o
    ÍÌaÁ7  ã                   @   s¦   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Zeeƒ\ZZZG dd„ deƒZdS )é    N)ÚGtk)ÚPango)Úlog)Úxmlutilé   )Úuiutil)ÚvmmAsyncJob)ÚvmmGObjectUI)ÚvmmConnectionManager)Ú	vmmDomain)ÚvmmXMLEditoré   c                   @   sò   e Zd Zedd„ ƒZdd„ Zdd„ Zedd„ ƒZed	d
„ ƒZ	dd„ Z
d8d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d0d1„ Zd2d3„ Zd4d5„ Zd6d7„ ZdS )9ÚvmmMigrateDialogc              
   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 migrate dialog: %s)	Ú	_instancer   ÚshowÚtopwinÚ	ExceptionÚerrÚshow_errÚ_Ústr)ÚclsÚ	parentobjÚvmÚe© r   ú./usr/share/virt-manager/virtManager/migrate.pyÚshow_instance   s   ÿ€ÿzvmmMigrateDialog.show_instancec              
   C   sŠ   t  | dd¡ d | _t| j| j|  d¡|  d¡ƒ| _| j d| j	¡ | j 
| j| j| j| j| j| j| jdœ¡ |  ¡  |  ¡  |  ¡  d S )Nz
migrate.uizvmm-migratezdetails-box-alignzdetails-boxzxml-requested)Úon_vmm_migrate_delete_eventÚon_migrate_cancel_clickedÚon_migrate_finish_clickedÚon_migrate_dest_changedÚon_migrate_set_address_toggledÚon_migrate_set_port_toggledÚon_migrate_mode_changed)r	   Ú__init__r   r   Úbuilderr   ÚwidgetÚ
_xmleditorÚconnectÚ_xmleditor_xml_requested_cbÚconnect_signalsÚ_delete_eventÚ_cancel_clickedÚ_finish_clickedÚ_destconn_changedÚ_set_address_toggledÚ_set_port_toggledÚ_mode_changedÚbind_escape_key_closeÚ_cleanup_on_app_closeÚ_init_state©Úselfr   r   r   r%   (   s*   
þÿø
zvmmMigrateDialog.__init__c                 C   s   d | _ | j ¡  d | _d S ©N)r   r(   Úcleanupr6   r   r   r   Ú_cleanupB   s   

zvmmMigrateDialog._cleanupc                 C   s
   t  ¡ jS r8   )r
   Úget_instanceÚconnsr6   r   r   r   Ú	_connobjsG   s   
zvmmMigrateDialog._connobjsc                 C   s   | j r| j jpd S r8   )r   Úconnr6   r   r   r   r>   K   s   zvmmMigrateDialog.connc                 C   s6   t  d¡ |  |¡ |  ¡  | j |¡ | j ¡  d S )NzShowing migrate wizard)r   ÚdebugÚ_set_vmÚ_reset_stater   Úset_transient_forÚpresent)r7   Úparentr   r   r   r   r   T   s
   

zvmmMigrateDialog.showNc                 C   s"   t  d¡ | j ¡  |  d ¡ dS )NzClosing migrate wizardr   )r   r?   r   Úhider@   ©r7   Úignore1Úignore2r   r   r   Úclose[   s   


zvmmMigrateDialog.closec                 C   s   | j |kr|  ¡  d S d S r8   )r   rI   )r7   Ú_connr   r   r   r   Ú_vm_removed_cba   s   
ÿzvmmMigrateDialog._vm_removed_cbc                 C   s4   | j }|r|j | ¡ |r|j d| j¡ || _ d S )Nz
vm-removed)r   r>   Údisconnect_by_objr)   rK   )r7   ÚnewvmÚoldvmr   r   r   r@   e   s   
zvmmMigrateDialog._set_vmc                 C   sL  d gt  }t|t< t|t< t|t< tj|Ž }|  d¡}| 	|¡ t
 |t¡}| dtjj¡ | dd¡ | |dt¡ | ttjj¡ dd„ }| t|¡ |  d¡}t tt¡}| td	ƒd
