
    W'FgI                         S SK r SSKJr  SSKJr  SSKJr  SSK7  SSK7  SSKJ	r	  SSK
Jr  SS	KJr  SS
KJrJrJr  \r " S S\5      r " S S\5      r " S S\5      r " S S\5      rg)    N   )generatename)xmlutil)BuildConfig)*)DomainCapabilities)log)OSDB)
XMLBuilderXMLPropertyXMLChildPropertyc                      \ rS rSrSr/ SQr\" \5      r\" \	5      r
\" \5      r\" \5      r\" \5      r\" \5      r\" \5      r\" \5      r\" \5      r\" \5      r\" \5      r\" \5      r\" \5      r \" \!5      r"\" \#5      r$\" \%5      r&\" \'5      r(\" \)5      r*\" \+5      r,\" \-5      r.\" \/5      r0\" \15      r2\" \35      r4\" \55      r6\" \75      r8S r9Sr:g)_DomainDevices   devices)disk
controller
filesystem	interface	smartcardserialparallelconsolechannelinputtpmgraphicssoundaudiovideohostdevredirdevwatchdog
memballoonrngpanicshmemmemoryvsockiommuc                 p    / n[         R                  nU H  nUR                  [        X5      5        M     U$ N)r   _XML_PROP_ORDERextendgetattr)selfretlistdevtypesdevtypes       )/usr/share/virt-manager/virtinst/guest.pyget_all_DomainDevices.get_all;   s2    !11GNN7412       N);__name__
__module____qualname____firstlineno__XML_NAMEr-   r   
DeviceDiskr   DeviceControllerr   DeviceFilesystemr   DeviceInterfacer   DeviceSmartcardr   DeviceSerialr   DeviceParallelr   DeviceConsoler   DeviceChannelr   DeviceInputr   	DeviceTpmr   DeviceGraphicsr   DeviceSoundr   DeviceAudior   DeviceVideor    DeviceHostdevr!   DeviceRedirdevr"   DeviceWatchdogr#   DeviceMemballoonr$   	DeviceRngr%   DevicePanicr&   DeviceShMemr'   DeviceMemoryr(   DeviceVsockr)   DeviceIommur*   r5   __static_attributes__r8   r7   r4   r   r      s   H1O 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r7   r   c                   J    \ rS rSrSr/ SQr\" SSS9r\" SSS9r\" SSS9r	S	r
g
)_IOThreadIDD   iothread)idthread_pool_minthread_pool_max./@idTis_int./@thread_pool_min./@thread_pool_maxr8   N)r9   r:   r;   r<   r=   r-   r   r\   r]   r^   rW   r8   r7   r4   rY   rY   D   s2    HBO	WT	*B!"6tDO!"6tDOr7   rY   c                   4    \ rS rSrSr\" SSS9r\" SSS9rSrg)	_DefaultIOThreadM   defaultiothreadrb   Tr`   rc   r8   N)	r9   r:   r;   r<   r=   r   r]   r^   rW   r8   r7   r4   re   re   M   s!     H!"6tDO!"6tDOr7   re   c                   ,   \ rS rSr\SuS j5       r\S 5       r\S 5       r\S 5       rSr	/ SQr
S	 r\" S
5      r\" SSS9r\" \SS9r\" \5      rS rS r\" \\5      r\" SSS9r\" SSS9r\" SSS9r\" SSS9rS rS r\" SSS9r\" \\5      r\" SSS9r \" S5      r!\" S5      r"\" S5      r#\" S5      r$\" SSS9r%\" SSS9r&\" S5      r'\" S 5      r(\" S!5      r)\" S"5      r*\" S#5      r+\" S$5      r,\" S%5      r-\" S&5      r.\" S'5      r/\" S(5      r0\" \1SS)9r2\" \35      r4\" \5SS)9r6\" \7SS)9r8\" \9SS)9r:\" \;SS)9r<\" \=SS)9r>\" \?SS)9r@\" \ASS)9rB\" \CSS)9rD\" \ESS)9rF\" \GSS)9rH\" \ISS)9rJ\" \KSS)9rL\" \MSS)9rN\" \O5      rP\" \QSS)9rR\" \SSS)9rT\" \USS)9rVS* rW\" \W5      rXS+ rYS, rZS- r[S. r\S/ r]S0 r^S1 r_S2 r`S3 raS4 rbS5 rcSvS6 jrdS7 reSvS8 jrfS9 rgS: rhS; ri\" \jSS)9rkS< rlSvS= jrmS> rnS? roS@ rpSA rqSB rrSC rsSD rtSE ruSF rvSG rwSH rxSI rySJ rzSwSL jr{SM r|SN r}SO r~SP rSwSQ jrSR rSS rST rSU rSvSV jrSW rSX rSY rSZ rS[ rS\ rS] rS^ rS_ rS` rSa rSb rSc rSd rSe rSf rSg rSh rSi rSj rSk rSl rSm rSn rSo rSp rSq rSr rSs rStrgK)xGuestT   Tc                     U(       a   [         R                  " [        S5      U5        U(       d  g  U R                  U5        [        [        S5      U-  5      e! [         a     g f = f)Nri   z"Guest name '%s' is already in use.)r   validate_generic_name_lookupByName	Exception
ValueError)connnamecheck_collisionvalidates       r4   validate_nameGuest.validate_nameU   s^    ,,QwZ>	d# ?@4GHH  		s   A 
A&%A&c                    ^  U 4S jn[        S5       H4  nU" 5       n[        R                  " T R                  U5      (       a  M2  Us  $    [        R
                  " S5        g )Nc                    > TR                  5       (       a  g[        SS5       V s/ s H  n [        R                  " SS5      PM     nn US   S-  S-  US'   US   S	-  S
-  US'   SR	                  / SQ5      [        U5      -  $ s  sn f )Nz$00000000-1111-2222-3333-444444444444r               @      ?      -)z%02x%02x%02x%02x%02x%02xr   r   z%02x%02x%02x%02x%02x%02x)fake_conn_predictablerangerandomrandintjointuple)ignoreurq   s     r4   _randomUUID(Guest.generate_uuid.<locals>._randomUUIDd   s    ))++=6;ArlClF3'lACaD4KF+AaDaD4KF+AaD88 ) *,1!H5 5	 Ds   !B   z'Failed to generate non-conflicting UUID)r   r   check_libvirt_collisionlookupByUUIDr	   error)rq   r   r   uuids   `   r4   generate_uuidGuest.generate_uuidb   sS    
	5 CjF=D77%%t- -	 ! 			9	;r7   c                 |  ^  S nSnT R                   R                  nUR                  S5      (       a  UR                  SS5      S   nT R                   R                  S:X  a&  SnT R                  R                  5       (       a  S	nOS
nT R                  R                  T R                  R                  R                  R                  R                  :w  a$  USU" T R                  R                  5      -  -  nSnU 4S jn[        R                  " X4U=(       a    S=(       d    SUU(       + =(       a    S=(       d    SS9$ )Nc                     U S:X  a  gU $ )Narmv7larmr8   )_as    r4   _pretty_arch)Guest.generate_name.<locals>._pretty_arch{   s    X~Ir7   Fz-unknownr   r   r   genericT	containervmz-%sc                 Z   > [         R                  " TR                  R                  U 5      $ r,   )r   r   rq   rn   )nguests    r4   cbGuest.generate_name.<locals>.cb   s%    77

'', ,r7       )	start_num	force_numsep)osinforr   endswithrsplitosis_containerarchrq   capshostcpur   generate_name)r   r   r   basenamer   s   `    r4   r   Guest.generate_namey   s    	
 	<<$$Z((sA.q1H<<	)Ixx$$&&&88==EJJOO0044999UXX]] ;;;HI	, ))(oA*i%#+- 	-r7   c                    ^  U 4S jnT R                   R                  5       (       d  T R                   R                  5       (       a  U" 5       $ g)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                  2  > T R                   S;   a  ST R                  ;   a  gT R                   S;   a"  ST R                  ;   a  gST R                  ;   a  gT R                   S;   a  ST R                  ;   a  gT R                   S;   a  ST R                  ;   a  gg g )	N)ppc64ppc64lepseries)r   aarch64virtzvexpress-a15)s390xzs390-ccw-virtio)riscv64riscv32)r   machines)capsinfos   r4   _qemu_machine4Guest.get_recommended_machine.<locals>._qemu_machine   s    !55X... }} 55X...!!X%6%66)}}	)$(9(99,}} 66X...! / 7r7   N)rq   is_qemuis_test)r   r   s   ` r4   get_recommended_machineGuest.get_recommended_machine   s:    	"& ==  ""hmm&;&;&=&= ?"r7   domain)*typerr   r   genidgenid_enabletitledescription	_metadata	iothreadsiothreadidsrg   	maxMemorymaxMemorySlotsr(   _currentMemory	blkiotunememtunememoryBacking_vcpusvcpu_currentvcpu_placementvcpu_cpusetvcpulistnumatuneresourcesysinfo
bootloaderbootloader_argsr   idmapfeaturesr   clockon_poweroff	on_rebooton_crashpmemulatorr   launchSecurity	seclabelskeywrapc                 x   [         R                  " U /UQ70 UD6  [        R                  U l        SU l        SU l        SU l        SU l        SU l	        SU l
        SU l        SU l        SU l        U R                  R                  U l        SU l        SU l        S U l        S U l        S U l        S U l        S U l        g )NF   )r   __init__r   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_tpmr   SPECIAL_MODE_APP_DEFAULTx86_cpu_defaultnum_pcie_root_portsskip_default_osinfouefi_requested_Guest__osinfo	_capsinfo_domcaps_extra_drivers)r0   argskwargss      r4   r   Guest.__init__   s    D24262 &1%A%A"$)!$)!"'%*"%*" % %"' %#xx@@
 $& #( ""r7   z./namez./iothreadsr`   z./iothreadids)relative_xpathc                 r    Ub.  [        U5      nU R                  b  U R                  U:  a  Xl        Xl        g r,   )intr(   r   r0   vals     r4   _set_currentMemoryGuest._set_currentMemory   s0    ?c(C{{"dkkC&7!!r7   c                     U R                   $ r,   )r   r0   s    r4   _get_currentMemoryGuest._get_currentMemory   s    """r7   z./currentMemoryz./memoryz./maxMemoryz./maxMemory/@slotsc                 r    Ub.  [        U5      nU R                  b  U R                  U:  a  Xl        Xl        g r,   )r  r   r   r  s     r4   
_set_vcpusGuest._set_vcpus   s4    ?c(C  ,1B1BS1H$'!r7   c                     U R                   $ r,   )r   r  s    r4   
_get_vcpusGuest._get_vcpus  s    {{r7   z./vcpuz./vcpu/@currentz./vcpu/@placementz./vcpu/@cpusetz./uuidz./genid)is_boolr_   z./@typez./bootloaderz./bootloader_argsz./descriptionz./titlez./devices/emulatorz./on_poweroffz./on_rebootz
./on_crashz./on_lockfailure)	is_singlec                    U R                   (       a  U R                   $ U R                  R                  R                  nU(       aC  [        R
                  " U5      U l         U R                   (       d  [        R                  " SU5        U R                   (       d7  U R                  (       a  [        R                  " S5      eU R                  5         U R                   $ )NzPXML 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
   lookup_os_by_full_idr	   debugr   r   DevErrorset_default_os_name)r0   r  s     r4   _get_osinfoGuest._get_osinfo:  s    ==== ((.. 55e<DM==		 BCHJ }}
 ''&&DF F$$&}}r7   c                 Z    Xl         UR                  U R                  R                  l        g r,   )r   full_idr   r  r  )r0   objs     r4   _set_os_objGuest._set_os_objQ  s    ),  &r7   c                 ~    [         R                  " USS9n[        R                  " SU5        U R	                  U5        g )NT)raise_errorzSetting Guest osinfo name %s)r
   	lookup_osr	   r  r#  )r0   rr   r"  s      r4   set_os_nameGuest.set_os_nameU  s/    nnTt4		0#6r7   c                 &    U R                  S5        g )Nr   )r(  r  s    r4   r  Guest.set_default_os_nameZ  s    #r7   c                    U R                   R                  5       (       d  gU R                  R                  5       (       d|  U R                  R	                  5       (       d]  U R                  R                  5       (       d>  U R                  R                  5       (       d  U R                  R                  5       (       a  gU(       d  gU R                  R                  5       (       a  ggNFT)	rq   r   r   is_arm_machvirtis_riscv_virtis_s390x
is_pseriesis_loongarch64is_x86)r0   
os_supports     r4   _supports_virtioGuest._supports_virtio]  s    yy  "" GG##%%GG!!##GGGG  GG""$$77>>r7   c                 j    U R                  U R                  R                  U R                  5      5      $ r,   )r5  r   supports_virtionetr   r  s    r4   r8  Guest.supports_virtionetq  s(    $$T[[%C%CDDWDW%XYYr7   c                 j    U R                  U R                  R                  U R                  5      5      $ r,   )r5  r   supports_virtiodiskr   r  s    r4   r;  Guest.supports_virtiodisks  (    $$T[[%D%DTEXEX%YZZr7   c                 j    U R                  U R                  R                  U R                  5      5      $ r,   )r5  r   supports_virtioscsir   r  s    r4   r?  Guest.supports_virtioscsiu  r=  r7   c                 j    U R                  U R                  R                  U R                  5      5      $ r,   )r5  r   supports_virtioserialr   r  s    r4   _supports_virtioserialGuest._supports_virtioserialw  s(    $$T[[%F%FtGZGZ%[\\r7   c                 .    U R                   R                  $ r,   )r   	bootorderr  s    r4   _get_old_boot_orderGuest._get_old_boot_order  s    ww   r7   c                    U R                  5       n/ nSnSnSnSnU R                  R                   Hi  nU(       d  UR                  S:X  a  UnU(       d  UR                  S:X  a  UnU(       d  UR                  S;  a  UnU(       d  MW  U(       d  M`  U(       d  Mi    O   U R                  R                   H  nUn  O   U H  n	U	S:X  a(  U(       a!  UR                  UR                  5       5        M1  U	S:X  a(  U(       a!  UR                  UR                  5       5        M_  U	S:X  a(  U(       a!  UR                  UR                  5       5        M  U	S:X  d  M  U(       d  M  UR                  UR                  5       5        M     U$ )z\Converts the old boot order (e.g. <boot dev='hd'/>) into the
per-device boot order format.

Ncdromfloppy)rJ  rK  networkhdfd)rG  r   r   devicer   append
get_xml_id)
r0   
boot_orderretr   rJ  rK  netdr   bs
             r4   _convert_old_boot_order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,,./  
