o
    b=                     @   sd   d dl Z d dlZd dlZd dlmZ ddlmZ G dd deZG dd deZ	G d	d
 d
eZ
dS )    N)log   )
vmmGObjectc                   @   s   e Zd ZdZdd ZdS )_VMStatsRecordz9
    Tracks a set of VM stats for a single timestamp
    c                 C   sn   || _ || _|| _|| _|| _|| _|| _|d | _|	d | _|
d | _	|d | _
d | _d | _d | _d | _d S )Ni   )	timestampcpuTime
cpuTimeAbscpuHostPercentcpuGuestPercentcurmemcurrMemPercent	diskRdKiB	diskWrKiBnetRxKiBnetTxKiB
diskRdRate
diskWrRate	netRxRate	netTxRate)selfr   r   r   r	   r
   r   r   diskRdBytesdiskWrBytes
netRxBytes
netTxBytes r   7/usr/share/virt-manager/virtManager/lib/statsmanager.py__init__   s   




z_VMStatsRecord.__init__N)__name__
__module____qualname____doc__r   r   r   r   r   r      s    r   c                   @   sB   e Zd ZdZdd Zdd Zdd Zdd	 ZdddZdd Z	dS )_VMStatsListz9
    Tracks a list of VMStatsRecords for a single VM
    c                 C   s>   t |  g | _d| _d| _d| _d| _d| _g | _g | _	d S )Ng      $@F)
r   r   _statsdiskRdMaxRatediskWrMaxRatenetRxMaxRatenetTxMaxRatemem_stats_period_is_setstats_disk_skipstats_net_skipr   r   r   r   r   1   s   

z_VMStatsList.__init__c                 C   s   d S Nr   r*   r   r   r   _cleanup>   s   z_VMStatsList._cleanupc                    s   j  }tj}||krj||=  fdd}|d _|d _|d _|d _t jj	_	t jj
_
t jj_t jj_jd  d S )Nc                    sN   d}j r"j d }t | t||  } j|j }t|t| }t|dS )N        r   )r"   getattrr   floatmax)record_nameretoldstatsratedifftimediffnewstatsr   r   r   _calculate_rateG   s   

z2_VMStatsList.append_stats.<locals>._calculate_rater   r   r   r   r   )configget_stats_history_lengthlenr"   r   r   r   r   r0   r#   r$   r%   r&   insert)r   r7   expectedcurrentr8   r   r6   r   append_statsA   s   






z_VMStatsList.append_statsc                 C   s   | j sdS t| j d |S )Nr   )r"   r.   )r   r1   r   r   r   
get_record]   s   z_VMStatsList.get_record      Y@c                 C   sj   g }| j  d }|d urt||}t|D ]}|t| jk r-|t| j| ||  q|d q|S )N   r   )r9   r:   minranger;   r"   appendr.   )r   r1   limitceilvectorstatslenir   r   r   
get_vectorb   s   
z_VMStatsList.get_vectorc                 C   s    | j |||d| j |||dfS )N)rG   )rK   )r   name1name2rF   rG   r   r   r   get_in_out_vectoro   s   z_VMStatsList.get_in_out_vectorN)rA   )
r   r   r   r    r   r,   r?   r@   rK   rN   r   r   r   r   r!   -   s    
r!   c                   @   s   e 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d Zdd Zdd Zdd Zd S )!vmmStatsManagerz&
    Class for polling statistics
    c                 C   s8   t |  i | _i | _d| _d| _d| _d| _d| _d S )NT)	r   r   	_vm_stats_latest_all_stats_all_stats_supported_net_stats_supported_disk_stats_supported_disk_stats_lxc_supported_mem_stats_supportedr*   r   r   r   r   x   s   

zvmmStatsManager.__init__c                 C   s"   | j  D ]}|  qd | _d S r+   )rP   valuescleanuprQ   )r   	statslistr   r   r   r,      s   

