
    g4P                         d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
mZmZ ddlmZ ddlmZmZmZ d	Zd
Z G d de	j*                        Zy)znetplan apply command line    N   )utils   )ConfigManagerConfigurationError)apply_sriov_config)OvsDbServerNotRunningOvsDbServerNotInstalledapply_ovs_cleanupznetplan-ovs-cleanup.service   c                   z     e Zd Z fdZd Zd	dZeg fd       Zedefd       Z	ed
d       Z
ed
d       Z xZS )NetplanApplyc                 T    t         |   ddd       d| _        d| _        d | _        y )Napplyz.Apply current netplan config to running systemT)
command_iddescriptionleafF)super__init__
sriov_onlyonly_ovs_cleanupstate)self	__class__s    4/usr/share/netplan/netplan_cli/cli/commands/apply.pyr   zNetplanApply.__init__+   s5    G%U" 	 	$   %
    c                    | j                   j                  ddd       | j                   j                  ddd       | j                   j                  dd	       | j                  | _        | j	                          | j                          y )
Nz--sriov-only
store_truez0Only apply SR-IOV related configuration and exit)actionhelpz--only-ovs-cleanupz1Only clean up old OpenVSwitch interfaces and exitz--statez0Directory containing previous YAML configuration)r    )parseradd_argumentcommand_applyfunc
parse_argsrun_command)r   s    r   runzNetplanApply.run3   s      &X 	! 	Z  !5l&Y 	! 	[  &X 	! 	Z &&	r   c                    t               }|r|| _        | j                  rt        j	                  ||       y | j
                  rt        j                  |dd|       y dt        j                  v r{t        j                  d      }|t        d      t        j                  |ddddd	dd
g      }|dk7  r6|rt        j                  |       n|dk(  rt!        d      t        d|z        y d}t#        t%        j$                  d            }	t%        j$                  d      }
||
v r|
j'                  |       t#        |
      }t%        j$                  d      }t)        j*                  |t)        j,                               }t#        |      }g }d }dt        j                  v r#|j/                  ddg       t        j0                  }|j3                  t)        j4                                |rKt        j                  ||      dk7  r1|r$t        j                  t        j6                         nt9        d      t)        j,                         }t#        t%        j$                  d            }|s|	rd}t%        j$                  d      }||v r|j'                  |       t#        |      }|s|rd}t%        j$                  d      }|j;                  t)        j*                  ||             t#        |      }|s|rd}|rt)        j<                          |rIt?        j@                  d       t        j                  ||||       dg}t)        jB                  d||       nt?        j@                  d       d}|rt?        j@                  d       t)        jD                         rkd |v rt)        jF                  d       }|D ]   }||vr	 t)        jH                  d!d"|g       " t)        jL                  d|       nt?        j@                  d#       t)        j,                         }|jO                          t        jQ                  ||      }| j                  rpt        | j                        }|jO                          |jR                  jU                         }|jR                  jU                         }t        jW                  |||       t)        j,                         }|D ]  }t?        j@                  d$|       	 t        jX                  d%d&d'd(|z   gt        jZ                  t        jZ                  )       t        jX                  d%d*d(|z   gt        jZ                  t        jZ                  )        t)        j,                         }|j]                         D ]  \  }} | j_                  d,      }!|!sta        |!      tb        k\  r&t?        jd                  d-jg                  |!|             S||v r*|!|v r&t?        j@                  d.jg                  ||!             t        jX                  d/d0d1d2|d3gt        jZ                  t        jZ                  )       t        jX                  d/d0d1d2|d,| j_                  d,      gt        jZ                  t        jZ                  )        t        jX                  g d4       	 t        jX                  g d5       t        j	                  ||       t        jh                  jk                  d7      rt)        jB                  d8d9g       |r
