o
    b3                     @   s   d dl Z d dlZd dlZddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ dd	lmZ dd
lmZmZ ddlmZmZ dd ZG dd deZdS )    N   )Capabilities)pollhelpers)support)xmlutil)Guest)log)
NodeDevice)StoragePoolStorageVolume)URIMagicURIc                  C   s(   d} t t| stt| t  tt| S )zc
    Lookup the local libvirt library version, but cache the value since
    it never changes.
    __virtinst_cached_getVersion)hasattrlibvirtsetattr
getVersiongetattr)key r   ./usr/share/virt-manager/virtinst/connection.py_real_local_libvirt_version   s   

r   c                   @   s  e Zd ZdZedd Zedd Zdd Zdd	 Zd
d Z	e
e	Zdd Ze
eZdd Zdd Zdd Zdd Zdd Zdd ZdZdZdZdZdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Z d0d1 Z!d2d3 Z"d4d5 Z#d6d7 Z$d8d9 Z%d:d; Z&d<d= Z'd>d? Z(d@dA Z)dBdC Z*dDdE Z+dFdG Z,dHdI Z-dJdK Z.dLdM Z/dNdO Z0dPdQ Z1dRdS Z2dTdU Z3dVdW Z4dXdY Z5dZd[ Z6d\d] Z7d^d_ Z8d`da Z9dbdc Z:ddde Z;dfdg Z<dhdi Z=djS )kVirtinstConnectionz
    Wrapper for libvirt connection that provides various bits like
    - caching static data
    - lookup for API feature support
    - simplified API wrappers that handle new and old ways of doing things
    c                  C   s*   t jd} | st jd} t j| dS )NXDG_CACHE_HOMEz~/.cachezvirt-manager)osenvirongetpath
expanduserjoin)retr   r   r   get_app_cache_dir)   s   z$VirtinstConnection.get_app_cache_dirc                   C   s   t  S N)r   in_testsuiter   r   r   r   r#   0   s   zVirtinstConnection.in_testsuitec                 C   s   |pd}t |r+t || _| jj| _| jjp| j| _| jj| _| jj	| _
| jj| _nd | _|| _|| _d| _d | _d | _
d | _d | _d | _t| j| _d | _i | _d | _d | _d | _d | _d | _tt| | _d S )N F)r   uri_is_magic
_magic_uriopen_uri	_open_urifakeuri_uripredictable_fake_conn_predictableconn_version_fake_conn_versionlibvirt_version_fake_libvirt_version_daemon_version_conn_version_libvirtconnr   _uriobj_caps_fetch_cachecb_fetch_all_domainscb_fetch_all_poolscb_fetch_all_volscb_fetch_all_nodedevscb_cache_new_poolr   SupportCacheweakrefproxy)selfuri_initial_urir   r   r   __init__4   s4   




