o
    b2                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZ 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 ddlmZ G dd deZG dd deZdS )    N)log)pollhelpers   )connectauth)testmock)
vmmGObject)LibvirtEnumMap)	vmmDomain)
vmmNetwork)vmmNodeDevice)vmmStoragePool)vmmStatsManagerc                   @   sl   e 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dd Zdd ZdS )_ObjectListz?
    Class that wraps our internal list of libvirt objects
       c                 C   s$   t |  g | _i | _t | _d S N)r   __init___objects	_denylist	threadingLock_lockself r   1/usr/share/virt-manager/virtManager/connection.pyr   %   s   
z_ObjectList.__init__c                 C   s
   g | _ d S r   )r   r   r   r   r   _cleanup,      
z_ObjectList._cleanupc                 C   s   t |j|  S r   )str	__class__get_namer   objr   r   r   _denylist_key/      z_ObjectList._denylist_keyc                 C   s0   |  |}| j|d}|d | j|< | j| S )z
        Add an object to the denylist. Basically a list of objects we
        choose not to poll, because they threw an error at init time

        :param obj: vmmLibvirtObject to denylist
        :returns: number of added object to list
        r   r   )r"   r   get)r   r!   keycountr   r   r   add_denylist2   s   

z_ObjectList.add_denylistc                 C   s   |  |}t| j|dS )z
        :param obj: vmmLibvirtObject to remove from denylist
        :returns: True if object was denylisted or False otherwise.
        r   )r"   boolr   popr   r!   r%   r   r   r   remove_denylist?   s   
z_ObjectList.remove_denylistc                 C   s   |  |}| j|dtjkS )z
        If an object is in list only once don't consider it denylisted,
        give it one more chance.

        :param obj: vmmLibvirtObject to check
        :returns: True if object is denylisted
        r   )r"   r   r$   r   BLACKLIST_COUNTr*   r   r   r   in_denylistG   s   
z_ObjectList.in_denylistc                 C   s\   | j ! || jvr| |W  d   S | j| 	 W d   dS 1 s'w   Y  dS )z
        Remove an object from the list.

        :param obj: vmmLibvirtObject to remove
        :returns: True if object removed, False if object was not found
        NT)r   r   r+   remover    r   r   r   r.   R   s   
$z_ObjectList.removec                 C   st   | j - | jD ]}|j|jkr | | kr  W d   dS q| j| 	 W d   dS 1 s3w   Y  dS )z
        Add an object to the list.

        :param obj: vmmLibvirtObject to add
        :returns: True if object added, False if object already in the list
        NFT)r   r   r   r   append)r   r!   checkobjr   r   r   addb   s   
$z_ObjectList.addc                    s>   | j   fdd| jD W  d   S 1 sw   Y  dS )zK
        Return all objects over the passed vmmLibvirtObject class
        c                    s   g | ]	}|j  u r|qS r   )r   .0oclassobjr   r   
<listcomp>|   s    z5_ObjectList.get_objects_for_class.<locals>.<listcomp>Nr   r   )r   r6   r   r5   r   get_objects_for_classw   s   $z!_ObjectList.get_objects_for_classc                 C   s(   |  |D ]}| |kr|  S qdS )zB
        Lookup an object with the passed classobj + name
        N)r9   r   )r   r6   namer!   r   r   r   lookup_object~   s
   z_ObjectList.lookup_objectc                 C   s8   | j  | jd d  W  d    S 1 sw   Y  d S r   r8   r   r   r   r   all_objects   s   $z_ObjectList.all_objectsN)__name__
