o
    pb                     @   s   d dl Z ddlmZ ddlmZ ddlmZ ddlT ddlT ddlm	Z	 ddl
mZ dd	lmZ dd
lmZmZmZ eZG dd deZG dd deZG dd deZdS )    N   )generatename)xmlutil)BuildConfig)*)DomainCapabilities)log)OSDB)
XMLBuilderXMLPropertyXMLChildPropertyc                   @   s   e Zd ZdZg dZeeZeeZ	ee
ZeeZeeZeeZeeZeeZeeZeeZeeZeeZeeZee Z!ee"Z#ee$Z%ee&Z'ee(Z)ee*Z+ee,Z-ee.Z/ee0Z1ee2Z3ee4Z5ee6Z7dd Z8dS )_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                 C   s(   g }t j}|D ]
}|t| | q|S N)r   _XML_PROP_ORDERextendgetattr)selfretlistdevtypesdevtype r0   )/usr/share/virt-manager/virtinst/guest.pyget_all;   s
   z_DomainDevices.get_allN)9__name__
__module____qualname__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'   r2   r0   r0   r0   r1   r      s:    r   c                   @   s"   e Zd ZdZdgZedddZdS )_IOThreadIDiothreadid./@idTis_intN)r3   r4   r5   r6   r)   r   rR   r0   r0   r0   r1   rP   D   s    rP   c                   @   s>  e Zd ZedddZedd Zedd Zedd	 Zd
Zg dZ	dd Z
edZedddZeeddZdd Zdd ZeeeZedddZedddZedddZedddZdd Zdd ZedddZeeeZed ddZed!Zed"Zed#Z ed$Z!ed$dd%Z"ed&ddZ#ed'Z$ed(Z%ed)Z&ed*Z'ed+Z(ed,Z)ed-Z*ed.Z+ed/Z,ed0Z-ee.dd1Z/ee0Z1ee2dd1Z3ee4dd1Z5ee6dd1Z7ee8dd1Z9ee:dd1Z;ee<dd1Z=ee>dd1Z?ee@dd1ZAeeBdd1ZCeeDdd1ZEeeFdd1ZGeeHdd1ZIeeJdd1ZKeeLZMeeNdd1ZOeePdd1ZQeeRdd1ZSd2d3 ZTeeTZUd4d5 ZVd6d7 ZWd8d9 ZXd:d; ZYd<d= ZZd>d? Z[d@dA Z\dBdC Z]dDdE Z^dFdG Z_dHdI Z`ddKdLZadMdN ZbddOdPZcdQdR ZddSdT ZedUdV Zfeegdd1ZhdWdX ZiddYdZZjd[d\ Zkd]d^ Zld_d` Zmdadb Zndcdd Zodedf Zpdgdh Zqdidj Zrdkdl Zsdmdn Ztdodp Zudqdr ZvddtduZwdvdw Zxdxdy Zydzd{ Zzd|d} Z{d~d Z|dd Z}dd Z~dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdsS )GuestTc                 C   sP   |r
t td| |sd S z| | W n
 ty   Y d S w ttd| )NrV   z"Guest name '%s' is already in use.)r
   validate_generic_name_lookupByName	Exception
