o
    ïì¿`%+  ã                   @   sh   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dS )é    )ÚGtk)Úlog)ÚStorageVolumeé   )Úuiutil)ÚvmmAsyncJob)ÚvmmGObjectUI)ÚvmmXMLEditorc                   @   s&  e Zd ZdejdeegfiZdd„ Zdd„ ZdCd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dDd'd(„ZdDd)d*„Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Z d7d8„ Z!d9d:„ Z"d;d<„ Z#d=d>„ Z$d?d@„ Z%dAdB„ Z&dS )EÚvmmCreateVolumeúvol-createdNc              	   C   s   t  | dd¡ || _|| _d | _d | _t| j| j|  	d¡|  	d¡ƒ| _
| j
 d| j¡ | j | j| j| j| j| j| jdœ¡ |  ¡  |  ¡  d S )Nzcreatevol.uizvmm-create-volzdetails-box-alignzdetails-boxzxml-requested)Úon_vmm_create_vol_delete_eventÚon_vol_cancel_clickedÚon_vol_create_clickedÚon_vol_name_changedÚon_vol_format_changedÚon_backing_browse_clicked)r   Ú__init__ÚconnÚ_parent_poolÚ
_name_hintÚ_storage_browserr	   ÚbuilderÚtopwinÚwidgetÚ
_xmleditorÚconnectÚ_xmleditor_xml_requested_cbÚconnect_signalsÚcloseÚ_create_clicked_cbÚ_vol_name_changed_cbÚ_vol_format_changed_cbÚ_browse_backing_clicked_cbÚbind_escape_key_closeÚ_init_state)Úselfr   Úparent_pool© r'   ú0/usr/share/virt-manager/virtManager/createvol.pyr      s,   
þÿù	zvmmCreateVolume.__init__c                 C   sd   z| j j ¡ }W n ty   tjddd d }Y nw t d|¡ |  ¡  | j |¡ | j 	¡  d S )NzError getting parent_pool xmlT)Úexc_infoz-Showing new volume wizard for parent_pool=
%s)
r   ÚxmlobjÚget_xmlÚ	Exceptionr   ÚdebugÚ_reset_stater   Úset_transient_forÚpresent)r%   ÚparentÚ
parent_xmlr'   r'   r(   Úshow7   s   þÿzvmmCreateVolume.showc                 C   s2   t  d¡ | j ¡  | jr| j ¡  |  d¡ dS )NzClosing new volume wizardFr   )r   r-   r   Úhider   r   Ú	set_modal)r%   Úignore1Úignore2r'   r'   r(   r   D   s   



zvmmCreateVolume.closec                 C   s:   d | _ d | _| j ¡  d | _| jr| j ¡  d | _d S d S ©N)r   r   r   Úcleanupr   ©r%   r'   r'   r(   Ú_cleanupL   s   


þzvmmCreateVolume._cleanupc                 C   ó
   || _ d S r8   )r   )r%   Úhintr'   r'   r(   Úset_name_hint[   ó   
zvmmCreateVolume.set_name_hintc                 C   s   | j  t|ƒ¡ d S r8   )r   r5   Úbool)r%   Úmodalr'   r'   r(   r5   ^   s   zvmmCreateVolume.set_modalc                 C   r<   r8   )r   )r%   Úpoolr'   r'   r(   Úset_parent_poola   r?   zvmmCreateVolume.set_parent_poolc                 C   sH   |   d¡}t tt¡}| |¡ t |d¡ dD ]	}| ||g¡ qd S )Nú
vol-formatr   )ÚrawÚqcow2)r   r   Ú	ListStoreÚstrÚ	set_modelr   Úinit_combo_text_columnÚappend)r%   Úformat_listÚformat_modelÚfmtr'   r'   r(   r$   i   s   

ÿzvmmCreateVolume._init_statec                 C   s4  | j  ¡  |  ¡ }| ¡ }t |  d¡|¡ t |  d¡| j 	¡ ¡ |  d¡ 
|  ¡ p,d¡ |  d¡ ¡  |  d¡ d¡ |  d¡ 
d¡ |  d¡ |  ¡  ¡ |  ¡  |  ¡  |  d¡ d¡ t| j ¡ d	 d	 d	 ƒ}d
}|  d¡ dd¡ |  d¡ t||ƒ¡ |  d¡ tdƒ| j ¡ | j ¡ dœ ¡ d S )NrD   úvol-nameÚ Úchangedúbacking-storeúvol-nonsparseúbacking-expanderFé   é   úvol-capacitygš™™™™™¹?i@B zvol-parent-infoz-<b>%(volume)s's</b> available space: %(size)s)ÚvolumeÚsize)r   Úreset_stateÚ_make_stub_volÚsupports_formatr   Úset_grid_row_visibler   Úset_list_selectionr   Úget_default_storage_formatÚset_textÚ_default_vol_nameÚ
grab_focusÚemitÚ
set_activeÚ_should_default_sparseÚ_show_sparseÚ_show_backingÚset_expandedÚintr   Úget_availableÚ	set_rangeÚ	set_valueÚminÚ
set_markupÚ_Úget_nameÚget_pretty_available)r%   ÚvolÚ	hasformatÚ
pool_availÚdefault_capr'   r'   r(   r.   q   s6   
ÿ
ÿ
þÿzvmmCreateVolume._reset_statec                 C   s"   |   d¡ ¡ s	d S t |   d¡¡S )NrD   )r   Úget_visibler   Úget_list_selectionr:   r'   r'   r(   Ú_get_config_format–   s   z"vmmCreateVolume._get_config_formatc                 C   s~   | j pd}|  ¡ }d}z$tj| j ¡ | j ¡ ||d}|r*|r-| dd¡d }W |S W |S W |S  ty>   t	 
d¡ Y |S w )Nrr   rP   )ÚsuffixÚ.r   r   z Error finding a default vol name)r   Ú_default_suffixr   Úfind_free_namer   Úget_backendr   Úrsplitr,   r   Ú	exception)r%   r=   ry   Úretr'   r'   r(   ra   ›   s(   
ýûûýýz!vmmCreateVolume._default_vol_namec                 C   s&   |   ¡ }|j|jkrdS t |  ¡ ¡S )NrP   )r[   Ú	file_typeÚ	TYPE_FILEr   Úget_file_extension_for_formatrx   )r%   rr   r'   r'   r(   r{   «   s   ÿzvmmCreateVolume._default_suffixc                 C   s   |   ¡ dkS )NrF   )rx   r:   r'   r'   r(   re   ²   ó   z&vmmCreateVolume._should_default_sparsec                 C   s   | j j ¡ }|tjkS r8   )r   r*   Úget_disk_typer   r‚   )r%   Údtyper'   r'   r(   Ú_can_sparseµ   s   
zvmmCreateVolume._can_sparsec                 C   ó   t  |  d¡|  ¡ ¡ d S )NrS   )r   r]   r   r‡   r:   r'   r'   r(   rf   ¹   ó   ÿzvmmCreateVolume._show_sparsec                 C   s&   | j  ¡ dkr	dS |  ¡ dkrdS dS )NÚlogicalTrF   F)r   Úget_typerx   r:   r'   r'   r(   Ú_can_backing½   s
   zvmmCreateVolume._can_backingc                 C   rˆ   )NrT   )r   r]   r   rŒ   r:   r'   r'   r(   rg   Ä   r‰   zvmmCreateVolume._show_backingc                    sp   ˆ j d u r/‡ fdd„}ddlm} |ˆ jƒˆ _ ˆ j  |¡ ˆ j j ˆ j ¡ ¡ ˆ j  ˆ j	j
¡ ˆ j  ˆ j¡ d S )Nc                    s   | }ˆ   d¡ |¡ d S )NrR   )r   r`   )ÚsrcÚtextÚignorer:   r'   r(   ÚcbÊ   s   z(vmmCreateVolume._browse_file.<locals>.cbr   )ÚvmmStorageBrowser)r   Ústoragebrowser‘   r   Úset_finish_cbr   r5   Ú	get_modalÚset_browse_reasonÚconfigÚCONFIG_DIR_IMAGEr3   )r%   r   r‘   r'   r:   r(   Ú_browse_fileÈ   s   
ÿzvmmCreateVolume._browse_filec                 C   s   | j j||| j ¡ d d S )N)rA   )ÚerrÚshow_errr   r”   )r%   ÚinfoÚdetailsr'   r'   r(   Ú	_show_err×   s   zvmmCreateVolume._show_errc                 C   s"   t | j ¡ |d}| j ¡ |_|S )N)Úparsexml)r   r   r}   r   rB   )r%   Úxmlrr   r'   r'   r(   r[   ß   s   zvmmCreateVolume._make_stub_volc                 C   s"   | j  ¡ }t d|¡ | j|dS )NzUsing XML from xmleditor:
%s)rŸ   )r   r+   r   r-   r[   )r%   rŸ   r'   r'   r(   Ú_build_xmlobj_from_xmleditorä   s   
z,vmmCreateVolume._build_xmlobj_from_xmleditorc           
      C   s¬   |   d¡ ¡ }|   d¡ ¡ }|| }|  ¡ }|   d¡ ¡ }|   d¡ ¡ }|   d¡ ¡ }d}|r1|}|  ¡ }	||	_|d d d |	_|d d d |	_|rO||	_	|rT||	_