__module____qualname____doc__r,   r   r   r"   r'   r+   r-   r.   r1   r9   r;   r<   r   r   r   r   r      s    
r   c                   @   s  e Zd Zejdegfejdegfejdegfejdegfejdegfejdegfejdegfejdegfejdg fejdg fejdegfdZedd\ZZ	Z
dd Zedd Zd	d
 ZdddZdd Zdd Zdd Zdd Zedd Zdd Zdd Zdd Zedd Zedd Zed d Zed!d Zed"d Zed#d Zed$d Zed%d Z ed&d Z!ed'd Z"ed(d Z#ed)d Z$ed*d Z%ed+d Z&ed,d Z'd-d. Z(d/d0 Z)d1d2 Z*ed3d4 Z+d5d6 Z,d7d8 Z-d9d: Z.d;d< Z/d=d> Z0d?d@ Z1dAdB Z2dCdD Z3dEdF Z4dGdH Z5dIdJ Z6dKdL Z7dMdN Z8dOdP Z9dQdR Z:dSdT Z;dUdV Z<dWdX Z=dYdZ Z>d[d\ Z?d]d^ Z@d_d` ZAdadb ZBdcdd ZCdedf ZDdgdh ZEdidj ZFdkdl ZGdmdn ZHdodp ZIdqdr ZJdsdt ZKdudv ZLdwdx ZMdydz ZNd{d| ZOd}d~ ZPdd ZQdd ZRdd ZSdd ZTdd ZU				dddZVdd ZWdd ZXdd ZYdd ZZdddZ[dddZ\dddZ]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd ZldS )vmmConnectionN)vm-added
vm-removed	net-addednet-removed
pool-addedpool-removednodedev-addednodedev-removedresources-sampledstate-changedopen-completedr      c                 C   s   || _ t|  | j| _t| j | _d| _d | _	d | _
d | _d| _g | _d| _g | _d| _g | _d| _g | _i | _t | _t | _g | _d | _| | | j |   d S )NF)_urir   r   _STATE_DISCONNECTED_statevirtinstVirtinstConnection_backend_closingconnect_error_init_object_count_init_object_eventusing_domain_events_domain_cb_idsusing_network_events_network_cb_idsusing_storage_pool_events_storage_pool_cb_idsusing_node_device_events_node_device_cb_ids
_xml_flagsr   r   r   statsmanager_stats	_hostinfoadd_gsettings_handle_on_config_pretty_name_changed_config_pretty_name_changed_cb_init_virtconn)r   urir   r   r   r      s6   
zvmmConnection.__init__c                 C   s   |   } |  }|}|dkr| dkrd}|S | dkrd}|S |dkr2| dkr*d}|S | dkr0d}|S |dkr:d	}|S |d
kr@d}|S )zu
        Convert XML <domain type='foo'> and <os><type>bar</type>
        into a more human relevant string.
        xenzxen (paravirt)hvmzxen (fullvirt)testz
test (xen)z
test (hvm)qemuzQEMU TCGkvmKVM)lower)gtypedomtypelabelr   r   r   	pretty_hv   s.   zvmmConnection.pretty_hvc                 C   s   d| j j|  tt| f S )Nz<%s uri=%s id=%s>)r   r=   get_urihexidr   r   r   r   __repr__   s   zvmmConnection.__repr__r   c                 C   sj   ddl m} t jdk}t }	 t }| rdS || |kr#dS |r/| r/|d qtd q)zi
        Wait for this object to emit the specified signal. Will not
        block the mainloop.
        r   )Gtk
MainThreadTNFg?)	gi.repositoryrx   r   current_threadr:   timeevents_pendingmain_iteration_dosleep)r   
compare_cbtimeoutrx   is_main_thread
start_timecur_timer   r   r   _wait_for_condition   s   

z!vmmConnection._wait_for_conditionc                    s\    fdd j _ fdd j _ fdd j _ fdd}| j _ fdd}| j _d S )	Nc                         dd    D S )Nc                 S      g | ]}|j d dqS Frefresh_if_nec
get_xmlobjr3   r!   r   r   r   r7         BvmmConnection._init_virtconn.<locals>.<lambda>.<locals>.<listcomp>)list_vmsr   r   r   r   <lambda>      z.vmmConnection._init_virtconn.<locals>.<lambda>c                      r   )Nc                 S   r   r   r   r   r   r   r   r7     r   r   )
list_poolsr   r   r   r   r     r   c                      r   )Nc                 S   r   r   r   r   r   r   r   r7     r   r   )list_nodedevsr   r   r   r   r     r   c                     sj   g }    D ],}| D ]%}z| |jdd W q ty1 } ztd| W Y d }~qd }~ww q| S )NFr   zFetching volume XML failed: %s)r   get_volumesr/   r   	Exceptionr   debug)retpoolvoler   r   r   fetch_all_vols  s   z4vmmConnection._init_virtconn.<locals>.fetch_all_volsc                    s<     sd S |   jdd  fdd}| d S )NT)pollpoolc                      s   t  S r   )r(   get_pool_by_namer   )r:   r   r   r   r        zHvmmConnection._init_virtconn.<locals>.cache_new_pool.<locals>.compare_cb)	is_activer:   schedule_priority_tickr   )r!   r   r   )r:   r   cache_new_pool  s   z4vmmConnection._init_virtconn.<locals>.cache_new_pool)rS   cb_fetch_all_domainscb_fetch_all_poolscb_fetch_all_nodedevscb_fetch_all_volscb_cache_new_pool)r   r   r   r   r   r   rg     s   


	zvmmConnection._init_virtconnc                 C      | j S r   )rN   r   r   r   r   rt   (     zvmmConnection.get_uric                 C   r   r   )rS   r   r   r   r   get_backend*  r   zvmmConnection.get_backendc                 C   
   | j  S r   )rS   invalidate_capsr   r   r   r   r   -  r   zvmmConnection.invalidate_capsc                 C      t | djS NrS   )getattrcapsr   r   r   r   r   /      zvmmConnection.<lambda>c                 C   s&   | j  r