t%        j$                  d:      D #cg c]!  }#t        jh                  jm                  |#      # }$}#t%        j$                  d;      D #cg c]9  }#|#jo                  d<tp        z         st        jh                  jm                  |#      ; }%}#	 t)        jr                          t)        jt                  t)        jv                                t)        jB                  d8tp        gd       t)        jB                  d8|$|%z   d       |rt)        j*                  ||      }&|&D ]  }t)        jx                  |        t        jz                  d@dA       t)        jL                  d8|       d |&v rd}|rg dB}'t}        dC      D ]m  }(t        j~                  |'ddD      })|)j                  dEk(  rt        j                  dF       @dGt        |)j                        v r nt        j                  dH       o d |&v r|rt)        j                  |       y y y y # t        jJ                  $ r Y w xY w# t        jJ                  $ r t?        j@                  d+|       Y w xY w# t        jJ                  $ r/}"t?        jd                  d6jg                  |"             Y d }"~"d }"~"ww xY wc c}#w c c}#w # t        jJ                  $ r2 t?        jd                  d=       t)        jB                  d>d?gd       Y w xY w)INFSNAPbusctlzmissing busctl utilitycallz--quietz--systemzio.netplan.Netplanz/io/netplan/NetplanApplyr      z'failed to communicate with dbus servicez1failed to communicate with dbus service: error %sz//run/systemd/system/netplan-ovs-cleanup.servicez/run/systemd/network/*netplan-*z!/run/systemd/system/netplan-ovs-*z0/run/NetworkManager/system-connections/netplan-*NETPLAN_PROFILEvalgrindz--leak-check=full)stderrz(the configuration could not be generatedTzDnetplan generated networkd configuration changed, reloading networkdznetplan-wpa-*.servicestop)syncz2no netplan generated networkd configuration exists z9netplan generated NM configuration changed, restarting NMlodevice
disconnectz,no netplan generated NM configuration existsz%netplan triggering .link rules for %sudevadmztest-builtinnet_setup_linkz/sys/class/net/)stdoutr0   testz#Ignoring device without syspath: %snamez5Interface name {} is too long. {} will not be renamedz+Interface rename {} -> {} already happened.iplinksetdevdown)r7   controlz--reload)r7   triggerz--action=movez--subsystem-match=netz--settlez!Ignoring device trigger error: {}z*/run/systemd/system/netplan-regdom.servicestartznetplan-regdom.servicez1/run/systemd/system/*.wants/netplan-wpa-*.servicez1/run/systemd/system/*.wants/netplan-ovs-*.service/z:Falling back to a hard restart of systemd-networkd.servicerestartzsystemd-networkd.servicez/run/NetworkManager/devices)ignore_errors)nmcligeneralstatus
   )capture_outputtext      z

connectedg      ?)Fr   r   r   r   process_sriov_configr   process_ovs_cleanuposenvironshutilwhichRuntimeError
subprocessr+   sysexitPermissionErrorboolglobremover   nm_interfacesget_interfacesextendSTDOUTappendget_generator_path	EX_CONFIGr   updatesystemctl_daemon_reloadloggingdebug	systemctl
nm_runningnm_get_connection_for_interfacerG   CalledProcessErrorsystemctl_network_managerparseprocess_link_changesvirtual_interfaceskeysclear_virtual_links
check_callDEVNULLitemsgetlenIF_NAMESIZEwarningformatpathexistsbasenameendswithOVS_CLEANUP_SERVICEnetworkctl_reloadnetworkctl_reconfigurenetworkd_interfacesip_addr_flushrmtreeranger'   
returncodetimesleepstrr9   nm_bring_interface_up)*r   run_generater2   exit_on_error	state_dirconfig_managerr*   resovs_cleanup_serviceold_files_networkdold_ovs_globold_files_ovsold_nm_glob	nm_ifacesold_files_nmgenerator_callgenerate_outdevicesrestart_networkdrestart_ovs_globrestart_ovsrestart_nm_glob
restart_nmwpa_servicesloopback_connectionr5   changescm
prev_links
curr_linksdevices_after_udevifacesettingsnew_nameefnetplan_wpanetplan_ovsr]   cmd_outs*                                             r   r#   zNetplanApply.command_apply@   s   &"DJ ??--nmL"",,^UE=Y RZZ \\(+F~"#;<< //669j#7#8#7#*	#% &C ax HHSMCZ)AC C 'KcQS S O!$)),M"NOyy!DE,. 34\*ii RS''U5I5I5KL	K(