zvmmStatsManager._cleanupc                 C   s.   |   }|d }|d }|d }|||fS )Nr         )get_backendinfo)r   vmr]   state	guestcpusr   r   r   r   _old_cpu_stats_helper   s
   
z%vmmStatsManager._old_cpu_stats_helperc                 C   s0  t   }| r| j sdddd|fS d}d}d}| |d}| |d}|rD|dd}	|dd}
|dd}|d}n| |\}	}
}|	tj	tj
fv }|rZd}
d}|| }|s|j }|d || d	 d	 d	  }|| }|
dkr||
 pd}td
td|}td
td|}|||||fS )Nr   r   r   zstate.statezvcpu.currentzcpu.timevirt-manager.timestamprA   g     @@r-   )time	is_activer9   get_stats_enable_cpu_pollget_vm_statslistr@   getra   libvirtVIR_DOMAIN_SHUTOFFVIR_DOMAIN_CRASHEDconnhost_active_processor_countr0   rC   )r   r^   allstatsr   r   r	   r
   prevTimestampprevCpuTimer_   r`   r   
is_offlinehostcpus	pcentbaser   r   r   _sample_cpu_stats   sD   
z!vmmStatsManager._sample_cpu_statsc              
   C      |  |}z| |}|r|d }|d }||fW S W dS  tjyo } zD|jj|r=t	d d| _
W Y d }~dS t	d| || | rXt	d| |j| nt	d W Y d }~dS W Y d }~dS d }~ww )	Nr   r[   z$conn does not support interfaceStatsFr   r   z-Error in interfaceStats for '%s' dev '%s': %sAdding %s to skip list%Aren't running, don't add to skiplist)rf   r\   interfaceStatsrh   libvirtErrorrk   supportis_error_nosupportr   debugrS   get_namerd   r)   rE   )r   r^   devrY   iorxtxerrr   r   r   _old_net_stats_helper   4   




z%vmmStatsManager._old_net_stats_helperc                 C   s   d}d}|  |}| jr| r| j sg |_||fS |rA| D ]}td|r0||| 7 }td|r<||| 7 }q"||fS |	 D ]}|j
}|sMqE||jv rSqE| ||\}	}
||	7 }||
7 }qE||fS )Nr   znet.[0-9]+.rx.bytesznet.[0-9]+.tx.bytes)rf   rS   rd   r9   get_stats_enable_net_pollr)   keysrematchget_interface_devices_norefresh
target_devr   )r   r^   rm   r   r   rY   keyifacer~   devrxdevtxr   r   r   _sample_net_stats   s8   


z!vmmStatsManager._sample_net_statsc              
   C   rt   )	NrB   rZ   z conn does not support blockStatsFru   z)Error in blockStats for '%s' dev '%s': %srv   rw   )rf   r\   
blockStatsrh   ry   rk   rz   r{   r   r|   rT   r}   rd   r(   rE   )r   r^   r~   rY   r   rdwrr   r   r   r   _old_disk_stats_helper   r   z&vmmStatsManager._old_disk_stats_helperc              
   C   sJ  d}d}|  |}| jr| r| j sg |_||fS |rA| D ]}td|r0||| 7 }td|r<||| 7 }q"||fS |j	
 r~| jr~z| d}|r`|d }|d }||fW S W n tjy} } ztd| d| _W Y d }~nd }~ww | D ]}	|	j}
|
sq|
|jv rq| ||
\}}||7 }||7 }q||fS )	Nr   zblock.[0-9]+.rd.byteszblock.[0-9]+.wr.bytes rB   rZ   z&LXC style disk stats not supported: %sF)rf   rT   rd   r9   get_stats_enable_disk_pollr(   r   r   r   rk   is_lxcrU   r\   r   rh   ry   r   r|   get_disk_devices_norefreshtargetr   )r   r^   rm   r   r   rY   r   r   ediskr~   diskrddiskwrr   r   r   _sample_disk_stats  sR   