ValueError)connnamecheck_collisionvalidater0   r0   r1   validate_nameL   s   zGuest.validate_namec                    sD    fdd}t dD ]}| }t j|s|  S q
td d S )Nc                     s^      rdS dd tddD } | d d@ dB | d< | d	 d
@ dB | d	< dg dt|  S )Nz$00000000-1111-2222-3333-444444444444c                 S   s   g | ]}t d dqS )r      )randomrandint).0ignorer0   r0   r1   
<listcomp>`       z<Guest.generate_uuid.<locals>._randomUUID.<locals>.<listcomp>r            @      ?      -)z%02x%02x%02x%02x%02x%02xrp   rp   z%02x%02x%02x%02x%02x%02x)fake_conn_predictablerangejointuple)ur\   r0   r1   _randomUUID[   s   z(Guest.generate_uuid.<locals>._randomUUID   z'Failed to generate non-conflicting UUID)rr   r   check_libvirt_collisionlookupByUUIDr   error)r\   rw   re   uuidr0   rv   r1   generate_uuidY   s   zGuest.generate_uuidc                    s   dd }d} j j}|dr|ddd } j jdkr)d	} j r'd
}nd} jj jjj	j
jkr@|d| jj 7 }d} fdd}tj|||rNdpOd|| rUdpVddS )Nc                 S   s   | dkrdS | S )Narmv7larmr0   )_ar0   r0   r1   _pretty_archr   s   z)Guest.generate_name.<locals>._pretty_archFz-unknownro   r   r   genericT	containervmz-%sc                    s   t  jj| S r(   )r   ry   r\   rY   )nguestr0   r1   cb   s   zGuest.generate_name.<locals>.cb    )	start_num	force_numsep)osinfor]   endswithrsplitosis_containerarchr\   capshostcpur   generate_name)r   r   r   basenamer   r0   r   r1   r   p   s$   

zGuest.generate_namec                    s*    fdd} j  s j  r| S dS )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                      sv    j dv rd jv rdS  j dv rd jv rdS d jv rdS  j dv r+d jv r+dS  j dv r7d jv r9dS d S d S )	N)ppc64ppc64lepseries)r~   aarch64virtzvexpress-a15)s390xzs390-ccw-virtio)riscv64riscv32)r   machinesr0   capsinfor0   r1   _qemu_machine   s    








z4Guest.get_recommended_machine.<locals>._qemu_machineN)r\   is_qemuis_test)r   r   r0   r   r1   get_recommended_machine   s   zGuest.get_recommended_machinedomain))typer]   r|   genidgenid_enabletitledescription	_metadata	iothreadsiothreadids	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                 O   s   t j| g|R i | tj| _d| _d| _d| _d| _d| _	d| _
d| _| jj| _d| _d| _d| _d | _d | _d | _d | _d S )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_tpmr   SPECIAL_MODE_APP_DEFAULTx86_cpu_defaultnum_pcie_root_portsskip_default_osinfouefi_requested_Guest__osinfo	_capsinfo_domcaps_extra_drivers)r,   argskwargsr0   r0   r1   r      s"   

zGuest.__init__z./namez./iothreadsrT   z./iothreadids)relative_xpathc                 C   s4   |d urt |}| jd u s| j|k r|| _|| _d S r(   )intr%   r   r,   valr0   r0   r1   _set_currentMemory   s
   
zGuest._set_currentMemoryc                 C      | j S r(   )r   r,   r0   r0   r1   _get_currentMemory      zGuest._get_currentMemoryz./currentMemoryz./memoryz./maxMemoryz./maxMemory/@slotsc                 C   s4   |d urt |}| jd ur| j|kr|| _|| _d S r(   )r   r   r   r   r0   r0   r1   
_set_vcpus   s
   
zGuest._set_vcpusc                 C   r   r(   )r   r   r0   r0   r1   
_get_vcpus   r   zGuest._get_vcpusz./vcpuz./vcpu/@currentz./vcpu/@placementz./vcpu/@cpusetz./uuidz./genid)is_boolrS   z./@typez./bootloaderz./bootloader_argsz./descriptionz./titlez./devices/emulatorz./on_poweroffz./on_rebootz
./on_crashz./on_lockfailure)	is_singlec                 C   s\   | j r| j S | jjj}|rt|| _ | j std| | j s+| jr't	
d|   | j S )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)r,   r   r0   r0   r1   _get_osinfo-  s    
zGuest._get_osinfoc                 C   s   || _ |j| jj_d S r(   )r   full_idr   r   r   )r,   objr0   r0   r1   _set_os_objD  s   zGuest._set_os_objc                 C   s(   t j|dd}td| | | d S )NT)raise_errorzSetting Guest osinfo name %s)r	   	lookup_osr   r   r   )r,   r]   r   r0   r0   r1   set_os_nameH  s   zGuest.set_os_namec                 C   s   |  d d S )Nr   )r   r   r0   r0   r1   r   M  s   zGuest.set_default_os_namec                 C   sT   | j  sdS | j s| j s| j s| j rdS |s!dS | j r(dS dS NFT)r\   r   r   is_arm_machvirtis_riscv_virtis_s390x
is_pseriesis_x86)r,   
os_supportr0   r0   r1   _supports_virtioP  s   


zGuest._supports_virtioc                 C      |  | j| jS r(   )r  r   supports_virtionetr   r   r0   r0   r1   r  c     zGuest.supports_virtionetc                 C   r  r(   )r  r   supports_virtiodiskr   r   r0   r0   r1   r  e  r  zGuest.supports_virtiodiskc                 C   r  r(   )r  r   supports_virtioscsir   r   r0   r0   r1   r  g  r  zGuest.supports_virtioscsic                 C   r  r(   )r  r   supports_virtioserialr   r   r0   r0   r1   _supports_virtioseriali  r  zGuest._supports_virtioserialc                 C      | j jS r(   )r   	bootorderr   r0   r0   r1   _get_old_boot_orderq  s   zGuest._get_old_boot_orderc           
      C   s   |   }g }d}d}d}d}| jjD ]%}|s|jdkr|}|s&|jdkr&|}|s/|jdvr/|}|r7|r7|r7 nq| jjD ]}|} |D ]9}	|	dkrS|rS||  qC|	dkra|ra||  qC|	dkro|ro||  qC|	dkr||r|||  qC|S )zlConverts the old boot order (e.g. <boot dev='hd'/>) into the
        per-device boot order format.

        Ncdromfloppy)r  r  networkhdfd)r  r   r   devicer   append
get_xml_id)
r,   
boot_orderretr   r  r  netdr   br0   r0   r1   _convert_old_boot_ordert  s<   zGuest._convert_old_boot_orderc                 C   s\   g }|   D ]}|jjsq|| |jjf q|s|  S |jdd d dd |D S )Nc                 S   s   | d S Nr   r0   )pr0   r0   r1   <lambda>      z.Guest._get_device_boot_order.<locals>.<lambda>keyc                 S   s   g | ]}|d  qS )r   r0   )rd   r  r0   r0   r1   rf     s    z0Guest._get_device_boot_order.<locals>.<listcomp>)get_bootable_devicesbootorderr  r  r  sort)r,   r$  devr0   r0   r1   _get_device_boot_order  s   zGuest._get_device_boot_orderFc                 C   s   |r|   S |  S r(   )r  r'  )r,   legacyr0   r0   r1   get_boot_order  s   zGuest.get_boot_orderc                 C   sZ   g | j _| j D ]}d|j_q	tdd |  D }t|dD ]
\}}||| j_q dS )z-Sets the new device boot order for the domainNc                 s   s    | ]	}|  |fV  qd S r(   )r  )rd   r&  r0   r0   r1   	<genexpr>  s    z/Guest._set_device_boot_order.<locals>.<genexpr>r   )	r   r  r   r2   r#  r$  dictr"  	enumerate)r,   r  r&  dev_mapboot_idx
dev_xml_idr0   r0   r1   _set_device_boot_order  s   
zGuest._set_device_boot_orderc                 C   s   |r|| j _dS | | dS )zModifies the boot orderN)r   r  r0  )r,   r  r(  r0   r0   r1   set_boot_order  s   zGuest.set_boot_orderc                 C   s~   g | j _tdd |  D dd d}||j_d}|D ]!}||u r"q|jj||fv r5|jjd }||j_q|dur< dS qdS )aD  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.

        c                 S   s   g | ]
}|j jd ur|qS r(   r#  r$  )rd   r  r0   r0   r1   rf     s    z,Guest.reorder_boot_order.<locals>.<listcomp>c                 S   r  r(   r2  )r  r0   r0   r1   r    r  z*Guest.reorder_boot_order.<locals>.<lambda>r   Nr   )r   r  sortedr"  r#  r$  )r,   r&  
boot_indexdevs_sortednext_boot_indexr  r0   r0   r1   reorder_boot_order  s"   
zGuest.reorder_boot_orderc                 C      | j | d S r(   )r   	add_childr,   r&  r0   r0   r1   
add_device     zGuest.add_devicec                 C   r8  r(   )r   remove_childr:  r0   r0   r1   remove_device  r<  zGuest.remove_devicec                 C   s8   t | j|j}t|D ]\}}|||r|  S qdS )ze
        Try to find a child device that matches the content of
        the passed @origdev.
        N)r+   r   DEVICE_TYPEr,  compare_device)r,   origdevdevlistidxr&  r0   r0   r1   find_device  s   zGuest.find_devicec                 C   s*   | j }|j|j |j }|s||j }|S )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,   exclude_redirdevr   devsr0   r0   r1   r"    s
   
zGuest.get_bootable_devicesc                 C   sT   | j  r| j s| j r| j| j j}n
| j  p!| j	 }t
d| |S )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   r  r\   r   r   r   requires_firmware_efir   r   is_bhyver   r   )r,   
prefer_efir0   r0   r1   prefers_uefi  s   
zGuest.prefers_uefic                 C   s$   | j jr| j jdkrdS | j jdkS )NpflashTefi)r   loaderloader_typefirmwarer   r0   r0   r1   is_uefi  s   zGuest.is_uefic                 C   sp   d| j _d| j _|| j _| j  r2d| j jv r4d| j_d| j _| j  s6t	
d| j j d| j _dS dS dS dS )ze
        Set old style UEFI XML via loader path.
        Set up smm if needed for secureboot
        TrK  secbootzPChanging machine type from '%s' to 'q35' which is required for UEFI secure boot.q35N)r   	loader_rorN  rM  r  r   smmloader_secureis_q35r   warningmachine)r,   pathr0   r0   r1   set_uefi_path  s   
	
zGuest.set_uefi_pathc                 C   s>   |   }| rd| j_dS |  }td| | | dS )z5
        Enable UEFI using our default logic
        rL  NzSetting default UEFI path=%s)lookup_domcapssupports_firmware_efir   rO  _lookup_default_uefi_pathr   r   rZ  r,   domcapsrY  r0   r0   r1   enable_uefi9  s   zGuest.enable_uefic                 C   s$   | j jD ]}|j|jkr dS qd S NT)r   r   r   
TYPE_SPICEr,   gfxr0   r0   r1   	has_spiceF  s
   zGuest.has_spicec                 C   s   | j jD ]}|jr dS qd S ra  )r   r   glrc  r0   r0   r1   has_glK  s
   zGuest.has_glc                 C   s,   | j jD ]}| }|r|dkr dS qdS )NnoneTF)r   r   get_first_listen_type)r,   rd  listenr0   r0   r1   has_listen_noneP  s   zGuest.has_listen_nonec                 C   s0   | j  sdS | jjD ]
}|jdkr dS qdS )NF/T)r   r   r   r   target)r,   fsr0   r0   r1   is_full_os_containerW  s   

zGuest.is_full_os_containerc                 C   s$   t dd | jjD }| o|  S )z
        Return True if the guest supports virtio-scsi, and there's
        no other scsi controllers attached to the guest
        c                 S      g | ]}|j d kqS scsir   rd   r  r0   r0   r1   rf   d      z0Guest.can_default_virtioscsi.<locals>.<listcomp>)anyr   r   r  )r,   has_any_scsir0   r0   r1   can_default_virtioscsi_  s   zGuest.can_default_virtioscsic                 C   s   | j  sdS dS r   )r   
is_windowsr   r0   r0   r1   hyperv_supportedg  s   
zGuest.hyperv_supportedc                    s.    fdd} j r| j st  _  j S )Nc                    sr    j dkrdS  jjr jj| jkrdS  j r j | jkrdS  jjr, jj| jkr,dS  jr7 j| jkr7dS dS )NtestTF)r   r   rX  r   r   r   rY  )r_  r   r0   r1   _comparen  s   
z&Guest.lookup_domcaps.<locals>._compare)r   r   build_from_guestr,   r|  r0   r   r1   r[  l  s   zGuest.lookup_domcapsc                    sH    fdd} j r| j s! jjj jj jj j jjd _  j S )Nc                    sh    j r j | jkrdS  jjr jj| jkrdS  jjr% jj| jkr%dS  jjr2 jj| jvr2dS dS r   )r   hypervisor_typer   os_typer   rX  r   r   r   r0   r1   r|    s   z'Guest.lookup_capsinfo.<locals>._compare)r  r   typrX  )	r   r\   r   guest_lookupr   r  r   r   rX  r~  r0   r   r1   lookup_capsinfo  s   zGuest.lookup_capsinfoNc                 C   s   |r|| _ n|  }| j o| jj }|j| _|j| j_|j| j_| jjs*|j| j_| js;| j	 s;| jdkr;|j| _| jj
sFt|| j_
|r`| j rb| j rd| jdkrftd| j d S d S d S d S d S )Nvzkvmz*KVM acceleration not available, using '%s')r   r  r   r   r  r  r   rM  r   is_xenpvrX  rV   r   r\   r   r  r   rW  )r,   r   wants_default_typer0   r0   r1   set_capabilities_defaults  s6   




