
    C                        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Z G d dej.                        Z G d dej.                        Z G d dej.                        Z G d dej.                        Zd Zd Zd Zd Z G d de       Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d  Z)y
)!z4Code that's shared between multiple NAT subcommands.    )absolute_import)division)unicode_literals)
exceptions)flags)scope)yaml)filesNc                   "     e Zd ZdZ fdZ xZS )NatNotFoundErrorzRaised when a NAT is not found.c                 \    || _         dj                  |      }t        t        |   |       y )NzNAT `{0}` not found)nameformatsuperr   __init__)selfr   msg	__class__s      Alib/googlecloudsdk/command_lib/compute/routers/nats/nats_utils.pyr   zNatNotFoundError.__init__#   s*    DI

&
&t
,C	
D*3/    __name__
__module____qualname____doc__r   __classcell__r   s   @r   r   r       s    '0 0r   r   c                   "     e Zd ZdZ fdZ xZS ))IpAllocateOptionShouldNotBeSpecifiedErrorz>Raised when IP Allocation option is specified for private NAT.c                 0    d}t         t        |   |       y )Nz`--nat-external-ip-pool and --auto-allocate-nat-external-ips cannot be specified for Private NAT.)r   r   r   r   r   r   s     r   r   z2IpAllocateOptionShouldNotBeSpecifiedError.__init__,   s    2C	
3TCCHr   r   r   s   @r   r   r   )   s    FI Ir   r   c                   "     e Zd ZdZ fdZ xZS )IpAllocationUnspecifiedErrorzARaised when IP Allocation option is not specified for public NAT.c                 0    d}t         t        |   |       y )NzcEither --nat-external-ip-pool or --auto-allocate-nat-external-ips must be specified for Public NAT.)r   r#   r   r!   s     r   r   z%IpAllocationUnspecifiedError.__init__5   s    /C	
&6s;r   r   r   s   @r   r#   r#   2   s    I< <r   r#   c                   "     e Zd ZdZ fdZ xZS )-SubnetOptionOrSubnet64OptionShouldBeSpecifiedz9Raised when not ipv4 nor ipv6 subnet option is specified.c                 0    d}t         t        |   |       y )NzAt least one of: --nat-all-subnet-ip-ranges, --nat-primary-subnet-ip-ranges, --nat-custom-subnet-ip-ranges, --nat64-all-v6-subnet-ip-ranges, --nat64-custom-v6-subnet-ip-ranges should be specified.)r   r&   r   r!   s     r   r   z6SubnetOptionOrSubnet64OptionShouldBeSpecified.__init__>   s    	   

