
    /I_                     4    S SK Js  Jr  S SKJs  Jr  S SKJs  Jr  S SKJ	r	  S SK
Jr  S SKJr  S SK7  S SKJr  S SK7  S SKJr   " S S	\	\5      r g! \\4 a=    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7  S SKJr  S SK7  S SKJr   NQf = f)
    N)Addon)NetlinkCacheIfnameNotFoundError)Link)*)utils)
moduleBasec                      \ rS rSrSSSS/SS/S.S	S
/S/S.SS
/S/S.SS/S/S.SS
/S/SS.S/ SQS/SS.SSS/S/SS.SSS /S!/S.S"S#/SS$/S%S&.S'S(/S).S*SSS+/S,/S-.S.S//S0/S.S.S1/S2/S.S3S4/S5/S.S6.S7.rS8rS9 rS: rS; rS< r	S[S> jr
S? r\S@ 5       rSA rSB rSC rSD rSE rSF rSG rSH rSI rSJ rSK rSL rSM rSN rSO r\SP 5       rSQ r\SR 5       r\SS 5       r ST r!SU r"SV r#\\\"\!SW.r$SX r%S[SY jr&SZr'g=)\vxlan&   z)vxlan module configures vxlan interfaces.zvxlan id116777214Tzvxlan-id 100)help
validrangerequiredexamplezvxlan local tunnel ipz<ipv4>z"vxlan-local-tunnelip 172.16.20.103)r   	validvalsr   zvxlan-svcnodeip 172.16.22.125zvxlan svc node ipz<ipv6>z%vxlan-svcnodeip6 2001:DB8:8086:6502::zvxlan remote ipzvxlan-remoteip 172.16.22.127)r   r   r   	multilinezvxlan learning yes/no)yesnoonoffzvxlan-learning nor   )r   r   r   defaultzvxlan aging timer04096zvxlan-ageing 300300)r   r   r   r   z#vxlan purge existing remote entriesr   zvxlan-purge-remotes yesz,vxlan UDP port (transmitted to vxlan driver)zvxlan-port 4789655364789)r   r   r   r   zvxlan physical devicezvxlan-physdev eth1)r   r   zIspecifies the TTL value to use in outgoing packets (range 0..255), 0=auto255zvxlan-ttl 42)r   r   r   r   zvxlan multicast groupz<ip>zvxlan-mcastgrp 172.16.22.127z<ip6>zvxlan-mcastgrp ff02::15cz-vxlan multicast group for single-vxlan devicez<number-ipv4-list>z4vxlan-mcastgrp-map 1000=239.1.1.100 1001=239.1.1.200)vxlan-idvxlan-local-tunnelipvxlan-svcnodeipvxlan-svcnodeip6vxlan-remoteipvxlan-learningvxlan-ageingvxlan-purge-remotes
vxlan-portvxlan-physdev	vxlan-ttlvxlan-mcastgrpvxlan-mcastgrp6vxlan-mcastgrp-map)mhelpattrszipmr-loc                    [         R                  " U 5        [        R                  " U /UQ70 UD6  [        R                  " [
        R                  R                  U R                  R                  SS95      U l
        S U l        SU l        SU l        [
        R                  R                  U R                  R                  SS9=(       d    U R                  U l        g )Nr&   module_nameattr Fzvxlan-physdev-mcastgrp)r   __init__r   r   get_boolean_from_stringpolicymanagerpolicymanager_apiget_module_globals	__class____name___vxlan_purge_remotes_vxlan_local_tunnelip_clagd_vxlan_anycast_ipvxlan_mcastgrp_refVXLAN_PHYSDEV_MCASTGRP_DEFAULTvxlan_physdev_mcast)selfargskargss      $/usr/share/ifupdown2/addons/vxlan.pyr4   vxlan.__init__{   s    tD14151$)$A$A++>> NN33* ? %
! &*"')$ #(#0#B#B#U#U//) $V $
 $1 00 	     c                     SU l         g )NF)r>   rA   s    rD   resetvxlan.reset   s     #(rF   c                 b   U R                  U5      (       a  UR                  S5      (       d:  U R                  (       d)  U R                  R	                  SUR
                  -  5        gU R                  UR
                  UR                  S5      =(       d    U R                  U R                  5      $ g)Nr    z %s: missing vxlan-local-tunnelipFT)_is_vxlan_deviceget_attr_value_firstr<   loggerwarningname$syntax_check_localip_anycastip_equalr=   )rA   ifaceobjifaceobj_getfuncs      rD   syntax_checkvxlan.syntax_check   s      **001GHHQUQkQk##$F$VW<<--.DEcIcIc,, 
 rF   c                      U(       aY  U(       aR  [         R                  " U5      [         R                  " U5      :X  a$  U R                  R                  U< SU< S35        gg! [         a     gf = f)NzA: vxlan-local-tunnelip and clagd-vxlan-anycast-ip are identical ()FT)	ipnetwork	IPNetworkrN   rO   	Exception)rA   ifnamelocal_ip
anycast_ips       rD   rQ   *vxlan.syntax_check_localip_anycastip_equal   se    	J9+>+>x+HIL_L_`jLk+k##'-x%9 :   		s   AA# #
A0/A0Nc                    UR                  S5      (       a#  U=R                  [        R                  -  sl        U R	                  U5      (       ac  U=R
                  [        R                  -  sl        U R                  U5        U R                  (       d  UR                  S5      (       a  SU l	        OqUR                  S:X  aa  UR                  S5      nU(       a8  [        U5      S:w  a  U R                  UR                  < S35        US   U l        U R                  U5        UR                  S	5      nU(       a  U/$ g )
Nbridge-vlan-vni-mapr*   Tlozclagd-vxlan-anycast-ip   z8: multiple clagd-vxlan-anycast-ip lines, using first oner   r(   )rM   link_privflagsifaceLinkPrivFlagsSINGLE_VXLANrL   	link_kindifaceLinkKindVXLAN_set_global_local_ipr>   get_attr_valuerP   lenlog_warnr=   )rA   rR   ifaceobjs_allclagd_vxlan_listphysdevs        rD   get_dependent_ifacenamesvxlan.get_dependent_ifacenames   s	   (()>??##'9'F'FF#  **-"5"55%%h/ **x/F/FGW/X/X*.']]d"'667OP'(A-MM%-]]#5 6/?/B,%%h/ //@9rF   c                 f    UR                  S5      nU(       a  U R                  (       d  X l        g g g )Nr    )rM   r<   )rA   rR   vxlan_local_tunnel_ips      rD   ri   vxlan._set_global_local_ip   s.     ( = =>T U )C)C)>& *D rF   c                     U R                   [        R                  -  =(       dM    U R                  [        R
                  -  =(       d)    U R                  S5      =(       d    U R                  S5      $ )Nr   r`   )rf   rg   rh   rc   rd   re   rM   )rR   s    rD   rL   vxlan._is_vxlan_device   sb    !!M$7$77 G)),>,K,KKG//