zGuest.set_capabilities_defaultsc                 C   s   | j jpd}d| j _|  }|jr|jjp|jj}dd |D }|D ] }|dkr+d}n|dkr2d}n|d	 }||rB|| j _ dS q"td
| )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   Nc                 S   s   g | ]}|j r|jqS r0   )	canonicalr]   )rd   mr0   r0   r1   rf     rg   z.Guest.refresh_machine_type.<locals>.<listcomp>pcz
pc-i440fx-rR  zpc-q35-ro   z+Don't know how to refresh machine type '%s')r   rX  r  r   r   r   
startswithrZ   )r,   original_machine_typer   mobjscanonical_namesmachine_aliasprefixr0   r0   r1   refresh_machine_type  s,   
zGuest.refresh_machine_typec                 C   s   | j  s| j  sd S | j s| j sd S | jjdvr d S dd | jD }|s0| j g}|d }|j	r9d S d| j_d|_
d|_	d S )N)Nr   c                 S      g | ]	}|j d kr|qS )smbiosrs  )rd   sr0   r0   r1   rf         z5Guest.set_smbios_serial_cloudinit.<locals>.<listcomp>r   r   r  z
ds=nocloud)r\   r   r   r   r  r   smbios_moder   add_newsystem_serialr   )r,   sysinfosr   r0   r0   r1   set_smbios_serial_cloudinit  s&   