z"vmmStatsManager._sample_disk_statsc              
   C   s~   |j j sd S tdd | jjD sd S zd}| |t	j
 W d S  ty> } ztd| W Y d }~d S d }~ww )Nc                 S   s   g | ]	}|j d kr|qS )virtio)model).0br   r   r   
<listcomp>O  s    
z9vmmStatsManager._set_mem_stats_period.<locals>.<listcomp>   z!Error setting memstats period: %s)rk   rz   conn_mem_stats_periodany
get_xmlobjdevices
memballoonr\   setMemoryStatsPeriodrh   VIR_DOMAIN_AFFECT_LIVE	Exceptionr   r|   )r   r^   secsr   r   r   r   _set_mem_stats_periodH  s   

z%vmmStatsManager._set_mem_stats_periodc              
   C   s   d}d}z|   }|dd}td||d| }W ||fS  tjyU } z(|jj|r9t	
d d| _nt	
d| W Y d }~||fS W Y d }~||fS d }~ww )NrB   r   actualunusedz!conn does not support memoryStatsFzError reading mem stats: %s)r\   memoryStatsrg   r0   rh   ry   rk   rz   r{   r   r|   rV   )r   r^   totalmemr   statsr   r   r   r   _old_mem_stats_helperZ  s"   

z%vmmStatsManager._old_mem_stats_helperc                 C   s   |  |}| jr| r| j sd|_dS |jdu r#| | d|_|r7|dd}td||d| }n| 	|\}}|t
| d }td	t|d
}||fS )NFru   Tzballoon.currentrB   r   zballoon.unusedd   r-   rA   )rf   rV   rd   r9   get_stats_enable_memory_pollr'   r   rg   r0   r   r/   rC   )r   r^   rm   rY   r   r   r   r   r   r   _sample_mem_statsj  s(   


z!vmmStatsManager._sample_mem_statsc           	   
   C   s,  | j r| r	i S d}| j r|tjO }|tjO }|tjO }| j r)|tj	O }| j
 r3|tjO }| j r=|tjO }|dkrCi S i }z t }| |d}|D ]\}}||d< ||| < qTW |S  tjy } z#|j|r}td d| _ ntd| W Y d }~|S W Y d }~|S d }~ww )Nr   rb   z)conn does not support getAllDomainStats()Fz"Error call getAllDomainStats(): %s)rR   is_testr9   re   rh   VIR_DOMAIN_STATS_STATEVIR_DOMAIN_STATS_CPU_TOTALVIR_DOMAIN_STATS_VCPUr   VIR_DOMAIN_STATS_BALLOONr   VIR_DOMAIN_STATS_BLOCKr   VIR_DOMAIN_STATS_INTERFACErc   r\   getAllDomainStats
UUIDStringry   rz   r{   r   r|   )	r   rk   	statflagsr2   r   rawallstatsdomdomallstatsr   r   r   r   _get_all_stats  sD   









	

zvmmStatsManager._get_all_statsc                 C   s   | j | d }| ||\}}}}}| ||\}}	| ||\}
}| ||\}}t||||||	||
|||}| |	| d S r+   )
rQ   rg   get_uuidrs   r   r   r   r   rf   r?   )r   r^   r   r   r   r	   r
   r   r   r   r   r   r   r   r7   r   r   r   refresh_vm_stats  s   
z vmmStatsManager.refresh_vm_statsc                 C   s   |  || _d S r+   )r   rQ   )r   rk   r   r   r   cache_all_stats  s   zvmmStatsManager.cache_all_statsc                 C   s,   |  | jvrt | j|  < | j|   S r+   )r}   rP   r!   )r   r^   r   r   r   rf     s   z vmmStatsManager.get_vm_statslistN)r   r   r   r    r   r,   ra   rs   r   r   r   r   r   r   r   r   r   r   rf   r   r   r   r   rO   t   s"    
0$0*rO   )r   rc   rh   virtinstr   	baseclassr   objectr   r!   rO   r   r   r   r   <module>   s   G