
    C                        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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\R.                  5      r " S S\R.                  5      r " S S\R.                  5      r " S S\R.                  5      rS rS rS rS r " S S\ 5      r!S r"S r#S r$S r%S r&S r'S r(S  r)g
)!z4Code that's shared between multiple NAT subcommands.    )absolute_import)division)unicode_literals)
exceptions)flags)scope)yaml)filesNc                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )NatNotFoundError    zRaised when a NAT is not found.c                 Z   > Xl         SR                  U5      n[        [        U ]  U5        g )NzNAT `{0}` not found)nameformatsuperr   __init__)selfr   msg	__class__s      Alib/googlecloudsdk/command_lib/compute/routers/nats/nats_utils.pyr   NatNotFoundError.__init__#   s(    I

&
&t
,C	
D*3/    )r   __name__
__module____qualname____firstlineno____doc__r   __static_attributes____classcell__r   s   @r   r   r       s    '0 0r   r   c                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ ))IpAllocateOptionShouldNotBeSpecifiedError)   z>Raised when IP Allocation option is specified for private NAT.c                 0   > Sn[         [        U ]  U5        g )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   2IpAllocateOptionShouldNotBeSpecifiedError.__init__,   s    2C	
3TCCHr    r   r!   s   @r   r#   r#   )   s    FI Ir   r#   c                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )IpAllocationUnspecifiedError2   zARaised when IP Allocation option is not specified for public NAT.c                 0   > Sn[         [        U ]  U5        g )NzcEither --nat-external-ip-pool or --auto-allocate-nat-external-ips must be specified for Public NAT.)r   r*   r   r&   s     r   r   %IpAllocationUnspecifiedError.__init__5   s    /C	
&6s;r   r(   r   r!   s   @r   r*   r*   2   s    I< <r   r*   c                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )-SubnetOptionOrSubnet64OptionShouldBeSpecified;   z9Raised when not ipv4 nor ipv6 subnet option is specified.c                 0   > Sn[         [        U ]  U5        g )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   6SubnetOptionOrSubnet64OptionShouldBeSpecified.__init__>   s    	   