z!Guest.set_smbios_serial_cloudinitc                 C   s6   | j s| j r| j | _ n|| _ | j| j  dS )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)r,   defCPUsr0   r0   r1   sync_vcpus_topology  s
   
zGuest.sync_vcpus_topologyc                 C   s  |    | jst| j| _| d |   |   |   | 	  | 
  |   |   |   |   |   |   | j|  | j|  | j|  | jD ]}||  qT| j|  | j|  | j|  | j D ]}||  qs|   |   |   d S r  )r  r|   rV   r}   r\   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   set_defaultsr   r   r   r   r   r   r   r2   _add_virtioscsi_controller_add_q35_pcie_controllers_add_spice_devices)r,   _guestseclabelr&  r0   r0   r1   r    s8   

zGuest.set_defaultsc                 C   s
   || _ d S r(   )r   )r,   extra_driversr0   r0   r1   add_extra_drivers  s   
zGuest.add_extra_driversc                 C   st   | j jrd S |  }| j  r*| j r*d|jv r*| jj r*| j	
 r*d| j _d S |jr2|jd p3d }|| j _d S )NrR  r   )r   rX  r  r  r\   r   r   supportqemu_q35_defaultr   supports_chipset_q35)r,   r   defaultr0   r0   r1   r  $  s   