| jd u rdS | jd d S )Nr   r   i   rS   is_openrc   r   r   r   r   host_memory_size1  s   zvmmConnection.host_memory_sizec                 C   s"   | j  r
| jd u rdS | jd S )Nr      r   r   r   r   r   host_active_processor_count6  s   
z)vmmConnection.host_active_processor_countc                 C   r   r   )rS   getHostnamer   r   r   r   libvirt_gethostname@  r   z!vmmConnection.libvirt_gethostnamec                 C   r   r   )r   get_uri_hostnamesr   r   r   r   C     c                 C   r   r   )r   get_uri_usernamer   r   r   r   r   E  r   c                 C   r   r   )r   get_uri_transportr   r   r   r   r   G  r   c                 C   r   r   )r   get_uri_portr   r   r   r   r   I  r   c                 C   r   r   )r   get_uri_driverr   r   r   r   r   J  r   c                 C   r   r   )r   is_container_onlyr   r   r   r   r   L  r   c                 C   r   r   )r   is_lxcr   r   r   r   r   M  r   c                 C   r   r   )r   is_vzr   r   r   r   r   N  r   c                 C   r   r   )r   is_xenr   r   r   r   r   O  r   c                 C   r   r   )r   	is_remoter   r   r   r   r   P  r   c                 C   r   r   )r   is_qemur   r   r   r   r   Q  r   c                 C   r   r   )r   is_qemu_privilegedr   r   r   r   r   R  r   c                 C   r   r   )r   is_qemu_unprivilegedr   r   r   r   r   S  r   c                 C   r   r   )r   is_testr   r   r   r   r   U  r   c                 C   r   r   )r   is_unprivilegedr   r   r   r   r   V  r   c                 C   s@   |   dd}tj| j |}tj|st|d |S )N/_i  )	rt   replaceospathjoinrS   get_app_cache_direxistsmakedirs)r   rh   r   r   r   r   get_cache_dirY  s
   zvmmConnection.get_cache_dirc                 C   sB   | j jdd}|dkr|S | j  }|dkr|S | j r|S d S )NT)rawdefaultqcow2)configget_default_storage_formatsupportconn_default_qcow2)r   r   fmtr   r   r   r   `  s   

z(vmmConnection.get_default_storage_formatc                 C   s   |   r|   S dddddddd}||  |  }|  }|   }|}|d	kr5|d
td 7 }n|rK|dkrKtj	|rK|dtj	| 7 }|rS|d| 7 }|S )zj
        Return a pretty label for use in the manager view, and various
        connection lists.
        ESXLXCOpenVZzQEMU/KVM
VirtualboxVMWareXen)esxlxcopenvzrl   vboxvmwareri   z/session zUser sessionz/systemz %sz: %s)
_get_config_pretty_namer$   
get_driverr   r   get_uri_pathr   r   r   basename)r   
pretty_maphvhostnamer   r   r   r   r   get_pretty_descr  s*   
zvmmConnection.get_pretty_descc                 C   s   | j jS r   )rS   r   r   r   r   r   r     s   zvmmConnection.supportc           
      C   sX   |}| j |}|d u r | \}}i }||d< ||d< || j |< |d }|d }	|	|fS )Nactiveinactive)r`   r$   )
r   r!   r%   
check_funcignore
flags_dictinactactactive_flagsinactive_flagsr   r   r   _get_flags_helper  s   

zvmmConnection._get_flags_helperc                    s    d} fdd}  ||S )Ndomainc                     s\   d} d} j rtj}ntd  j r%|tjO }tj} || fS td || fS )Nr   z'Domain XML inactive flag not supported.z%Domain XML secure flag not supported.)r   domain_xml_inactivelibvirtVIR_DOMAIN_XML_INACTIVEr   r   domain_xml_secureVIR_DOMAIN_XML_SECURE)r   r   r   vmr   r   r     s   


z/vmmConnection.get_dom_flags.<locals>.check_func)r   )r   r  r%   r   r   r  r   get_dom_flags  s   zvmmConnection.get_dom_flagsc                 C   s<   t j|  }|r|  D ]}| |jkr|  S qd S r   )rQ   StoragePoollookup_default_poolr   r   r   r:   )r   poolxmlpr   r   r   get_default_pool  s   zvmmConnection.get_default_poolc                 C   sp   |   D ]1}| D ]*}z| |kr|W     S W q
 ty4 } ztd|| W Y d }~q