7GLr   r(   r   r!   s   @r   r/   r/   ;   s    AM Mr   r/   c                 d    U R                    H  nXR                  :X  d  M  Us  $    [        U5      e)z8Returns the nat with the given name in the given router.)natsr   r   )routernat_namenats      r   FindNatOrRaiser8   H   s,    [[c88j  	""r   c                    SU R                   0n[        XU5        U R                  b<  UR                  R                  R
                  R                  U R                  5      US'   U R                  S:H  nU R                  =(       d    U R                  nU(       a  U(       a
  [        5       eO&U(       d
  [        5       e[        X5      u  pVXRS'   XbS'   U R                  b<  UR                  R                  R
                  R                  U R                  5      US'   U R                  bM  U R                   Vs/ s H2  nUR                  R                  R
                  R                  U5      PM4     snUS'   U R                   US'   U R"                  US	'   U R$                  US
'   U R&                  US'   U R(                  US'   U R*                  US'   U R,                  US'   U R.                  US'   U R0                  c  U R2                  ba  UR                  R                  R5                  5       nU R0                  Ul        U R2                  b  [9        U R2                  U5      Ul        XS'   U R<                  b  U R<                  US'   U R>                  (       a  [A        U R>                  U5      US'   UR                  R                  R
                  " S0 UD6$ s  snf )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rulesr(   )!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_mappingrJ   _ParseRulesFromYamlFile)	argscompute_holderparams
is_privateis_ip_allocation_specifiedoptionnat_ipsendpoint_type
log_configs	            r   CreateNatMessagerp   P   s   DII&D&9	YY&&00DDTYYO 6N yyI%*
))FT-F-F !577 " &(**'=OF$* !8	'&&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$;	--900 -. 
ZZ-djj.IF7O				'	'	1	1	;F	;;As   59Kc                     [        X5      u  p4[        X5      u  pVU(       d  U(       d
  [        5       eU(       a  X2S'   U(       a  XBS'   U(       a  XRS'   U(       a  XbS'   gg)z'Adds subnet options to the params dict.sourceSubnetworkIpRangesToNatsubnetworkssourceSubnetworkIpRangesToNat64nat64SubnetworksN)_ParseIpv4SubnetFields_ParseIpv6SubnetFieldsr/   )rg   rh   ri   source_ipv4_subnets_to_natipv4_subnetssource_ipv6_subnets_to_natipv6_subnetss          r   rK   rK      sl    -C
.* .D
.* 
$,F
7
99.H*+(=0J,-!- r   c                 	   UR                   [        R                  R                  [        R                  R                  4;   d  UR
                  (       a  [        X5      u  p4X0l        X@l        UR                  [        R                  R                  L d  UR                  (       a  [        X5      u  p4X0l        X@l        UR                   (       a  SU l        / U l        UR"                  (       a  SU l        / U l        UR$                  (       a  [        R&                  R)                  XR*                  5      nU Vs/ s H  n[,        R.                  " U5      PM     snU l        UR2                  (       d4  U R4                   Vs/ s H  n[7        XV5      (       a  M  UPM     snU l        UR8                  (       a  / U l        UR:                  (       d  UR2                  (       a  [=        X5      u  pxXpl        Xl        UR@                  b>  URB                  RD                  RF                  RI                  UR@                  5      U l%        URL                  b  URL                  U l'        OURP                  (       a  SU l'        URR                  b  URR                  U l*        OURV                  (       a  SU l*        URX                  b  URX                  U l-        OUR\                  (       a  SU l-        UR^                  b  UR^                  U l0        OURb                  (       a  SU l0        URd                  b  URd                  U l3        OURh                  (       a  SU l3        URj                  b  URj                  U l6        OURn                  (       a  SU l6        URp                  b  URp                  U l9        OURt                  (       a  SU l9        URv                  b  URv                  U l<        URz                  c  UR|                  b<  U R~                  =(       d$    URB                  RD                  R                  5       U l?        URz                  b  URz                  U R~                  lA        UR|                  b%  [        UR|                  U5      U R~                  lC        UR                  b  UR                  U lE        UR                  (       a  [        UR                  U5      U lF        U $ s  snf s  snf )z3Updates a NAT message with the specified arguments.N)Hsubnet_option	nat_flagsSubnetOption
ALL_RANGESPRIMARY_RANGESnat_custom_subnet_ip_ranges_ParseSubnetFieldsrr   rs   subnet_ipv6_optionSubnetIpv6OptionALL_IPV6_SUBNETS nat64_custom_v6_subnet_ip_rangesrw   rt   ru   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drainNatIpsrQ   r=   
_ContainIp clear_nat_external_drain_ip_poolrP   rR   r<   rS   rL   rM   rN   rT   r>   rW   r@   clear_udp_idle_timeoutrX   rA   clear_icmp_idle_timeoutrY   rB   "clear_tcp_established_idle_timeoutrZ   rC   !clear_tcp_transitory_idle_timeoutr[   rD   clear_tcp_time_wait_timeoutr\   rE   clear_min_ports_per_vmr]   rF   clear_max_ports_per_vmr^   rG   r_   r`   rH   ra   rb   rc   rd   re   rI   rJ   rf   )	r7   rg   rh   ranges_to_natrs   drain_nat_ipsiprl   rm   s	            r   UpdateNatMessager      s    

 
 
+
+

 
 
/
/

 
	)	)!3D!IM(5%!O !;!;!L!LL		.	.!7!MM*7'&	$$(,C%CO	&&*.C'C	$$88JJ&&(M3@A=Rs}}R(=ACO $$zz!M)F"zcj 
**CO	((D,E,E'=OF$J	'&&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   : S S%S%c                       \ rS rSrSrS rSrg)SubnetUsagei  zDHelper object to store what ranges of a subnetwork are used for NAT.c                 >    SU l         SU l        [        5       U l        g )NF)using_primary	using_alllistsecondary_ranges)r   s    r   r   SubnetUsage.__init__  s    DDN FDr   )r   r   r   N)r   r   r   r   r   r   r   r(   r   r   r   r     s
    L#r   r   c           
          [        5       nUR                  R                  nU R                  [        R
                  R                  :X  a"  UR                  R                  R                  nGOU R                  [        R
                  R                  :X  a"  UR                  R                  R                  nGONUR                  R                  R                  n[        5       nU R                   H  nUR                  S5      nSnUS:  a  [         R"                  " SS5      eUS:X  a  UR%                  S5      u  pOUn	X;  a  ['        5       XY'   Ub0  US:X  a  SXY   l        Mt  XY   R*                  R-                  U5        M  SXY   l        M     U GHq  n	[0        R2                  " 5       R5                  U	/[6        R8                  R:                  U R<                  UR>                  [@        RB                  " UR                  5      S9n
XY   n/ nUR(                  (       a/  UR-                  URD                  RF                  RH                  5        UR.                  (       a/  UR-                  URD                  RF                  RJ                  5        UR*                  (       a/  UR-                  URD                  RF                  RL                  5        UR-                  [N        RP                  " U
S	   5      UUR*                  S
.5        GMt     U[S        US S94$ )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                     U S   $ Nr   r(   subnets    r   <lambda>$_ParseSubnetFields.<locals>.<lambda>h  s    vr   key)*r   rL   rM   r}   r~   r   r   rN   ,SourceSubnetworkIpRangesToNatValueValuesEnumALL_SUBNETWORKS_ALL_IP_RANGESr   %ALL_SUBNETWORKS_ALL_PRIMARY_IP_RANGESLIST_OF_SUBNETWORKSdictr   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)rg   rh   rs   rM   r   subnet_usagescustom_subnet_argcolonsrange_optionsubnet_name
subnet_refsubnet_usageoptionss                r   r   r     s   +""++(	911<<<GG	&	&  Y33BBBGG	.	. 
 	GG		 
 FM!== &&s+fl	!!::+(* 	* Q;$5$;$;C$@!\'		)%0]"		!5 15-
$
.

$
5
5
<
<\
J37"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                     U R                   [        R                  R                  L a  U R                  (       d  S/ 4$ [        X5      $ )z8Parses arguments related to ipv4 subnets to use for NAT.N)r}   r~   r   CUSTOM_RANGESr   r   )rg   rh   s     r   rv   rv   k  s;     I22@@@..8O	D	11r   c           
         U R                   [        R                  R                  L a  U R                  (       d  S/ 4$ / nUR
                  R                  nU R                   [        R                  R                  L a"  UR                  R                  R                  / 4$ U R                   H  n[        R                  " 5       R                  U/[        R                  R                   U R"                  UR$                  [&        R(                  " UR
                  5      S9nUR+                  S[,        R.                  " US   5      05        M     UR                  R                  R0                  [3        US S94$ )z8Parses arguments related to ipv6 subnets to use for NAT.Nr   r   r   c                     U S   $ r   r(   r   s    r   r   (_ParseIpv6SubnetFields.<locals>.<lambda>  s    r   r   )r   r~   r   LIST_OF_IPV6_SUBNETSr   rL   rM   r   rN   .SourceSubnetworkIpRangesToNat64ValueValuesEnumALL_IPV6_SUBNETWORKSr   r   r   r   r   r   r   r   r   r   r   r   r   LIST_OF_IPV6_SUBNETWORKSr   )rg   rh   subnetsrM   r   r   s         r   rw   rw   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                    UR                   R                  nU R                  (       a*  UR                  R                  R
                  [        5       4$ UR                  R                  R                  [        R                  R                  XR                  5       Vs/ s H  n[        R                  " U5      PM     sn4$ s  snf )N)rL   rM   rP   rN   "NatIpAllocateOptionValueValuesEnum	AUTO_ONLYr   MANUAL_ONLYr~   IP_ADDRESSES_ARGr   r   r   r   )rg   rh   rM   addresss       r   rR   rR     s    ""++(	((AAKKF 



?
?
K
K//AA
((*N*' 
mmG*N 
  Ns    C c                    U S:X  a4  UR                   R                  R                  R                  R                  $ U S:X  a4  UR                   R                  R                  R                  R
                  $ U S:X  a4  UR                   R                  R                  R                  R                  $ [        R                  " SS5      e)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)	rL   rM   ra   FilterValueValuesEnumr   r   r   r   r   )
filter_strrh   s     r   rc   rc     s    5!!**==""33(&&!!**==""#4#46= !!**=="";;0 	44 (	* *r   c                 B    U  H  nUR                  5       U;   d  M    g   g)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                    [         R                  " U 5       n[        R                  " U5      nSU;  a  [        R
                  " SS5      eUS    Vs/ s H  n[        XA5      PM     snsSSS5        $ s  snf ! , (       d  f       g= f)z*Parses NAT Rules from the given YAML file.rJ   z--rulesz0The YAML file must contain the 'rules' attributeN)r
   
FileReaderr	   loadr   r   _CreateRule)	file_pathrh   import_file
rules_yaml	rule_yamls        r   rf   rf     s    	"k;'Jj 88
IK K $G,,I 	I., #"
 #"s   ;A8A3'A83A88
Bc                    UR                   R                  R                  5       nSU ;   a
  U S   Ul        SU ;   a
  U S   Ul        SU ;   a  U S   nUR                   R                  R                  5       Ul        SU;   a  US   UR                  l        SU;   a  US   UR                  l        SU;   a  US   UR                  l	        SU;   a  US   UR                  l
        U$ )z1Creates a Rule object from the given parsed YAML.
ruleNumbermatchactionsourceNatActiveIpssourceNatDrainIpssourceNatActiveRangessourceNatDrainRanges)rL   rM   RouterNatRuler   r   RouterNatRuleActionr   r   r   r   r   )r   rh   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.natsr~   googlecloudsdk.corecore_exceptionsr	   googlecloudsdk.core.utilr
   r   Errorr   r#   r*   r/   r8   rp   rK   r   objectr   r   rv   rw   rR   rc   r   rf   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   