zGuest._set_default_machinec                 C   s\   |   }| sttd| sttd| jj | }|s,ttd| jj |S )zg
        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_loaderRuntimeErrorrX   arch_can_uefir   r   find_uefi_path_for_archr^  r0   r0   r1   r]  5  s   zGuest._lookup_default_uefi_pathc              
   C   s   |   o| jj o| jj o| jjd u o| jjd u o| jjd u }|s'| js'd S z|   W d S  t	yW } z| jr: t
jddd t
d| t
d W Y d }~d S d }~ww )NzError setting UEFI defaultT)exc_infozCouldn't configure UEFI: %sz"Your VM may not boot successfully.)rJ  r   kernelrM  rS  nvramrO  r   r`  r  r   r   rW  )r,   use_default_uefier0   r0   r1   r  K  s.   



zGuest._set_default_uefic                 C   s,   dd | j jD }|sdS tdd |D S )Nc                 S   r  usbrs  rd   cr0   r0   r1   rf   `  s    
z'Guest._usb_disabled.<locals>.<listcomp>Fc                 S   rp  )rh  )modelr  r0   r0   r1   rf   d  ru  )r   r   all)r,   controllersr0   r0   r1   _usb_disabled_  s   zGuest._usb_disabledc                 C   s$  | j  rd S | jjrd S | jjsd S |  rd S d}d}| j  r)| j  s)d}| j  s8| j 	 s8| j 
 r<d}d}|rNt| j}d|_d|_| | |r`t| j}d|_d|_| | | j  r| j| jrt| j}d|_d|_| | t| j}d|_d|_| | d S d S d S )NFTtabletr  keyboardvirtio)r   r   r   r   r   r  r  r  r   r   r   r@   r\   r   busr;  r   r   supports_virtioinputr   )r,   
