o
    AVbfL                     @   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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 ZdZd
ZdZdZdZdZdZG dd deZG dd deZG dd deZG dd dZdd Zdd Zdd Zdd Zd d! Zd"d# Z dS )$    N)Gtk)Pango)log)xmlutil   )vmmAsyncJob)vmmGObjectUI)uiutil                  c                   @   s   e Zd ZdZdd Zdd Zdd Zd5d	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)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 ZdS )6_vmmDeleteBasezI
    Base class for both types of VM/device storage deleting wizards
    c                 C   s^   t | dd d | _| j| j| j| j| jd |   | 	  | j
|   |   d S )Nz	delete.uiz
vmm-delete)on_vmm_delete_delete_eventon_delete_cancel_clickedon_delete_ok_clicked on_delete_remove_storage_toggled)r   __init__vmbuilderconnect_signalsclose_finish_clicked_cb_toggle_remove_storagebind_escape_key_close_cleanup_on_app_closetopwin	set_title_get_dialog_title_init_stateself r$   -/usr/share/virt-manager/virtManager/delete.pyr   $   s   z_vmmDeleteBase.__init__c                 C   s   t | d d S )Ndelete-storage-list)_prepare_storage_listwidgetr"   r$   r$   r%   r!   5   s   z_vmmDeleteBase._init_statec                 C   s6   t d | | |   | j| | j  d S )NzShowing delete wizard)r   debug_set_vm_reset_stater   set_transient_forpresent)r#   parentr   r$   r$   r%   show8   s
   

z_vmmDeleteBase.showNc                 C   s"   t d | j  | d  dS )NzClosing delete wizardr   )r   r)   r   hider*   )r#   ignore1ignore2r$   r$   r%   r   ?   s   


z_vmmDeleteBase.closec                 C      d S Nr$   r"   r$   r$   r%   _cleanupF      z_vmmDeleteBase._cleanupc                 C   s4   | j }|r|j|  |r|jd| j || _ d S )Nz
vm-removed)r   conndisconnect_by_objconnect_vm_removed_cb)r#   newvmoldvmr$   r$   r%   r*   N   s   
z_vmmDeleteBase._set_vmc                 C   s   |   }dt| }| d| | jdd | d  |  }t	
| d| |  }| d| | d  |  }t| d| j| jj| d S )Nz<span size='large'>%s</span>zheader-labelr   zdelete-cancelzdelete-warn-running-vm-boxdelete-remove-storager&   )_get_dialog_textr   
xml_escaper(   
set_markupr   resize
grab_focus_vm_active_statusr	   set_grid_row_visible_get_remove_storage_default
set_activetoggled_get_disk_datas_populate_storage_listr   r7   )r#   text	title_str	vm_activeremove_storage_default	diskdatasr$   r$   r%   r+   V   s$   