*!!:/B"CD%,,Le6689JOON<PTUU&()STT&&(  		*K LM$6#99%HI"22##$78+,}#))$VW,,_gFG/*
lJ ))+MM`a,,^]KYfg34LOOFLt<MMNO MMUV!9$*/*O*OPT*U'% FY. X|V$DE //TBMMHI &&( 	33G^L ::tzz*BHHJ..335J'::??AJ,,ZWM &&( 	MFMMA6JM%%y.'7'86'A'C .8-?-?-7-?-?	A
 %%y&'86'A'C-7-?-?-7-?-?A	M #113&}} 	AOE8||F+Hx=K/OO$[$b$bckmr$stG#4F(FMM"O"V"VW\^f"gh%%tVUE5&&Q-7-?-?-7-?-?A %%tVU',e'-x||F/C'E .8-?-?-7-?-?	A	A* 	@A	K!!"no 	)).-H 77>>FGOOG&>%?@8<		Bu8vw1277++A.wKw8<		Bu8v I1"#**S3F-F"G 77++A. IK IT''),,U-F-F-HI OOG&9%:FOOG[;%>TJ "//IM& +##E*+ MM7tL++G$?
 }$ 5 r 	$A$..TMC ~~*

1 $CJJ7JJsO	$ }$)<++,?@ *=$M K &88 R 00 MCVLM< ,, 	K OO?FFqIJJ	K xI 00 T \]	,F+GdSSTs\   4d!A5d/e &f$>f);f. d,+d,/)eef!2$ff!.Ag32g3c                    |st        j                  d       g S t        t        |       t        |      z
        }t        t        |      j	                  |            }|D ]  }	 dddd|g}t        j                  |       ! |S # t
        j                  $ r' t        j                  dj                  |             Y ]w xY w)a%  
        Calculate the delta of virtual links. And remove the links that were
        dropped from the YAML config, if they were not dropped by the backend
        already.
        We can make use of the netplan netdef ids, as those equal the interface
        name for virtual links.
        z;Cannot clear virtual links: no network interfaces provided.r<   r=   deleter?   zCould not delete interface {})	rf   rx   listr>   intersectionrV   rr   rk   ry   )r   r   r   dropped_interfacesinterfaces_to_clearr=   r   s          r   rq   z NetplanApply.clear_virtual_linksI  s     OOYZI!#j/C
O"CD #3'9#:#G#G#PQ' 	NDNVXud;%%c*	N "! 00 N ? F Ft LMNs   #B7B=<B=r   c                 2   i }|j                   j                         D ]  }|j                  }|s|j                  st	        j
                  | |      }|s/t        j                  dj                  |j                               f||k(  r%t        j                  dj                  |             |j                  r1t        j                  dj                  |j                  ||             d|i||<    t        j                  dj                  |             |S )z
        Go through the pending changes and pick what needs special handling.
        Only applies to non-critical interfaces which can be safely updated.
        z,Cannot find unique matching interface for {}z&Skipping correctly named interface: {}zLCannot rename {} ({} -> {}) at runtime (needs reboot), due to being criticalr;   zLink changes: {})physical_interfacesvaluesset_name
_has_matchr   find_matching_ifacerf   rx   ry   idrg   critical)
interfacesr   r   netdefnewnamecurrent_iface_names         r   rn   z!NetplanApply.process_link_changesc  s      %88??A 	<FooG$$!&!:!::v!N% N U UV\V_V_ `a!W,FMMgVW n!'		3Ew!OQ ,27*;G&'-	<0 	(//89r   c                     	 t        |        y # t        j                  $ rD}t        j                  t        |             |rt        j                  d       Y d }~y Y d }~y d }~ww xY w)NrN   )r   r   config_errorsrf   errorr   rW   rX   )r   r   r   s      r   rO   z!NetplanApply.process_sriov_config  sJ    	~."" 	MM#a&! 	s    A%5A  A%c                    	 t        | ||       y # t        t        f$ rD}t        j                  t        |             |rt        j                  d       Y d }~y Y d }~y d }~wt        $ r.}t        j                  dj                  |             Y d }~y d }~wt        $ r }t        j                  d|       Y d }~y d }~ww xY w)NrN   zCannot call Open vSwitch: {}.zCannot call Open vSwitch: %s.)r   OSErrorrU   rf   r   r   rW   rX   r	   rx   ry   r
   rg   )r   ovs_oldovs_currentr   r   s        r   rP   z NetplanApply.process_ovs_cleanup  s    		>ng{C& 	MM#a&! $ 	GOO;BB1EFF& 	>MM91==	>s,    B?5AB?*$BB?B::B?)TFTN)T)__name__
__module____qualname__r   r'   r#   staticmethodrq   r   rn   rO   rP   __classcell__)r   s   @r   r   r   )   sp    GAR <> " "2 # # #J   
> 
>r   r   )__doc__rf   rQ   rW   r[   rV   rS   r   r3   r   configmanagerr   r   sriovr   ovsr	   r
   r   r~   rw   NetplanCommandr    r   r   <module>r      sO   ( !  	 
      > & S S 4 t>5'' t>r   