g¡ | tdƒdg¡ | 	|¡ t
 |d¡ |  d¡ d¡ |  d¡ |  d¡ ¡ ¡ |  d¡ |  d¡ ¡ ¡ |  d¡ |  d¡ ¡ ¡ d S )Númigrate-destÚ	ellipsizezwidth-charsé   Ú	sensitivec                 S   s:   dd„ }| | }| | }|t  d u rdS ||t |t ƒS )Nc                 S   s   | |k| |k  S r8   r   )ÚaÚbr   r   r   Ú_cmp‚   s   z;vmmMigrateDialog._init_state.<locals>._sorter.<locals>._cmpéÿÿÿÿ)ÚCOL_URIÚ	COL_LABEL)ÚmodelÚiter1Úiter2ÚignorerU   Úrow1Úrow2r   r   r   Ú_sorter   s   z-vmmMigrateDialog._init_state.<locals>._sorterúmigrate-modeÚDirectFÚ	TunnelledTr   Úchangedzmigrate-mode-labelúmigrate-unsafezmigrate-unsafe-labelúmigrate-temporaryzmigrate-temporary-label)ÚNUM_COLSr   rX   rW   ÚboolÚCOL_CAN_MIGRATEr   Ú	ListStorer'   Ú	set_modelr   Úinit_combo_text_columnÚset_propertyr   ÚEllipsizeModeÚMIDDLEÚadd_attributeÚset_sort_column_idÚSortTypeÚ	ASCENDINGÚset_sort_funcÚappendr   ÚemitÚset_tooltip_textÚget_tooltip_text)r7   ÚcolsrY   ÚcomboÚtextr_   r   r   r   r5   r   s<   



	