z_vmmDeleteBase._reset_statec                 C   s   |    d S r4   )_finish)r#   srcr$   r$   r%   r   s   s   z!_vmmDeleteBase._finish_clicked_cbc                 C   s   | j |kr|   d S d S r4   )r   r   )r#   _connr   r$   r$   r%   r:   v   s   
z_vmmDeleteBase._vm_removed_cbc                 C   s   |  }t| d| d S )Nzdelete-storage-scroll)
get_activer	   rD   r(   )r#   rP   dodelr$   r$   r%   r   z   s   
z%_vmmDeleteBase._toggle_remove_storagec                 C   sP   |  d}| }g }|  d r&|D ]}|t s%|t r%||t  q|S )Nr&   r=   )r(   	get_modelrR   STORAGE_ROW_CANT_DELETESTORAGE_ROW_CONFIRMappendSTORAGE_ROW_PATH)r#   del_listmodelpathsrowr$   r$   r%   _get_paths_to_delete   s   
z#_vmmDeleteBase._get_paths_to_deletec                 C   s,   |    |d ur| jj||d |   d S )N)details)reset_finish_cursorerrshow_errr   )r#   errorr^   r$   r$   r%   _delete_finished_cb   s   z"_vmmDeleteBase._delete_finished_cbc                 C   s   |   }|r%td}tdd| }| jj| jj| jj||d}|s%d S |   | 	|s6| 
d d  d S | |\}}t| j| j|g| j
g ||| j}|  | d  d S )Nz,Are you sure you want to delete the storage?z(The following paths will be deleted:

%s
)text1text2)r]   _joinr`   chkbox_helperconfigget_confirm_delstorageset_confirm_delstorageset_finish_cursor_remove_devicerc   _get_progress_textr   _async_deleter   r   runr*   )r#   r[   titlemessageretrJ   progWinr$   r$   r%   rO      s0   
z_vmmDeleteBase._finishc              
   C   s  d}g }z#|  | |j }| }| |||}| | |jjdd W n& tyM } ztd|	 t
|d }	dt }W Y d }~nd }~ww d}
|D ]}|
d|d |d f 7 }
qR|
sg|sgd S |rx|d	7 }|td
7 }||
7 }ntd}	|
}|	r||	| d S d S )N T)pollvmz2Error deleting virtual machine '%(vm)s': %(error)s)r   rb   z%s
%s
r   r   

zCAdditionally, there were errors removing certain storage devices: 
z:Errors encountered while removing certain storage devices.)_destroy_vmr7   get_backend	get_meter_async_delete_paths
_delete_vmschedule_priority_tick	Exceptionrg   get_namestrrh   	traceback
format_exc	set_error)r#   asyncjobr   r[   r^   storage_errorsr7   metererb   storage_errstrerrinfor$   r$   r%   rp      s>   



z_vmmDeleteBase._async_deletec                 C   s   g }|D ]@}zt d| |td| d  | ||| W n  ty? } z|t|dt	
 f W Y d }~nd }~ww |  q|S )NzDeleting path: %szDeleting path '%s'rv   )r   r)   startrg   _async_delete_pathr   rW   r   rh   r   r   end)r#   r[   r7   r   r   pathr   r$   r$   r%   r|      s   

z"_vmmDeleteBase._async_delete_pathsc                 C   sR   z| |}W n ty   d }td| Y nw |r"|d d S t| d S )Nz*Path '%s' is not managed. Deleting locallyr   )storageVolLookupByPathr   r   r)   deleteosunlink)r#   r7   r   ignorevolr$   r$   r%   r      s   z!_vmmDeleteBase._async_delete_pathc                 C      t r4   NotImplementedErrorr"   r$   r$   r%   r       r6   z _vmmDeleteBase._get_dialog_titlec                 C   r   r4   r   r"   r$   r$   r%   r>      r6   z_vmmDeleteBase._get_dialog_textc                 C   r   r4   r   r#   r[   r$   r$   r%   ro      r6   z!_vmmDeleteBase._get_progress_textc                 C   r   r4   r   r"   r$   r$   r%   rH     r6   z_vmmDeleteBase._get_disk_datasc                 C   r   r4   r   r"   r$   r$   r%   rC     r6   z _vmmDeleteBase._vm_active_statusc                 C   r   r4   r   r#   r   r$   r$   r%   r}     r6   z_vmmDeleteBase._delete_vmc                 C   r   r4   r   r   r$   r$   r%   rn     r6   z_vmmDeleteBase._remove_devicec                 C   r   r4   r   r   r$   r$   r%   ry   
  r6   z_vmmDeleteBase._destroy_vmc                 C   r   r4   r   r"   r$   r$   r%   rE     r6   z*_vmmDeleteBase._get_remove_storage_default)NN)__name__
__module____qualname____doc__r   r!   r/   r   r5   r*   r+   r   r:   r   r]   rc   rO   rp   r|   r   r    r>   ro   rH   rC   r}   rn   ry   rE   r$   r$   r$   r%   r       s6    

)r   c                   @   sd   e Zd ZdZe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 )vmmDeleteDialogz=
    Dialog for deleting a VM and optionally its storage
    c              
   C   sd   z| j st | _ | j |j| W d S  ty1 } z|jtdt|  W Y d }~d S d }~ww )Nz!Error launching delete dialog: %s)		_instancer   r/   r   r   r`   ra   rg   r   )cls	parentobjr   r   r$   r$   r%   show_instance  s   zvmmDeleteDialog.show_instancec                 C      t dS )NzDelete Virtual Machinerg   r"   r$   r$   r%   r         z!vmmDeleteDialog._get_dialog_titlec                 C   s   t dd| j i S )NzDelete '%(vmname)s'vmnamerg   r   r   r"   r$   r$   r%   r>   !  s   z vmmDeleteDialog._get_dialog_textc                 C   s@   |rt d| j  }|}||gS t d| j  }|}||gS )NzJDeleting virtual machine '%s' and selected storage (this may take a while)zDeleting virtual machine '%s'r   r#   r[   rr   rJ   r$   r$   r%   ro   $  s   z"vmmDeleteDialog._get_progress_textc                 C      dS NTr$   r"   r$   r$   r%   rE   .  r6   z+vmmDeleteDialog._get_remove_storage_defaultc                 C   s
   t | jS r4   )_build_diskdata_for_vmr   r"   r$   r$   r%   rH   1  s   