r7   c                 Z   / nU R                  5        HU  nUR                  R                  (       d  M   UR                  UR	                  5       UR                  R                  45        MW     U(       d  U R                  5       $ UR                  S S9  U Vs/ s H  o3S   PM	     sn$ s  snf )Nc                     U S   $ Nr   r8   )ps    r4   <lambda>.Guest._get_device_boot_order.<locals>.<lambda>  s    1r7   keyr   )get_bootable_devicesbootorderrP  rQ  rW  sort)r0   rc  devr\  s       r4   _get_device_boot_orderGuest._get_device_boot_order  s    ,,.C88>>LL#..*CHHNN;< /
  //11

~
&#$e!e$$$s   B(c                 P    U(       a  U R                  5       $ U R                  5       $ r,   )rG  rf  )r0   legacys     r4   get_boot_orderGuest.get_boot_order  s#    ++--**,,r7   c                    / U R                   l        U R                  R                  5        H  nSUR                  l        M     [        S U R                  5        5       5      n[        US5       H  u  pEXCU   R                  l        M     g)z-Sets the new device boot order for the domainNc              3   D   #    U  H  oR                  5       U4v   M     g 7fr,   )rQ  .0re  s     r4   	<genexpr>/Guest._set_device_boot_order.<locals>.<genexpr>  s!      42 47(#.2s    r   )	r   rF  r   r5   rb  rc  dictra  	enumerate)r0   rR  re  dev_mapboot_idx
dev_xml_ids         r4   _set_device_boot_orderGuest._set_device_boot_order  s{      <<'')C!CHHN *  40024 4$-j!$< H-5J$$* %=r7   c                 V    U(       a  XR                   l        gU R                  U5        g)zModifies the boot orderN)r   rF  rw  )r0   rR  ri  s      r4   set_boot_orderGuest.set_boot_order  s     *GG''
3r7   c                    / U R                   l        [        U R                  5        Vs/ s H  nUR                  R
                  c  M  UPM      snS S9nX!R                  l        SnU HT  nX1L a  M	  UR                  R
                  XR4;   a+  UR                  R
                  S-   nXSR                  l        MO  Uc  MT    g   gs  snf )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                 .    U R                   R                  $ r,   )rb  rc  )rO  s    r4   r]  *Guest.reorder_boot_order.<locals>.<lambda>  s    0A0Ar7   r_  r   )r   rF  sortedra  rb  rc  )r0   re  