zVirtinstConnection.__init__c                 C   s   | j d}t||S )Nr3   )__dict__r   r   )r?   attrlibvirtconnr   r   r   __getattr__`   s   
zVirtinstConnection.__getattr__c                 C   s   | j p| jS r"   )r*   r(   r?   r   r   r   _get_urie      zVirtinstConnection._get_uric                 C   s   | j st| | j | _ | j S r"   )r5   r   r3   getCapabilitiesrG   r   r   r   	_get_capsi   s
   zVirtinstConnection._get_capsc                 C      | j S r"   )r3   rG   r   r   r   get_conn_for_api_argp      z'VirtinstConnection.get_conn_for_api_argc                 C   s*   d}| j r
| j  }d | _ d | _i | _|S Nr   )r3   closer*   r6   r?   r    r   r   r   rP   x   s   
zVirtinstConnection.closec                 C   rL   r"   )r,   rG   r   r   r   fake_conn_predictable   rN   z(VirtinstConnection.fake_conn_predictablec                 C   s
   d | _ d S r"   )r5   rG   r   r   r   invalidate_caps      
z"VirtinstConnection.invalidate_capsc                 C   s
   t | jS r"   )boolr3   rG   r   r   r   is_open   rT   zVirtinstConnection.is_openc                 C   s   | j r| j   tjtjtjtjtjtjg}d}t	| j
|||g|}| j r,| j | || _| j
s@| j | _t| j| _d S d S rO   )r&   validater   VIR_CRED_AUTHNAMEVIR_CRED_ECHOPROMPTVIR_CRED_REALMVIR_CRED_PASSPHRASEVIR_CRED_NOECHOPROMPTVIR_CRED_EXTERNALopenAuthr(   overwrite_conn_functionsr3   getURIr*   r   r4   )r?   authcbcbdatavalid_auth_options
open_flagsconnr   r   r   open   s*   
zVirtinstConnection.openvmspoolsvolsnodedevsc                 C   s2   |r| S || j vr| | j |< | j | d d  S r"   )r6   )r?   r   raw_cboverride_cbr   r   r   _fetch_helper   s
   
z VirtinstConnection._fetch_helperc                 C   s   t | i dd \}}}g }|D ]/}z|d}W n tjy2 } ztd| W Y d }~qd }~ww |tt	
| |d q|S )Nc                 S      | S r"   r   objignorer   r   r   <lambda>       z;VirtinstConnection._fetch_all_domains_raw.<locals>.<lambda>r   zFetching domain XML failed: %sparsexml)r   	fetch_vmsXMLDescr   libvirtErrorr   debugappendr   r=   r>   )r?   dummy1dummy2r    domainsrp   xmler   r   r   _fetch_all_domains_raw   s   

z)VirtinstConnection._fetch_all_domains_rawc                 C   s   t t| |ddS )Nr   rt   )r
   r=   r>   rw   r?   poolobjr   r   r   _build_pool_raw   s   
z"VirtinstConnection._build_pool_rawc                 C   sv   t | i dd \}}}g }|D ](}z| |}W n tjy2 } ztd| W Y d }~qd }~ww || q|S )Nc                 S   rn   r"   r   ro   r   r   r   rr      rs   z9VirtinstConnection._fetch_all_pools_raw.<locals>.<lambda>zFetching pool XML failed: %s)r   fetch_poolsr   r   rx   r   ry   rz   )r?   r{   r|   r    rh   r   poolr   r   r   r   _fetch_all_pools_raw   s   

z'VirtinstConnection._fetch_all_pools_rawc                    s*   t  i dd \}}} fdd|D S )Nc                 S   rn   r"   r   ro   r   r   r   rr      rs   z<VirtinstConnection._fetch_all_nodedevs_raw.<locals>.<lambda>c                    s"   g | ]}t t |d qS )r   )r	   r=   r>   rw   ).0rp   rG   r   r   
<listcomp>   s    z>VirtinstConnection._fetch_all_nodedevs_raw.<locals>.<listcomp>)r   fetch_nodedevs)r?   r{   r|   r    r   rG   r   _fetch_all_nodedevs_raw   s   


z*VirtinstConnection._fetch_all_nodedevs_rawc           
      C   s   g }z	| j |j}W n tjy   | Y S w | d tjkr#|S t| |i dd \}}}|D ].}z|	d}|
tt| |d W q2 tjy` }	 ztd|	 W Y d }	~	q2d }	~	ww |S )Nr   c                 S   rn   r"   r   ro   r   r   r   rr      rs   z4VirtinstConnection._fetch_vols_raw.<locals>.<lambda>rt   zFetching volume XML failed: %s)r3   storagePoolLookupByNamenamer   rx   infoVIR_STORAGE_POOL_RUNNINGr   fetch_volumesrw   rz   r   r=   r>   r   ry   )
r?   
poolxmlobjr    r   r{   r|   ri   volr~   r   r   r   r   _fetch_vols_raw   s(   

z"VirtinstConnection._fetch_vols_rawc                 C   s&   g }|   D ]
}|| | q|S r"   )fetch_all_poolsextendr   )r?   r    r   r   r   r   _fetch_all_vols_raw   s   z&VirtinstConnection._fetch_all_vols_rawc                 C   s`   | j | jvrd S | j| j  }| |}|| | j| jvr d S | j| j }|| | d S r"   )_FETCH_KEY_POOLSr6   r   rz   _FETCH_KEY_VOLSr   r   )r?   r   poollistr   vollistr   r   r   _cache_new_pool_raw   s   

z&VirtinstConnection._cache_new_pool_rawc                 C   s   | j r|  |S | |S )z:
        Insert the passed poolobj into our cache
        )r;   r   r   r   r   r   cache_new_pool  s   

z!VirtinstConnection.cache_new_poolc                 C      |  | j| j| jS )z3
        Returns a list of Guest() objects
        )rm   _FETCH_KEY_DOMAINSr   r7   rG   r   r   r   fetch_all_domains  
   z$VirtinstConnection.fetch_all_domainsc                 C   r   )z7
        Returns a list of StoragePool objects
        )rm   r   r   r8   rG   r   r   r   r     r   z"VirtinstConnection.fetch_all_poolsc                 C   r   )z9
        Returns a list of StorageVolume objects
        )rm   r   r   r9   rG   r   r   r   fetch_all_vols#  r   z!VirtinstConnection.fetch_all_volsc                 C   r   )z8
        Returns a list of NodeDevice() objects
        )rm   _FETCH_KEY_NODEDEVSr   r:   rG   r   r   r   fetch_all_nodedevs,  r   z%VirtinstConnection.fetch_all_nodedevsc                 C   rL   r"   )r*   rG   r   r   r   r`   :  rN   zVirtinstConnection.getURIc                 C   s   | j d ur| j S t S r"   )r0   r   rG   r   r   r   local_libvirt_versionB  s   
