
    /I_%                          S SK Jr  S SK7  S SKJr  S SKJr  S SKJr  S SK	J
s  Jr  S SKrS SKrS SKrS SKr " S S\\5      rg! \ a&    S SKJr  S SK7  S SKJr  S SKJr  S SKJr  S SKJr   NHf = f)	    )Addon)*)utils)
moduleBase)moduleNotSupportedNc            
           \ rS rSrSr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.rS rS rS rS r	S-S  jr
S! rS" rS# rS.S% jrS& rS' rS( r\\\S).rS* rS.S+ jrS,rg$)/openvswitch   z7ifupdown2 addon module to configure Openvswitch bridge z0openvswitch module configure openvswitch bridgesz)Interfaces to be part of this ovs bridge.z<interface-list>FT)z$ovs-ports swp1.100 swp2.100 swp3.100zovs-ports glob swp1-3.100z ovs-ports regex (swp[1|2|3].100))help	validvalsrequired
multivalueexamplezovs interface type	OVSBridge)r   r   r   z)Interface MTU (maximum transmission unit)5529216zovs-mtu 16001500)r   
validranger   defaultz?This option lets you add extra arguments to a ovs-vsctl command)r   r   a  This option lets you run additional ovs-vsctl commands,separated by "--" (double dash). Variables can be part of the "ovs_extra"option. You can provide all the standard environmental variablesdescribed in the interfaces(5) man page. You can also pass shellcommands.extra argszuovs_extra set bridge ${IFACE} other-config:hwaddr=00:59:cf:9c:84:3a -- br-set-external-id ${IFACE} bridge-id ${IFACE})r   r   r   zGovs ports to ignore/condone when reloading config / removing interfacesz2ovs-ports-condone-regex ^[a-zA-Z0-9]+_v[0-9]{1,4}$)	ovs-portsovs-typeovs-mtuovs-options	ovs-extraovs-ports-condone-regex)mhelpattrsc                     [         R                  " U /UQ70 UD6  [        R                  " U 5        [        R                  R                  S5      (       d  [        S5      eg )N/usr/bin/ovs-vsctlz/module init failed: no /usr/bin/ovs-vsctl found)r   __init__r   ospathexistsr   )selfargskargss      */usr/share/ifupdown2/addons/openvswitch.pyr    openvswitch.__init__P   sK    T2D2E2tww~~233$%VWW 4    c                 D    UR                  S5      nU(       a  US:X  a  ggg)Nr   r   TF)get_attr_value_first)r$   ifaceobjovstypes      r'   _is_ovs_bridgeopenvswitch._is_ovs_bridgeV   s&    //
;+%r)   c                     / nUR                  S5      =(       d    /  H"  nUR                  UR                  5       5        M$     U(       a+  U R                  UR                  SR                  U5      5      $ g )Nr    )get_attr_valueextendsplitparse_port_listnamejoin)r$   r,   	ovs_portsports       r'   _get_ovs_portsopenvswitch._get_ovs_ports_   s`    	++K8>B>DTZZ\* ? ''sxx	7JKKr)   c                 z    [         R                  " SU-  5      nU(       a  [        UR                  5       5      nU$ g )Nz /usr/bin/ovs-vsctl list-ports %s)r   exec_commandsorted
splitlines)r$   ifaceoutputr8   s       r'   _get_running_ovs_ports"openvswitch._get_running_ovs_portsj   s7    ##$F$MNv0023Ir)   c                 x    UR                  S5      nU(       a"  U(       a  U$ [        R                  " SU-  5      $ g )Nr   %s)r+   recompile)r$   r,   
get_stringovs_port_condone_regexs       r'   _get_ovs_port_condone_regex'openvswitch._get_ovs_port_condone_regexq   s8    !)!>!>?X!Y!--::u'==>>r)   c                    U(       Ga  UR                   (       a  UR                   OS[        R                  S'   UR                   (       a  UR                   OS[        R                  S'   UR                  (       a  UR                  OS[        R                  S'   UR                  (       a  SR                  UR                  5      OS[        R                  S'   SnU H  nUS-   U-   nM      U R                  R                  S	U-  5        [        R                  " U5        g g ! [        R                   a"  n[        S
U< SUR                  < 35      eS nAf[         a  n[        SU-  5      eS nAff = f)N IFACELOGICALMETHOD,ADDRFAMr   z -- z
Running %sz	Command "z	 failed: rE   )r6   r!   environaddr_methodaddr_familyr7   loggerdebugr   exec_user_command
subprocessCalledProcessError	ExceptionrA   )r$   r,   cmdlistfinalcmdcmdces          r'   
_ovs_vsctlopenvswitch._ovs_vsctly   s   3;==(--bBJJw5=]]HMMBJJy!;C;O;O8#7#7UWBJJx FNFZFZCHHX-A-A$B`bBJJy!+H#f,s2 +!!<8#<=''1  00 Sh!QRR +**+s$   ,4D" "E36EE3 E..E3c                 R   UR                   nUR                  S5      nUR                  S5      nUR                  S5      nU R                  U5      n/ nSU-  nUR	                  U5        U(       a  SU< SU< 3nUR	                  U5        U R
                  R                  U5      (       a  U R                  U5      n	U R                  U5      n
/ nU
b#  U	b   [        [        U
5      [        U	5      -
  5      nUbp  U Hj  nU(       aE  UR                  U5      (       a/  U R                  R                  UR                   < SU< S35        MO  S	U< SU< 3nUR	                  U5        Ml     S
U-  nUR	                  U5        SU-  nUR	                  U5        Ub  UR                  U5        Ub  SU< SU< 3nUR	                  U5        U R                  X5        U R
                  R                  UR                   5      (       d'  U R                   R#                  UR                   S5        g g )Nr   r   r   z--may-exist add-br %szset bridge r1   z: port z> will stay enslaved as it matches with ovs-ports-condone-regexz--if-exists del-port z--if-exists clear bridge %s auto_attach controller external-ids fail_mode flood_vlans ipfix mirrors netflow other_config protocols sflowzL--if-exists clear interface %s mtu_request external-ids other_config optionszset Interface z mtu_request=r	   )r6   r+   r2   rJ   appendcachelink_existsr:   rB   listsetmatchrV   infor3   ra   iproute2link_add_openvswitch)r$   r,   r@   
ovsoptionsovsextraovsmtuovsportscondoneregexcmd_listr^   r8   running_ovs_portsmissingportsr9   s                r'   
_addbridgeopenvswitch._addbridge   s   22MB
**;7..	:#??I%u-',j9COOC  ::!!5))++H5I $ ; ;E BL ,1F#C(9$:S^$KL'(D+0D0J0J40P0P((  yA  yF  yF  HL  *M  N 8=tDCOOC( ) ]  _d  eCOOC  abghCOOC OOH%5:FCCOOC +zz%%hmm44MM..x}}mL 5r)   c                 F    SUR                   -  nU R                  X/5        g )Nz	del-br %s)r6   ra   )r$   r,   r^   s      r'   
_delbridgeopenvswitch._delbridge   s    8==)%(r)   Nc                 x    U R                  U5      (       d  g U=R                  [        R                  -  sl        g N)r.   link_privflagsifaceLinkPrivFlagsOPENVSWITCH)r$   r,   ifaceobjs_alls      r'   get_dependent_ifacenames$openvswitch.get_dependent_ifacenames   s1    ""8,,#5#A#AAr)   c                 &    U R                  U5        g rz   )rt   r$   r,   s     r'   _upopenvswitch._up   s    "r)   c                     [         R                  R                  (       d+  U R                  R	                  UR
                  5      (       d  g U R                  U5        g rz   )ifupdownflagsflagsPERFMODEre   rf   r6   rw   r   s     r'   _downopenvswitch._down   s8    ""++DJJ4J4JHMM4Z4Z"r)   c                 Z    U R                   R                  UR                  5      (       d  g g rz   )re   rf   r6   )r$   r,   ifaceobjcurrs      r'   _query_checkopenvswitch._query_check   s!    zz%%x}}55r)   )zpre-upz	post-downquery-checkcurrc                 6    U R                   R                  5       $ )z-returns list of ops supported by this module )_run_opskeys)r$   s    r'   get_opsopenvswitch.get_ops   s    }}!!$$r)   c                     U R                   R                  U5      nU(       d  gUS:w  a  U R                  U5      (       d  gUS:X  a
  U" XU5        gU" X5        g)a  run openvswitch configuration on the interface object passed as argument