usb_tabletusb_keyboardr&  r0   r0   r1   r  f  sN   








zGuest._add_default_input_devicec                 C   s   | j rd S | jjs| jjrd S t| j}| j r3d| | j}|j	|_
|d |j_|d |j_n|j|_
| j r?d|_| | d S )Nz/dev/nmdm{}ABsclp)r   r   r   r   r>   r\   rH  formatr}   	TYPE_NMDMr   sourcemasterslaveTYPE_PTYr   r   target_typer;  )r,   r&  nmdm_dev_prefixr0   r0   r1   r    s   


z!Guest._add_default_console_devicec                 C   s:   | j  rd S | jjrd S | jjsd S | t| j d S r(   )r   r   r   r   r   r;  rE   r\   r   r0   r0   r1   r    s   
zGuest._add_default_video_devicec                 C   s   t dd | jjD rd S | j s| j sd S | jj }d}d}| j	 r5t
| j o/|}| }n)| j rE|rD| jj rDd}n| j rU|rT| jj rTd}n	| j r^|r^d}|rpt| jD ]}| | qfd S |r~| t| j|  d S d S )Nc                 S   rp  r  rs  rt  r0   r0   r1   rf     ru  z5Guest._add_default_usb_controller.<locals>.<listcomp>FT)rv  r   r   r\   r   r   r  conn_qemu_xhcir   r  boolr   supports_usb3r   conn_machvirt_pci_defaultr   conn_riscv_virt_pci_defaultr   r8   get_usb2_controllersr;  get_usb3_controller)r,   	qemu_usb3usb2usb3r&  r0   r0   r1   r    sD   





z!Guest._add_default_usb_controllerc                 C   sl   | j rd S | jjrd S | j r0|  r2| jj r4t| j}d|_	d|_
|j|_| | d S d S d S d S )Nunixr  )r   r   r   r\   r   r
  r  conn_autosocketr?   r   r  CHANNEL_NAME_QEMUGAtarget_namer;  r:  r0   r0   r1   r    s   


zGuest._add_default_channelsc                 C   sZ   | j rd S | jjrd S | j r| j sd S | j s#| j s#d S | 	t
| j d S r(   )r   r   r   r   r   r\   is_vzr  r   r;  rB   r   r0   r0   r1   r    s   
zGuest._add_default_graphicsc                 C   s   | j rd S | jjrd S | j s&| j s&| j s&| j s&| j s&d S | j	
 rJ| j| jrL| j	j rNt| j	}d|_d|_| | d S d S d S d S )Nrb   z/dev/urandom)r   r   r"   r   r  r   r   r   r   r\   r   r   supports_virtiorngr   r  conn_rng_urandomrJ   r   r  r;  r:  r0   r0   r1   r    s0   