d }~ww qd S )Nz(Error looking up volume from path=%s: %s)r   r   get_target_pathr   r   r   )r   r   r   r   r   r   r   r   get_vol_by_path  s   zvmmConnection.get_vol_by_pathc                 C   s8   | j |kr|| _ td|  |   | d d S d S )Nzconn=%s changed to state=%srK   )rP   r   r   rt   get_state_textemit)r   newstater   r   r   _change_state  s   
zvmmConnection._change_statec                 C      | j | jkS r   )rP   _STATE_ACTIVEr   r   r   r   r     r   zvmmConnection.is_activec                 C   r  r   )rP   rO   r   r   r   r   is_disconnected  r   zvmmConnection.is_disconnectedc                 C   r  r   )rP   _STATE_CONNECTINGr   r   r   r   is_connecting  r   zvmmConnection.is_connectingc                 C   s(   |   rtdS |  rtdS tdS )NDisconnected
ConnectingActive)r  r   r  r   r   r   r   r    s
   zvmmConnection.get_state_textc                 C      | j t|S r   )r   r;   r	   r   r:   r   r   r   get_vm_by_name  r   zvmmConnection.get_vm_by_namec                 C      | j tS r   )r   r9   r	   r   r   r   r   r     r   zvmmConnection.list_vmsc                 C   r  r   )r   r;   r
   r  r   r   r   get_net_by_name  r   zvmmConnection.get_net_by_namec                 C   r  r   )r   r9   r
   r   r   r   r   	list_nets   r   zvmmConnection.list_netsc                 C   r  r   )r   r;   r   r  r   r   r   r     r   zvmmConnection.get_pool_by_namec                 C   r  r   )r   r9   r   r   r   r   r   r     r   zvmmConnection.list_poolsc                 C   r  r   )r   r;   r   r  r   r   r   get_nodedev_by_name  r   z!vmmConnection.get_nodedev_by_namec                 C   r  r   )r   r9   r   r   r   r   r   r   
  r   zvmmConnection.list_nodedevsc                 C   s   g }|   D ]7}z| }W n! tjy/ } z| tjkr%tjddd W Y d }~qd }~ww |r8|j|kr8q|	| q|S )NzError fetching nodedev XMLTexc_info)
r   r   r   libvirtErrorget_error_codeVIR_ERR_NO_NODE_DEVICEr   r   device_typer/   )r   devtyperetdevsdevxmlobjr   r   r   r   filter_nodedevs  s   zvmmConnection.filter_nodedevsc                 C      | j |S r   )rS   	defineXMLr   xmlr   r   r   define_domain)  r   zvmmConnection.define_domainc                 C   r)  r   )rS   networkDefineXMLr+  r   r   r   define_network+  r   zvmmConnection.define_networkc                 C   s   | j |dS Nr   )rS   storagePoolDefineXMLr+  r   r   r   define_pool-  r   zvmmConnection.define_poolc           	      C   s  |  r| j}n| r| j}n| r| j}n	tjd|j	 |j
dd d }z[z||}W nH tyx } z<ztjd| dd ||}W   tys } ztjd| dd td| t|t|d	 }t|d d }~ww d }~ww W |r|| d S d S |r|| w w )
Nz4rename_object helper doesn't support object class %sF)forcezError defining new name %s XMLTr  zFailed to redefine original %s!z|%(object)s rename failed. Attempting to recover also failed.

Original error: %(origerror)s

Recover error: %(recovererror)s)object	origerrorrecovererror)	is_domainr-  is_poolr2  
is_networkr/  rQ   xmlutilDevErrorr   deleter   r   r   
class_namer   r   RuntimeErrorchange_name_backend)	r   r!   origxmlnewxml	define_cbnewobj	renameerrfixerrmsgr   r   r   rename_object0  sR   


zvmmConnection.rename_objectc                 G   sP   |}t |}|d}| }td||| | |}|r&| |j d S d S )Nz0domain xmlmisc event: domain=%s event=%s args=%s)listr)   r:   r   r   r  idle_addrecache_from_event_loop)r   connr   argsr   eventstrr:   r!   r   r   r   _domain_xml_misc_evente  s   

z$vmmConnection._domain_xml_misc_eventc           	      C   V   |}|}|  }td|t|| | |}|r"| |j d S | jddd d S )Nz$domain lifecycle event: domain=%s %sTpollvmr3  )	r:   r   r   r   domain_lifecycle_strr  rJ  rK  r   	r   rL  r   statereasonuserdatar   r:   r!   r   r   r   _domain_lifecycle_eventr     