ÿ
ÿ
ÿzvmmMigrateDialog._init_statec                 C   sT  | j  ¡  tdƒdt | j ¡ ¡i }|  d¡ |¡ |  d¡ 	d¡ |  d¡ 
¡  |  d¡ d¡ | j ¡ }d	|| j ¡ f }|  d
¡ | j ¡ ¡ |  d¡ |¡ |  d¡ | j ¡ ¡ |  d¡ d¡ |  d¡ d¡ |  d¡ d¡ |  d¡ d¡ |  d¡ d¡ |  d¡ d¡ | j ¡ rœ|  d¡ d¡ n|  d¡ d¡ |  ¡  d S )Nz*<span size='large'>Migrate '%(vm)s'</span>r   zheader-labelzmigrate-advanced-expanderFzmigrate-cancelú
config-boxTz%s (%s)zmigrate-label-namezmigrate-label-srczmigrate-set-addressÚtoggledúmigrate-set-portr`   r   rd   re   úmigrate-portiB  i À  )r(   Úreset_stater   r   Ú
xml_escaper   Úget_namer'   Ú
set_markupÚset_expandedÚ
grab_focusÚset_visibler>   Úlibvirt_gethostnameÚget_pretty_descÚset_textÚget_name_or_titlerv   Úget_uriÚ
set_activeru   Úis_xenÚ	set_valueÚ_populate_destconn)r7   Ú	title_strÚhostnameÚsrctextr   r   r   rA   ž   s.   
ÿ

zvmmMigrateDialog._reset_statec                 C   s   |   ¡  dS )Nr   ©rI   rF   r   r   r   r,   È   s   zvmmMigrateDialog._delete_eventc                 C   ó   |}|   ¡  d S r8   r’   ©r7   Úsrcr\   r   r   r   r-   Ì   ó   z vmmMigrateDialog._cancel_clickedc                 C   r“   r8   )Ú_finishr”   r   r   r   r.   Ð   r–   z vmmMigrateDialog._finish_clickedc           
      C   s   t  |¡}|s	d S |r|t pd}|t }d}|stdƒ}|  d¡ |¡ |  d¡ |¡ |  d¡ |¡ d}d}d}|r[|| j	v r[| j	| }	|	 
¡ }|	 ¡ sWtdƒ}d| }|	 ¡ }|  d¡ |¡ |  d	¡ |¡ t  |  d
¡t|ƒ¡ |  d¡ |¡ d S )NFÚ z0A valid destination connection must be selected.r{   zmigrate-finishz¦A remotely accessible libvirt URI is required for tunneled migration, but the selected connection is a local URI. Libvirt will reject this unless you add a transport.z<span size='small'>%s</span>úmigrate-addressúmigrate-tunnel-urizmigrate-tunnel-warning-boxzmigrate-tunnel-warning-label)r   Úget_list_selected_rowrh   rW   r   r'   r…   Úset_sensitiverv   r=   rŠ   Ú	is_remoter†   rˆ   Úset_grid_row_visiblerg   r‚   )
r7   r•   ÚrowÚcan_migrateÚuriÚtooltipÚaddressÚtunnel_warningÚ
tunnel_uriÚdestconnr   r   r   r/   Ô   s:   

ÿÿz"vmmMigrateDialog._destconn_changedc                 C   s`   |  ¡ }|  d¡ |¡ |  d¡ | ¡ |  d¡  ¡ }|  d¡ |o$|¡ |  d¡ d¡ d S )Nr™   zmigrate-address-labelr}   r|   )Ú
get_activer'   r…   r‹   ru   )r7   r•   ÚenableÚport_enabler   r   r   r0   þ   s   z%vmmMigrateDialog._set_address_toggledc                 C   s.   |  ¡ }|  d¡ |¡ |  d¡ | ¡ d S )Nr~   zmigrate-port-label)r§   r'   r…   )r7   r•   r¨   r   r   r   r1     s   z"vmmMigrateDialog._set_port_toggledc                 C   s   t j|  d¡ddS )Nr`   r   )Úcolumn)r   Úget_list_selectionr'   r6   r   r   r   Ú_is_tunnel_selected  s   z$vmmMigrateDialog._is_tunnel_selectedc                 C   s2   |}|   ¡ }|  d¡ | ¡ |  d¡ |¡ d S )Nzmigrate-direct-boxzmigrate-tunnel-box)r¬   r'   r…   )r7   r•   r\   Ú	is_tunnelr   r   r   r2     s   zvmmMigrateDialog._mode_changedc                 C   s˜   | j  ¡ }| j  ¡ }d}| ¡ }|}| ¡ }| ¡ |kr%tdƒd|i }n"| ¡ r2tdƒd|i }n| ¡ |krAtdƒd|i }n| ¡ rGd}|||gS )NFz"%(uri)s (Hypervisors do not match)r¡   z%(uri)s (Disconnected)z%(uri)s (Same connection)T)r>   Ú
get_driverrŠ   r‡   r   Úis_disconnectedÚ	is_active)r7   r¦   ÚdriverÚorigurir    Ú
pretty_uriÚdescÚdesturir   r   r   Ú_build_dest_row  s   


z vmmMigrateDialog._build_dest_rowc                 C   s¶   |   d¡}| ¡ }| ¡  g }t| j ¡ ƒD ]
}| |  |¡¡ qtdd„ |D ƒƒs5| 	dt
dƒd dg¡ |D ]}| |¡ q7| d¡ t|ƒD ]\}}|t rX| |¡  d S qHd S )NrO   c                 S   s   g | ]}|t  ‘qS r   )rh   )Ú.0rŸ   r   r   r   Ú
<listcomp>7  s    z7vmmMigrateDialog._populate_destconn.<locals>.<listcomp>r   z No usable connections available.F)r'   Ú	get_modelÚclearÚlistr=   Úvaluesrt   r¶   ÚanyÚinsertr   r‹   Ú	enumeraterh   )r7   ry   rY   Úrowsr>   rŸ   Úidxr   r   r   rŽ   .  s&   
ÿ

þÿz#vmmMigrateDialog._populate_destconnc                 C   s|   d }|   d¡ ¡ r|   d¡ ¡ }d }|   d¡ ¡ r"t|   d¡ ¡ ƒ}|s&d S | j ¡ r0d| }nd| }|r<|d| 7 }|S )Nr™   r~   z%sztcp:%sz:%s)r'   Úget_visibleÚget_textÚintÚ	get_valuer>   rŒ   )r7   r£   Úportr¡   r   r   r   Ú_build_regular_migrate_uriI  s   

