
    ʖ%i!                         d dl Z d dlZd dlZdZdddZddddZ G d	 d
e      Z G d de      Zd Z	 e	       Z
d Zd Zd Zd Zd Zd Zd Zd Zy)    Nz	ovs-vsctl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                  j                  dt        z         s&t         j                  j                  dt        z         s	dt        z   S dt        z   S )Nz	/usr/bin/z
/snap/bin/)ospathexistsOPENVSWITCH_OVS_VSCTLr   r   r   _ovs_vsctl_pathr   .   sF    	ww~~k"778|,AAB000111r   c                  H    t         j                  j                  t              S N)r   r   r   OVS_VSCTL_PATHr   r   r   _ovs_installedr   9   s    77>>.))r   c                  |    t        j                  t        dgt         j                  t         j                        dk(  S )Nshow)stdoutstderrr   )
subprocesscallr   DEVNULLr   r   r   _ovs_activer$   =   s-    ??NF3J<N<NWaWiWijnooor   c                 n   t         j                  |      }|It        d| |||g}t        j                  ddj                  |      z         t        j                  |       y|rS||k7  rMt        d| ||d|g}t        j                  ddj                  |      z         t        j                  |       yyy)z2Cleanup values from a column (i.e. "column=value")NremoveRunning: %s set=)DEFAULTSgetr   loggingdebugjoinr!   
check_call)typeifacecolumnvaluedefaultcmds         r   _del_colr7   A   s    ll6"GxufeDmchhsm34c"	W%udEfg3NOmchhsm34c"	 &r   c           	          t         d| |||d|dg}t        j                  ddj                  |      z         t	        j
                  |       y)z:Cleanup values from a dictionary (i.e. "column:key=value")r&   z=""r'   r(   N)r   r-   r.   r/   r!   r0   )r1   r2   r3   keyr4   r6   s         r   	_del_dictr;   P   sB     8T5&e:T
UCMM-#((3-/0#r   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r   r   ).0itemouts     r   	<genexpr>z_del_global.<locals>.<genexpr>r   s     8tts{8s   ,zReset command unknown for:)
GLOBALSr,   r   appendr!   check_outputallsplitr0   	Exception)	r1   r2   r:   r4   del_cmdget_cmdargs_getargs_delrB   s	           @r   _del_globalrO   X   s    {{35GW)"G,"G,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/      globalr&   external-idsN)rI   lenrO   r;   r7   r!   r0   r   )r1   r2   settingr4   rI   cols         r   clear_settingrY   x   s    MM#q!E
(C
h3u:>D%q51	Ua$uQxq59ueAh.>8T5.RYZ[r   c                 p    t        |t              sJ |j                  | d       }|xr |j                  dk(  S )NOpenVSwitch)
isinstancedictr,   backend)r2   np_interface_dictnp_defs      r   is_ovs_interfacera      s9    '...""5$/F5fnn55r   c                 f   t               st        d      t               st        d      | j	                          t               }| j                  j                         D ]*  }t        || j                        s|j                  |       , d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 ]<  }|j'                  d      sd |v s|j                  d d      \  }}t)        ||||       >   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 OpenvSwitch cleanup: ovs-vsctl is 'not-found'z#OpenvSwitch database is not running))Portzdel-port)Bridgedel-br)	Interfacere   z--columns=name,external-idsz-fcsvz-dbarez--no-headingslistr   Tr=   znetplan=truerD   rf   z	br-existsz--if-existszdel-bond-ifacerS   )rc   rd   rf   Open_vSwitch
Controllerzname,external-idsrj   rU   rk   z_uuid,external-idsz--columns=%sznetplan/.r9   r(   r*   N)r   r   r$   r   parser)   netdefskeysra   addr!   rG   r   
splitlinesrI   run
returncoder0   strip
startswithrY   )config_managerovs_oldovs_current
ovs_ifacesitrB   liner2   colsextidsentryrW   vals                 r   apply_ovs_cleanupr      sa    %&bcc=#$IJJJ##((* Q 6 67NN1 S X%%~7T'+UD&/SY[\]^[_'a+/1 NN$ 		XD%

3*J&Q4;&:>>>;X]:^+_+j+jmn+n))>=JZ\a*bc))>=!A$PU*VW		X	X  K >"!D,'D%%~~7L'+UD&/SY[\'^+/1 NN$ 	>DT!&$(JJsA$6ME6 $\\#.44S9 >E''
3u',{{3':%a=>	>>r   )r-   r   r!   r   r+   rE   rJ   r   r   r   r   r   r$   r7   r;   rO   rY   ra   r   r   r   r   <module>r      s   $  	 # 
 % &7:		I 		i 	2 !"*p#;@\6=>r   