z%vmmConnection._domain_lifecycle_eventc           	      C   rP  )Nz*domain agent lifecycle event: domain=%s %sTrQ  )	r:   r   r   r   domain_agent_lifecycle_strr  rJ  rK  r   rT  r   r   r   _domain_agent_lifecycle_event  rY  z+vmmConnection._domain_agent_lifecycle_eventc           	      C   rP  )Nz&network lifecycle event: network=%s %sT)pollnetr3  )	r:   r   r   r   network_lifecycle_strr  rJ  rK  r   )	r   rL  networkrU  rV  rW  r   r:   r!   r   r   r   _network_lifecycle_event  s   
z&vmmConnection._network_lifecycle_eventc           	      C   rP  )Nz(storage pool lifecycle event: pool=%s %sT)r   r3  )	r:   r   r   r   storage_lifecycle_strr   rJ  rK  r   )	r   rL  r   rU  rV  rW  r   r:   r!   r   r   r   _storage_pool_lifecycle_event  s   
z+vmmConnection._storage_pool_lifecycle_eventc                 C   s>   |}|}|  }td| | |}|sd S | |j d S )Nz#storage pool refresh event: pool=%s)r:   r   r   r   rJ  "refresh_pool_cache_from_event_loop)r   rL  r   rW  r   r:   r!   r   r   r   _storage_pool_refresh_event  s   
z)vmmConnection._storage_pool_refresh_eventc                 C   s8   |}|}|  }td|t|| | jddd d S )Nz*node device lifecycle event: nodedev=%s %sT)pollnodedevr3  )r:   r   r   r   nodedev_lifecycle_strr   )r   rL  r&  rU  rV  rW  r   r:   r   r   r   _node_device_lifecycle_event  s   z*vmmConnection._node_device_lifecycle_eventc                 C   s>   |}|}|  }td| | |}|r| |j d S d S )Nz$node device update event: nodedev=%s)r:   r   r   r  rJ  rK  )r   rL  r&  rW  r   r:   r!   r   r   r   _node_device_update_event  s   
z'vmmConnection._node_device_update_eventc           	   
      s   j  sd S  fdd}z|   j  d tj jd  d _	t
d W n tyE } zd _	t
d| W Y d }~nd }~ww d" fdd	}|d	d
 |dd |dd |dd |dd j |dd z"|  ttdd} j  d | jd  d _t
d W n ty } zd _t
d| W Y d }~nd }~ww z7|  ttdd}ttdd} j  d | jd   j  d | jd  d _t
d W n ty } zd _t
d| W Y d }~nd }~ww zI|  ttdd}ttdd} j} j} j  d ||d   j  d ||d   jjjr=t  || d _!t
d  W d S  tyd } zd _t
d!| W Y d }~d S d }~ww )#Nc                      s    j jjr	tdd S )Nzevents disabled via cli)r   CLITestOptions	no_eventsr>  r   r   r   r   _check_events_disabled  s   
z>vmmConnection._add_conn_events.<locals>._check_events_disabledTzUsing domain eventsFz#Error registering domain events: %sc              
      s    j sd S |s
 j}z,tt| |} j  d |||  | dkr1 jj	j
r4t | W d S W d S W d S  tyP } ztd| | W Y d }~d S d }~ww )N#VIR_DOMAIN_EVENT_ID_AGENT_LIFECYCLEzError registering %s event: %s)rX   rO  r   r   rY   r/   r   domainEventRegisterAnyr   rh  fake_agent_eventr   schedule_fake_agent_eventr   r   r   )	eventnameeventvalcbeventidr   r   r   r   _add_domain_xml_event  s,   z=vmmConnection._add_conn_events.<locals>._add_domain_xml_event"VIR_DOMAIN_EVENT_ID_BALLOON_CHANGE   VIR_DOMAIN_EVENT_ID_TRAY_CHANGE
   "VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED    VIR_DOMAIN_EVENT_ID_DEVICE_ADDED   rk     #VIR_DOMAIN_EVENT_ID_METADATA_CHANGE   VIR_NETWORK_EVENT_ID_LIFECYCLEr   zUsing network eventsz$Error registering network events: %s#VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE!VIR_STORAGE_POOL_EVENT_ID_REFRESHr   zUsing storage pool eventsz)Error registering storage pool events: %s"VIR_NODE_DEVICE_EVENT_ID_LIFECYCLEVIR_NODE_DEVICE_EVENT_ID_UPDATEzUsing node device eventsz(Error registering node device events: %sr   )"r   conn_working_xen_eventsrY   r/   r   rl  r   VIR_DOMAIN_EVENT_ID_LIFECYCLErX  rX   r   r   r   r[  r   r[   networkEventRegisterAnyr_  rZ   r]   storagePoolEventRegisterAnyra  rc  r\   rf  rg  r_   nodeDeviceEventRegisterAnyr   rh  fake_nodedev_eventr   schedule_fake_nodedev_eventr^   )	r   rj  r   rs  rr  	refreshidupdateidlifecycle_cb	update_cbr   r   r   _add_conn_events  s   