zvmmDeleteDialog._get_disk_datasc                 C   s   | j  }|S r4   )r   	is_active)r#   rL   r$   r$   r%   rC   4  s   
z!vmmDeleteDialog._vm_active_statusc                 C   s   |}dS r   r$   )r#   r[   dummyr$   r$   r%   rn   8  s   zvmmDeleteDialog._remove_devicec                 C   (   |  rtd|  |  d S d S )NzRemoving VM '%s')is_persistentr   r)   r   r   r   r$   r$   r%   r}   <     zvmmDeleteDialog._delete_vmc                 C   r   )NzForcing VM '%s' power off.)r   r   r)   r   destroyr   r$   r$   r%   ry   A  r   zvmmDeleteDialog._destroy_vmN)r   r   r   r   classmethodr   r    r>   ro   rE   rH   rC   rn   r}   ry   r$   r$   r$   r%   r     s    
	
r   c                   @   sn   e Zd ZdZed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 )vmmDeleteStoragez]
    Dialog for removing a disk device from a VM and optionally deleting
    its storage
    Fc              
   C   s  t d| z| | W n ty+ } z|tdt|  W Y d }~d S d }~ww d}z| | W n% tyZ } zt dt| t|dt	
 f}W Y d }~nd }~ww |s_dS td}|ro|d7 }|td	7 }|jtd
|d d |d  |tjjtjjd d S )NzRemoving device: %szError Removing Device: %sr$   z$Device could not be hotUNplugged: %srv   Tz;This change will take effect after the next guest shutdown. zStorage will not be deleted.z4Device could not be removed from the running machiner   rx   r   )r^   rf   buttonsdialog_type)r   r)   remove_devicer   ra   rg   r   detach_devicerh   r   r   r   ButtonsTypeOKMessageTypeINFO)r   r`   devobjdeleting_storager   
detach_errmsgr$   r$   r%   remove_devobj_internalL  s8   "
z'vmmDeleteStorage.remove_devobj_internalc                 C   s   t |  || _d S r4   )r   r   disk)r#   r   r$   r$   r%   r   m  s   

zvmmDeleteStorage.__init__c                 C   r   )NzRemove Disk Devicer   r"   r$   r$   r%   r    q  r   z"vmmDeleteStorage._get_dialog_titlec                 C   s   t dd| jji S )NzRemove disk device '%(target)s'targetrg   r   r   r"   r$   r$   r%   r>   t  s   z!vmmDeleteStorage._get_dialog_textc                 C   s2   |rt d| jj }nt d| jj }|}||gS )NzFRemoving disk device '%s' and selected storage (this may take a while)zRemoving disk device '%s'r   r   r$   r$   r%   ro   x  s   z#vmmDeleteStorage._get_progress_textc                 C   r   NFr$   r"   r$   r$   r%   rE     r6   z,vmmDeleteStorage._get_remove_storage_defaultc                 C   s   t | jgS r4   )	_DiskData	from_diskr   r"   r$   r$   r%   rH     s   z vmmDeleteStorage._get_disk_datasc                 C   r   r   r$   r"   r$   r$   r%   rC     r6   z"vmmDeleteStorage._vm_active_statusc                 C   s    t |}tj| j| j| j|dS )N)r   )boolr   r   r   r`   r   )r#   r[   r   r$   r$   r%   rn     s
   zvmmDeleteStorage._remove_devicec                 C   r3   r4   r$   r   r$   r$   r%   r}     r6   zvmmDeleteStorage._delete_vmc                 C   r3   r4   r$   r   r$   r$   r%   ry     r6   zvmmDeleteStorage._destroy_vmN)F)r   r   r   r   staticmethodr   r   r    r>   ro   rE   rH   rC   rn   r}   ry   r$   r$   r$   r%   r   G  s     	r   c                   @   s$   e Zd ZdZedd Zdd ZdS )r   zm
    Helper class to contain all info we need to decide whether we
    should default to deleting a path
    c                 C   s    t | j|  | j| j| jdv S )z:
        Build _DiskData from a DeviceDisk object
        )cdromfloppy)r   r   get_source_path	read_only	shareabledevice)r   r$   r$   r%   r     s   z_DiskData.from_diskc                 C   s"   || _ || _|| _|| _|| _d S r4   )labelr   rosharedis_media)r#   r   r   r   r   r   r$   r$   r%   r     s
   
z_DiskData.__init__N)r   r   r   r   r   r   r   r$   r$   r$   r%   r     s
    
