+
    h  c                   s    ^ RI t ^RIHt ^RIHt ^RIHt ^RI5 ^RI5 ^RIH	t	 ^RI
Ht ^RIHt ^R	IHtHtHt ]t ! R
 R]4      t ! R R]4      t ! R R]4      t ! R R]4      tR# )i    N)generatename)xmlutil)BuildConfig)Z*)DomainCapabilities)log)OSDB)
XMLBuilderXMLPropertyXMLChildPropertyc                   s  a  ] tR t^t o Rt. ROt]! ]4      t]! ]	4      t
]! ]4      t]! ]4      t]! ]4      t]! ]4      t]! ]4      t]! ]4      t]! ]4      t]! ]4      t]! ]4      t]! ]4      t]! ]4      t ]! ]!4      t"]! ]#4      t$]! ]%4      t&]! ]'4      t(]! ])4      t*]! ]+4      t,]! ]-4      t.]! ]/4      t0]! ]14      t2]! ]34      t4]! ]54      t6]! ]74      t8]! ]94      t:R t;Rt<V t=R# )_DomainDevicesdevicesc                sp    . p\         P                  pV F  pVP                  \        W4      4       K  	  V# N)r	   _XML_PROP_ORDERZextendgetattr)selfZretlistZdevtypesZdevtype   &   )/usr/share/virt-manager/virtinst/guest.pyget_allZ_DomainDevices.get_allR   s2    !11GNN7412       N)disk
controller
filesystem	interface	smartcardserialparallelconsolechannelinputtpmgraphicssoundaudiovideohostdevredirdevwatchdog
memballoonrngpanicshmemmemoryvsockiommupstore)>__name__
__module____qualname____firstlineno__XML_NAMEr   r   Z
DeviceDiskr   DeviceControllerr   ZDeviceFilesystemr   ZDeviceInterfacer   ZDeviceSmartcardr   ZDeviceSerialr   ZDeviceParallelr   DeviceConsoler   DeviceChannelr   DeviceInputr   	DeviceTpmr   DeviceGraphicsr   DeviceSoundr    ZDeviceAudior!   DeviceVideor"   ZDeviceHostdevr#   DeviceRedirdevr$   ZDeviceWatchdogr%   DeviceMemballoonr&   	DeviceRngr'   ZDevicePanicr(   ZDeviceShMemr)   ZDeviceMemoryr*   ZDeviceVsockr+   ZDeviceIommur,   ZDevicePstorer-   r   __static_attributes____classdictcell__Z__classdict__   @r   r	   r	      s$    HO: J'D!"23J!"23J 1I 1Il+F/H}-G}-G[)E
9
%C/H[)E[)E[)E}-G/H/H!"23J
9
%C[)E[)El+F[)E[)El+F r   r	   c                   s    ] tR t^[tRt. ROt]! RRR7      t]! RRR7      t]! RRR7      t	]! RRR7      t
]! RRR7      t]! R	RR7      tR
tR# )_IOThreadIDZiothread./@idTZis_int./@thread_pool_min./@thread_pool_maxz./poll/@maxz./poll/@growz./poll/@shrinkr   N)idthread_pool_minthread_pool_max)r.   r/   r0   r1   r2   r   r   rG   rH   rI   maxZgrowZshrinkr>   r   r   r   rB   rB   [   sW    HBO	WT	*B!"6tDO!"6tDO
mD
1C~d3D)$7Fr   rB   c                   sB    ] tR t^gtRt]! RRR7      t]! RRR7      tRtR# )_DefaultIOThreaddefaultiothreadrE   TrD   rF   r   N)	r.   r/   r0   r1   r2   r   rH   rI   r>   r   r   r   rK   rK   g   s!     H!"6tDO!"6tDOr   rK   c                   s  a  ] tR t^nt o ]RR l4       t]R 4       t]R 4       t]R 4       tRt	. RNRNR	NR
NRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNR NR!NR"NR#NR$NR%NR&NR'NR(NR)NR*NR+NR,NR-NR.NR/NR0Nt
R1 t]! R24      t]! R3RR47      t]! ]R5R67      t]! ]4      tR7 tR8 t]! ]]4      t]! R9RR47      t]! R:RR47      t]! R;RR47      t]! R<RR47      tR= tR> t]! R?RR47      t]! ]]4      t]! R@RR47      t ]! RA4      t!]! RB4      t"]! RC4      t#]! RD4      t$]! RDRRE7      t%]! RFRR47      t&]! RG4      t']! RH4      t(]! RI4      t)]! RJ4      t*]! RK4      t+]! RL4      t,]! RM4      t-]! RN4      t.]! RO4      t/]! RP4      t0]! ]1RRQ7      t2]! ]34      t4]! ]5RRQ7      t6]! ]7RRQ7      t8]! ]9RRQ7      t:]! ];RRQ7      t<]! ]=RRQ7      t>]! ]?RRQ7      t@]! ]ARRQ7      tB]! ]CRRQ7      tD]! ]ERRQ7      tF]! ]GRRQ7      tH]! ]IRRQ7      tJ]! ]KRRQ7      tL]! ]MRRQ7      tN]! ]O4      tP]! ]QRRQ7      tR]! ]SRRQ7      tT]! ]URRQ7      tVRR tW]! ]W4      tXRS tYRT tZRU t[RV t\RW t]RX t^RY t_RZ t`R[ taR\ tbR] tcRR^ ltdR_ teRR` ltfRa tgRb thRc ti]! ]jRRQ7      tkRd tlRRe ltmRf tnRg toRh tpRi tqRj trRk tsRl ttRm tuRn tvRo twRp txRq tyRr tzRRt lt{Ru t|Rv t}Rw t~Rx tRRy ltRz tR{ tR| tR} tRR~ ltR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tRtV tRs# )GuestTc                s    V'       d!   \         P                  ! \        R 4      V4       V'       g   R#  V P                  V4       \        \        R4      T,          4      h  \         d     R# i ; i)rM   Nz"Guest name '%s' is already in use.)r   Zvalidate_generic_name_lookupByName	ExceptionZ
ValueError)connnameZcheck_collisionZvalidates   &&&&r   validate_nameZGuest.validate_nameo   s^    ,,QwZ>	d# ?@4GHH  		s   A   A/.A/c                s   a  V 3R  lp\        R4       F5  pV! 4       p\        P                  ! S P                  V4      '       d   K3  Vu # 	  \        P
                  ! R4       R# )c                  sL  < SP                  4       '       d   R # \        ^ ^4       U u. uF  p \        P                  ! ^ ^4      NK  	  pp V^,          ^,          ^@,          V^&   V^,          ^?,          ^,          V^&   RP	                  . RO4      \        V4      ,          # u up i )z$00000000-1111-2222-3333-444444444444-)z%02x%02x%02x%02x%02x%02xrU   rU   z%02x%02x%02x%02x%02x%02x)Zfake_conn_predictablerangerandomZrandintZjoinZtuple)ignoreZurQ   s     r   _randomUUIDZ(Guest.generate_uuid.<locals>._randomUUID~   s    ))++=6;ArlClF3'lACaD4KF+AaDaD4KF+AaD88XY\abc\ddd	 Ds    B!i   z'Failed to generate non-conflicting UUIDN)rV   r    check_libvirt_collisionZlookupByUUIDr   Zerror)rQ   rY   rX   uuids   f   r   generate_uuidZGuest.generate_uuid|   sM    		e CjF=D778I8I4PP !
 			;<r   c                s  a  R  pRpS P                   P                  pVP                  R4      '       d   VP                  R^4      ^ ,          pS P                   P                  R8X  d(   RpS P                  P                  4       '       d   RpMRpS P                  P                  S P                  P                  P                  P                  P                  8w  d-   VRV! S P                  P                  4      ,          ,          pRpV 3R	 lp\        P                  ! TTT;'       d    ^;'       g    ^TV'       * ;'       d    R;'       g    R