Args:
    **ifaceobj** (object): iface object

    **operation** (str): any of 'pre-up', 'post-down', 'query-checkcurr',
                         'query-running'
Kwargs:
    **query_ifaceobj** (object): query check ifaceobject. This is only
        valid when op is 'query-checkcurr'. It is an object same as
        ifaceobj, but contains running attribute values and its config
        status. The modules can use it to return queried running state
        of interfaces. status is success if the running state is same
        as user required state in ifaceobj. error otherwise.
Nzquery-runningr   )r   getr.   )r$   r,   	operationquery_ifaceobj
extra_args
op_handlers         r'   runopenvswitch.run   sT      ]]&&	2
(1D1Dh1O1O))7'r)    )Frz   )__name__
__module____qualname____firstlineno____doc___modinfor    r.   r:   rB   rJ   ra   rt   rw   r   r   r   r   r   r   r   __static_attributes__r   r)   r'   r	   r	      s    C D D01!"
 -)]  D$fo*+!	 Z!
.
 " T  U	 f % TU(K*
-H^X	+,5Mn)
## 'H%(r)   r	   )ifupdown2.lib.addonr   ifupdown2.ifupdown.ifaceifupdown2.ifupdown.utilsr   #ifupdown2.ifupdownaddons.modulebaser   ifupdown2.ifupdown.exceptionsr    ifupdown2.ifupdown.ifupdownflagsifupdownr   r[   	lib.addonifupdown.ifaceifupdown.utilsifupdownaddons.modulebaseifupdown.exceptionsifupdown.ifupdownflagsloggingrF   rY   r!   r	   r   r)   r'   <module>r      s`   3)*.>@<<  	  	e(% e(  3 $4623s   &A )A10A1