zGuest._add_default_rngc                 C   sf   | j rd S | jjrd S |  sd S |   std d S td t| j	}tj
|_| | d S )Nz&Domain caps doesn't report TPM supportzAdding default TPM)r   r   r   rP  r[  supports_tpm_emulatorr   r   rA   r\   TYPE_EMULATORr   r;  r:  r0   r0   r1   r     s   


zGuest._add_default_tpmc                 C   s   | j jrd S | j sd S | j s(| j s(| j s(| j s(| j	 s(d S | j
| jr>t| j}d|_| | d S d S )Nr  )r   r!   r\   r   r   r  r   r   r   r   r   supports_virtioballoonr   rI   r  r;  r:  r0   r0   r1   r    s&   


zGuest._add_default_memballoonc                 C   sT   |   sd S tdd | jjD sd S t| j}d|_d|_||  | 	| d S )Nc                 S   r  rq  )r  rt  r0   r0   r1   rf   -  r  z4Guest._add_virtioscsi_controller.<locals>.<listcomp>rr  zvirtio-scsi)
rx  rv  r   r   r8   r\   r   r  r  r;  )r,   ctrlr0   r0   r1   r  *  s   

z Guest._add_virtioscsi_controllerc                 C   s.   | j  rdS | j  rdS | j  rdS dS )NTF)r   rV  r   r   r   r0   r0   r1   defaults_to_pcie6  s   


zGuest.defaults_to_pciec                 C   s   t dd | jjD rd S |  sd S d}td| j tt| jdD ]0}|s?t	| j
}d|_d|_||  | | d}t	| j
}d|_d	|_||  | | q$d S )
Nc                 S   r  )pcirs  r  r0   r0   r1   rf   @  r  z3Guest._add_q35_pcie_controllers.<locals>.<listcomp>FzUsing num_pcie_root_ports=%sr   r  z	pcie-rootTzpcie-root-port)rv  r   r   r  r   r   r   rr   maxr8   r\   r   r  r  r;  )r,   addeddummyr  r0   r0   r1   r  ?  s(   




zGuest._add_q35_pcie_controllersc                 C   sT   | j rd S | jjD ]}|j|jkr d S q	t| j}tj|_||  | | d S r(   )	r   r   r   r   TYPE_SPICEVMCr?   r\   r  r;  )r,   chnr&  r0   r0   r1   _add_spice_channelsV  s   

zGuest._add_spice_channelsc                 C   sF   | j rd S | jjrd S | j sd S t| j}||  | | d S r(   )	r   r   r   r   is_hvmrC   r\   r  r;  r:  r0   r0   r1   _add_spice_soundf  s   


zGuest._add_spice_soundc                 C   sl   | j rd S | jjrd S |  rd S | j sd S tdD ]}t| j}d|_	d|_
||  | | qd S )Nr   r  spicevmc)r   r   r   r  r   r  rr   rG   r\   r  r   r  r;  )r,   re   r&  r0   r0   r1   _add_spice_usbredirr  s   


zGuest._add_spice_usbredirc                 C   sR   |   sd S | jjd u r| j r| jj rd| j_|   | 	  | 
  d S )NF)re  r   vmportr   r  r\   r  conn_vmportr  r  r  r   r0   r0   r1   r    s   
zGuest._add_spice_devices)TT)Fr(   )r3   r4   r5   staticmethodr`   r}   r   r   r6   r)   r   r   r]   r   r   rP   r   r   r   propertycurrentMemoryr   r%   r   r   r   r   r   r  r   r   r   r|   r   r   rR   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   r  r  r  r  r
  r  r  r'  r)  r0  r1  r7  r;  r>  r   r   rD  r"  rJ  rP  rZ  r`  re  rg  rk  ro  rx  rz  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  r0   r0   r0   r1   rV   K   s    


" 

%

'

%%*	%	rV   )rb   r   r   r   buildconfigr   r   r   domcapabilitiesr   loggerr   osdictr	   
xmlbuilderr
   r   r   Device_ignorer   rP   rV   r0   r0   r0   r1   <module>   s   ,