7GLr   r   r   s   @r   r&   r&   ;   s    AM Mr   r&   c                 `    | j                   D ]  }||j                  k(  s|c S  t        |      )z8Returns the nat with the given name in the given router.)natsr   r   )routernat_namenats      r   FindNatOrRaiser-   H   s.    [[c388j  	""r   c                 t   d| j                   i}t        | ||       | j                  <|j                  j                  j
                  j                  | j                        |d<   | j                  dk(  }| j                  xs | j                  }|r|r/t               |s
t               t        | |      \  }}||d<   ||d<   | j                  <|j                  j                  j
                  j                  | j                        |d<   | j                  J| j                  D cg c]1  }|j                  j                  j
                  j                  |      3 c}|d<   | j                   |d<   | j"                  |d	<   | j$                  |d
<   | j&                  |d<   | j(                  |d<   | j*                  |d<   | j,                  |d<   | j.                  |d<   | j0                  | j2                  a|j                  j                  j5                         }| j0                  |_        | j2                  t9        | j2                  |      |_        ||d<   | j<                  | j<                  |d<   | j>                  rtA        | j>                  |      |d<    |j                  j                  j
                  di |S c c}w )z3Creates a NAT message from the specified arguments.r   typePRIVATEnatIpAllocateOptionnatIpsautoNetworkTierendpointTypesudpIdleTimeoutSecicmpIdleTimeoutSectcpEstablishedIdleTimeoutSectcpTransitoryIdleTimeoutSectcpTimeWaitTimeoutSecminPortsPerVmmaxPortsPerVmenableDynamicPortAllocation	logConfig enableEndpointIndependentMappingrules )!r   _AddSubnetOptionsToParamsr/   clientmessages	RouterNatTypeValueValuesEnumauto_allocate_nat_external_ipsnat_external_ip_poolr   r#   _ParseNatIpFieldsauto_network_tierAutoNetworkTierValueValuesEnumendpoint_types%EndpointTypesValueListEntryValuesEnumudp_idle_timeouticmp_idle_timeouttcp_established_idle_timeouttcp_transitory_idle_timeouttcp_time_wait_timeoutmin_ports_per_vmmax_ports_per_vmenable_dynamic_port_allocationenable_logging
log_filterRouterNatLogConfigenable_TranslateLogFilterfilter#enable_endpoint_independent_mappingr?   _ParseRulesFromYamlFile)	argscompute_holderparams
is_privateis_ip_allocation_specifiedoptionnat_ipsendpoint_type
log_configs	            r   CreateNatMessagerf   P   s   DII&D.&9	YY&&00DDTYYO 6N yyI%*
))FT-F-F !577%(**'n=OFG$*F !F8	'&&00OO""	$  
$
 "00	 1M 	&&00VV	
 1	F? !% 5 5&	!%!7!7&	+/+L+L&	'(*.*J*J&	&'$($>$>&	 ! 11& 11&*.*M*M&	&'	$(C&&//BBDJ++J"-doo~Nj$F;	--900 -. 
ZZ-djj.IF7O	1			'	'	1	1	;F	;;As   "6J5c                     t        | |      \  }}t        | |      \  }}|s|s
t               |r||d<   |r||d<   |r||d<   |r||d<   yy)z'Adds subnet options to the params dict.sourceSubnetworkIpRangesToNatsubnetworkssourceSubnetworkIpRangesToNat64nat64SubnetworksN)_ParseIpv4SubnetFields_ParseIpv6SubnetFieldsr&   )r]   r^   r_   source_ipv4_subnets_to_natipv4_subnetssource_ipv6_subnets_to_natipv6_subnetss          r   rA   rA      s|    -C
N.*l .D
N.*l 
$,F
7
99.HF*+(F=0JF,-!-F r   c                  	   |j                   t        j                  j                  t        j                  j                  fv s|j
                  rt        ||      \  }}|| _        || _        |j                  t        j                  j                  u s|j                  rt        ||      \  }}|| _        || _        |j                   rd| _        g | _        |j"                  rd| _        g | _        |j$                  rt        j&                  j)                  ||j*                        }|D cg c]  }t-        j.                  |       c}| _        |j2                  s,| j4                  D cg c]  }t7        ||      r| c}| _        |j8                  rg | _        |j:                  s|j2                  rt=        ||      \  }}|| _        || _        |j@                  >|jB                  jD                  jF                  jI                  |j@                        | _%        |jL                  |jL                  | _'        n|jP                  rd| _'        |jR                  |jR                  | _*        n|jV                  rd| _*        |jX                  |jX                  | _-        n|j\                  rd| _-        |j^                  |j^                  | _0        n|jb                  rd| _0        |jd                  |jd                  | _3        n|jh                  rd| _3        |jj                  |jj                  | _6        n|jn                  rd| _6        |jp                  |jp                  | _9        n|jt                  rd| _9        |jv                  |jv                  | _<        |jz                  |j|                  7| j~                  xs$ |jB                  jD                  j                         | _?        |jz                  |jz                  | j~                  _A        |j|                  %t        |j|                  |      | j~                  _C        |j                  |j                  | _E        |j                  rt        |j                  |      | _F        | S c c}w c c}w )z3Updates a NAT message with the specified arguments.N)Hsubnet_option	nat_flagsSubnetOption
ALL_RANGESPRIMARY_RANGESnat_custom_subnet_ip_ranges_ParseSubnetFieldsrh   ri   subnet_ipv6_optionSubnetIpv6OptionALL_IPV6_SUBNETS nat64_custom_v6_subnet_ip_rangesrm   rj   rk   clear_nat_subnet_ip_rangesclear_nat64_subnet_ip_rangesnat_external_drain_ip_poolDRAIN_NAT_IP_ADDRESSES_ARGResolveAsResource	resourcessix	text_typedrainNatIpsrG   r2   
_ContainIp clear_nat_external_drain_ip_poolrF   rH   r1   rI   rB   rC   rD   rJ   r3   rM   r5   clear_udp_idle_timeoutrN   r6   clear_icmp_idle_timeoutrO   r7   "clear_tcp_established_idle_timeoutrP   r8   !clear_tcp_transitory_idle_timeoutrQ   r9   clear_tcp_time_wait_timeoutrR   r:   clear_min_ports_per_vmrS   r;   clear_max_ports_per_vmrT   r<   rU   rV   r=   rW   rX   rY   rZ   r[   r>   r?   r\   )	r,   r]   r^   ranges_to_natri   drain_nat_ipsiprb   rc   s	            r   UpdateNatMessager      s    

 
 
+
+

 
 
/
/

 
	)	)!3D.!IM;(5C%!CO !;!;!L!LL		.	.!7n!MM;*7C'&C	$$(,C%CO	&&*.C'C	$$88JJn&&(M3@A=Rs}}R(=ACO $$zz!M2)F"zcj 
**CO	((D,E,E'n=OFG$CCJ	'&&00OO""	$  
& 11C"" C	'!33C##!C	&&2'+'H'HC$..'+C$	%%1&*&F&FC#--&*C#	+ $ : :C'' $C	&--C""C	&--C""C	((4&*&I&IC#	$(CL..77JJL M	$..CMM	__ .tOCMM	--900 ( 
ZZ'

NCCI	*U Bs   'Q6%Q;7Q;c                       e Zd ZdZd Zy)SubnetUsagezDHelper object to store what ranges of a subnetwork are used for NAT.c                 >    d| _         d| _        t               | _        y )NF)using_primary	using_alllistsecondary_ranges)r   s    r   r   zSubnetUsage.__init__  s    DDN FDr   N)r   r   r   r   r   r@   r   r   r   r     s
    L#r   r   c           
         t               }|j                  j                  }| j                  t        j
                  j                  k(  r"|j                  j                  j                  }n| j                  t        j
                  j                  k(  r"|j                  j                  j                  }n9|j                  j                  j                  }t               }| j                  D ]  }|j                  d      }d}|dkD  rt!        j"                  dd      |dk(  r|j%                  d      \  }	}n|}	|	|vrt'               ||	<   |/|dk(  rd||	   _        p||	   j*                  j-                  |       d||	   _         |D ]b  }	t1        j2                         j5                  |	gt6        j8                  j:                  | j<                  |j>                  tA        jB                  |j                              }
||	   }g }|j(                  r/|j-                  |jD                  jF                  jH                         |j.                  r/|j-                  |jD                  jF                  jJ                         |j*                  r/|j-                  |jD                  jF                  jL                         |j-                  tO        jP                  |
d	         ||j*                  d
       e |tS        |d       fS )z3Parses arguments related to subnets to use for NAT.:N   z--nat-custom-subnet-ip-rangeszMEach specified subnet must be of the form SUBNETWORK or SUBNETWORK:RANGE_NAMEALLTscope_listerr   )r   sourceIpRangesToNatsecondaryIpRangeNamesc                     | d   S Nr   r@   subnets    r   <lambda>z$_ParseSubnetFields.<locals>.<lambda>h  s    vr   key)*r   rB   rC   rs   rt   ru   rv   rD   ,SourceSubnetworkIpRangesToNatValueValuesEnumALL_SUBNETWORKS_ALL_IP_RANGESrw   %ALL_SUBNETWORKS_ALL_PRIMARY_IP_RANGESLIST_OF_SUBNETWORKSdictrx   countcalliope_exceptionsInvalidArgumentExceptionsplitr   r   r   appendr   subnet_flagsSubnetworkResolverResolveResourcescompute_scope	ScopeEnumREGIONregionr   compute_flagsGetDefaultScopeListerRouterNatSubnetworkToNat+SourceIpRangesToNatValueListEntryValuesEnumALL_IP_RANGESPRIMARY_IP_RANGELIST_OF_SECONDARY_IP_RANGESr   r   sorted)r]   r^   ri   rC   r   subnet_usagescustom_subnet_argcolonsrange_optionsubnet_name
subnet_refsubnet_usageoptionss                r   ry   ry     s   +""++(	911<<<GG	&	&  Y33BBBGG	.	. 
 	GG		 
 FM!== &&s+fl	!!::+(* 	* Q;$5$;$;C$@!\'	M	)%0]k"		!5 15-
$
.

$
5
5
<
<\
J37k"0- >0 %224EE-

!
!
(
(
++

"
"$::##% F &j #;/lg			--88	H 
	#	#--889I9I	K 
	&	&x88CC33	5 --
1.!(#/#@#@ 	3 %> 1NO	PPr   c                     | j                   t        j                  j                  u r| j                  sdg fS t        | |      S )z8Parses arguments related to ipv4 subnets to use for NAT.N)rs   rt   ru   CUSTOM_RANGESrx   ry   )r]   r^   s     r   rl   rl   k  s=     I22@@@..8O	D.	11r   c           
         | j                   t        j                  j                  u r| j                  sdg fS g }|j
                  j                  }| j                   t        j                  j                  u r"|j                  j                  j                  g fS | j                  D ]  }t        j                         j                  |gt        j                  j                   | j"                  |j$                  t'        j(                  |j
                              }|j+                  dt-        j.                  |d         i        |j                  j                  j0                  t3        |d       fS )z8Parses arguments related to ipv6 subnets to use for NAT.Nr   r   r   c                     | d   S r   r@   r   s    r   r   z(_ParseIpv6SubnetFields.<locals>.<lambda>  s    r   r   )rz   rt   r{   LIST_OF_IPV6_SUBNETSr}   rB   rC   r|   rD   .SourceSubnetworkIpRangesToNat64ValueValuesEnumALL_IPV6_SUBNETWORKSr   r   r   r   r   r   r   r   r   r   r   r   r   LIST_OF_IPV6_SUBNETWORKSr   )r]   r^   subnetsrC   r   r   s         r   rm   rm   u  s7    !;!;!P!PP338O'""++(		 : : K KKII^^
 
 ::k002CC	&&  "889N9NO D J NNFCMM*Q-89: ; GG``W78
 r   c                 z   |j                   j                  }| j                  r*|j                  j                  j
                  t               fS |j                  j                  j                  t        j                  j                  | |j                        D cg c]  }t        j                  |       c}fS c c}w )N)rB   rC   rF   rD   "NatIpAllocateOptionValueValuesEnum	AUTO_ONLYr   MANUAL_ONLYrt   IP_ADDRESSES_ARGr   r   r   r   )r]   r^   rC   addresss       r   rH   rH     s    ""++(	((AAKKF 



?
?
K
K//AA
((*N*' 
mmG*N 
  Ns   B8c                    | dk(  r4|j                   j                  j                  j                  j                  S | dk(  r4|j                   j                  j                  j                  j
                  S | dk(  r4|j                   j                  j                  j                  j                  S t        j                  dd      )z6Translates the specified log filter to the enum value.r   TRANSLATIONS_ONLYERRORS_ONLYz--log-filterz:--log-filter must be ALL, TRANSLATIONS_ONLY or ERRORS_ONLY)	rB   rC   rW   FilterValueValuesEnumr   r   r   r   r   )
filter_strr^   s     r   rY   rY     s    5!!**==""33(&&!!**==""#4#46= !!**=="";;0 	44 (	* *r   c                 :    | D ]  }|j                         |v s y y)z)Returns true if target ip is in the list.TF)RelativeName)ip_list	target_ipr   s      r   r   r     s#    b	I%  
r   c                     t        j                  |       5 }t        j                  |      }d|vrt	        j
                  dd      |d   D cg c]  }t        ||       c}cddd       S c c}w # 1 sw Y   yxY w)z*Parses NAT Rules from the given YAML file.r?   z--rulesz0The YAML file must contain the 'rules' attributeN)r
   
FileReaderr	   loadr   r   _CreateRule)	file_pathr^   import_file
rules_yaml	rule_yamls        r   r\   r\     s    	"k;'Jj 88
IK K $G,,I 	I~., #"
 #"s   7A1A, A1,A11A:c                    |j                   j                  j                         }d| v r
| d   |_        d| v r
| d   |_        d| v r| d   }|j                   j                  j                         |_        d|v r|d   |j                  _        d|v r|d   |j                  _        d|v r|d   |j                  _	        d|v r|d   |j                  _
        |S )z1Creates a Rule object from the given parsed YAML.
ruleNumbermatchactionsourceNatActiveIpssourceNatDrainIpssourceNatActiveRangessourceNatDrainRanges)rB   rC   RouterNatRuler   r   RouterNatRuleActionr   r   r   r   r   )r   r^   ruleaction_yamls       r   r   r     s    				'	'	5	5	7$Y-DO	7#DJH%K ''00DDFDK{*'23G'Hdkk$k)&12E&Fdkk#+-*56M*Ndkk',)45K)Ldkk&	+r   )*r   
__future__r   r   r   googlecloudsdk.callioper   r   "googlecloudsdk.command_lib.computer   r   r   r   3googlecloudsdk.command_lib.compute.networks.subnetsr   /googlecloudsdk.command_lib.compute.routers.natsrt   googlecloudsdk.corecore_exceptionsr	   googlecloudsdk.core.utilr
   r   Errorr   r   r#   r&   r-   rf   rA   r   objectr   ry   rl   rm   rH   rY   r   r\   r   r@   r   r   <module>r     s    ; &  ' E E E U N = $ * 
0,, 0I0E0E I<?#8#8 <
MO4I4I 
M#=<@.,k\#& #KQ\2@	*"
r   