z(VirtinstConnection.local_libvirt_versionc                 C   sn   | j d ur| j S |  st S | jd u r4d| _z
| j | _W | jS  ty3   tjddd Y | jS w | jS )Nr   zError calling getLibVersionTexc_info)	r0   	is_remoter   r1   r3   getLibVersion	Exceptionr   ry   rG   r   r   r   daemon_versionH  s   

z!VirtinstConnection.daemon_versionc                 C   s`   | j d ur| j S | jd u r-d| _z
| j | _W | jS  ty,   tjddd Y | jS w | jS )Nr   zError calling getVersionTr   )r.   r2   r3   r   r   r   ry   rG   r   r   r   r-   V  s   

zVirtinstConnection.conn_versionc                 C   s   t | jjS r"   )rU   r4   hostnamerG   r   r   r   r   g  rI   zVirtinstConnection.is_remotec                 C   s,   |   dkrdS |   dkrt dkS dS )Nz/sessionFz/embedr   T)get_uri_pathr   getuidrG   r   r   r   is_privilegedi  s
   z VirtinstConnection.is_privilegedc                 C   s
   |    S r"   )r   rG   r   r   r   is_unprivilegedo  rT   z"VirtinstConnection.is_unprivilegedc                 C      | j jS r"   )r4   r   rG   r   r   r   get_uri_hostnamer     z#VirtinstConnection.get_uri_hostnamec                 C   r   r"   )r4   portrG   r   r   r   get_uri_portt  r   zVirtinstConnection.get_uri_portc                 C   r   r"   )r4   usernamerG   r   r   r   get_uri_usernamev  r   z#VirtinstConnection.get_uri_usernamec                 C   s   |   r
| jjs
dS | jjS )Ntls)r   r4   	transportrG   r   r   r   get_uri_transportx  s   z$VirtinstConnection.get_uri_transportc                 C   r   r"   )r4   r   rG   r   r   r   r   ~  r   zVirtinstConnection.get_uri_pathc                 C   r   r"   )r4   schemerG   r   r   r   get_uri_driver  r   z!VirtinstConnection.get_uri_driverc                 C      | j jdS )Nqemur4   r   
startswithrG   r   r   r   is_qemu     zVirtinstConnection.is_qemuc                 C      |   o|  S r"   )r   r   rG   r   r   r   is_qemu_privileged     z%VirtinstConnection.is_qemu_privilegedc                 C   r   r"   )r   r   rG   r   r   r   is_qemu_unprivileged  r   z'VirtinstConnection.is_qemu_unprivilegedc                 C   s   t | jjdS Ntest)r   r(   r   r   rG   r   r   r   is_really_test  s   z!VirtinstConnection.is_really_testc                 C   r   r   r   rG   r   r   r   is_test  r   zVirtinstConnection.is_testc                 C      | j jdp| j jdS )Nxenlibxlr   rG   r   r   r   is_xen     zVirtinstConnection.is_xenc                 C   r   )Nlxcr   rG   r   r   r   is_lxc  r   zVirtinstConnection.is_lxcc                 C   r   )Nopenvzr   rG   r   r   r   	is_openvz  r   zVirtinstConnection.is_openvzc                 C   s   |   p|  S r"   )r   r   rG   r   r   r   is_container_only  r   z$VirtinstConnection.is_container_onlyc                 C   r   )Nvz	parallelsr   rG   r   r   r   is_vz  r   zVirtinstConnection.is_vzc                 C   r   )Nbhyver   rG   r   r   r   is_bhyve  r   zVirtinstConnection.is_bhyvec                 C   s(   | j  }| js|  rd}|  p|S )NF)r   conn_streamr&   r   r#   rQ   r   r   r   support_remote_url_install  s   
z-VirtinstConnection.support_remote_url_installN)>__name__
__module____qualname____doc__staticmethodr!   r#   rB   rF   rH   propertyr@   rK   capsrM   rP   rR   rS   rV   rf   r   r   r   r   rm   r   r   r   r   r   r   r   r   r   r   r   r   r`   r   r   r-   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   "   sx    

,	 				r   )r   r=   r   r$   r   r   r   r   guestr   loggerr   nodedevr	   storager
   r   r@   r   r   r   objectr   r   r   r   r   <module>   s   