boot_indexrO  devs_sortednext_boot_indexs         r4   reorder_boot_orderGuest.reorder_boot_order  s      43L3L3N @3N!'!2!2 %3N @!AC
 $!F}{{  _$AA"(++"3"3a"7$3!* "@s   CCc                 :    U R                   R                  U5        g r,   )r   	add_childr0   re  s     r4   
add_deviceGuest.add_device  s    s#r7   c                 ~    U R                   R                  U5        U R                  U5        U R                  U5        g r,   )r   remove_child_remove_duplicate_console_remove_spice_devicesr  s     r4   remove_deviceGuest.remove_device  s0    !!#&&&s+""3'r7   c                     [        U R                  UR                  5      n[        U5       H  u  p4UR	                  XC5      (       d  M  Us  $    g)zM
Try to find a child device that matches the content of
the passed @origdev.
N)r/   r   DEVICE_TYPErs  compare_device)r0   origdevdevlistidxre  s        r4   find_deviceGuest.find_device  sF    
 $,,(;(;<!'*HC%%c//
 + r7   c                     U R                   nUR                  UR                  -   UR                  -   nU(       d  X2R                  -   nU$ )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"   )r0   exclude_redirdevr   devss       r4   ra  Guest.get_bootable_devices  s@     ,,||g///'//A***Dr7   c                 H   U R                   R                  5       (       an  U R                  R                  5       (       d  U R                  R	                  5       (       a0  U R
                  R                  U R                   R                  5      nO}U R                   R                  5       =(       d\    U R                   R                  5       =(       d;    U R                   R                  5       =(       d    U R                  R                  5       n[        R                  " SU5        U$ )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)r   r3  rq   r   r   r   requires_firmware_efir   r.  r/  r2  is_bhyver	   r  )r0   
prefer_efis     r4   prefers_uefiGuest.prefers_uefi  s     GGNNYY  DII$5$5$7$7
 ::477<<HJ''113 /''//1/''002/ )),,. 
 			$j1r7   c                     U R                   R                  (       a  U R                   R                  S:X  a  gU R                   R                  S:H  $ )NpflashTefi)r   loaderloader_typefirmwarer  s    r4   is_uefiGuest.is_uefi/  s6    77>>dgg11X=ww5((r7   c                    SU R                   l        SU R                   l        XR                   l        U R                   R	                  5       (       a  SU R                   R                  ;   a  SU R
                  l        SU R                   l        U R                   R                  5       (       d=  [        R                  " SU R                   R                  5        SU R                   l        gggg)zM
Set old style UEFI XML via loader path.
Set up smm if needed for secureboot
Tr  secbootzPChanging machine type from '%s' to 'q35' which is required for UEFI secure boot.q35N)r   	loader_ror  r  r3  r   smmloader_secureis_q35r	   warningmachine)r0   paths     r4   set_uefi_pathGuest.set_uefi_path4  s    
 !& GGNN' $DMM$(DGG!77>>## B) #(	 $ ( r7   c                     U R                  5       nUR                  5       (       a  SU R                  l        gU R	                  5       n[
        R                  " SU5        U R                  U5        g)z%
Enable UEFI using our default logic
r  NzSetting default UEFI path=%s)lookup_domcapssupports_firmware_efir   r  _lookup_default_uefi_pathr	   r  r  r0   domcapsr  s      r4   enable_uefiGuest.enable_uefiN  s[     %%'((**$DGG--/		0$74 r7   c                 @   S U R                   l        S U R                   l        S U R                   l        S U R                   l        S U R                   l        S U R                   l        S U R                   l        U R                   R                   H  nU R                   R                  U5        M      U R                  R                  R                  S5        U R                  R                  R                  S5        U R                  R                  R                  S5        g )Nz./os/firmwarez
./os/nvramz./os/loader)r   r  r  r  r  r  nvramnvram_templatefirmware_featuresr  	_xmlstatexmlapinode_force_remove)r0   features     r4   disable_uefiGuest.disable_uefi[  s     " $!%ww00GGG  ) 1 	//@//=//>r7   c                 v    U R                   R                   H  nUR                  UR                  :X  d  M    g   g NT)r   r   r   
TYPE_SPICEr0   gfxs     r4   	has_spiceGuest.has_spicek  s)    <<((Cxx3>>) )r7   c                 d    U R                   R                   H  nUR                  (       d  M    g   g r  )r   r   glr  s     r4   has_glGuest.has_glp  s"    <<((Cvvv )r7   c                     U R                   R                   H$  nUR                  5       nU(       d  M  US:X  d  M$    g   g)NnoneTF)r   r   get_first_listen_type)r0   r  listens      r4   has_listen_noneGuest.has_listen_noneu  s8    <<((C..0Fv&F* ) r7   c                     U R                   R                  5       (       d  gU R                  R                   H  nUR                  S:X  d  M    g   g)NF/T)r   r   r   r   target)r0   fss     r4   is_full_os_containerGuest.is_full_os_container|  s@    ww##%%,,))ByyC * r7   c                     [        U R                  R                   Vs/ s H  oR                  S:H  PM     sn5      nU(       + =(       a    U R	                  5       $ s  snf )zl
Return True if the guest supports virtio-scsi, and there's
no other scsi controllers attached to the guest
scsi)anyr   r   r   r?  )r0   rU  has_any_scsis      r4   can_default_virtioscsiGuest.can_default_virtioscsi  sM    
 dll6M6MN6MFFf,6MNO>D$<$<$>> Os   Ac                 D    U R                   R                  5       (       d  ggr-  )r   
is_windowsr  s    r4   hyperv_supportedGuest.hyperv_supported  s    {{%%''r7   c                    ^ ^ U 4S jmUU 4S jnT R                   (       a  U" T R                   5      (       d  [        R                  " T 5      T l         T R                   $ )Nc                 *  > TR                   R                  U R                  :X  a  g TR                  5       nUR                  TR                   R                  U R                  5      (       a  gg! [         a    [        R
                  " S5         gf = f)NTzCError fetching machine list for alias resolution, assuming mismatchF)r   r  lookup_capsinforo   r	   	exceptionis_machine_alias)r  r   r0   s     r4   _compare_machine.Guest.lookup_domcaps.<locals>._compare_machine  sy    ww'//1//1
 (('//JJ   > ?s   A/ / BBc                   > TR                   S:X  a  gTR                  R                  (       a  T" U 5      (       d  gTR                   (       a  TR                   U R                  :w  a  gTR                  R                  (       a%  TR                  R                  U R                  :w  a  gTR
                  (       a  TR
                  U R                  :w  a  gg)NtestTF)r   r   r  r   r   r   r  )r  r  r0   s    r4   _compare&Guest.lookup_domcaps.<locals>._compare  s    yyF" ww'7'@'@yyTYY'..8ww|| <}}',,!>r7   )r   r   build_from_guest)r0   r  r  s   ` @r4   r  Guest.lookup_domcaps  s@    		 }}HT]]$;$;.??EDM}}r7   c                 Z  ^  U 4S jnT R                   (       a  U" T R                   5      (       dq  T R                  R                  R                  T R                  R
                  T R                  R                  T R                  T R                  R                  S9T l         T R                   $ )Nc                   > TR                   (       a  TR                   U R                  :w  a  gTR                  R                  (       a%  TR                  R                  U R                  :w  a  gTR                  R                  (       a%  TR                  R                  U R                  :w  a  gTR                  R
                  (       a%  TR                  R
                  U R                  ;  a  ggr-  )r   hypervisor_typer   os_typer   r  r   )r   r0   s    r4   r  'Guest.lookup_capsinfo.<locals>._compare  s    yyTYY(*B*BBww477??h6F6F#Fww|| =ww477??(:K:K#Kr7   )r  r   typr  )	r   rq   r   guest_lookupr   r  r   r   r  )r0   r  s   ` r4   r  Guest.lookup_capsinfo  sr    		 ~~Xdnn%=%=!YY^^88WW\\II	 9 )DN
 ~~r7   Nc                    U(       a  Xl         OU R                  5       nU R                  (       + =(       a    U R                  R                  (       + nUR
                  U l        UR                  U R                  l        UR                  U R                  l        U R                  R                  (       d  UR                  U R                  l        U R                  (       d@  U R                  R                  5       (       d!  U R                  S:w  a  UR                  U l        U R                  R                  (       d$  [        R                  U5      U R                  l
        U(       as  U R                  R                  5       (       aS  U R                  R                  5       (       a3  U R                  S:w  a"  [         R"                  " SU R                  5        g g g g g )Nvzkvmz*KVM acceleration not available, using '%s')r   r  r   r   r  r  r   r  r   is_xenpvr  ri   r   rq   r   r3  r	   r  )r0   r   wants_default_types      r4   set_capabilities_defaultsGuest.set_capabilities_defaults  s,   %N++-H!%]B477??/B,,	"**}}ww~~%__DGGN  ""II$--DMww#;;HEDGGOIIGGNNIIKK@$))M     r7   c                     U R                   R                  =(       d    SnSU R                   l        U R                  5       nUR                  =(       a    UR                  R                  =(       d    UR
                  R                  nU Vs/ s H!  oDR                  (       d  M  UR                  PM#     nnU HB  nUS:X  a  SnOUS:X  a  SnOUS-   nUR                  U5      (       d  M2  X`R                   l          g   [        SU-  5      es  snf )	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.
r   Npcz
pc-i440fx-r  zpc-q35-r   z+Don't know how to refresh machine type '%s')
r   r  r  r   r   r   	canonicalrr   
startswithRuntimeError)r0   original_machine_typer   mobjsmcanonical_namesmachine_aliasprefixs           r4   refresh_machine_typeGuest.refresh_machine_type  s     !% 52'') *))F.6nn.E.E 	+0@5aKK61665@,M$%%'" ',$//77"/ - H%& ' 	' As   D#Dc                 J   U R                   R                  5       (       d   U R                   R                  5       (       d  g U R                  R	                  5       (       d   U R                  R                  5       (       d  g U R                  R                  S;  a  g U R                   Vs/ s H  oR                  S:X  d  M  UPM     nnU(       d  U R                  R                  5       /nUS   nUR                  (       a  g SU R                  l        SUl        SUl
        g s  snf )N)Nr   smbiosr   r   z
ds=nocloud)rq   r   r   r   r3  r.  smbios_moder   r   add_newsystem_serial)r0   ssysinfosr   s       r4   set_smbios_serial_cloudinit!Guest.set_smbios_serial_cloudinit  s    		!!##		!!##  ''))77&77#||B|!vv/AA|B,,./H1+  ' , Cs   (D ?D c                     U R                   (       dE  U R                  R                  5       (       a   U R                  R                  5       U l         OXl         U R                  R	                  U R                   5        g)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)vcpusr   has_topologyvcpus_from_topologyset_topology_defaults)r0   defCPUss     r4   sync_vcpus_topologyGuest.sync_vcpus_topology  sM     zzxx$$&&!XX99;
$
&&tzz2r7   c                 `    Xl         US:X  a  U R                  5         g U R                  U5        g Nspice)r   _add_spice_devicesr  )r0   r  insts      r4   change_graphicsGuest.change_graphics)  s(    	'>##%&&t,r7   c                 T   SU R                   l        Ub  [        U5      U l        U R                  R                  5        GHP  nUR                  S:X  a#  UR                  S;   a  U R                  U5        M7  UR                  S:X  a  UR                  S:X  a  SUl	        UR                  S:X  a  UR                  S:X  a  S	Ul	        UR                  S
:X  a  UR                  S:X  at  SUl
        U R                  R                   Vs/ s H!  o3R                  (       d  M  UR                  PM#     nnUR                  U5        UR                  R                  5         UR                  R                  S:X  d  GM6  UR                  R                  5         GMS     U R!                  5         g s  snf )Nr  r   )pciider   ich6ich9r   e1000e1000er   r,  satar+  )r   r  r  r   r   r5   r  r   r  modelbusr   r  generate_targetaddressclearadd_q35_pcie_controllers)r0   r   re  rU  used_targetss        r4   convert_to_q35Guest.convert_to_q350  s<   *'*+>'?D$<<'')C</N*""3'7*		V#"	;.		W$$	6)5  26,,2C2CP2CQxx2CP##L1!!#{{5(!!#- *0 	%%'  Qs   F%F%c                    U R                  5       (       d  g U R                  R                   Vs/ s H  oR                  S:X  d  M  UPM     snS   nUR                  (       d  g [        U R                  5      nSUl        UR                  U R                  5        UR                  (       a  UR                  Ul        U R                  U5        g s  snf )Nr%  r   egl-headless)
r  r   r   r   r  rI   rq   set_defaults
rendernoder  )r0   gspicedevre  s       r4   !_convert_spice_gl_to_egl_headless'Guest._convert_spice_gl_to_egl_headlessP  s    ~~#||44J4!'8IA4J1M{{TYY'!#%00CN Ks   CCc                    U R                   R                   Vs/ s H  o"R                  S:X  d  M  UPM     nnU R                   R                   Vs/ s H)  nUR                  S:w  d  M  UR                  S:w  d  M'  UPM+     nnU(       a  U H  nU R                  U5        M     gU(       dS  [	        U R
                  5      nUR                  Ul        UR                  U R
                  5        U R                  U5        gUR                  S5      n[	        U R
                  UR                  5       5      nU H  nU R                  U5        M     UR                  5         UR                  Ul        UR                  Ul        UR                  Ul        UR                  Ul        UR                  Ul        UR                   Ul        UR"                  Ul        UR$                   H%  nUR'                  U5        UR)                  U5        M'     UR                  U 5        U(       a7  UR*                  UR,                  l        UR.                  UR,                  l        ggs  snf s  snf )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.`
vncr<  Nr   )r   r   r   r  rI   rq   TYPE_VNCr=  r  popget_xmlr6  keymapportautoportpasswdpasswdValidTor  listensr  r  clipboard_copypastesource
mouse_mode)r0   agentr?  vnc_devs
other_devsre  srcdevr  s           r4   _convert_to_vnc_graphicsGuest._convert_to_vnc_graphics_  s     $||44H4!%A4H!%!6!6 D!6Affo *+&&N*B !6
 D
 ""1%    +C||CHTYY'OOC  nnQ		3;;=9Aq!  			<<]]
;;]]
"00]]
nnF'MM&! % 	/5/I/IELL,&,&7&7ELL# S IDs   III(I:Ic                    U R                   R                  (       d8  [        U R                  5      nUR	                  U 5        U R                  U5        gU R                   R                   Vs/ s H  o"R                  S:X  d  M  UPM     nnU(       aI  [        S U R                   R                   5       5      (       d  SU R                   R                  S   l        U H}  nUR                  nUR                  5         UR	                  U 5        U(       a  M9  UR                  S:w  d  MK  [        R                  " SUR                  5        U R                  U5        M     gs  snf )zm
If there's no video device, add a default one.
If there's any qxl device, reset its config to app defaults.
Nqxlc              3   8   #    U  H  oR                   v   M     g 7fr,   )primaryrn  s     r4   rp  .Guest._convert_to_vnc_video.<locals>.<genexpr>  s     J7I7Is   Tr   virtiozECan't use model=%s for non-primary video device, removing it instead.)r   r    rL   rq   r=  r  r2  r  rZ  r6  r	   r  r  )r0   videodevvqxl_devsre  
is_primarys         r4   _convert_to_vnc_videoGuest._convert_to_vnc_video  s    
 ||!!"499-H!!$'OOH%#||11F1!WW5EA1FCJt||7I7IJJJ,0DLLq!)CJIIKT":#))x"7		 125))=""3'  Gs   ,EEc                     [        S U R                  R                   5       5      (       a  g [        U R                  5      nUR
                  Ul        UR                  U 5        U R                  U5        U$ )Nc              3   ^   #    U  H#  nUR                   UR                  :X  d  M  Uv   M%     g 7fr,   )r   TYPE_QEMUVDAGENT)ro  cs     r4   rp  *Guest._add_qemu_vdagent.<locals>.<genexpr>  s+      -.Qvv+++ q.s   -	-)	r  r   r   rF   rq   re  r   r=  r  r  s     r4   _add_qemu_vdagentGuest._add_qemu_vdagent  sb     -$,,.. - - -DII&''
r7   c                     U R                  5         U R                  5         SnU(       a  U R                  5       nU R                  U5        U R	                  5         g)z;
Convert existing XML to have one VNC graphics connection.
N)rA  _force_remove_spice_devicesrh  rU  ra  )r0   qemu_vdagentrQ  s      r4   convert_to_vncGuest.convert_to_vnc  sN     	..0 	((***,E%%e,""$r7   c                 `   U R                  5         U R                  (       d$  [        R                  U R                  5      U l        U R                  S5        U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R                  5         U R!                  5         U R"                  R%                  U 5        U R&                  R%                  U 5        U R(                  R%                  U 5        U R*                   H  nUR%                  U 5        M     U R,                  R%                  U 5        U R.                  R%                  U 5        U R0                  R%                  U 5        U R2                  R5                  5        H  nUR%                  U 5        M     U R7                  5         U R9                  5         U R;                  5         g r[  )r  r   ri   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   r=  r   r   r   r   r   r   r   r5   add_virtioscsi_controllerr7  r&  )r0   _guestseclabelre  s       r4   r=  Guest.set_defaults  s   &&(yy++DII6DI  #!!# ""$&&(&&(((*((*""$$$&

%d#""4(H!!$' 'T"T"((.<<'')CT" * 	&&(%%'!r7   c                     Xl         g r,   )r   )r0   extra_driverss     r4   add_extra_driversGuest.add_extra_drivers  s    +r7   c                 "   U R                   R                  (       a  g U R                  5       nU R                   R                  5       (       a  U R                  R                  5       (       aj  SUR                  ;   aZ  U R                  R                  R                  5       (       a1  U R                  R                  5       (       a  SU R                   l        g UR                  =(       a    UR                  S   =(       d    S nX R                   l        g )Nr  r   )r   r  r  r3  rq   r   r   supportqemu_q35_defaultr   supports_chipset_q35)r0   r   defaults      r4   rp  Guest._set_default_machine  s    77??'')GGNNIIX&&&II..00KK,,..#DGGO##<(9(9!(<D!r7   c                 |   U R                  5       nUR                  5       (       d  [        [        S5      5      eUR	                  5       (       d+  [        [        S5      U R
                  R                  -  5      eUR                  5       nU(       d+  [        [        S5      U R
                  R                  -  5      eU$ )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  supports_uefi_loaderr	  rm   arch_can_uefir   r   find_uefi_path_for_archr  s      r4   r  Guest._lookup_default_uefi_path
  s    
 %%'++--q!IJKK$$&&>?  ..0q "  #ww|| , - - r7   c                    U R                   SL a  g U R                  5       =(       a    U R                  R                  (       + =(       ax    U R                  R                  (       + =(       aV    U R                  R
                  S L =(       a7    U R                  R                  S L =(       a    U R                  R                  S L nU(       d  U R                   (       d  g  U R                  5         g ! [         a^  nU R                   (       a  e [        R                  " SSS9  [        R                  " SU5        [        R                  " S5         S nAg S nAff = f)NFzError setting UEFI defaultT)exc_infozCouldn't configure UEFI: %sz"Your VM may not boot successfully.)r   r  r   kernelr  r  r  r  r  r	  r	   r  r  )r0   use_default_uefies      r4   rq  Guest._set_default_uefi   s    %' --/ %%% GG%% GGMMT!	%
 GG$ 	  (;(;	> 	>""II2TBKK5q9KK<==	>s   C- -
E7AEEc                     U R                   R                   Vs/ s H  nUR                  S:X  d  M  UPM     nnU(       d  g[        U Vs/ s H  oR                  S:H  PM     sn5      $ s  snf s  snf )NusbFr  )r   r   r   allr2  )r0   rf  controllerss      r4   _usb_disabledGuest._usb_disabled7  se    "&,,"9"9 "9QFFeO "9 {;{!GGv%{;<<	 <s   A)A)
A.c                   ^ ^ T R                   (       a  g T R                  R                  5       (       a  g T R                  R                  5       (       a  g T R                  R
                  (       a  g T R                  R                  (       d  g SnSnT R                  R                  5       (       a  SnS mT R                  R                  5       (       a-  T R                  R                  T R                  5      (       a  SmOT R                  5       (       d  SmT(       d  g UU 4S jnU(       a  U" S5        U(       a	  U" S5        g g )NTFr\  r  c                    > [        TR                  5      nXl        TUl        UR	                  T5        TR                  U5        g r,   )rG   rq   r   r3  r=  r  )itypere  r3  r0   s     r4   
_add_input3Guest._add_default_input_device.<locals>._add_input\  s7    dii(CHCGT"OOC r7   tabletkeyboard)r   r   r   r  r   r   r   r3  r0  r   supports_virtioinputr   r  )r0   r  r  r  r3  s   `   @r4   rt  Guest._add_default_input_device>  s    ""77!!77<<||$$77>> H77{{//0C0CDD##%%C	! x z" r7   c                 V   U R                   (       a  g U R                  R                  (       d  U R                  R                  (       a  g [	        U R
                  5      nU R
                  R                  5       (       ad  SR                  U R                  U R
                  5      5      nUR                  Ul
        US-   UR                  l        US-   UR                  l        OUR                  Ul
        U R                  R!                  5       (       a  SUl        U R%                  U5        g )Nz/dev/nmdm{}ABsclp)r   r   r   r   rE   rq   r  formatr   	TYPE_NMDMr   rO  masterslaveTYPE_PTYr   r0  target_typer  )r0   re  nmdm_dev_prefixs      r4   ru  !Guest._add_default_console_deviceh  s    $$<<4<<#6#6DII&99+2243E3Edii3PQO}}CH /# 5CJJ.4CJJ||CH77$COr7   c                     U R                   R                  5       (       a  g U R                  R                  (       a  g U R                  R                  (       d  g U R                  [        U R                  5      5        g r,   )r   r   r   r    r   r  rL   rq   r  s    r4   rs  Guest._add_default_video_device{  sM    77!!<<||$$DII./r7   c                    [        U R                  R                   Vs/ s H  oR                  S:H  PM     sn5      (       a  g U R                  R                  5       (       d   U R                  R                  5       (       d  g U R                  R                  R                  5       nSnSnU R                  R                  5       (       a4  [        U R                  R                  5       =(       a    U5      nU(       + nOU R                  R                  5       (       a3  U(       a+  U R                  R                  R                  5       (       a  SnOU R                  R!                  5       (       a3  U(       a+  U R                  R                  R#                  5       (       a  SnOQU R                  R%                  5       (       a
  U(       a  SnO(U R                  R'                  5       (       a	  U(       a  SnU(       a8  [(        R+                  U R                  5       H  nU R-                  U5        M     g U(       a0  U R-                  [(        R/                  U R                  U 5      5        g g s  snf )Nr  FT)r  r   r   r   rq   r   r   r  conn_qemu_xhcir   r3  boolr   supports_usb3r.  conn_machvirt_pci_defaultr/  conn_riscv_virt_pci_defaultr1  r2  r?   get_usb2_controllersr  get_usb3_controller)r0   rU  	qemu_usb3usb2usb3re  s         r4   rv  !Guest._add_default_usb_controller  s   )@)@A)@A%)@ABByy  ""499+<+<+>+>II%%446	77>>113A	BD8DWW$$&&		!!;;==WW""$$ 		!!==??WW!!WW##%%'<<TYYG$ HOO 44TYYEG G Bs   I)c                    U R                   (       a  g U R                  R                  (       a  g U R                  R	                  5       (       a  U R                  5       (       ap  U R                  R                  R                  5       (       aF  [        U R                  5      nSUl	        SUl
        UR                  Ul        U R                  U5        g g g g )Nunixr\  )r   r   r   rq   r   rC  r  conn_autosocketrF   r   r  CHANNEL_NAME_QEMUGAtarget_namer  r  s     r4   rw  Guest._add_default_channels  s    $$<<II''))II--//		*CCH&CO!55COOOC  0 *  r7   c                 ^   U R                   (       a  g U R                  R                  (       a  g U R                  R	                  5       (       a   U R
                  R                  5       (       d  g U R                  R                  5       (       d}  U R                  R                  5       (       d^  U R                  R                  5       (       d?  U R                  R                  5       (       d   U R                  R                  5       (       d  g U R                  [        U R
                  5      5        g r,   )r   r   r   r   r   rq   is_vzr3  r1  r2  r.  r/  r  rI   r  s    r4   rr  Guest._add_default_graphics  s    %%<<  77!!$))//*;*;  ""$$&&((''))%%''tyy12r7   c                 (   U R                   (       a  g U R                  R                  (       a  g U R                  R	                  5       (       d  U R                  R                  5       (       d}  U R                  R                  5       (       d^  U R                  R                  5       (       d?  U R                  R                  5       (       d   U R                  R                  5       (       d  g U R                  R                  5       (       a  U R                  R                  U R                  5      (       a_  U R                  R                  R!                  5       (       a5  [#        U R                  5      nSUl        SUl        U R)                  U5        g g g g )Nr   z/dev/urandom)r   r   r%   r   r3  r.  r/  r0  r1  r2  rq   r   r   supports_virtiorngr   r  conn_rng_urandomrQ   r   rO  r  r  s     r4   rx  Guest._add_default_rng  s     <<  ''))%%''  """"$$&&((IIKK**4+>+>??II..00DII&CCH'CJOOC 	 1 @  r7   c                    U R                   (       a  g U R                  R                  (       a  g U R                  5       (       d  g U R	                  5       R                  5       (       d  [        R                  " S5        g [        R                  " S5        [        U R                  5      n[        R                  Ul        U R                  U5        SU l        g )Nz&Domain caps doesn't report TPM supportzAdding default TPMT)r   r   r   r  r  supports_tpm_emulatorr	   r  rH   rq   TYPE_EMULATORr   r  r   r  s     r4   rz  Guest._add_default_tpm  s      <<
 ||~~""$::<<II>?		&'		"** $r7   c                    U R                   R                  (       a  g U R                  R                  5       (       d  g U R                  R                  5       (       d  U R                  R                  5       (       d}  U R                  R                  5       (       d^  U R                  R                  5       (       d?  U R                  R                  5       (       d   U R                  R                  5       (       d  g U R                  R                  U R                  5      (       a.  [        U R                  5      nSUl        U R!                  U5        g g )Nr\  )r   r$   rq   r   r   r3  r.  r/  r0  r1  r2  r   supports_virtioballoonr   rP   r2  r  r  s     r4   ry  Guest._add_default_memballoon  s    <<""yy  ""
   ''))%%''  """"$$&&((;;--d.A.ABB"499-C CIOOC  Cr7   c                 R   U R                  5       (       d  g [        U R                  R                   Vs/ s H  oR                  S:X  d  M  UPM     sn5      (       d  g [        U R                  5      nSUl        SUl        UR                  U 5        U R                  U5        g s  snf )Nr  zvirtio-scsi)r  r  r   r   r3  r?   rq   r   r2  r=  r  )r0   rU  ctrls      r4   r{  Guest.add_virtioscsi_controller  s    **,,t||00D0!EEVOA0DEE		*	"
$ Es   B$B$c                    U R                   R                  5       (       a  gU R                   R                  5       (       a  gU R                   R                  5       (       a  gU R                   R	                  5       (       a  gg)NTF)r   r  r.  r/  r2  r  s    r4   defaults_to_pcieGuest.defaults_to_pcie  s[    77>>77""$$77  ""77!!##r7   c                    [        U R                  R                   Vs/ s H  oR                  S:X  d  M  UPM     sn5      (       a  g U R	                  5       (       d  g Sn[
        R                  " SU R                  5        [        [        U R                  S5      5       H  nU(       dG  [        U R                  5      nSUl        SUl        UR                  U 5        U R                  U5        Sn[        U R                  5      nSUl        SUl        UR                  U 5        U R                  U5        M     g s  snf )Nr+  FzUsing num_pcie_root_ports=%sr   z	pcie-rootTzpcie-root-port)r  r   r   r   r  r	   r  r   r   maxr?   rq   r2  r=  r  )r0   rf  addeddummyr  s        r4   r7  Guest.add_q35_pcie_controllers"  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
   D;D;c                 z   U R                  5       R                  5       (       d  g U R                  (       a  g U R                  R                   H  nUR
                  UR                  :X  d  M    g    [        U R                  5      n[        R                  Ul        UR                  U 5        U R                  U5        g r,   )r  supports_channel_spicevmcr   r   r   r   TYPE_SPICEVMCrF   rq   r=  r  )r0   chnre  s      r4   _add_spice_channelsGuest._add_spice_channels9  s    ""$>>@@$$<<''Cxx3,,, ( DII& ..r7   c                    U R                   (       a  g U R                  R                  (       a  g U R                  R	                  5       (       d  g [        U R                  5      nUR                  U 5        U R                  U5        g r,   )	r   r   r   r   is_hvmrJ   rq   r=  r  r  s     r4   _add_spice_soundGuest._add_spice_soundK  sZ    ""<<ww~~$))$r7   c                    U R                  5       R                  5       (       d  g U R                  (       a  g U R                  R                  (       a  g U R                  5       (       a  g U R                  R                  5       (       d  g [        S5       HH  n[        U R                  5      nSUl        SUl        UR                  U 5        U R                  U5        MJ     g )Nr   r  spicevmc)r  supports_redirdev_usbr   r   r"   r  r   r3  r   rN   rq   r3  r   r=  r  )r0   r   re  s      r4   _add_spice_usbredirGuest._add_spice_usbredirW  s    ""$::<<%%<<  ww~~
 AhF +CCG!CHT"OOC  r7   c                 p   U R                  5       (       d  g U R                  R                  cY  U R                  R	                  5       (       a:  U R
                  R                  R                  5       (       a  SU R                  l        U R                  5         U R                  5         U R                  5         g )NF)r  r   vmportr   r3  rq   r  conn_vmportr  r  r  r  s    r4   r&  Guest._add_spice_devicesm  s|    ~~MM  (GGNNII))++#(DMM   "  "r7   c                     [         R                  X5      nU(       aA  [        R                  " SUR	                  5       5        U R
                  R                  U5        g g )Nz"Found duplicate console device:
%s)rE   get_console_duplicater	   r  rG  r   r  )r0   re  condups      r4   r  Guest._remove_duplicate_consolez  sB    44T?II;V^^=MNLL%%f- r7   c                     U R                   R                   H0  nUR                  S:X  d  M  U R                   R                  U5        M2     g r$  )r   r   r   r  )r0   r   s     r4   _remove_spice_audioGuest._remove_spice_audio  s4    \\''EzzW$))%0 (r7   c                     U R                   R                   H>  nUR                  [        R                  :X  d  M#  U R                   R                  U5        M@     g r,   )r   r   r   rF   r  r  )r0   r   s     r4   _remove_spice_channelsGuest._remove_spice_channels  s:    ||++G||}:::))'2 ,r7   c                     U R                   R                   H0  nUR                  S:X  d  M  U R                   R                  U5        M2     g )Nr  )r   r"   r   r  )r0   r"   s     r4   _remove_spice_usbredirGuest._remove_spice_usbredir  s4    --H}}
*))(3 .r7   c                     U R                   R                  U R                   R                  -    H:  nUR                  UR                  :X  d  M  U R                   R                  U5        M<     g r,   )r   r   r   r   TYPE_SPICEPORTr  r  s     r4   _remove_spiceportGuest._remove_spiceport  sI    <<&&)=)==Cxx3---))#. >r7   c                     U R                  5         U R                  5         U R                  5         U R                  5         g r,   )r  r  r  r  r  s    r4   rk  !Guest._force_remove_spice_devices  s2      "##%##% r7   c                 p    UR                   S:w  d  U R                  5       (       a  g U R                  5         g )Nr   )r  r  rk  )r0   rmdevs     r4   r  Guest._remove_spice_devices  s+    
*dnn.>.>((*r7   )__osinfor   r   r   r   r   r   r   r   r(   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   )TT)Fr,   )r9   r:   r;   r<   staticmethodru   r   r   r   r=   r-   r   r   rr   r   r   rY   r   re   rg   r	  r  propertycurrentMemoryr   r(   r   r   r  r  r   r  r   r   r   r   r   r   r\   r   r   r   r   r   r   r   r   r   on_lockfailureDomainVCPUsr   DomainSeclabelr   DomainKeyWrapr   DomainOsr   DomainFeaturesr   DomainClockr   	DomainCpur   DomainCputunecputuneDomainNumatuner   DomainPmr   DomainBlkiotuner   DomainMemtuner   DomainMemoryBackingr   DomainIdmapr   DomainResourcer   DomainSysinfor   DomainLaunchSecurityr   DomainMetadatar   DomainXMLNSQemu
xmlns_qemur  r   r#  r(  r  r5  r8  r;  r?  rC  rG  rW  rf  rj  rw  rz  r  r  r  r   r   r  ra  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r(  r9  rA  rU  ra  rh  rm  r=  r  rp  r  rq  r  rt  ru  rs  rv  rw  rr  rx  rz  ry  r{  r  r7  r  r  r  r&  r  r  r  r  r  rk  r  rW   r8   r7   r4   ri   ri   T   s1   
I 
I ; ;, - -<  D HOO#D 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* k"F5
$(Z[[]!#J%-
64 N$(
 ~>G	,)
(4!? 

?
 D*M4#'J-*3-(@58n(4	%"#"J,"",>.=(#T&0&GP!3!*%,!,
	".$
!,#.1
3
4
/
!+r7   ri   )r   r   r   r   buildconfigr   r   r   domcapabilitiesr   loggerr	   osdictr
   
xmlbuilderr   r   r   Device_ignorer   rY   re   ri   r8   r7   r4   <module>r&     sd       $   /   A A
)Z )XE* EEz EI+J I+r7   