|	S )NrO   úvol-name-suffixrW   rS   rR   r   rU   )r   Úget_textrx   Ú	get_valueÚ
get_activer[   ÚnameÚcapacityÚ
allocationÚbacking_storeÚformat)
r%   r¥   ry   ÚvolnamerN   ÚcapÚ	nonsparseÚbackingÚallocrr   r'   r'   r(   Ú_build_xmlobj_from_uié   s&   z%vmmCreateVolume._build_xmlobj_from_uic              
   C   sd   z|   ¡ }|r| j ¡ r|  ¡ }|W S  ty1 } z| j tdƒt|ƒ ¡ W Y d }~d S d }~ww )NzError building XML: %s)	r¯   r   Úis_xml_selectedr    r,   r™   rš   ro   rH   )r%   Úcheck_xmleditorr*   Úer'   r'   r(   Ú_build_xmlobj   s   &€ÿzvmmCreateVolume._build_xmlobjc                 C   s   |  |¡}|  d||¡ d S )Nr   )Úget_volume_by_namerc   )r%   rB   rª   rr   r'   r'   r(   Ú_pool_refreshed_cb  s   
z"vmmCreateVolume._pool_refreshed_cbc                 C   sX   |   ¡  |rtdƒ| }| j||d d S | j d| j|j¡ |  | jj¡ |  	¡  d S )NzError creating vol: %s)rœ   Ú	refreshed)
Úreset_finish_cursorro   r   r   r   rµ   r¥   Úidle_addÚrefreshr   )r%   Úerrorrœ   rr   r'   r'   r(   Ú
_finish_cb  s   ÿzvmmCreateVolume._finish_cbc              
   C   s–   | j dd}|s