r   c                 C   s   g }| j jjD ]
}|t| q|td|  jjddd |td|  jj	ddd |td|  jj
ddd |S )zT
    Return a list of _DiskData for all VM resources the app attempts to delete
    kernelTFinitrddtb)xmlobjdevicesr   rW   r   r   
get_xmlobjr   r   r   r   )r   rN   r   r$   r$   r%   r     s   r   c              	   C   s   |   }|  |D ]K}|jsq
d}d}||j}t|||j\}	}
|	r0t|| ||\}}d}|	s7|
}n|s;|}d}tjj	}||	 |j|j
t||||g}|| q
dS )zG
    Fill in the storage list UI from the passed list of _DiskData
    FNzdialog-warning)rT   clearr   get_vol_by_path_can_delete_do_we_defaultr   r   IconSizeLARGE_TOOLBARr   r   rW   )storage_listr   r7   rN   rZ   diskdatadefaultdefinfor   can_deldelinfoinfoicon	icon_sizer\   r$   r$   r%   rI     s2   rI   c              
   C   s  t tttttttt}| | | t t  }t t	d}t  }t t	d}|
t jj |d | | | | | | | | t  }|dt|  ||d dd }||| |t t  }||d ||dt |t |d	d
 |dtjj t  }	||	d ||	dt |t t  }
||
d ||
dt ||
dt  ||
dt! |t  d S )NTargetzStorage PathTrG   Fc           
      S   sR   || }|t  }| }|t }|  d }	|	d| |	d| |	d| d S )Nr   inconsistentactive	sensitive)rU   rV   	get_cellsset_property)
columncellrZ   _iterdatar\   r   r   r   chkr$   r$   r%   sensitive_cb  s   z+_prepare_storage_list.<locals>.sensitive_cbrJ   zwidth-chars2   	ellipsizevisiblez	icon-namez
stock-size)"r   	ListStorer   r   int	set_modelset_tooltip_columnSTORAGE_ROW_TOOLTIPTreeViewColumnrg   
set_sizingTreeViewColumnSizingAUTOSIZE
set_expandappend_columnCellRendererToggler9   _storage_item_toggled
pack_startset_cell_data_funcset_sort_column_idrU   CellRendererTextadd_attributerX   r   r   EllipsizeModeMIDDLESTORAGE_ROW_TARGETCellRendererPixbufSTORAGE_ROW_ICON_SHOWSTORAGE_ROW_ICONSTORAGE_ROW_ICON_SIZE)r   rZ   
confirmCol	targetColinfoColpathColchkboxr   path_txt
target_txtinfo_imgr$   r$   r%   r'     sF   






	


r'   c                 C   s"   |   }| }| || t< d S r4   )rR   rT   rV   )rP   indexr   r   rZ   r$   r$   r%   r  (  s   r  c                 C   s   d}|r |   }|tjjkrtd}n>|tjjkrtd}n3|  r)td}n*tj	
|s4td}nttj	|tjsDtd}ntt|tj rStd}t| }||fS )z"Is the passed path even deleteableNzCannot delete iSCSI share.zCannot delete SCSI device.z'Cannot delete unmanaged remote storage.zPath does not exist.z$No write access to parent directory.z%Cannot delete unmanaged block device.)get_parent_poolget_typevirtinstStoragePool
TYPE_ISCSIrg   	TYPE_SCSI	is_remoter   r   existsaccessdirnameW_OKstatS_ISBLKST_MODEr   )r7   r   r   r   	pool_type
can_deleter$   r$   r%   r   /  s$   




r   c              
   C   s  g }|j r|td n|st|jtjs|td |jr(|td |s4|jr4|td z+t	j
|  |j}t|dkr^|| d|}td}|d| 7 }|| W n! ty } ztdt| |td	 W Y d
}~nd
}~ww d|}	t|	 }
|
|	fS )z7 Returns (do we delete by default?, info string if not)zStorage is read-only.zNo write access to path.zStorage is marked as shareable.zStorage is a media device.r   z
- z3Storage is in use by the following virtual machinesz!Failed checking disk conflict: %sz$Failed to check disk usage conflict.Nrd   )r   rW   rg   r   r"  r   r$  r   r   r  
DeviceDiskpath_in_use_byrz   lenremoverh   r   r   	exceptionr   r   )r7   vm_namer   r   r   namesnamestrr   r   infostr
do_defaultr$   r$   r%   r   H  s8   





r   )!r   r%  r   gi.repositoryr   r   r  r   r   r   r   	baseclassr   libr	   rV   rU   rX   r  r  r  r  r   r   r   r   r   r   rI   r'   r  r   r   r$   r$   r$   r%   <module>   s<    q7T,6