zvmmConnection._add_conn_eventsc                 C   s   d| _ | | j d S )NT)rT   rJ  closer   r   r   r   _schedule_close@  s   zvmmConnection._schedule_closec                 C   s  |   std|   d| _zVz7| j rF| jD ]}| j| q| j	D ]}| j
| q%| jD ]}| j| q1| jD ]}| j| q=W n tyW   tjddd Y nw W g | _g | _	g | _g | _ng | _g | _	g | _g | _w g | _| jr~| j  | j D ],}| j| z| | |  W q ty } ztd|| W Y d }~qd }~ww | j  t | _| j }|dkrtd | | j d| _d S )	Nzconn.close() uri=%sTz+Failed to deregister events in conn cleanupr  zFailed to cleanup %s: %sr   z<LEAK: conn close() returned 1, meaning refs may have leaked.F)r  r   r   rt   rT   rS   r   rY   domainEventDeregisterAnyr[   networkEventDeregisterAnyr]   storagePoolEventDeregisterAnyr_   nodeDeviceEventDeregisterAnyr   rb   rW   clearr   r<   r.   _remove_object_signalcleanupr   r  r  rO   )r   eidr!   r   closeretr   r   r   r  D  sb   










zvmmConnection.closec                 C   sJ   |    d | _d | j_d | j_d | j_d | j_d | j_| j	  d | _d S r   )
r  r   rS   r   r   r   r   r   ra   r  r   r   r   r   r   t  s   

zvmmConnection._cleanupc                 C   sB   |   sd S | | j td|   | | jd|    d S )Nz(Scheduling background open thread for %sz
Connect %s)r  r  r  r   r   rt   _start_thread_open_threadr   r   r   r   open  s   zvmmConnection.openc              
   C   s>  d}d }d }d }z.t j}| }| jjjrt| || | jjjr-td}tj	d dg|_
|| j|| W dS  ty_ } z|}dt }	t|tjrU| }| }W Y d }~nd }~ww |ttdd krotd dS |tj	krd	| v rtd
 |  stt   }| jjjrd}t | t||	|}
d|
fS )NFzfake session errorz!fake session error not authorized)TN VIR_ERR_AUTH_CANCELLEDz+User cancelled auth, not raising any error.)FNznot authorizedzbLooks like we might have failed policykit auth. Checking to see if we have a valid console sessionT)r   creds_dialogr   rh  fake_openauthr   fake_session_errorr   r   VIR_ERR_AUTH_FAILEDerrrS   r  r   r   	traceback
format_exc
isinstancer!  get_error_messager   r   r   ro   r   r(   do_we_have_sessionrU   r   )r   warnconsolelibvirt_error_codelibvirt_error_messageexcrq  datalerrr   tbConnectErrorr   r   r   _do_open  sR   







zvmmConnection._do_openc              
   C   sx  t d| j  t d| j  t d| j  t d|  | j  | j	
 s0td| j	 s:t d | j	 sDt d | j	 sNt d |   z	| jd	d
 W n tyu } zt dt| W Y d }~nd }~ww t | _d| _| jdddddddd | j  d | _d | _ztj|   W d S  ty } zt dt| W Y d }~d S d }~ww )Nzlibvirt version=%szdaemon version=%szconn version=%sz%s capabilities:
%sz8Connection does not support required domain listing APIsz0Connection doesn't seem to support storage APIs.z0Connection doesn't seem to support network APIs.z0Connection doesn't seem to support nodedev APIs.   r   zFailed to setKeepAlive: %sr   T)stats_updaterR  r\  r   rd  r3  initial_pollz Building default pool failed: %s)r   r   rS   local_libvirt_versiondaemon_versionconn_versionrt   r   get_xmlr   conn_domainr>  conn_storageconn_networkconn_nodedevr  setKeepAliver   r   r   EventrW   rV   r   waitrQ   r  build_default_poolr   )r   r   r   r   r   _populate_initial_state  sF   








z%vmmConnection._populate_initial_statec                 C   s   z|   \}}|r|   W n# ty1 } zd}t| t|dt d}W Y d }~nd }~ww |r=| 	| j
| j n|   | d| d S )NFr  rL   )r  r  r   r   rU   r   r   r  r  rJ  r  r  r  	idle_emit)r   r   r  r   r   r   r   r    s    zvmmConnection._open_threadc                 C   sd   |  r| d| d S | r| d| d S | r$| d| d S | r0| d| d S d S )NrC   rE   rG   rI   )r7  r  r9  r8  
is_nodedevr    r   r   r   r    s   z#vmmConnection._remove_object_signalc                 C   sh   | j  sdS |D ](}| }| }| j|s!td|| q	td|| | | |	  q	dS )z
        Responsible for signaling the UI for any updates. All possible UI
        updates need to go here to enable threading that doesn't block the
        app with long tick operations.
        Nz<Requested removal of %s=%s, but it's not in our object list.z%s=%s removed)
rS   r   r=  r   r   r.   r   r   r  r  )r   gone_objectsr!   r=  r:   r   r   r   _gone_object_signals	  s   


z"vmmConnection._gone_object_signalsc              	   C   s  | j  sd S z| }|r>td||  | j|}td| W | jr:|  j	d8  _	| j	dkr<| j
  d S d S d S | j| | j|srtd||  |  W | jrn|  j	d8  _	| j	dkrp| j
  d S d S d S | std|| |  | r| d| n | r| d| n| r| d	| n