z+vmmMigrateDialog._build_regular_migrate_uric                 C   sR   |   ¡  |rtdƒ| }| jj||d d S |jdd | jjdd |  ¡  d S )NzUnable to migrate guest: %s©ÚdetailsT)Úpollvm)Úreset_finish_cursorr   r   r   Úschedule_priority_tickr>   rI   )r7   ÚerrorrÉ   r¦   r   r   r   Ú
_finish_cb]  s   zvmmMigrateDialog._finish_cbc              
   C   sr  zHd }| j  ¡ r| j  ¡ }t d|¡ t |  d¡¡}|t }| j	 
|t ¡}|  ¡ }|  d¡ ¡ }|  d¡ ¡ }|rC|  d¡ ¡ }n|  ¡ }W n( typ }	 zd t ¡ ¡}
| jjtdƒt|	ƒ |
d W Y d }	~	d S d }	~	ww |  ¡  d }| j ¡ r‚| j| jf}|rŠ|d	| 7 }t| j| j||||||g| j|gtd
ƒ| j ¡  tdƒ| j ¡ |dœ | j |d}| !¡  d S )NzUsing XML from xmleditor:
%srO   rd   re   rš   r˜   z#Uncaught error validating input: %srÈ   ú zMigrating VM '%s'z;Migrating VM '%(name)s' to %(host)s. This may take a while.)ÚnameÚhost)Ú	cancel_cb)"r(   Úis_xml_selectedÚget_xmlr   r?   r   r›   r'   rX   r=   ÚgetrW   r¬   r§   rÃ   rÇ   r   ÚjoinÚ	tracebackÚ
format_excr   r   r   r   Úset_finish_cursorr   Úsupports_domain_job_infoÚ_cancel_migrationr   Ú_async_migraterÎ   r   r   Úrun)r7   ÚxmlrŸ   Ú	destlabelr¦   ÚtunnelÚunsafeÚ	temporaryr¡   r   rÉ   rÒ   ÚprogWinr   r   r   r—   h  sT   

€ÿþ€û
ÿùzvmmMigrateDialog._finishc              
   C   sd   t  d¡ z| ¡  W n! ty, } zt  d¡ | tdƒ| ¡ W Y d }~d S d }~ww d|_d S )NzCancelling migrate jobzError cancelling migrate jobz Error cancelling migrate job: %sT)r   r?   Ú	abort_jobr   Ú	exceptionÚshow_warningr   Újob_canceled)r7   Úasyncjobr   r   r   r   r   rÛ   •  s   

€ý
z"vmmMigrateDialog._cancel_migrationc	              	   C   sl   |  ¡ }	|j}
|}|
 ¡  | ¡ ¡}t|
|| ¡ ƒ}t d| ¡ |
 	¡ | 	¡ ¡ |j
|||||||	d d S )NzMigrating vm=%s from %s to %s)Úmeter)Ú	get_meterr>   Úget_backendÚlookupByNamer   r   ÚUUIDr   r?   rŠ   Úmigrate)r7   rè   ÚorigvmÚ	origdconnÚmigrate_urirà   rá   râ   rÞ   ré   ÚsrcconnÚdstconnÚvminstr   r   r   r   rÜ      s   ÿ
ÿzvmmMigrateDialog._async_migratec                 C   s   | j  | jj ¡ ¡ d S r8   )r(   Úset_xmlr   ÚxmlobjrÔ   )r7   r•   r   r   r   r*   ´  s   z,vmmMigrateDialog._xmleditor_xml_requested_cb)NN) Ú__name__Ú
__module__Ú__qualname__Úclassmethodr   r%   r:   Úpropertyr=   r>   r   rI   rK   r@   r5   rA   r,   r-   r.   r/   r0   r1   r¬   r2   r¶   rŽ   rÇ   rÎ   r—   rÛ   rÜ   r*   r   r   r   r   r      s>    
	


,**	-r   )r×   Úgi.repositoryr   r   Úvirtinstr   r   Úlibr   rè   r   Ú	baseclassr	   Úconnmanagerr
   Úobject.domainr   Ú	xmleditorr   rf   ÚrangerX   rW   rh   r   r   r   r   r   Ú<module>   s"   þ