;G //0EF	GrF   c                     U(       d  U R                   $ UR                  S5      nU(       a  [        R                  " U5      nU$ U R                   nU$ )Nr&   )r;   rM   r   r5   )rA   rR   purge_remotess      rD   __get_vlxan_purge_remotesvxlan.__get_vlxan_purge_remotes   sP    ,,, 556KL!99-HM  !55MrF   c                 ^    SnU(       a#  UR                  5       S:X  a  SnU$ [        U5      nU$ )Nr   auto)lowerint)rA   
ttl_configttls      rD   get_vxlan_ttl_from_stringvxlan.get_vxlan_ttl_from_string   s7    !V+ 
 *o
rF   c                     [        U5      nUR                  [        R                  5      nU(       a  Xv:w  a  U R	                  U< SU< S3U5        Xd[        R                  '   g! [
         a    U R	                  U< SU< S3U5         gf = f)z
Get vxlan-id user config and check it's value before inserting it in our netlink dictionary
:param ifname:
:param ifaceobj:
:param vxlan_id_str:
:param user_request_vxlan_info_data:
:param cached_vxlan_ifla_info_data:
:return:
z": Cannot change running vxlan id (z): Operation not supportedz: invalid vxlan-id ''N)r~   getr   IFLA_VXLAN_ID	log_error
ValueError)rA   r[   rR   vxlan_id_struser_request_vxlan_info_datacached_vxlan_ifla_info_datavxlan_idcached_vxlan_ids           rD   __config_vxlan_idvxlan.__config_vxlan_id   s    	[<(H9==d>P>PQO?#>0
 @H););< 	[NN&,OQYZ	[s   A"A% %$BBc                 j   UR                  S5      n U(       a  [        U5      $ [        R                  R	                  U R
                  R                  SS9nU(       d,  U(       a$  U R                  S5      nU(       a  [        U5      $ ggg! [         a    U R                  U< SU< S3U5         gf = f)z
Get vxlan-ageing user config or via policy, return integer value, None or raise on error
:param ifname:
:param ifaceobj:
:param link_exists:
:return:
r%   r0   z: invalid vxlan-ageing 'r   N)
rM   r~   r6   r7   get_attr_defaultr9   r:   get_attr_default_valuerZ   r   )rA   r[   rR   link_existsvxlan_ageing_strs        rD   __get_vxlan_ageing_intvxlan.__get_vxlan_ageing_int  s     $88H	c+,,,>>OO NN33#  P  
 $#'#>#>~#N #/00 $	 )4#  	cNNfFVWYab	cs   B A"B $B21B2c                     U R                  XU5      nU(       a)  U(       a#  XeR                  [        R                  5      :X  a  gU R                  R                  U< SU< 35        Xd[        R                  '   g)zR
Check user config vxlan-ageing and insert it in our netlink dictionary if needed
Nz: set vxlan-ageing )_vxlan__get_vxlan_ageing_intr   r   IFLA_VXLAN_AGEINGrN   info)rA   r[   rR   r   r   r   vxlan_ageings          rD   __config_vxlan_ageingvxlan.__config_vxlan_ageing  sZ     226[Q@_@_`d`v`v@w0wflKL?KT%;%;<rF   c           
      >   UR                  S5      n U(       d2  [        R                  R                  U R                  R
                  SS9n [        U5      nUR                  [        R                   5      n	U(       a0  Xy:w  a*  U R                  R                  U< SU	< SU< SU< 35        gU R                  R#                  U< S	U< 35        Xt[        R                   '   g! [         a    U R                  R                  n N[         ad  nU R                  R                  U< SU R                  R                  < S[        U5      < 35        U R                  R                  n SnAGNSnAff = f! [$         a    U R'                  U< S
U< S3U5         gf = f)z
Check vxlan-port user config, validate the integer value and insert it in the netlink dictionary if needed
:param ifname:
:param ifaceobj:
:param link_exists:
:param user_request_vxlan_info_data:
:param cached_vxlan_ifla_info_data:
:return:
r'   r0   z: vxlan-port: using default z: invalid configured value Nz: vxlan-port (zE) cannot be changed - to apply the desired change please run: ifdown z	 && ifup z: set vxlan-port z: invalid vxlan-port 'r   )rM   r6   r7   r   r9   r:   r~   	TypeErrornetlinkVXLAN_UDP_PORTr   rN   rO   strr   r   IFLA_VXLAN_PORTr   rZ   r   )
rA   r[   rR   r   r   r   vxlan_port_str
vxlan_portecached_vxlan_ports
             rD   __config_vxlan_portvxlan.__config_vxlan_port+  sU    "66|D!	_!!.!@!@!Q!Q $ 7 7% "R "
9 0
 !< ? ?@T@T U2KK''!#4ffF KK
KLAK)=)=>-  9 "\\88
 9##t||::CFD "\\88
9&  	_NNFNSU]^	_sO   9E5 C# AE5 .4E5 # E2E5 	E2AE-'E5 -E22E5 5$FFc                 \   UR                  S5      n U(       a  U R                  U5      nOAU R                  [        R                  R	                  U R
                  R                  SS95      nUR                  [        R                  5      nXg:w  ar  Ub1  U R                  R                  U< SU(       a  UOU< SU< S35        O+U R                  R                  U< SU(       a  UOU< 35        Xc[        R                  '   gg! [         a    U R                  U< SU< S3U5         gf = f)	z
Get vxlan-ttl from user config or policy, validate integer value and insert in netlink dict
:param ifname:
:param ifaceobj:
:param user_request_vxlan_info_data:
:param cached_vxlan_ifla_info_data:
:return:
r)   r0   Nz: set vxlan-ttl z (cache rW   z: invalid vxlan-ttl 'r   )rM   r   r6   r7   r   r9   r:   r   r   IFLA_VXLAN_TTLrN   r   rZ   r   )rA   r[   rR   r   r   vxlan_ttl_str	vxlan_ttlcached_ifla_vxlan_ttls           rD   __config_vxlan_ttlvxlan.__config_vxlan_ttlY  s    !55kB	] ::=I	 ::!33DD$(NN$;$;( E 	 %@$C$CDDWDW$X!1(4KK$$&cpR_vR  BW  &X  YKK$$vXe}ktGt%uvDMT-@-@A 2  	]NN6=QS[\	]s   C/D $D+*D+c           
      &   UR                  S5      nU(       d  U R                  (       a  U R                  nU(       a^  UR                  [        R                  5      nU R
                  (       a.  U(       a'  [        R                  " U R
                  5      nX:X  a  UnU(       d2  [        R                  R                  U R                  R                  SS9nU(       aK   [        R                  " U5      nUR                  (       a#  U R                  R!                  U< SU< S35        UR                  [        R                  5      n
U(       aW  Xj:w  aP  U R                  R'                  U< SU< 35        Xd[        R                  '   U R)                  XU R
                  5        U$ U
(       a6  U R                  R'                  U< S	U
< S
35        SU[        R                  '   U$ ! ["         a$  n	[#        U< SU< S[%        U	5      < 35      eSn	A	ff = f)z
Get vxlan-local-tunnelip user config or policy, validate ip address format and insert in netlink dict
:param ifname:
:param ifaceobj:
:param link_exists:
:param user_request_vxlan_info_data:
:param cached_vxlan_ifla_info_data:
:return:
r    r0   z: vxlan-local-tunnelip : netmask ignoredz: invalid vxlan-local-tunnelip : Nz: set vxlan-local-tunnelip z': removing vxlan-local-tunnelip (cache rW   )rM   r<   r   r   IFLA_VXLAN_LOCALr=   rX   rY   r6   r7   r   r9   r:   IPv4Addressinitialized_with_prefixlenrN   rO   rZ   r   r   rQ   )rA   r[   rR   r   r   r   localrunning_localtunnelip	anycastipr   cached_ifla_vxlan_locals              rD   __config_vxlan_local_tunnelip#vxlan.__config_vxlan_local_tunnelipz  s    --.DE33..E %@$C$CDDYDY$Z!++0E%//0L0LM	51E!33DD NN33+ E E
 e!--e433KK''Z`bg(hi
 #>"A"A$BWBW"X/  fe!TUFKT-B-BC 99&IeIef
 	 %KKvWnopBF()>)>?!  eVUZ\_`a\b cddes   A
G" "
H,HHc                     UR                  U5      nU(       d2  [        R                  R                  U R                  R
                  US9nU$ )Nr0   )rM   r6   r7   r   r9   r:   )rA   rR   	attr_namevxlan_attr_values       rD   __get_vxlan_attributevxlan.__get_vxlan_attribute  sK    #88C,>>OO NN33  P  
  rF   c	           
         U(       a%  U(       a  U R                  U< SU< SU< S3U5        Sn	Sn
U(       a   [        R                  " U5      nUR                  (       a#  U R                  R                  U< SU< S35        UR                  R                  (       a>  U R                  R                  U< SU< S35        U(       d  U R                  SU-  5        OU(       a   [        R                  " U5      nUR                  (       a#  U R                  R                  U< SU< S35        UR                  R                  (       d/  U R                  R                  U< SU< S35        U(       d  UnS
nOSn	U(       a  UnU(       d  U R                  SU-  5        UR                  [        R                  5      nX\:w  a  U(       d  [        R                  " S5      nSn	U R                  R                  U< SU	< SU< 35        XW[        R                  '   Sn
U(       aK  U(       a&  U R                  R                  U< SU< S35        XZ4$ U R                  R                  SU-  5        XZ4$ ! [         a$  n[        U< SU< S	[        U5      < 35      eS
nAff = f! [         a$  n[        U< SU< S	[        U5      < 35      eS
nAff = f)_  
vxlan-mcastgrp and vxlan-svcnodeip are mutually exclusive
this function validates ip format for both attribute and tries to understand
what the user really want (remote or group option).

:param ifname:
:param ifaceobj:
:param mcast_grp:
:param group:
:param physdev:
:param user_request_vxlan_info_data:
:param cached_vxlan_ifla_info_data:
:return:
z: both group (vxlan-mcastgrp z) and remote (vxlan-svcnodeip ) cannot be specifiedr!   Fz: vxlan-svcnodeip r   z: invalid vxlan-svcnodeip r   NzO: invalid group address, for multicast IP please use attribute "vxlan-mcastgrp"zL%s: vxlan: 'group' (vxlan-mcastgrp) requires 'vxlan-physdev' to be specifiedz: vxlan-mcastgrp z: invalid vxlan-mcastgrp zT: invalid group address, for non-multicast IP please use attribute "vxlan-svcnodeip"r*   z0.0.0.0zvxlan-svcnodeip/vxlan-mcastgrp: set  Tz.: vxlan-mcastgrp configuration changed (cache !): flapping vxlan device requiredzH%s: vxlan-mcastgrp configuration changed: flapping vxlan device required)r   rX   r   r   rN   rO   rZ   r   ipis_multicastr   r   IFLA_VXLAN_GROUPrY   r   )rA   r[   rR   r   	mcast_grpgroupro   r   r   attribute_namemulticast_group_changer   cached_ifla_vxlan_groups                rD   __config_vxlan_groupvxlan.__config_vxlan_group  sb    NN$i89AC +!&`!--e433KK''U[]b(cd
 xx$$##bhjo%q r
 NN#qu{#|}c%11)<	77KK''TZ\e(fg
 <<,,##'-y%: ; %E $I!1!NN#qu{#|}"="A"A$BWBW"X+!++I6!AKKNOBG)>)>? &*"*KK$$!#:< ,,	 KK$$bekk ,,G  `PUWZ[\W] ^__`&  cvyZ]^_Z` abbcs1   A
I1 %A
J" 1
J;JJ"
K,KKc	                    U(       a%  U(       a  U R                  U< SU< SU< S3U5        Sn	Sn
U(       ag   [        R                  " U5      nUR                  (       a>  U R                  R                  U< SU< S
35        U(       d  U R                  SU-  5        OU(       a}   [        R                  " U5      nUR                  (       d/  U R                  R                  U< SU< S35        U(       d  UnSnOSn	U(       a  UnU(       d  U R                  SU-  5        UR                  [        R                  5      nX\:w  a  U(       d  [        R                  " SSS9nSn	U R                  R                  U< SU	< SU< 35        XW[        R                  '   Sn
U(       aK  U(       a&  U R                  R                  U< SU< S35        XZ4$ U R                  R                  SU-  5        XZ4$ ! [         ab     [        R                  " U5      R
                  nU R                  R                  U< SU< S35        Un GN!   [        U< SU< S	35      e= ff = f! [         ab     [        R                  " U5      R
                  nU R                  R                  U< SU< S35        Un GN!   [        U< SU< S	35      e= ff = f)r   z: both group (vxlan-mcastgrp6 z) and remote (vxlan-svcnodeip6 r   r"   Fz: vxlan-svcnodeip6 r   z: invalid vxlan-svcnodeip6 z: must be in ipv4 formatzP: invalid group address, for multicast IP please use attribute "vxlan-mcastgrp6"zM%s: vxlan: 'group' (vxlan-mcastgrp6) requires 'vxlan-physdev' to be specifiedz: vxlan-mcastgrp6 z: invalid vxlan-mcastgrp6 zU: invalid group address, for non-multicast IP please use attribute "vxlan-svcnodeip6"Nr+   z::0   )familyz vxlan-svcnodeip6/vxlan-mcastgrp6r   r   Tz/: vxlan-mcastgrp6 configuration changed (cache r   zI%s: vxlan-mcastgrp6 configuration changed: flapping vxlan device required)r   rX   IPv6AddressrZ   IPv6Networkr   rN   rO   r   r   r   IFLA_VXLAN_GROUP6rY   r   )rA   r[   rR   r   r   r   ro   r   r   r   r   group_ipr   s                rD   __config_vxlan_group6vxlan.__config_vxlan_group6   s    NN$i89AC ,!&q!--e4 !!##cikp%r s
 NN#rv|#}~t%11)<	 ))##'-y%: ; %E $I!2!NN#rv|#}~"="A"A$BXBX"Y+!++E!<!CKKNOCH)?)?@ &*"*KK$$!#:< ,,	 KK$$cfll ,,S  qq(44U;>>HKK''V\^c(de$Eq#agin$oppq(  tt(44Y?BBHKK''U[]f(gh (It#`fhq$rssts=   G4 'I# 4
I ?AIII #
K.AJ66KKc                    U(       a"  UR                   [        R                  -  (       d@  UR                  S5      nU(       d  U R	                  S5      n[
        R                  " U5      nOUR                  [        R                  5      nXTR                  [        R                  5      :w  aH  U R                  R                  UR                  < SU(       a  SOS< 35        XS[        R                  '   g g )Nr$   z: set vxlan-learning r   r   )rc   rd   BRIDGE_PORTrM   r   r   r5   r   r   IFLA_VXLAN_LEARNINGrN   r   rP   )rA   rR   r   r   r   vxlan_learnings         rD   __config_vxlan_learningvxlan.__config_vxlan_learning  s    ("9"9<N<Z<Z"Z%::;KLN!!%!<!<=M!N"::>JN8<<T=U=UVN<<T=U=UVVKKHMMSa4glKlmnES)A)AB WrF   c                    UR                  S5      nU(       d  U(       d  U$ U R                  nU R                  R                  U5      (       d  U R                  R                  UR                  < SU< SU< S35        U R                  R                  US[        R                  S[        R                  S0S9  U R                  R                  U5        U$ )	aF  
vxlan-physdev wrapper, special handling is required for mcastgrp is provided
the vxlan needs to use a dummy or real device for tunnel endpoint communication
This wrapper will get the physdev from user config or policy. IF the device
doesnt exists we create a dummy device.

:param ifaceobj:
:param mcastgrp:
:return physdev:
r(   z: needs a dummy device (z3) to use for multicast termination (vxlan-mcastgrp rW   dummyi>  rb   )r[   kindifla)rM   r@   cacher   rN   r   rP   r   link_add_with_attributesr   IFLA_MTUIFLA_LINKMODElink_up)rA   rR   mcastgrpro   s       rD   __get_vxlan_physdevvxlan.__get_vxlan_physdev  s     //@ (N**zz%%g..KK (wB C LL11wVZVcVcejlpl~l~  AB  VC1  DLL  )rF   c                 V   U(       a   U R                   R                  U5      nXeR                  [        R                  5      :w  an  U R                  R                  UR                  < SU< 35        Xd[        R                  '   U(       a)  U R                  R                  SUR                  -  5        gg! [         ai     [        U R                  R                  SU-  5      5      n N! [         a1    U R                  R                  UR                  < SU< S35          g f = ff = f)Nz/sys/class/net/%s/ifindexz
: physdev z doesn't existsz: set vxlan-physdev zG%s: vxlan-physdev configuration changed: flapping vxlan device requiredTF)r   get_ifindexr   r~   sysfsread_file_onelinerZ   rN   errorrP   r   r   IFLA_VXLAN_LINKr   )rA   r   rR   vxlan_physdevr   r   vxlan_physdev_ifindexs          rD   __config_vxlan_physdevvxlan.__config_vxlan_physdev  s    (,

(>(>}(M% %(G(GH\H\(]]  x}}m!\]EZT-A-AB KK$$%nqyq~q~%~# 3 ,/

0L0LMhkxMx0y,z)  KK%%Xe&fgs)   B5 5
D( 'C))7D$ D(#D$$D(c                    UR                  S5      nUR                  [        R                  -  (       d0  U(       d)  U R                  R                  SUR                  -  5        g UR                  nU R                  R                  U5      nU(       a  U R                  R                  U5      nUS:w  aC  U R                  R                  U< SU< S35        UR                  [        R                  5        g U R                  R                  U5      nO0 n0 nU(       a  U R                  X1X'U5        U R!                  XXv5        U R#                  X1XGU5        U R%                  X1XGU5        U R'                  X1Xv5        U R)                  X1XGU5      nU R+                  US5      n	U R+                  US5      n
U R+                  US5      nU R+                  US	5      nU R-                  X5      nU R/                  UUUUU5      nU R1                  UUUU	U
UUU5      u  nnU R3                  UUUUUUUU5      u  nnU=(       a    U=(       d    U=(       d    UnU(       GaA  U(       a/  [5        U5      S
:  d   U R                  R7                  SU-  5        GOUR                  [        R                  -  (       a  U(       a  U R                  R                  SU-  5        OU R8                  R;                  UU(       a  UR<                  OS U(       a  UR<                  OS UUR?                  [@        RB                  5      5        O` U(       a  U RD                  RG                  U5        U RD                  RI                  X75        U(       a  U RD                  RK                  U5        UR                  [        R                  -  (       Ga%  [R        RT                  " SU-  5      n/ nU(       al  URW                  5       RY                  S5       Vs/ s H  nSU;   d  M  UPM     sn H0  nURY                  5       SS u  nnnnnUR[                  UUU45        M2     U R]                  UR_                  S5      5      n[a        U5      [a        U5      -
  nU H$  u  nnnU R8                  Rc                  UUU5        M&     U H0  u  nnn UUU 4U;  d  M   U R8                  Re                  UUU 5        M2     U Rg                  U5      n!UR_                  S5      n"U"(       a    U" H  n#[h        Rj                  " U#5        M     U!(       d  U"(       Ga  [Q        U5      n$U$(       a  U"(       a  U$U";   a  U"Rm                  U$5        U R8                  Ro                  UR                  U(       a  [Q        UR<                  5      OS 5      n%[a        U%5      n&U"(       a.  [a        U"5      n'U&Rq                  U'5      n(U'Rq                  U&5      n)OU&n(/ n)U( H-  n* U R8                  Rs                  UR                  SS SU*5        M/     U) H-  n* U R8                  Ru                  UR                  SS SU*5        M/     g g ! [L         aV  nU(       a#  U RO                  U< S[Q        U5      < 3U5        O"U RO                  U< S[Q        U5      < 3U5         S nAg S nAff = fs  snf ! [L         aS  nUR                  [        R                  5        U RO                  U< SU< SU < S[Q        U5      < 3SS9   S nAGMj  S nAff = f! [L         a6  nU RO                  UR                  < S[Q        U5      < 35         S nAGN0S nAff = f! [L         a     GM  f = f! [L         a     GM^  f = f)Nr   z.%s: missing vxlan-id attribute on vxlan devicer
   z1: device already exists and is not a vxlan (type rW   r*   r!   r+   r"   rb   z-%s: vxlan already exists - no change detectedz<%s: updating existing single vxlan device is not support yetz : applying vxlan change failed: z: vxlan creation failed: zbridge fdb show dev %s
src_vnir      r,   z: vxlan-mcastgrp-map: =r   F)raise_errorr#   z: vxlan-remoteip: 00:00:00:00:00:00T);rM   rc   rd   re   rN   rO   rP   r   r   get_link_kindr   
set_statusifaceStatusERRORget_link_info_data_vxlan__config_vxlan_id_vxlan__config_vxlan_learning_vxlan__config_vxlan_ageing_vxlan__config_vxlan_port_vxlan__config_vxlan_ttl#_vxlan__config_vxlan_local_tunnelip_vxlan__get_vxlan_attribute_vxlan__get_vxlan_physdev_vxlan__config_vxlan_physdev_vxlan__config_vxlan_group_vxlan__config_vxlan_group6rk   r   iproute2link_add_single_vxlanr   r   r   r   r   link_down_forcelink_add_vxlan_with_info_datalink_up_forcerZ   r   r   r   exec_commandstripsplitappendget_vxlan_fdb_src_vnirj   setbridge_fdb_del_src_vnibridge_fdb_add_src_vni_vxlan__get_vlxan_purge_remotesrX   r   removeget_vxlan_peers
differencebridge_fdb_delbridge_fdb_append)+rA   rR   r   r[   r   device_link_kindr   r   r   vxlan_mcast_grpvxlan_svcnodeipvxlan_mcast_grp6vxlan_svcnodeip6r   vxlan_physdev_changedr   multicast_group_changedgroup6multicast_group_changed6flap_vxlan_devicer   vxlan_fdb_datacurrent_fdblineentrymac_dstr   user_config_fdbfdb_to_removevnidst_ipvxlan_purge_remotes	remoteipsremoteip	local_strpeers	cur_peers	new_peersdel_listadd_listaddrs+                                              rD   _up	vxlan._up  s   44Z@&&);)H)HHQ]KK PS[S`S` `ajj,,V4#zz77?7*!!/1 ##K$5$56 +/***G*G*O'*,'')$""6\a|}$$X<Xv""6[`{|  ;^yz2Nl226[  qL  M44X?OP44X?PQ55h@QR55h@RS00K $ ; ;('!
 *.)B)B('	*
&& ,0+E+E('	,
(( (z-D-yH`-ydy'3'C#Dq#H   !PSY!YZ**-?-L-LL"++,jms,st;;"(-EHH4(-EHH4)8<<T=Q=QR, LL88@BB6h, LL66v> ""%7%D%DDD"//0H60QRNK 0>/C/C/E/K/KD/Qg/QtU^bfUfd/QgE.3kkmAa.@+CCG&&Wc':; h #889P9PQe9fgO,s?/CCM,S!44VS#F  - )8$Wf&)<C<<VWfU )8 #<<XF++,<=	S )H))(3 !*
 ) E
IY9	+A  +MM11(--RWUXX]abEE
I	N	$//	:$//	:$ MM00 +dD ! !MM33 +dD != #,Y % & NNU[]`ab]c+dfno NNfVYZ[V\+]_gh h % C ++K,=,=>fV]_egjklgm'n  }B  C  CC  S8==#a&QRRS< !  ! s{   8AY =
Z8Z8>Z=	\ 3)] &)]2
Z5AZ00Z5=
\A\\
]'+]] 
]/.]/2
^ ^c                     / nU =(       d    /  H@  nUR                  5        H)  nUR                  S5      u  pEUR                  SXE45        M+     MB     U$ )Nr   r   )r  r  )vxlan_mcast_grp_mapfdbsr.  vni_ipr   r5  s         rD   r  vxlan.get_vxlan_fdb_src_vni  sR    (.B.E++-"(,,s"30'BC ( / rF   c                      U R                   R                  UR                  5        g ! [         a$  nU R	                  [        U5      5         S nAg S nAff = fN)r   link_delrP   rZ   rl   r   )rA   rR   r   s      rD   _downvxlan._down  s@    	"LL!!(--0 	"MM#a&!!	"s   %( 
AAAc                     U R                  U5      (       d  g U(       a  X4:X  a  UR                  X#S5        g UR                  X$S5        g Nr   rb   )rM   update_config_with_status)rR   ifaceobjcurrattrnameattrvalrunning_attrvals        rD   _query_check_n_updatevxlan._query_check_n_update  s>    ,,X66w9228aH228aPrF   c                    U(       aW  U H.  nXC;   a  U R                  XS5        M  U R                  XS5        M0     [        U5      R                  [        U5      5      nU Vs/ s H  o@R                  XS5      PM       ng s  snf rM  )rN  r  r  )rO  rP  	addressesrunning_addressesas        rD   _query_check_n_update_addresses%vxlan._query_check_n_update_addresses  sx    ) ::8J ::8J	 
 !$$5 6 A A47	N!DIZ[IZA	/	/Q	?IZ[[s   #Bc                 b  ^  UR                   nT R                  R                  U5      (       d  g T R                  R                  U5      nU(       d"  UR	                  UT R                  5       S5        g S[        R                  [        4S[        R                  [        4S[        R                  [        4S[        R                  [        4S[        R                  [        R                  4S[        R                  [        R                   4S[        R                  [        R                  4S	[        R                  [        R                   4S
[        R"                  U 4S j4S[        R$                  S 44
 Hn  u  pVnUR'                  U5      nU(       d  M   UR)                  U5      n	 U" U5      n
X:X  a  UR3                  XXS5        MS  UR3                  XY=(       d    SS5        Mp     UR)                  [        R4                  5      nUR'                  S5      nU(       d  T R6                  nUR9                  SU5        [1        U5      T R:                  :X  a  T R:                  nT R=                  UUS[1        U5      U(       a  [1        UR>                  5      OS 5        T RA                  U5      nU(       d  URC                  S5      (       a  UR)                  [        R                  5      nT RE                  USURC                  S5      T RF                  RI                  UR                   U(       a  [1        UR>                  5      OS 5      5        g g ! [*         aV  nT R,                  R/                  U< SU< S[1        U5      < 35        UR3                  XY=(       d    SS5         S nAGM3  S nAff = f)Nr   r)   r'   r%   r*   r+   r!   r"   r(   c                 :   > TR                   R                  U 5      $ rH  )r   r   )xrA   s    rD   <lambda>$vxlan._query_check.<locals>.<lambda>  s    $**BXBXYZB[rF   r$   c                 .    [         R                  " U 5      $ rH  )r   r5   )boolean_strs    rD   r_  r`    s    QVQnQnozQ{rF   r   Nonerb   r   r    r#   )%rP   r   r   r  &check_n_update_config_with_status_manyget_mod_attrsr   r   r~   r   r   r   r   rX   r   r   r   r   r   rM   r   rZ   rN   rO   r   rN  r   r<   update_configr=   rS  r   r  rj   rY  r  r  )rA   rR   rO  r[   r   vxlan_attr_strvxlan_attr_nlcallable_typer   cached_vxlan_attr_valuevxlan_attr_value_nlr   rR  rQ  rx   cached_svcnodes   `               rD   _query_checkvxlan._query_check  s   zz%%f--&*jj&C&CF&K#*??$J\J\J^`bc T//5d1137t33S9!7!7=!4#8#8):O:OP"D$:$:I<Q<QR"D$9$99;P;PQ#T%;%;Y=R=RS $"6"68[\!4#;#;={|=
8N=  (<<^L#&A&E&Em&T#&34D&E# #=66~YZ[66~Ghbhjkl;=
D 699$:O:OP//0FG00G""#97C4#?#??22G"""L'6C""#D	
 66x@H334DEE
 9<<T=R=RSN00 ''(89--hmmWeSARAR=Skop	 FI  ##FNCPQF$ST66~Ghbhjkls   (M
N.A
N))N.c                 \   UR                   nU R                  R                  U5      (       d  g U R                  R                  U5      S:X  d  g U R                  R	                  U5      nU(       d  g UR                  [        R                  5      nU(       d  g UR                  S[        U5      5        UR                  [        R                  5      nU(       a  UR                  SU5        UR                  [        R                  5      nU(       a  [        U5      nUR                  SU5        U R                  S 5      nU(       aC  U R                  R                  X&5      nU(       a!  U V	s/ s H  oR                  SU	5      PM       n	S[        R                  U R                   4S[        R"                  [        4S[        R$                  S	 4S
[        R&                  [        44 H>  u  pnUR                  U5      nUc  M  U" U5      nU(       d  M-  UR                  X5        M@     g s  sn	f )Nr
   r   r'   zvxlan-svcnoder#   r(   r%   r$   c                     U (       a  S$ S$ )Nr   r    )values    rD   r_  &vxlan._query_running.<locals>.<lambda>:  s    SX4Kc^cKcrF   r    )rP   r   r   r   r  r   r   r   rf  r   r   r   r  r  r  r   _get_ifname_for_ifindexr   r   r   )rA   ifaceobjrunningr[   r   r   r   vxlan_svcnode_valuerx   rQ  rX  vxlan_attr_namerh   callable_netlink_value_to_stringr   vxlan_attr_value_strs                  rD   _query_runningvxlan._query_running  s    %%zz%%f--zz''/7:&*jj&C&CF&K#*
 /2243E3EF%%j#h-@
 144T5I5IJ
)),
C
 :==d>S>ST"%&9":))/;NO
 66t< mm33FPGMTUW../?CWU !$"6"68T8TU!7!7=!4#;#;=cd')>)>D	Q
LO,L  ;>>}M+'GHX'Y$###11/XQ
 Vs   ,H)c                 Z     U R                   R                  U5      $ ! [         a     gf = f)z~
we need this middle-man function to query the cache
cache.get_ifname can raise KeyError, we need to catch
it and return None
N)r   
get_ifnameKeyError)rA   ifindexs     rD   rt  vxlan._get_ifname_for_ifindexE  s.    	::((11 		s    
**)zpre-upz	post-downquery-runningquery-checkcurrc                 H    [        U R                  R                  5       5      $ rH  )list_run_opskeysrH   s    rD   get_opsvxlan.get_opsW  s    DMM&&())rF   c                    U R                   R                  U5      nU(       d  g US:w  a  U R                  U5      (       d  g U R                  (       dp  U R                  (       a_  U R
                  R                  U R                  5      (       a5  U R                  R                  U R                  5        U R                  5         US:X  a
  U" XU5        g U" X5        g )Nr  r  )
r  r   rL   r>   r@   r   r   r   rI  rI   )rA   rR   	operationquery_ifaceobj
extra_args
op_handlers         rD   run	vxlan.runZ  s    ]]&&y1
'((22**00

..t/G/GHH%%d&>&>?

))t~6t&rF   )r=   r<   r;   r>   r@   rH  )(r:   
__module____qualname____firstlineno___modinfor?   r4   rI   rT   rQ   rp   ri   staticmethodrL   r  r   r  r   r  r  r  r  r	  r  r  r  r
  r  r@  r  rJ  rS  rY  rm  rz  rt  r  r  r  __static_attributes__rq  rF   rD   r
   r
   &   sc   < #"J/ *+	 0&Z@A% #&Z;<  ,&ZCD! *&Z:;!	 07/0 	 ,"Fm./ 	 >#T]56$ G-."Gn!	 001
1!5\*+ 0$X:; 0%Y67  H23RS#QM
PHd &/"1.(

@?
 G G[0c6
L,_\]B6p	 a-Fc-JT:.}~  " Q Q 	\ 	\QfGYR	 ''	H*'rF   r
   )!ifupdown2.nlmanager.ipnetwork	nlmanagerrX    ifupdown2.ifupdown.policymanagerifupdownr6    ifupdown2.ifupdown.ifupdownflagsifupdownflagsifupdown2.lib.addonr   ifupdown2.lib.nlcacher   ifupdown2.nlmanager.nlmanagerr   ifupdown2.ifupdown.ifaceifupdown2.ifupdown.utilsr   ifupdown2.ifupdownaddons.cache#ifupdown2.ifupdownaddons.modulebaser   ImportErrorModuleNotFoundErrornlmanager.ipnetworkifupdown.policymanagerifupdown.ifupdownflags	lib.addonlib.nlcachenlmanager.nlmanagerifupdown.ifaceifupdown.utilsifupdownaddons.cacheifupdownaddons.modulebaser
   rq  rF   rD   <module>r     sv   555<<<<)E2*.0>$F'E: F'# 	() 5+22;( $&45s   AA ABB