| r| d
| W | jr|  j	d8  _	| j	dkr| j
  d S d S d S | jr|  j	d8  _	| j	dkr| j
  w w w )NzBlacklisting %s=%sz"Object added in denylist, count=%dr   r   z.New %s=%s requested, but it's already tracked.z%s=%s status=%s addedrB   rD   rF   rH   )rS   r   r=  r   r   r   r   r'   rW   rV   setr+   r1   r  r  
run_statusr7  r  r9  r8  )r   r!   initialize_failedr=  r&   r   r   r   _new_object_cb  sj   




zvmmConnection._new_object_cbc                    s   g  g  fdd}|d}|d}|d}	|d}
r-j dkr-j  |||	|
fD ]}|s8q3fdd	}j|d
|d   |fd q3 fS )zp
        Helper called from tick() to do necessary polling and return
        the relevant object lists
        c                    s  | dkr}	  }t tj}n+| dkr }	 }t tj}n| dkr0}	 }t tj	}n}	
 }t tj}tdd |D } 	fdd}|rX|	j||\}}ng g t| }}ro	 jt7  _| fdd	|D  	fd
d	D S )Nnetspoolsnodedevsc                 s   s    | ]	}|  |fV  qd S r   )r   r2   r   r   r   	<genexpr>e  s    z@vmmConnection._poll.<locals>._process_objects.<locals>.<genexpr>c                    s    | |S r   r   )r!   r:   )clsr   r   r   rq  f  r   z9vmmConnection._poll.<locals>._process_objects.<locals>.cbc                    s   g | ]}| vr|qS r   r   r2   )newr   r   r7   q      zAvmmConnection._poll.<locals>._process_objects.<locals>.<listcomp>c                    s   g | ]
} j |s|qS r   )r   r-   )r3   nr   r   r   r7   r  s    )r  r
   r   
fetch_netsr   r   fetch_poolsr   r   fetch_nodedevsr   r	   	fetch_vmsdictrS   rI  valuesrV   lenextend)ptypedopollobjspollcbkeymaprq  gonemasterr  r  r\  rd  r   rR  preexisting_objectsr   )r  r  r   _process_objectsN  s<   
z-vmmConnection._poll.<locals>._process_objectsvmsr  r  r  r   c                    s$   | D ]}| d j |  qd S )Ninitialized)connect_oncer  init_libvirt_state)lstr!   r   r   r   rq    s   
zvmmConnection._poll.<locals>.cbzrefreshing xml for new %s)rM  )rV   rW   r  r  r=  )r   r  rR  r\  r   rd  r  new_vmsnew_nets	new_poolsnew_nodedevsnewlistrq  r   r  r   _pollE  s$   '

zvmmConnection._pollFc                 C   s  | j rdS |  rdS |  r|sdS |sd}| jr|sd}| jr%|s%d}| jr,|s,d}| jr3|s3d}| j | _	|rA| j
|  | |||||\}}	| | j| |	D ]x}
zE|
 r_|r_n |
 rg|sgW qU|
 ro|soW qU|
 rw|swW qU|
 r|sW qU| jjjr| j  td}tjg|_||
j|d W qU ty } z%td|
 t |tjrt!|d tjkr| j  t"d W Y d}~qUd}~ww |r| #dd	 |	D  | $d
 dS dS )z
        main update function: polls for new objects, updates stats, ...

        :param force: Perform the requested polling even if async events
            are in use.
        NFz
fake error)r  zTick for %s failedr!  zRvm tick raised system error but connection doesn't seem to have dropped. Ignoring.c                 S   s   g | ]}|  r|qS r   )reports_statsr2   r   r   r   r7     r  z'vmmConnection._tick.<locals>.<listcomp>rJ   )%rT   r  r  rX   rZ   r\   r^   rS   getInforc   ra   cache_all_statsr  rJ  r  r  r7  r9  r8  r  r   rh  
conn_crashr  r   r   VIR_ERR_SYSTEM_ERRORr  tickr   r   	exceptionr  r   r   _recalculate_statsr  )r   r  rR  r\  r   rd  r3  r  r  r  r!   r   r   r   r   _tick  sv   











zvmmConnection._tickc                 C   s  | j  sd S t }| j }t| j}||kr| j||= d}d}d}d}d}	d}
|  p0d}|  p6d}|D ]9}|	 s@q9||
 7 }|| 7 }|| 7 }|| 7 }|	| 7 }	|