R7      # )c                 s    V R 8X  d   R# V # )armv7lZarmr   )Z_a   &r   _pretty_archZ)Guest.generate_name.<locals>._pretty_arch   s    X~Ir   Fz-unknownrT   genericTZ	containerZvmz-%sc                 sZ   < \         P                  ! SP                  P                  V 4      # r   )r    rZ   rQ   rO   )nguest   &r   cbZGuest.generate_name.<locals>.cb   s!    77

8O8OQRSSr    )Z	start_num	force_numZsep)osinforR   ZendswithZrsplitosis_containerarchrQ   capsZhostcpur    generate_name)rb   r_   rf   Zbasenamerd   s   f    r   rm   ZGuest.generate_name   s   	
 	<<$$Z((sA.q1H<<	)Ixx$$&&&88==EJJOO0044999UXX]] ;;;HI	T ))ooA**%%#++
 	
r   c                s   a  V 3R lpS P                   P                  4       '       g!   S P                   P                  4       '       d   V! 4       # R# )z
Return the recommended machine type for the passed capsinfo.
We only return this for arch cases where there's a very clear
preference that's different from the default machine type
c                  sR  < S P                   R9   d   RS P                  9   d   R# S P                   R9   d'   RS P                  9   d   R# RS P                  9   d   R# S P                   R9   d   RS P                  9   d   R# S P                   R	9   d   RS P                  9   d   R# R# R# )
ppc64ZpseriesZvirtzvexpress-a15zs390-ccw-virtioN)rn   Zppc64le)r]   Zaarch64)Zs390x)Zriscv64Zriscv32)rj   machines)capsinfos   r   _qemu_machineZ4Guest.get_recommended_machine.<locals>._qemu_machine   s    }} 44hFWFW9W }} 55X...!!X%6%66)}}	)$(9(99,}} 66X...! / 7r   N)rQ   is_qemuis_test)rp   rq      f r   get_recommended_machineZGuest.get_recommended_machine   s:    	"$ ==  ""hmm&;&;&=&= ?"r   domaintyperR   r[   genidgenid_enabletitledescription	_metadata	iothreadsiothreadidsrL   	maxMemorymaxMemorySlotsr*   _currentMemory	blkiotunememtunememoryBacking_vcpusvcpu_currentvcpu_placementvcpu_cpusetvcpulistnumatuneresourcesysinfo
bootloaderbootloader_argsrh   idmapfeaturesrl   clockon_poweroff	on_rebooton_crashpmemulatorr
   launchSecurity	seclabelskeywrapc                sz   \         P                  ! V .VO5/ VB  \        P                  V n        R V n        R V n        R V n        R V n        R V n	        R V n
        R V n        R V n        R V n        V P                  P                  V n        ^V n        R V n        RV n        RV n        RV n        RV n        RV n        R# )FN)r   __init__r   Zdefault_graphicsdefault_graphics_typeskip_default_consoleskip_default_channelskip_default_soundskip_default_usbredirskip_default_graphicsskip_default_rngskip_default_tpmskip_default_inputhave_default_tpmrl   ZSPECIAL_MODE_APP_DEFAULTx86_cpu_defaultnum_pcie_root_portsskip_default_osinfouefi_requested_Guest__osinfo	_capsinfo_domcaps_extra_drivers)r   ZargsZkwargss   &*,r   r   ZGuest.__init__  s    D24262 &1%A%A"$)!$)!"'%*"%*" % %"' %#xx@@
 $& #( ""r   z./namez./iothreadsrD   z./iothreadids)Zrelative_xpathc                sz    Ve1   \        V4      pV P                  e   V P                  V8  d   Wn        Wn        R # r   )intr*   r   r   val   &&r   _set_currentMemoryZGuest._set_currentMemory)  s0    ?c(C{{"dkkC&7!!r   c                    V P                   # r   )r   r   r^   r   _get_currentMemoryZGuest._get_currentMemory0  s    """r   z./currentMemoryz./memoryz./maxMemoryz./maxMemory/@slotsc                sz    Ve1   \        V4      pV P                  e   V P                  V8  d   Wn        Wn        R # r   )r   r   r   r   r   r   
_set_vcpusZGuest._set_vcpus:  s4    ?c(C  ,1B1BS1H$'!r   c                r   r   )r   r   r^   r   
_get_vcpusZGuest._get_vcpusB  s    {{r   z./vcpuz./vcpu/@currentz./vcpu/@placementz./vcpu/@cpusetz./uuidz./genid)Zis_boolrC   z./@typez./bootloaderz./bootloader_argsz./descriptionz./titlez./devices/emulatorz./on_poweroffz./on_rebootz
./on_crashz./on_lockfailure)Z	is_singlec                s   V P                   '       d   V P                   # V P                  P                  P                  pV'       dE   \        P
                  ! V4      V n         V P                   '       g   \        P                  ! R V4       V P                   '       g9   V P                  '       d   \        P                  ! R4      hV P                  4        V P                   # )zPXML had libosinfo os id=%s but we didn't find any libosinfo object matching thatz*osinfo is accessed before it has been set.)r   r|   	libosinfoos_idr   Zlookup_os_by_full_idr   debugr   r   ZDevErrorset_default_os_name)r   r      & r   _get_osinfoZGuest._get_osinfou  s    ===== ((.. 55e<DM===		> }}}
 '''&&'STT$$&}}r   c                s\    Wn         VP                  V P                  P                  n        R # r   )r   Zfull_idr|   r   r   )r   objr   r   _set_os_objZGuest._set_os_obj  s    ),  &r   c                s    \         P                  ! VR R7      p\        P                  ! RV4       V P	                  V4       R# )T)Zraise_errorzSetting Guest osinfo name %sN)r   Z	lookup_osr   r   r   )r   rR   r      && r   set_os_nameZGuest.set_os_name  s/    nnTt4		0#6r   c                s(    V P                  R 4       R# )r`   N)r   r   r^   r   r   ZGuest.set_default_os_name  s    #r   c                sN   V P                   P                  4       '       g   R # V P                  P                  4       '       ga   V P                  P	                  4       '       gA   V P                  P                  4       '       g!   V P                  P                  4       '       d   R# V# FT)rQ   rr   rh   is_riscv_virtis_s390x
is_pseriesis_loongarch64)r   Z
os_supportr   r   _supports_virtioZGuest._supports_virtio  so    yy  "" GG!!##ww!!ww!!##ww%%''r   c                j    V P                  V P                  P                  V P                  4      4      # r   )r   rg   supports_virtionetr   r   r^   r   r   ZGuest.supports_virtionet  s(    $$T[[%C%CDDWDW%XYYr   c                r   r   )r   rg   supports_virtiodiskr   r   r^   r   r   ZGuest.supports_virtiodisk  (    $$T[[%D%DTEXEX%YZZr   c                r   r   )r   rg   supports_virtioscsir   r   r^   r   r   ZGuest.supports_virtioscsi  r   r   c                r   r   )r   rg   Zsupports_virtioserialr   r   r^   r   _supports_virtioserialZGuest._supports_virtioserial  s(    $$T[[%F%FtGZGZ%[\\r   c                .    V P                   P                  # r   )rh   	bootorderr   r^   r   _get_old_boot_orderZGuest._get_old_boot_order  s    ww   r   c                s&   V P                  4       p. pRpRpRpRpV P                  P                   Fr  pV'       g   VP                  R8X  d   TpV'       g   VP                  R8X  d   TpV'       g   VP                  R9  d   TpV'       g   K^  V'       g   Kh  V'       g   Kr   M	  V P                  P                   F  pTp M	  V F  p	V	R8X  d*   V'       d"   VP                  VP                  4       4       K3  V	R8X  d*   V'       d"   VP                  VP                  4       4       Kc  V	R8X  d*   V'       d"   VP                  VP                  4       4       K  V	R8X  g   K  V'       g   K  VP                  VP                  4       4       K  	  V# )z\Converts the old boot order (e.g. <boot dev='hd'/>) into the
per-device boot order format.

NcdromfloppyZnetworkZhdZfd)r   r   )r   r
   r   devicer   append
get_xml_id)
r   
boot_orderZretr   r   r   Znetdra   Zbs
   &         r   _convert_old_boot_orderZGuest._convert_old_boot_order  s0   
 --/
""AQXX0ahh(2AHH,??u&& # ''AC ( AI~#

3>>+,dt

4??,-g%

5++-.dvv

6,,./  
r   c                sj   . pV P                  4        FV  pVP                  P                  '       g   K!  VP                  VP	                  4       VP                  P                  34       KX  	  V'       g   V P                  4       # VP                  R  R7       V Uu. uF  q3^ ,          NK  	  up# u upi )c                 s    V ^,          # )   r   )pr^   r   <lambda>Z.Guest._get_device_boot_order.<locals>.<lambda>  s    1r   Zkey)get_bootable_devicesbootorderr   r   r   Zsort)r   r   devr   r   r   _get_device_boot_orderZGuest._get_device_boot_order  s    ,,.C88>>>LL#..*CHHNN;< /
  //11

~
&#$e!e$$$s   B0c                sR    V'       d   V P                  4       # V P                  4       # r   )r   r   )r   legacyr   r   get_boot_orderZGuest.get_boot_order  s#    ++--**,,r   c                s$   . V P                   n        V P                  P                  4        F  pRVP                  n        K  	  \        R V P                  4        4       4      p\        V^4       F  w  rEWCV,          P                  n        K  	  R# )z-Sets the new device boot order for the domainNc              3   sD   "   T F  qP                  4       V3x  K  	  R # 5ir   )r   .0r   r   r   	<genexpr>Z/Guest._set_device_boot_order.<locals>.<genexpr>  s     V:U3(#.:Us    )	rh   r   r
   r   r   r   Zdictr   	enumerate)r   r   r   Zdev_mapZboot_idxZ
dev_xml_ids   &&    r   _set_device_boot_orderZGuest._set_device_boot_order  st      <<'')C!CHHN * V$:S:S:UVV$-j!$< H-5J$$* %=r   c                s\    V'       d   WP                   n        R# V P                  V4       R# )zModifies the boot orderN)rh   r   r   )r   r   r      &&&r   set_boot_orderZGuest.set_boot_order  s     *GG''
3r   c                s   . V P                   n        \        V P                  4        Uu. uF  q3P                  P
                  f   K  VNK   	  upR R7      pW!P                  n        RpV F\  pW1J d   K
  VP                  P
                  WR39   d0   VP                  P
                  ^,           pWSP                  n        KU  Vf   K[   R# 	  R# u upi )a  Sets boot order of `dev` to `boot_index`

Sets the boot order for device `dev` to value `boot_index` and
adjusts all other boot indices accordingly. Additionally the
boot order defined in the 'os' node of a domain definition is
disabled since they are mutually exclusive in libvirt.

Nc                 r   r   )r   r   )r   r^   r   r   Z*Guest.reorder_boot_order.<locals>.<lambda>  s    v{{00r   r   )rh   r   Zsortedr   r   r   )r   r   Z
boot_indexr   Zdevs_sortedZnext_boot_indexs   &&&   r   reorder_boot_orderZGuest.reorder_boot_order
  s      "&";";"=_"=ARARVV"=_0
 $!F}{{  _$AA"(++"3"3a"7$3!* " `s   CCc                s<    V P                   P                  V4       R # r   )r
   	add_childr   r   r   r   
add_deviceZGuest.add_device1  s    s#r   c                s    V P                   P                  V4       V P                  V4       V P                  V4       R # r   )r
   remove_child_remove_duplicate_console_remove_spice_devicesr   r   r   remove_deviceZGuest.remove_device4  s0    !!#&&&s+""3'r   c                s    \        V P                  VP                  4      p\        V4       F   w  r4VP	                  WC4      '       g   K  Vu # 	  R# )zM
Try to find a child device that matches the content of
the passed @origdev.
N)r   r
   DEVICE_TYPEr   Zcompare_device)r   ZorigdevZdevlistZidxr      &&   r   find_deviceZGuest.find_device;  sF    
 $,,(;(;<!'*HC%%c//
 + r   c                s    V P                   pVP                  VP                  ,           VP                  ,           pV'       g   W2P                  ,           pV# )z
Returns bootable devices of the guest definition. If
@exclude_redirdev is `True` redirected devices will be
skipped in the output.

)r
   r   r   r#   r$   )r   Zexclude_redirdevr
   Zdevs   &&  r   r   ZGuest.get_bootable_devicesF  s@     ,,||g///'//A***Dr   c                sT   V P                   P                  4       '       dq   V P                  P                  4       '       g!   V P                  P	                  4       '       d1   V P
                  P                  V P                   P                  4      pMV P                   P                  4       ;'       g_    V P                   P                  4       ;'       g=    V P                   P                  4       ;'       g    V P                  P                  4       p\        P                  ! RV4       V# )z
Return True if this config prefers UEFI. For example,
arm+machvirt prefers UEFI since it's required for traditional
install methods
zPrefer EFI => %s)rh   is_x86rQ   rr   rs   rg   Zrequires_firmware_efirj   is_arm_machvirtr   r   is_bhyver   r   )r   Z
prefer_efir   r   prefers_uefiZGuest.prefers_uefiS  s     77>>!2!2!4!4		8I8I8K8K
 ::477<<HJ '') ( (77((*( (77))+( ( 99%%'	  			$j1r   c                s    V P                   P                  '       d   V P                   P                  R 8X  d   R# V P                   P                  R8H  # )pflashTefi)rh   loaderloader_typefirmwarer   r^   r   is_uefiZGuest.is_uefij  s8    77>>>dgg11X=ww5((r   c                s   RV P                   n        RV P                   n        WP                   n        V P                   P	                  4       '       d   RV P                   P                  9   d   RV P
                  n        RV P                   n        V P                   P                  4       '       g?   \        P                  ! RV P                   P                  4       RV P                   n        R# R# R# R# )zM
Set old style UEFI XML via loader path.
Set up smm if needed for secureboot
Tr   ZsecbootzPChanging machine type from '%s' to 'q35' which is required for UEFI secure boot.q35N)rh   	loader_ror   r   r   r   Zsmmloader_secureis_q35r   warningmachine)r   pathr   r   set_uefi_pathZGuest.set_uefi_patho  s    
 !& 77>>	TWW^^ ; $DMM$(DGG!77>>##>GGOO
 #( $ !<r   c                s    V P                  4       pVP                  4       '       d   RV P                  n        R# V P	                  4       p\
        P                  ! RV4       V P                  V4       R# )z%
Enable UEFI using our default logic
r   NzSetting default UEFI path=%s)lookup_domcapsZsupports_firmware_efirh   r   _lookup_default_uefi_pathr   r   r  r   domcapsr     &  r   enable_uefiZGuest.enable_uefi  s[     %%'((**$DGG--/		0$74 r   c                sB   R V P                   n        R V P                   n        R V P                   n        R V P                   n        R V P                   n        R V P                   n        R V P                   n        V P                   P                   F  pV P                   P                  V4       K   	  V P                  P                  P                  R4       V P                  P                  P                  R4       V P                  P                  P                  R4       R # )Nz./os/firmwarez
./os/nvramz./os/loader)rh   r   r   r  r   r  nvramZnvram_templateZfirmware_featuresr   Z	_xmlstateZxmlapiZnode_force_remove)r   Zfeaturer   r   disable_uefiZGuest.disable_uefi  s     " $!%ww00GGG  ) 1 	//@//=//>r   c                s|    V P                   P                   F!  pVP                  VP                  8X  g   K    R # 	  R# TN)r
   r   rw   Z
TYPE_SPICEr   gfxr   r   	has_spiceZGuest.has_spice  s)    <<((Cxx3>>) )r   c                sj    V P                   P                   F  pVP                  '       g   K   R # 	  R# r  )r
   r   glr  r   r   has_glZGuest.has_gl  s"    <<((Cvvv )r   c                s    V P                   P                   F'  pVP                  4       pV'       g   K  VR 8X  g   K&   R# 	  R# )noneTF)r
   r   Zget_first_listen_type)r   r  listenr  r   has_listen_noneZGuest.has_listen_none  s8    <<((C..0Fv&F* ) r   c                s    V P                   P                  4       '       g   R # V P                  P                   F  pVP                  R8X  g   K   R# 	  R # )FZ/T)rh   ri   r
   r   target)r   Zfsr   r   is_full_os_containerZGuest.is_full_os_container  s@    ww##%%,,))ByyC * r   c                s    \        V P                  P                   Uu. uF  qP                  R8H  NK  	  up4      pV'       * ;'       d    V P	                  4       # u upi )zl
Return True if the guest supports virtio-scsi, and there's
no other scsi controllers attached to the guest
scsi)anyr
   r   rw   r   )r   r   Zhas_any_scsir  r   can_default_virtioscsiZGuest.can_default_virtioscsi  sP    
 dll6M6MN6MFFf,6MNO>>D$<$<$>> Os   Ac                sJ    V P                   P                  4       '       g   R # R# r   )rg   Z
is_windowsr   r^   r   hyperv_supportedZGuest.hyperv_supported  s    {{%%''r   c                s   a a V 3R  loVV 3R lpS P                   '       d   V! S P                   4      '       g   \        P                  ! S 4      S n         S P                   # )c                 s8  < SP                   P                  V P                  8X  d   R #  SP                  4       pTP                  SP                   P                  T P                  4      '       d   R # R#   \         d    \        P
                  ! R4        R# i ; i)TzCError fetching machine list for alias resolution, assuming mismatchF)rh   r  lookup_capsinforP   r   Z	exceptionZis_machine_alias)r  rp   r   s   & r   _compare_machineZ.Guest.lookup_domcaps.<locals>._compare_machine  su    ww'//1//1 (('//JJ  cds   A4 4!BBc                 s  < SP                   R 8X  d   R# SP                  P                  '       d   S! V 4      '       g   R# SP                   '       d   SP                   V P                  8w  d   R# SP                  P                  '       d(   SP                  P                  V P                  8w  d   R# SP
                  '       d   SP
                  V P                  8w  d   R# R# )ZtestTF)rw   rh   r  rv   rj   r   r  )r  r   r   s   &r   _compareZ&Guest.lookup_domcaps.<locals>._compare  s    yyF" ww'7'@'@yyyTYY'..8ww||| <}}}',,!>r   )r   r   Zbuild_from_guest)r   r!  r   s   f @r   r  ZGuest.lookup_domcaps  sB    
		 }}}HT]]$;$;.??EDM}}r   c                sd  a  V 3R  lpS P                   '       d   V! S P                   4      '       gu   S P                  P                  P                  S P                  P
                  S P                  P                  S P                  S P                  P                  R7      S n         S P                   # )c                 s  < SP                   '       d   SP                   V P                  8w  d   R # SP                  P                  '       d(   SP                  P                  V P                  8w  d   R # SP                  P                  '       d(   SP                  P                  V P                  8w  d   R # SP                  P
                  '       d(   SP                  P
                  V P                  9  d   R # R# r   )rw   hypervisor_typerh   os_typerj   r  ro   )rp   r   rc   r   r!  Z'Guest.lookup_capsinfo.<locals>._compare  s    yyyTYY(*B*BBww477??h6F6F#Fww||| =ww477??(:K:K#Kr   )r#  rj   Ztypr  )	r   rQ   rk   Zguest_lookuprh   r#  rj   rw   r  )r   r!  rt   r   r  ZGuest.lookup_capsinfo  sv    		 ~~~Xdnn%=%=!YY^^88dggll		SWSZSZSbSb 9 DN ~~r   Nc                s   V'       d   Wn         MV P                  4       pV P                  '       * ;'       d    V P                  P                  '       * pVP
                  V n        VP                  V P                  n        VP                  V P                  n        V P                  P                  '       g   VP                  V P                  n        V P                  '       gC   V P                  P                  4       '       g#   V P                  R 8w  d   VP                  V n        V P                  P                  '       g%   \        P                  V4      V P                  n
        V'       d{   V P                  P                  4       '       dY   V P                  P                  4       '       d7   V P                  R8w  d$   \         P"                  ! RV P                  4       R# R# R# R# R# )ZvzZkvmz*KVM acceleration not available, using '%s'N)r   r  rw   rh   r#  r"  rj   r   r   is_xenpvr  rM   ru   rQ   rr   r   r   r  )r   rp   Zwants_default_typer   r   set_capabilities_defaultsZGuest.set_capabilities_defaults  s*   %N++-H!%]BB477??/B,,	"**}}ww~~~%__DGGN}}}TWW%5%5%7%7DII<M$--DMww#;;HEDGGO$))"3"3"5"5$''..:J:Jtyy\aOaKKDdiiP Pb:J"5r   c                s>   V P                   P                  ;'       g    RpRV P                   n        V P                  4       pVP                  ;'       d    VP                  P                  ;'       g    VP
                  P                  pV Uu. uF"  qDP                  '       g   K  VP                  NK$  	  ppV FJ  pVR8X  d   RpMVR8X  d   RpM	VR,           pVP                  V4      '       g   K9  W`P                   n         R# 	  \        RV,          4      hu upi )	a  
Reset the guests's machine type to the latest 'canonical' machine
name that qemu reports. So if my VM is using ancient pc-0.11, we
try to turn that into just `pc`

The algorithm here is to fetch all machine types that are aliases
for a stable name (like pc -> pc-i440fx-6.2), and see if our current
machine type uses alias as a prefix. This is the format that qemu
uses for its stable machine type names.
re   NZpcz
pc-i440fx-r   zpc-q35-rT   z+Don't know how to refresh machine type '%s')
rh   r  r  rv   ro   rb   Z	canonicalrR   Z
startswithRuntimeError)r   Zoriginal_machine_typerp   ZmobjsZmZcanonical_namesZmachine_aliasZprefixs   &       r   refresh_machine_typeZGuest.refresh_machine_type  s     !% 5 52'')==X__%=%=YY(..BYBY+0@5aKK61665@,M$%%'" ',$//77"/ - HK``aa As   D&Dc                sj   V P                   P                  4       '       g#   V P                   P                  4       '       g   R # V P                  P	                  4       '       g#   V P                  P                  4       '       g   R # V P                  P                  R9  d   R # V P                   Uu. uF  qP                  R8X  g   K  VNK  	  ppV'       g   V P                  P                  4       .pV^ ,          pVP                  '       d   R # RV P                  n        RVn        RVn
        R # u upi )Nr   Zsmbiosz
ds=nocloud)Nr   )rQ   rr   rs   rh   r   r   Zsmbios_moder   rw   Zadd_newZsystem_serial)r   ZsZsysinfosr   r   r   set_smbios_serial_cloudinitZ!Guest.set_smbios_serial_cloudinit8  s    yy  ""499+<+<+>+>ww~~(?(?(A(A77&77#||B|!vv/AAA|B,,./H1+   ' , Cs   0D0D0c                s    V P                   '       gG   V P                  P                  4       '       d!   V P                  P                  4       V n         MWn         V P                  P	                  V P                   4       R# )z
<cpu> topology count and <vcpus> always need to match. Handle
the syncing here since we are less constrained then doing it
in CPU set_defaults
N)vcpusrl   Zhas_topologyZvcpus_from_topologyZset_topology_defaults)r   ZdefCPUsr   r   sync_vcpus_topologyZGuest.sync_vcpus_topologyK  sO     zzzxx$$&&!XX99;
$
&&tzz2r   c                sf    Wn         VR 8X  d   V P                  4        R# V P                  V4       R# spiceN)rw   _add_spice_devicesr   )r   r   Zinstr   r   change_graphicsZGuest.change_graphicsX  s(    	'>##%&&t,r   c                sj   R V P                   n        Ve   \        V4      V n        V P                  P                  4        EFY  pVP                  R8X  d%   VP                  R9   d   V P                  V4       K9  VP                  R8X  d   VP                  R8X  d   RVn	        VP                  R8X  d   VP                  R	8X  d   R
Vn	        VP                  R8X  d   VP                  R8X  du   RVn
        V P                  P                   Uu. uF"  q3P                  '       g   K  VP                  NK$  	  ppVP                  V4       VP                  P                  4        VP                  P                  R8X  g   EK?  VP                  P                  4        EK\  	  V P!                  4        R# u upi )r   Nr   pciider    Zich6Zich9r   Ze1000Ze1000er   Zsata)r/  r0  )rh   r  r   r   r
   r   r   rw   r   modelbusr   r  Zgenerate_targetZaddressclearadd_q35_pcie_controllers)r   r   r   r   Zused_targetsr   r   convert_to_q35ZGuest.convert_to_q35_  s8   *'*+>'?D$<<'')C,.388~3M""3'')cii6.A"	+-#))w2F$	&(SWW-= 26,,2C2CP2CQxx2CP##L1!!#{{5(!!#% *( 	%%'  Qs   F0$F0c                s   V P                  4       '       g   R # V P                  P                   Uu. uF  qP                  R8X  g   K  VNK  	  up^ ,          pVP                  '       g   R # \        V P                  4      pRVn        VP                  V P                  4       VP                  '       d   VP                  Vn        V P                  V4       R # u upi )Nr,  egl-headless)
r  r
   r   rw   r  r8   rQ   set_defaultsZ
rendernoder   )r   gZspicedevr   r   r   !_convert_spice_gl_to_egl_headlessZ'Guest._convert_spice_gl_to_egl_headless{  s    ~~#||44J4!'8IAA4J1M{{{TYY'!#%00CN Ks   CCc                s   V P                   P                   Uu. uF  q"P                  R8X  g   K  VNK  	  ppV P                   P                   Uu. uF*  q"P                  R8w  g   K  VP                  R8w  g   K(  VNK,  	  ppV'       d   V F  pV P                  V4       K  	  R# V'       gU   \	        V P
                  4      pVP                  Vn        VP                  V P
                  4       V P                  V4       R# VP                  ^ 4      p\	        V P
                  VP                  4       4      pV F  pV P                  V4       K  	  VP                  4        VP                  Vn        VP                  Vn        VP                  Vn        VP                  Vn        VP                  Vn        VP                   Vn        VP"                  Vn        VP$                   F%  pVP'                  V4       VP)                  V4       K'  	  VP                  V 4       V'       d9   VP*                  VP,                  n        VP.                  VP,                  n        R# R# u upi u upi )a(  
If there's already VNC graphics configured, we leave it intact,
but rip out all evidence of other graphics devices.

If there's other non-VNC, non-egl-headless configured, we try to
inplace convert the first device we encounter.

If there's no graphics configured, set up a default VNC config.`
Zvncr6  N)r
   r   rw   r   r8   rQ   ZTYPE_VNCr7  r   Zpopget_xmlr3  ZkeymapZportZautoportZpasswdZpasswdValidTor  Zlistensr   r   Zclipboard_copypastesourceZ
mouse_mode)r   agentr8  Zvnc_devsZ
other_devsr   Zsrcdevr  s   &&      r   _convert_to_vnc_graphicsZGuest._convert_to_vnc_graphics  s     $||44H4!%AA4H ||,,
,!%AAFFnD\AA, 	 
 ""1%    +C||CHTYY'OOC  nnQ		3;;=9Aq!  			<<]]
;;]]
"00]]
nnF'MM&! % 	/5/I/IELL,&,&7&7ELL# U I
s   I I I%'I%:I%c                sJ   V P                   P                  '       g:   \        V P                  4      pVP	                  V 4       V P                  V4       R# V P                   P                   Uu. uF  q"P                  R8X  g   K  VNK  	  ppV'       d   \        ;QJ d0    R V P                   P                   4       F  '       g   K   RM%	  RM!! R V P                   P                   4       4      '       g#   RV P                   P                  ^ ,          n        V F  pVP                  pVP                  4        VP	                  V 4       V'       d   K:  VP                  R8w  g   KM  \        P                  ! RVP                  4       V P                  V4       K  	  R# u upi )zm
If there's no video device, add a default one.
If there's any qxl device, reset its config to app defaults.
NZqxlc              3   s8   "   T F  qP                   x  K  	  R # 5ir   )primaryr   r   r   r   Z.Guest._convert_to_vnc_video.<locals>.<genexpr>  s     J7I7Is   TFvirtiozECan't use model=%s for non-primary video device, removing it instead.)r
   r"   r:   rQ   r7  r   r1  r  r>  r3  r   r   r   )r   ZvideodevZvZqxl_devsr   Z
is_primary   &     r   _convert_to_vnc_videoZGuest._convert_to_vnc_video  s   
 ||!!!"499-H!!$'OOH%#||11F1!WW5EAA1FCCJt||7I7IJCCCJt||7I7IJJJ,0DLLq!)CJIIKT":#))x"7		[II ""3'  Gs   .F F c                s^   \         ;QJ d0    R  V P                  P                   4       F  '       g   K   RM%	  RM!! R  V P                  P                   4       4      '       d   R# \        V P                  4      pVP
                  Vn        VP                  V 4       V P                  V4       V# )c              3   s^   "   T F#  qP                   VP                  8X  g   K  Vx  K%  	  R # 5ir   )rw   TYPE_QEMUVDAGENT)r   cr   r   r   Z*Guest._add_qemu_vdagent.<locals>.<genexpr>  s#     O.Q&&A<N<N2Nqq.s   -
-TFN)	r  r
   r   r5   rQ   rB  rw   r7  r   r   r   r   _add_qemu_vdagentZGuest._add_qemu_vdagent  st    3O$,,..O333O$,,..OOODII&''
r   c                s    V P                  4        V P                  4        RpV'       d   V P                  4       pV P                  V4       V P	                  4        R# )z;
Convert existing XML to have one VNC graphics connection.
N)r9  _force_remove_spice_devicesrD  r=  rA  )r   Zqemu_vdagentr<  r   r   convert_to_vncZGuest.convert_to_vnc  sN     	..0 	((***,E%%e,""$r   c                sd   V P                  4        V P                  '       g%   \        P                  V P                  4      V n        V P                  ^4       V P                  4        V P                  4        V P                  4        V P                  4        V P                  4        V P                  4        V P                  4        V P                  4        V P                  4        V P                  4        V P!                  4        V P"                  P%                  V 4       V P&                  P%                  V 4       V P(                  P%                  V 4       V P*                   F  pVP%                  V 4       K  	  V P,                  P%                  V 4       V P.                  P%                  V 4       V P0                  P%                  V 4       V P2                  P5                  4        F  pVP%                  V 4       K  	  V P7                  4        V P9                  4        V P;                  4        R# )r   N)r%  r[   rM   r\   rQ   r*  _set_default_machine_set_default_uefi_add_default_graphics_add_default_video_device_add_default_input_device_add_default_console_device_add_default_usb_controller_add_default_channels_add_default_rng_add_default_memballoon_add_default_tpmr   r7  rl   r   r   r   rh   r   r
   r   add_virtioscsi_controllerr4  r-  )r   Z_guestZseclabelr   r   r   r7  ZGuest.set_defaults  s   &&(yyy++DII6DI  #!!# ""$&&(&&(((*((*""$$$&

%d#""4(H!!$' 'T"T"((.<<'')CT" * 	&&(%%'!r   c                s    Wn         R # r   )r   )r   Zextra_driversr   r   add_extra_driversZGuest.add_extra_drivers  s    +r   c                s@   V P                   P                  '       d   R # V P                  4       pV P                   P                  4       '       d   V P                  P                  4       '       do   RVP                  9   d^   V P                  P                  P                  4       '       d4   V P                  P                  4       '       d   RV P                   n        R # VP                  ;'       d    VP                  ^ ,          ;'       g    R pW P                   n        R # )Nr   )rh   r  r  r   rQ   rr   ro   supportZqemu_q35_defaultrg   Zsupports_chipset_q35)r   rp   Zdefaultr  r   rG  ZGuest._set_default_machine%  s    77???'') GGNN		!!##***		!!22440022#DGGO##<<(9(9!(<DD!r   c                s   V P                  4       pVP                  4       '       g   \        \        R4      4      hVP	                  4       '       g0   \        \        R4      V P
                  P                  ,          4      hVP                  4       pV'       g0   \        \        R4      V P
                  P                  ,          4      hV# )zO
If a default UEFI firmware path is found, return it,
otherwise raise an error
z&Libvirt version does not support UEFI.z*Don't know how to setup UEFI for arch '%s'z/Did not find any UEFI binary path for arch '%s')r  Zsupports_uefi_loaderr&  rN   Zarch_can_uefirh   rj   Zfind_uefi_path_for_archr
  r  r   r	  ZGuest._lookup_default_uefi_path8  s    
 %%'++--q!IJKK$$&&>?$'',,N  ..0q!RSVZV]V]VbVbbccr   c                s   V P                   R J d   R# V P                  4       ;'       d    V P                  P                  '       * ;'       d|    V P                  P                  '       * ;'       dY    V P                  P
                  RJ ;'       d9    V P                  P                  RJ ;'       d    V P                  P                  RJ pV'       g   V P                   '       g   R#  V P                  4        R#   \         dd   pT P                   '       d   h \        P                  ! RRR7       \        P                  ! RT4       \        P                  ! R4        Rp?R# Rp?ii ; i)FNzError setting UEFI defaultT)Zexc_infozCouldn't configure UEFI: %sz"Your VM may not boot successfully.)r   r   rh   Zkernelr   r  r  r   r  r&  r   r   r  )r   Zuse_default_uefiZer  r   rH  ZGuest._set_default_uefiM  s   %'  ) )GGNN") )GGNN") ) !!T)) ) %	) )
   D( 	  (;(;(;	> 	>"""II2TBKK5q9KK<==	>s   &C8 8E&AE!!E&c                s    V P                   P                   Uu. uF  qP                  R 8X  g   K  VNK  	  ppV'       g   R# \        V Uu. uF  qP                  R8H  NK  	  up4      # u upi u upi )usbFr  )r
   r   rw   Zallr1  )r   rC  Zcontrollersr  r   _usb_disabledZGuest._usb_disabledf  s^    "&,,"9"9M"9QVVu_qq"9M{;{!GGv%{;<< N <s   A)A)A.c                s  a a S P                   '       d   R # S P                  P                  4       '       d   R # S P                  P                  4       '       d   R # S P                  P
                  '       d   R # S P                  P                  '       g   R # RpRpS P                  P                  4       '       d   RpR oS P                  P                  4       '       d/   S P                  P                  S P                  4      '       d   RoMS P                  4       '       g   RoS'       g   R # VV 3R lpV'       d	   V! R4       V'       d   V! R4       R # R # )NTFr?  rU  c                 s   < \        SP                  4      pWn        SVn        VP	                  S4       SP                  V4       R # r   )r6   rQ   rw   r2  r7  r   )Zityper   r2  r   s   & r   
_add_inputZ3Guest._add_default_input_device.<locals>._add_input  s7    dii(CHCGT"OOC r   tabletkeyboard)r   rh   ri   r$  r
   r   r   r   r   rg   Zsupports_virtioinputr   rV  )r   rX  rY  rW  r2  s   f   @r   rK  ZGuest._add_default_input_devicel  s    """77!!77<<||$$$77>> H77{{//0C0CDD##%%C	! x z" r   c                sv   V P                   '       d   R # V P                  P                  '       g   V P                  P                  '       d   R # \	        V P
                  4      pV P
                  P                  4       '       dm   RP                  V P                  V P
                  4      4      pVP                  Vn
        VR,           VP                  n        VR,           VP                  n        MVP                  Vn
        V P                  P!                  4       '       d   RVn        V P%                  V4       R # )Nz/dev/nmdm{}ZAZBZsclp)r   r
   r   r   r4   rQ   r   Zformatr\   Z	TYPE_NMDMrw   r;  ZmasterZslaveZTYPE_PTYrh   r   target_typer   )r   r   Znmdm_dev_prefixr  r   rL  Z!Guest._add_default_console_device  s    $$$<<4<<#6#6#6DII&99+2243E3Edii3PQO}}CH /# 5CJJ.4CJJ||CH77$COr   c                s
   V P                   P                  4       '       d   R # V P                  P                  '       d   R # V P                  P                  '       g   R # V P                  \        V P                  4      4       R # r   )rh   ri   r
   r"   r   r   r:   rQ   r   r^   r   rJ  ZGuest._add_default_video_device  sS    77!!<<||$$$DII./r   c                s   \        V P                  P                   Uu. uF  qP                  R 8H  NK  	  up4      '       d   R# V P                  P                  4       '       g#   V P                  P                  4       '       g   R# V P                  P                  P                  4       pRpRpV P                  P                  4       '       d6   \        V P                  P                  4       ;'       d    T4      pV'       * pMV P                  P                  4       '       d6   V'       d-   V P                  P                  P                  4       '       d   RpMV P                  P!                  4       '       d6   V'       d-   V P                  P                  P#                  4       '       d   RpMUV P                  P%                  4       '       d   V'       d   RpM*V P                  P'                  4       '       d   V'       d   RpV'       d:   \(        P+                  V P                  4       F  pV P-                  V4       K  	  R# V'       d2   V P-                  \(        P/                  V P                  V 4      4       R# R# u upi )rU  NFT)r  r
   r   rw   rQ   rr   rs   rT  Zconn_qemu_xhcirh   r   Zboolrg   Zsupports_usb3r   Zconn_machvirt_pci_defaultr   Zconn_riscv_virt_pci_defaultr   r   r3   Zget_usb2_controllersr   Zget_usb3_controller)r   r   Z	qemu_usb3Zusb2Zusb3r   r@  r   rM  Z!Guest._add_default_usb_controller  s   )@)@A)@A%)@ABByy  ""499+<+<+>+>II%%446	77>>113AA	BD8DWW$$&&TYY..HHJJWW""$$ TYY..JJLLWW!!WW##%%'<<TYYG$ HOO,@@DQR C Bs   I>c                s   V P                   '       d   R # V P                  P                  '       d   R # V P                  P	                  4       '       d   V P                  4       '       dt   V P                  P                  P                  4       '       dH   \        V P                  4      pRVn	        RVn
        VP                  Vn        V P                  V4       R # R # R # R # )NZunixr?  )r   r
   r   rQ   rr   r   rT  Zconn_autosocketr5   rw   rZ  ZCHANNEL_NAME_QEMUGAZtarget_namer   r   r   r   rN  ZGuest._add_default_channels  s    $$$<< II++--		!!1133		*CCH&CO!55COOOC  4 .  r   c                sz   V P                   '       d   R # V P                  P                  '       d   R # V P                  P	                  4       '       d#   V P
                  P                  4       '       g   R # V P                  P                  4       '       g   V P                  P                  4       '       gc   V P                  P                  4       '       gC   V P                  P                  4       '       g#   V P                  P                  4       '       g   R # V P                  \        V P
                  4      4       R # r   )r   r
   r   rh   ri   rQ   Zis_vzr   r   r   r   r   r   r8   r   r^   r   rI  ZGuest._add_default_graphics  s    %%%<<   77!!$))//*;*;  GG&&((GG**,,GG++--GG))++tyy12r   c                sL   V P                   '       d   R # V P                  P                  '       d   R # V P                  P	                  4       '       g   V P                  P                  4       '       g   V P                  P                  4       '       gc   V P                  P                  4       '       gC   V P                  P                  4       '       g#   V P                  P                  4       '       g   R # V P                  P                  4       '       d   V P                  P                  V P                  4      '       dc   V P                  P                  P!                  4       '       d7   \#        V P                  4      pRVn        RVn        V P)                  V4       R # R # R # R # )NrW   z/dev/urandom)r   r
   r'   rh   r   r   r   r   r   r   rQ   rr   rg   Zsupports_virtiorngr   rT  Zconn_rng_urandomr=   rw   r   r   r   r   r   rO  ZGuest._add_default_rng  s      <<GGNNww&&((ww$$&&ww!!ww!!##ww%%'' II..t/B/BCC		!!2244DII&CCH'CJOOC  5 D  r   c                s   V P                   '       d   R # V P                  P                  '       d   R # V P                  4       '       g   R # V P	                  4       P                  4       '       g   \        P                  ! R4       R # \        P                  ! R4       \        V P                  4      p\        P                  Vn        V P                  V4       RV n        R # )Nz&Domain caps doesn't report TPM supportzAdding default TPMT)r   r
   r   r   r  Zsupports_tpm_emulatorr   r   r7   rQ   ZTYPE_EMULATORrw   r   r   r   r   r   rQ  ZGuest._add_default_tpm  s       <<
 ||~~""$::<<II>?		&'		"** $r   c                s   V P                   P                  '       d   R # V P                  P                  4       '       g   R # V P                  P                  4       '       g   V P                  P                  4       '       g   V P                  P                  4       '       gc   V P                  P                  4       '       gC   V P                  P                  4       '       g#   V P                  P                  4       '       g   R # V P                  P                  V P                  4      '       d0   \        V P                  4      pRVn        V P!                  V4       R # R # )Nr?  )r
   r&   rQ   rr   rh   r   r   r   r   r   r   rg   Zsupports_virtioballoonr   r<   r1  r   r   r   r   rP  ZGuest._add_default_memballoon(  s    <<"""yy  "" GGNNww&&((ww$$&&ww!!ww!!##ww%%'';;--d.A.ABB"499-C CIOOC  Cr   c                s\   V P                  4       '       g   R # \        V P                  P                   Uu. uF  qP                  R8X  g   K  VNK  	  up4      '       g   R # \        V P                  4      pRVn        RVn        VP                  V 4       V P                  V4       R # u upi )Nr  zvirtio-scsi)r  r  r
   r   r2  r3   rQ   rw   r1  r7  r   )r   r   ctrlr  r   rR  ZGuest.add_virtioscsi_controller@  s    **,,t||00D0!EEVOAA0DEE		*	"
$ Es   B)B)c                s   V P                   P                  4       '       d   R # V P                   P                  4       '       d   R # V P                   P                  4       '       d   R # V P                   P	                  4       '       d   R # R# )TF)rh   r  r   r   r   r   r^   r   defaults_to_pcieZGuest.defaults_to_pcieL  s[    77>>77""$$77  ""77!!##r   c                s   \        V P                  P                   Uu. uF  qP                  R 8X  g   K  VNK  	  up4      '       d   R# V P	                  4       '       g   R# Rp\
        P                  ! RV P                  4       \        \        V P                  ^ 4      4       F  pV'       gH   \        V P                  4      pR Vn        RVn        VP                  V 4       V P                  V4       Rp\        V P                  4      pR Vn        RVn        VP                  V 4       V P                  V4       K  	  R# u upi )r/  NFzUsing num_pcie_root_ports=%sz	pcie-rootTzpcie-root-port)r  r
   r   rw   r\  r   r   r   rV   rJ   r3   rQ   r1  r7  r   )r   rC  ZaddedZdummyr[  s   &    r   r4  ZGuest.add_q35_pcie_controllersW  s    4<<22F2affo2FGG$$&&		0$2J2JK3t77;<E'		2!	(
!!$'%#DII.DDI)DJd#OOD! = Gs
   EEc                s   V P                  4       P                  4       '       g   R # V P                  '       d   R # V P                  P                   F!  pVP
                  VP                  8X  g   K    R # 	  \        V P                  4      p\        P                  Vn        VP                  V 4       V P                  V4       R # r   )r  Zsupports_channel_spicevmcr   r
   r   rw   TYPE_SPICEVMCr5   rQ   r7  r   )r   Zchnr   r  r   _add_spice_channelsZGuest._add_spice_channelsn  s    ""$>>@@$$$<<''Cxx3,,, ( DII& ..r   c                s   V P                   '       d   R # V P                  P                  '       d   R # V P                  P	                  4       '       g   R # \        V P                  4      pVP                  V 4       V P                  V4       R # r   )	r   r
   r    rh   Zis_hvmr9   rQ   r7  r   r   r   r   _add_spice_soundZGuest._add_spice_sound  s`    """<<ww~~$))$r   c                s   V P                  4       P                  4       '       g   R # V P                  '       d   R # V P                  P                  '       d   R # V P                  4       '       d   R # V P                  P                  4       '       g   R # \        ^4       FH  p\        V P                  4      pRVn        RVn        VP                  V 4       V P                  V4       KJ  	  R # )NrU  spicevmc)r  Zsupports_redirdev_usbr   r
   r$   rV  rh   r   rV   r;   rQ   r2  rw   r7  r   )r   rX   r   r  r   _add_spice_usbredirZGuest._add_spice_usbredir  s    ""$::<<%%%<<   ww~~
 AhF +CCG!CHT"OOC  r   c                s|   V P                  4       '       g   R # V P                  P                  f\   V P                  P	                  4       '       d<   V P
                  P                  P                  4       '       d   RV P                  n        V P                  4        V P                  4        V P                  4        R # )NF)r  r   Zvmportrh   r   rQ   rT  Zconn_vmportr^  r_  ra  r   r^   r   r-  ZGuest._add_spice_devices  sz    ~~=='DGGNN,<,<ARARA^A^A`A`#(DMM   "  "r   c                s    \         P                  W4      pV'       dC   \        P                  ! R VP	                  4       4       V P
                  P                  V4       R# R# )z"Found duplicate console device:
%sN)r4   Zget_console_duplicater   r   r:  r
   r   )r   r   Zcondupr   r   r   ZGuest._remove_duplicate_console  sB    44T?II;V^^=MNLL%%f- r   c                    V P                   P                   F1  pVP                  R 8X  g   K  V P                   P                  V4       K3  	  R# r+  )r
   r!   rw   r   )r   r!   r   r   _remove_spice_audioZGuest._remove_spice_audio  s4    \\''EzzW$))%0 (r   c                s    V P                   P                   F?  pVP                  \        P                  8X  g   K$  V P                   P                  V4       KA  	  R # r   )r
   r   rw   r5   r]  r   )r   r   r   r   _remove_spice_channelsZGuest._remove_spice_channels  s:    ||++G||}:::))'2 ,r   c                rb  )r`  N)r
   r$   rw   r   )r   r$   r   r   _remove_spice_usbredirZGuest._remove_spice_usbredir  s4    --H}}
*))(3 .r   c                s    V P                   P                  V P                   P                  ,            F;  pVP                  VP                  8X  g   K   V P                   P                  V4       K=  	  R # r   )r
   r   r   rw   ZTYPE_SPICEPORTr   r   r   r   _remove_spiceportZGuest._remove_spiceport  sL    <<&&)=)===Cxx3---))#. >r   c                s    V P                  4        V P                  4        V P                  4        V P                  4        R # r   )rc  rd  re  rf  r   r^   r   rE  Z!Guest._force_remove_spice_devices  s2      "##%##% r   c                sx    VP                   R 8w  g   V P                  4       '       d   R# V P                  4        R# )r   N)r   r  rE  )r   Zrmdevr   r   r   ZGuest._remove_spice_devices  s+    
*dnn.>.>((*r   )Z__osinfor   r   r   r   r   r   r   r   r*   r   r   r   r   r   r   r   r   r   r   rw   r   r[   r   r)  r   )TT)Fr   )r.   r/   r0   r1   ZstaticmethodrS   r\   rm   ru   r2   r   r   r   rR   r}   r   rB   r~   rK   rL   r   r   ZpropertyZcurrentMemoryr   r*   r   r   r   r   r   r)  r   r   r   r[   rx   ry   rG   rw   r   r   r{   rz   r   r   r   r   Zon_lockfailureZDomainVCPUsr   ZDomainSeclabelr   ZDomainKeyWrapr   ZDomainOsrh   ZDomainFeaturesr   ZDomainClockr   Z	DomainCpurl   ZDomainCputuneZcputuneZDomainNumatuner   ZDomainPmr   ZDomainBlkiotuner   ZDomainMemtuner   ZDomainMemoryBackingr   ZDomainIdmapr   ZDomainResourcer   ZDomainSysinfor   ZDomainLaunchSecurityr   ZDomainMetadatar|   ZDomainXMLNSQemuZ
xmlns_qemur   rg   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r%  r'  r(  r*  r.  r5  r9  r=  rA  rD  rF  r7  rS  rG  r	  rH  rV  rK  rL  rJ  rM  rN  rI  rO  rQ  rP  rR  r\  r4  r^  r_  ra  r-  r   rc  rd  re  rf  rE  r   r>   r?   r@   rA   r   rM   rM   n   s    
I 
I = =& 
 
B  B H+++ 	+ 		+
 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+  	!+" 	#+$ 	%+& 	'+( 	)+* 	++, 	-+. 	/+0 	1+2 	3+4 	5+6 	7+8 	9+: 	;+< 	=+> 	?+@ 	A+B 	C+D 	E+F 	G+H 	I+J 	K+L 	M+N 	O+P 	Q+R 	S+T 	U+OZ#B x DM$7I";OK&'78O"# /1CDM !24@ND1FM$7I !5dCN $/FZ,E0>L !45N./Kx D	"Ey$7L	WT	*By!D^,J!"56Oo.K	"E/0Ho.KM*I<(H !34Nt<H 0I}=G	(d	3B$?H[D9E
9
5C}=G$?H	(d	3B DAI}=G$%8DIM[D9E$?H}-G%&:dKN 4@I!/TBJ0 k"F5
$Z[[]!#J%-
64!N$(
 ~>G	.)
(6!? 

?
B&Q(!bF-&3-(868p(8%"#"J,"&*>2=(#T&0#SJ!"3"!2%,!0
	".$
!,	#.1
3
4
/
!+ +r   rM   )rW   re   r    r   Zbuildconfigr   r
   rv   Zdomcapabilitiesr   Zloggerr   Zosdictr   Z
xmlbuilderr   r   r   ZDeviceZ_ignorer	   rB   rK   rM   r   r   r   <module>rg     sd       $   /   A A
@Z @F	8* 	8Ez Eb+J b+r   