d S z| ¡  W n ty- } z|  tdƒt|ƒ ¡W  Y d }~S d }~ww |  ¡  t| j|g| j	|gtdƒtdƒ| j
ƒ}| ¡  d S )NT©r±   zError validating volume: %szCreating storage volume...z/Creating the storage volume may take a while...)r³   Úvalidater,   r   ro   rH   Úset_finish_cursorr   Ú_async_vol_creater»   r   Úrun)r%   rr   r²   ÚprogWinr'   r'   r(   Ú_finish  s"   "€ÿ
ûzvmmCreateVolume._finishc                 C   sL   | j  ¡ }| | j ¡ ¡}||_| ¡ }t d¡ |j	|d t d¡ d S )Nz!Starting background vol creation.)Úmeterzvol creation complete.)
r   r}   ÚstoragePoolLookupByNamer   rp   rB   Ú	get_meterr   r-   Úinstall)r%   Úasyncjobrr   r   ÚnewpoolrÃ   r'   r'   r(   r¿   1  s   

z!vmmCreateVolume._async_vol_createc                 C   s(   | j dd}| j |r| ¡ pd¡ d S )NFr¼   rP   )r³   r   Úset_xmlr+   )r%   r   r*   r'   r'   r(   r   B  s   z+vmmCreateVolume._xmleditor_xml_requested_cbc                 C   s:   |   ¡  |  d¡ |  ¡  ¡ |  ¡  |  d¡ d¡ d S )NrS   rO   rQ   )rf   r   rd   re   rg   rc   ©r%   r   r'   r'   r(   r!   F  s   
ÿz&vmmCreateVolume._vol_format_changed_cbc                 C   s0   |  ¡ }|  ¡ }d|v rd}|  d¡ |¡ d S )Nrz   rP   r¡   )r¢   r{   r   r`   )r%   r   rŽ   ry   r'   r'   r(   r    M  s
   z$vmmCreateVolume._vol_name_changed_cbc                 C   ó   |   ¡  d S r8   )r˜   rÊ   r'   r'   r(   r"   U  r„   z*vmmCreateVolume._browse_backing_clicked_cbc                 C   rË   r8   )rÂ   rÊ   r'   r'   r(   r   X  r„   z"vmmCreateVolume._create_clicked_cb)NNr8   )'Ú__name__Ú
__module__Ú__qualname__r   Ú	RUN_FIRSTÚobjectÚ__gsignals__r   r3   r   r;   r>   r5   rC   r$   r.   rx   ra   r{   re   r‡   rf   rŒ   rg   r˜   r   r[   r    r¯   r³   rµ   r»   rÂ   r¿   r   r!   r    r"   r   r'   r'   r'   r(   r
      sF    ÿ 
%

r
   N)Úgi.repositoryr   Úvirtinstr   r   Úlibr   rÇ   r   Ú	baseclassr   Ú	xmleditorr	   r
   r'   r'   r'   r(   Ú<module>   s   