| 7 }
t|| }t|| }q9d}|d |   }t| jdkr| jd d }|  }|d || d d d |  }tdtd|}tdtd|}||||||||	|
||d}| jd| d S )Nr   g      $@      Y@	timestampg     @@g        )r  memorymemoryPercentcpuTimecpuHostPercent
diskRdRate
diskWrRate	netRxRate	netTxRatediskMaxRate
netMaxRate)rS   r   r|   r   get_stats_history_lengthr  rb   disk_io_max_ratenetwork_traffic_max_rater   cpu_timestats_memorydisk_read_ratedisk_write_ratenetwork_rx_ratenetwork_tx_ratemaxr   r   mininsert)r   r  nowexpectedcurrentmemr  rdRatewrRaterxRatetxRater  r  r  pcentHostCpupcentMemprevTimestamp	host_cpusnewStatsr   r   r   r    sr   


z vmmConnection._recalculate_statsc                 K   s    ddl m} | | | d S )Nr   )	vmmEngine)enginer  get_instancer   )r   kwargsr  r   r   r   r   $  s   z$vmmConnection.schedule_priority_tickc                 O   s0   z| j |i | W d S  ty   |    w r   )r  r   r  r   rM  r!  r   r   r   tick_from_engine(  s   zvmmConnection.tick_from_enginec                 C   s    t | jdkr	dS | jd | S r0  )r  rb   )r   record_namer   r   r   _get_record_helper4  s   z vmmConnection._get_record_helperr  c                 C   sh   g }| j  d }|d urt||}t|D ]}|t| jk r,|| j| | |  q|d q|S )Nr   r   )r   r  r  ranger  rb   r/   )r   r$  limitceilvectorstatslenir   r   r   _vector_helper9  s   
zvmmConnection._vector_helperc                 C      |  d|S )Nr  r,  r   r'  r   r   r   stats_memory_vectorG  r   z!vmmConnection.stats_memory_vectorc                 C   r-  Nr  r.  r/  r   r   r   host_cpu_time_vectorI  r   z"vmmConnection.host_cpu_time_vectorc                 C   
   |  dS )Nr  r%  r   r   r   r   r	  L  r   zvmmConnection.stats_memoryc                 C   r3  r1  r4  r   r   r   r   host_cpu_time_percentageN  r   z&vmmConnection.host_cpu_time_percentagec                 C   s   |   S r   )r5  r   r   r   r   guest_cpu_time_percentageP  s   z'vmmConnection.guest_cpu_time_percentagec                 C      |  d|  d S )Nr  r  r4  r   r   r   r   network_traffic_rateR     z"vmmConnection.network_traffic_ratec                 C   r7  )Nr  r   r4  r   r   r   r   disk_io_rateU  r9  zvmmConnection.disk_io_ratec                 C   r3  )Nr  r4  r   r   r   r   r  Y  r   z&vmmConnection.network_traffic_max_ratec                 C   r3  )Nr  r4  r   r   r   r   r  [  r   zvmmConnection.disk_io_max_ratec                 C   s   | j |  S r   )r   get_conn_autoconnectrt   r   r   r   r   get_autoconnectc  s   zvmmConnection.get_autoconnectc                 C   s   | j |  | d S r   )r   set_conn_autoconnectrt   )r   valr   r   r   set_autoconnecte  s   zvmmConnection.set_autoconnectc                 C   s@   |   }||kr
d S |s||  krd S | j|  d| d S Nz/pretty-name)r   r   r   set_perconnrt   )r   valuecfgnamer   r   r   set_config_pretty_nameh  s   z$vmmConnection.set_config_pretty_namec                 C   s   | j |  dS r@  r   get_perconnrt   r   r   r   r   r   q  r#   z%vmmConnection._get_config_pretty_namec                 O   s    | j j|  dg|R i |S r@  )r   listen_perconnrt   r"  r   r   r   re   s  s
   z,vmmConnection._on_config_pretty_name_changedc                 C   s   |  d d S )NrK   )r  r   r   r   r   rf   v  r   z,vmmConnection._config_pretty_name_changed_cbc                 C   s   | j |  d||f d S Nz/window-size)r   rA  rt   )r   whr   r   r   set_details_window_sizey  s   z%vmmConnection.set_details_window_sizec                 C   s   | j |  d}|S rH  rE  )r   r   r   r   r   get_details_window_size{  s   z%vmmConnection.get_details_window_size)r   )FFFFFFF)r  r   )mr=   r>   r?   r   	RUN_FIRSTr4  __gsignals__r&  rO   r  r  r   staticmethodrs   rw   r   rg   rt   r   r   propertyr   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/  r2  rG  rO  rX  r[  r_  ra  rc  rf  rg  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r   r#  r%  r,  r0  r2  r	  r5  r6  r8  r:  r  r  r<  r?  rD  r   re   rf   rK  rL  r   r   r   r   rA      s    

&


%
(
5m0
-1
&Q
N@


	rA   )r   r   r|   r  r   rQ   r   r   libr   r   	baseclassr   lib.libvirtenummapr   object.domainr	   object.networkr
   object.nodedevr   object.storagepoolr   lib.statsmanagerr   r   rA   r   r   r   r   <module>   s&   p