
    *Ce!                         d dl Z d dlZd dlZd dlZddlmZmZ dZdZdddZ	dd	d
dZ
 G d de      Z G d de      Zd Zd Zd Zd Zd Zd Zd Zy)    N   )systemctl_is_activesystemctl_is_installedz/usr/bin/ovs-vsctlzovsdb-server.servicefalse)mcast_snooping_enablerstp_enable)del-sslzget-ssl)zdel-fail-modezget-fail-mode)zdel-controllerzget-controller)zset-sslzset-fail-modezset-controllerc                       e Zd Zy)OvsDbServerNotRunningN__name__
__module____qualname__     )/usr/share/netplan/netplan_cli/cli/ovs.pyr   r   *       r   r   c                       e Zd Zy)OvsDbServerNotInstalledNr   r   r   r   r   r   .   r   r   r   c           	          t         j                  |      }| t        j                  t        d| |||g       y|r*||k7  r$t        j                  t        d| ||d|g       yyy)z2Cleanup values from a column (i.e. "column=value")Nremoveset=)DEFAULTSget
subprocess
check_callOPENVSWITCH_OVS_VSCTL)typeifacecolumnvaluedefaults        r   _del_colr$   2   sd    ll6"G4heVUZ[\	W%4eT5U[]dJefg &r   c                 V    t        j                  t        d| |||t        |      g       y)z:Cleanup values from a dictionary (i.e. "column:key=value")r   N)r   r   r   _escape_colon)r   r    r!   keyr"   s        r   	_del_dictr(   =   s*     0(D%QTVcdiVjklr   c                 0    t        j                  dd|       S )Nz([^\\]):z\g<1>\:)resub)literals    r   r&   r&   D   s    66+z733r   c                 j   t         j                  |d      \  }}|dk(  rd}|rt        |g}t        |g}|r"|j                  |       |j                  |       t	        j
                  |d      t        fd|j                  d      D              rt	        j                  |       yyt        d|      )	z*Cleanup commands from the global namespace)NNr	   NTtextc              3   &   K   | ]  }|v  
 y w)Nr   ).0itemouts     r   	<genexpr>z_del_global.<locals>.<genexpr>b   s     8tts{8s   ,zReset command unknown for:)
GLOBALSr   r   appendr   check_outputallsplitr   	Exception)	r   r    r'   r"   del_cmdget_cmdargs_getargs_delr3   s	           @r   _del_globalr@   H   s    {{35GW))73)73OOE"OOE" %%hT: 8u{{3'788!!(+ 9 4c::r   c                 $   |j                  dd      }|d   }|dk(  r t        |      dkD  rt        | ||d   |       n5t        |      dkD  rt        | ||d   |d   |       nt	        | ||d   |       t        j                  t        d| |d|g       y)zDCheck if this setting is in a dict or a colum and delete accordingly/   r   globalr   external-idsN)r:   lenr@   r(   r$   r   r   r   )r   r    settingr"   r:   cols         r   clear_settingrI   h   s    MM#q!E
(C
h3u:>D%q51	Ua$uQxq59ueAh.0(D%Y`abr   c                 p    t        |t              sJ |j                  | d       }|xr |j                  dk(  S )NOpenVSwitch)
isinstancedictr   backend)r    np_interface_dictnp_defs      r   is_ovs_interfacerQ   v   s9    '...""5$/F5fnn55r   c                 ,   t        t              st        dt        z        t        t              st	        dj                  t                    | j                          t               }| j                  j                         D ]*  }t        || j                        s|j                  |       , t        j                  j                  t              rdD ]  }t!        j"                  t        dddddd	d
|d   g	d      }|j%                         D ]  }d|v s|j'                  d      d   }||v r!|d   dk(  rGt!        j(                  t        d|g      j*                  dkD  rt!        j,                  t        dd|g       pt!        j,                  t        d|d   |g         dD ]  }d}	|dk(  rd}	n|dk(  rd}	t!        j"                  t        d|	z  ddddd	d
|g	d      }|j%                         D ]  }d|v sd}|}
|dk7  r|j'                  dd      \  }}
|
j/                  d      j'                  d      D ]<  }|j1                  d      sd |v s|j'                  d d      \  }}t3        ||||       >   y"|s|rt5        j6                  d!       y"y")#aQ  
    Query OpenVSwitch state through 'ovs-vsctl' and filter for netplan=true
    tagged ports/bonds and bridges. Delete interfaces which are not defined
    in the current configuration.
    Also filter for individual settings tagged netplan/<column>[/<key]=value
    in external-ids and clear them if they have been set by netplan.
    z+Cannot apply OVS cleanup: %s is 'not-found'z{} is not running))Portzdel-port)Bridgedel-br)	InterfacerU   z--columns=name,external-idsz-fcsvz-dbarez--no-headingslistr   Tr.   znetplan=truer5   rV   z	br-existsz--if-existszdel-bond-ifacer   )rS   rT   rV   Open_vSwitch
Controllerzname,external-idsrZ   rE   r[   z_uuid,external-idsz--columns=%sznetplan/." r   zAovs-vsctl is missing, cannot tear down old OpenVSwitch interfacesN)r   OPENVSWITCH_OVSDB_SERVER_UNITr   r   r   formatparser   netdefskeysrQ   addospathisfiler   r   r8   
splitlinesr:   run
returncoder   strip
startswithrI   loggingwarning)config_managerovs_oldovs_current
ovs_ifacesitr3   liner    colsextidsentryrG   vals                 r   apply_ovs_cleanuprz   |   s    ""?@%&S&C'D E 	E<=#$7$>$>?\$]^^J##((* Q 6 67NN1 
ww~~+,V 	cA))+@B_+/foW]_`ab_c+e/35C ( 	c!T) JJsOA.E
* t{*z~~?TVach>i/j/u/uxy/y"--/DmUegl.mn"--/DmUVWXUY[`.ab	c		c  O 	BA&DN"%l"+))+@.SWBW+/foW]_`+b/35C ( B%E!FN*(,

3(:v "(c!2!8!8!= B ++J7C5L+0;;sA+>LGS)!UGSABB	B0 
K[\  r   )rm   re   r   r*   utilsr   r   r   r_   r   r6   r;   r   r   r$   r(   r&   r@   rI   rQ   rz   r   r   r   <module>r|      s   $  	  	 >,  6 
 % &7:		I 		i 	hm4;@c6B]r   