o
    ÇÜbò, ã                   @   sn  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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 ddlm Z  ddl!m"Z" dZ#dZ$e%dƒ\Z&Z'Z(Z)Z*e%dƒ\Z+Z,Z-Z.Z/Z0Z1e%dƒ\Z2Z3Z4Z5dd„ Z6dd„ Z7dd„ Z8dd„ Z9G dd „ d ƒZ:G d!d"„ d"eƒZ;dS )#é    N)ÚGtk)ÚPango)Úlogé   )Úuiutil)ÚvmmAsyncJob)ÚvmmGObjectUI)ÚvmmConnectionManager)ÚvmmAddStorage)ÚvmmMediaCombo)ÚvmmNetworkList)Ú	vmmEngine)ÚvmmDomainVirtinst)Ú	vmmOSList)ÚvmmStorageBrowser)ÚvmmVMWindowé   é   é   é   é   c                 C   s   | dkrdS | S )NÚarmv7lÚarm© )Ú_ar   r   ú//usr/share/virt-manager/virtManager/createvm.pyÚ_pretty_arch?   s   r   c                 C   s   t dƒt| ƒ S )Nz%.1f GiB)Ú_Úfloat)Úsizer   r   r   Ú_pretty_storageE   ó   r    c                 C   s   t dƒ| d  S )Nz%d MiBg      @)r   )Úmemr   r   r   Ú_pretty_memoryI   r!   r#   c                 C   s   t  d¡d u}|p| jjjS )NÚvirtBootstrap)ÚpkgutilÚfind_loaderÚconfigÚCLITestOptionsÚfake_virtbootstrap)ÚconnÚretr   r   r   Úis_virt_bootstrap_installedQ   s   r,   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú
_GuestDatazj
    Wrapper to hold all data that will go into the Guest object,
    so we can rebuild it as needed.
    c                 C   s‚   || _ || _d | _d | _d | _d | _d | _d | _d | _d | _	d | _
d | _d | _d | _d | _d | _d | _d | _d | _d | _d| _d S ©NF)r*   ÚcapsinfoÚfailed_guestÚdefault_graphics_typeÚskip_default_soundÚx86_cpu_defaultÚdiskÚ
filesystemÚ	interfaceÚinitÚmachineÚ
os_variantÚuefi_requestedÚnameÚvcpusÚmemoryÚcurrentMemoryÚlocationÚcdromÚ
extra_argsÚlivecd)Úselfr*   r/   r   r   r   Ú__init__[   s*   
z_GuestData.__init__c                 C   s\   i }| j r
| j |d< | jr| j|d< tj| jfi |¤Ž}| jr&| | jg¡ | jr,d|_|S )Nr?   r@   T)r?   r@   ÚvirtinstÚ	Installerr*   rA   Úset_extra_argsrB   )rC   ÚkwargsÚ	installerr   r   r   Úbuild_installerw   s   

z_GuestData.build_installerc                 C   sÊ   t  | j¡}| | j¡ | jr| j|j_| jr| | j¡ | j	r$| j	|_	| j
r-| | j
¡ | jr6| | j¡ | jr?| | j¡ | jrG| j|j_| jrN| j|_| jrU| j|_| jr\| j|_| jrc| j|_|S ©N)rE   ÚGuestr*   Úset_capabilities_defaultsr/   r8   Úosr9   Úset_os_namer:   r5   Ú
add_devicer4   r6   r7   r;   r<   r>   r=   )rC   Úguestr   r   r   Úbuild_guest…   s2   

z_GuestData.build_guestN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rD   rJ   rR   r   r   r   r   r-   V   s
    r-   c                   @   sô  e Zd Zed¶dd„ƒZdd„ Zdd„ Zd·dd	„Zd
d„ Zd¸dd„Z	dd„ Z
dd„ Zdd„ Zd¶dd„Zdd„ Zdd„ Zdd„ Zdd„ Zd¹dd „Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd¶d)d*„Zd¶d+d,„Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zdºd:d;„Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#dDdE„ Z$dºdFdG„Z%dHdI„ Z&dºdJdK„Z'dLdM„ Z(dNdO„ Z)dPdQ„ Z*dRdS„ Z+dTdU„ Z,dVdW„ Z-dXdY„ Z.dZd[„ Z/d\d]„ Z0d^d_„ Z1d`da„ Z2d¸dbdc„Z3ddde„ Z4dfdg„ Z5dhdi„ Z6djdk„ Z7dldm„ Z8dndo„ Z9dpdq„ Z:drds„ Z;dtdu„ Z<dvdw„ Z=dxdy„ Z>dzd{„ Z?d»d|d}„Z@d~d„ ZAd€d„ ZBd‚dƒ„ ZCd„d…„ ZDd†d‡„ ZEd¶dˆd‰„ZFdŠd‹„ ZGdŒd„ ZHdŽd„ ZIdd‘„ ZJd’d“„ ZKd”d•„ ZLd–d—„ ZMd˜d™„ ZNdšd›„ ZOdœd„ ZPdºdždŸ„ZQd d¡„ ZRd¢d£„ ZSd¤d¥„ ZTd¦d§„ ZUd¨d©„ ZVdªd«„ ZWd¬d­„ ZXd®d¯„ ZYd°d±„ ZZd²d³„ Z[d´dµ„ Z\dS )¼ÚvmmCreateVMNc              
   C   st   z| j stƒ | _ | j j|r|jpd |d W d S  ty9 } z|s"‚ |j tdƒt|ƒ ¡ W Y d }~d S d }~ww )N)Úuriz!Error launching create dialog: %s)	Ú	_instancerW   ÚshowÚtopwinÚ	ExceptionÚerrÚshow_errr   Ústr)ÚclsÚ	parentobjrX   Úer   r   r   Úshow_instance¬   s    ÿ€ýzvmmCreateVM.show_instancec              
      s¨  t  ˆ dd¡ ˆ  ¡  d ˆ _d ˆ _d ˆ _dˆ _dˆ _d ˆ _d ˆ _	d ˆ _
tˆ jˆ jˆ jƒˆ _ˆ  d¡ ˆ jj¡ ‡ fdd„}ˆ j d|¡ tˆ jˆ jˆ jƒˆ _ˆ j dˆ j¡ ˆ j d	ˆ j¡ ˆ j ˆ  d
¡¡ ˆ  d¡ ˆ jj¡ ˆ j i dˆ j“dˆ j“dˆ j“dˆ j“dˆ j“dˆ j“dˆ j“dˆ j“dˆ j “dˆ j!“dˆ j"“dˆ j#“dˆ j$“dˆ j%“dˆ j&“dˆ j'“dˆ j(“ˆ j)ˆ j*ˆ j+ˆ j,ˆ j-ˆ j.dœ¥¡ ˆ  /¡  ˆ  0¡  d S )Nzcreatevm.uiz
vmm-createFústorage-alignc                    s   ˆ   |¡ d S rK   ©Ú_browse_file)ÚignoreÚwidget©rC   r   r   Ú_browse_file_cbÌ   ó   z-vmmCreateVM.__init__.<locals>._browse_file_cbzbrowse-clickedÚchangedÚactivatezinstall-iso-labelzinstall-iso-alignÚon_vmm_newcreate_delete_eventÚon_create_cancel_clickedÚon_create_back_clickedÚon_create_forward_clickedÚon_create_finish_clickedÚon_create_pages_switch_pageÚon_create_conn_changedÚon_method_changedÚon_xen_type_changedÚon_arch_changedÚon_virt_type_changedÚon_machine_changedÚon_vz_virt_type_changedÚon_install_iso_browse_clickedÚon_install_url_entry_changedÚon_install_url_entry_activateÚ on_install_import_browse_clicked)Úon_install_app_browse_clickedÚ%on_install_oscontainer_browse_clickedÚ"on_install_container_source_toggleÚon_install_detect_os_toggledÚon_enable_storage_toggledÚon_create_vm_name_changed)1r   rD   Ú_cleanup_on_app_closer*   Ú	_capsinfoÚ_gdataÚ_detect_os_in_progressÚ_os_already_detected_for_mediaÚ_customize_windowÚ_storage_browserÚ_netlistr
   Úbuilderr[   Ú_addstoragerh   ÚaddÚtop_boxÚconnectr   Ú_mediacomboÚ_iso_changed_cbÚ_iso_activated_cbÚset_mnemonic_labelÚconnect_signalsÚ_close_requestedÚ_back_clickedÚ_forward_clickedÚ_finish_clickedÚ_page_changedÚ_conn_changedÚ_method_changedÚ_xen_type_changedÚ_arch_changedÚ_virt_type_changedÚ_machine_changedÚ_vz_virt_type_changedÚ_browse_isoÚ_url_changedÚ_url_activatedÚ_browse_importÚ_browse_appÚ_browse_oscontainerÚ_container_source_toggleÚ_detect_os_toggled_cbÚ_toggle_enable_storageÚ_name_changedÚbind_escape_key_closeÚ_init_state)rC   rj   r   ri   r   rD   ¸   s‚   ÿÿýüûúù	÷
öõôóòñïîíì
ãzvmmCreateVM.__init__c                 C   sB   t  d¡ |  ¡ s|  |¡ | j |¡ t ¡  ¡  | j 	¡  d S )NzShowing new vm wizard)
r   ÚdebugÚ
is_visibleÚ_reset_stater[   Úset_transient_forr   Úget_instanceÚincrement_window_counterÚpresent)rC   ÚparentrX   r   r   r   rZ      s   

zvmmCreateVM.showc                 C   sT   |   ¡ rt d¡ t ¡  ¡  | j ¡  |  ¡  | j	r | j	 
¡  |  d ¡ d | _d S )NzClosing new vm wizard)r°   r   r¯   r   r³   Údecrement_window_counterr[   ÚhideÚ_cleanup_customize_windowr‹   ÚcloseÚ	_set_connr‡   )rC   Úignore1Úignore2r   r   r   Ú_close
  s   




zvmmCreateVM._closec                 C   sn   | j r| j  ¡  d | _ | jr| j ¡  d | _| jr!| j ¡  d | _| jr,| j ¡  d | _d | _d | _d | _d S rK   )r‹   ÚcleanuprŒ   r’   rŽ   r*   r†   r‡   ri   r   r   r   Ú_cleanup  s   




zvmmCreateVM._cleanupTc                 C   sZ   |   d¡ ¡  |   d¡ d¡ |r|   d¡ ¡  |   d¡ ¡  |   d¡ tdƒ| ¡ dS )Nústartup-error-boxúcreate-forwardFúinstall-boxúarch-expanderústartup-errorz	Error: %s)rh   rZ   Úset_sensitiver¸   Úset_textr   )rC   ÚerrorÚhideinstallr   r   r   Ú_show_startup_error.  s   zvmmCreateVM._show_startup_errorc                 C   ó*   |   d¡ ¡  |   d¡ tdƒ| ¡ d S )NrÁ   rÅ   ú%<span size='small'>Warning: %s</span>©rh   rZ   Ú
set_markupr   ©rC   rÈ   r   r   r   Ú_show_startup_warning8  ó   

ÿz!vmmCreateVM._show_startup_warningc                 C   rË   )Núarch-warning-boxzarch-warningrÌ   rÍ   rÏ   r   r   r   Ú_show_arch_warning=  rÑ   zvmmCreateVM._show_arch_warningc                    sš  ˆ   d¡ d¡ ˆ   d¡ d¡ ˆ   d¡ d¡ ˆ   d¡ d¡ ˆ   d¡}t tt¡}| |¡ t |d¡}| 	d	t
jj¡ ‡ fd
d„}|dƒ |dƒ ˆ   d¡}t tt¡}| |¡ t |d¡ | dd„ d ¡ ˆ   d¡}t tt¡}| |¡ t |d¡ ˆ   d¡}	t t¡}
|	 |
¡ t |	d¡ |	 dd„ d ¡ ˆ   d¡}	t tt¡}
|	 |
¡ t |	d¡ tƒ ˆ _ˆ   d¡ ˆ jj¡ ˆ   d¡ ˆ jj¡ d S )Núcreate-pagesFúinstall-method-pagesúcreate-conn-labelÚ rÅ   úcreate-connr   Ú	ellipsizec                    s,   ˆ   | ¡}t t¡}| |¡ | d¡ d S ©Nr   )rh   r   Ú	ListStorer_   Ú	set_modelÚset_entry_text_column)Ú	widget_idÚlstÚmodelri   r   r   Úset_model_listP  s   


z/vmmCreateVM._init_state.<locals>.set_model_listúinstall-url-comboú$install-oscontainer-source-url-comboÚarchr   c                 S   ó   | | d d u S rÚ   r   ©ÚmÚirg   r   r   r   Ú<lambda>c  ó    z)vmmCreateVM._init_state.<locals>.<lambda>úxen-typer8   c                 S   rå   rÚ   r   ræ   r   r   r   ré   r  rê   ú	virt-typezinstall-os-alignzos-label)rh   Úset_show_tabsrÇ   r   rÛ   r_   rÜ   r   Úinit_combo_text_columnÚset_propertyr   ÚEllipsizeModeÚMIDDLEÚset_row_separator_funcr   Ú_os_listr   Úsearch_entryÚset_mnemonic_widget)rC   Ú	conn_listÚ
conn_modelÚtextrá   ÚarchListÚ	archModelÚ	hyperListÚ
hyperModelrß   rà   r   ri   r   r®   C  sF   



ÿ






zvmmCreateVM._init_statec                 C   s"  |   ¡  |  d¡ t¡ |  ddt¡ |  d¡ d¡ |  d¡ d¡ |  d¡ d¡ |  |¡}|  d	¡ d
¡ |  d¡ d¡ |  	|¡d
u rId
S | j
 ¡  d
| _dd„ }| j ¡  |  d¡ d¡ |  d¡ d¡ |  d¡ d
¡ |  d¡ ¡ }||| j ¡ ƒ |  d¡ d¡ |  d¡ d¡ |  d¡ d¡ |  d¡ d¡ |  d¡ d¡ |  d¡ d¡ |  d¡ d
¡ |  d¡ d
¡ |  d¡ d
¡ |  d¡ d¡ |  d¡ ¡ }||| j ¡ ƒ |  d¡ d¡ |  d ¡ d¡ | j ¡  | j d!¡ d¡ | j d"¡ d¡ |  d#¡ d
¡ dS )$zx
        Reset all UI state to default values. Conn specific state is
        populated in _populate_conn_state
        rÔ   Núcreate-vm-namer×   úmethod-localTrØ   éÿÿÿÿrÄ   Fúvz-virt-type-hvmc                 S   s&   |   ¡  |pg D ]}|  |g¡ qd S rK   )ÚclearÚappend)Úmedia_modelÚurlsÚurlr   r   r   Ú_populate_media_modelœ  s   ÿz7vmmCreateVM._reset_state.<locals>._populate_media_modelúinstall-urlopts-entryúinstall-url-entryzinstall-url-optionsrâ   úinstall-import-entryúinstall-app-entryz/bin/shúinstall-oscontainer-fsú$install-oscontainer-source-url-entryúinstall-oscontainer-source-userú!install-oscontainer-source-passwdú#install-oscontainer-source-insecureúinstall-oscontainer-bootstrapz install-oscontainer-auth-optionsúinstall-oscontainer-rootpwrã   úinstall-container-templatezcentos-7-x86_64úenable-storagezstorage-createzstorage-entryúsummary-customize)Úreset_finish_cursorrh   Úset_current_pageÚ	PAGE_NAMEr›   rÇ   Ú
set_activeÚ_populate_conn_listÚset_expandedr»   ró   Úreset_stater‰   r’   Ú	get_modelr'   Úget_media_urlsÚget_container_urlsrŽ   )rC   ÚurihintÚ
activeconnr  ÚurlmodelÚ	src_modelr   r   r   r±   €  sP   


ÿ
zvmmCreateVM._reset_statec              
   C   s  |   d¡ ¡  |  ¡ | _| j ¡ }| j ¡  }| jj ¡ }|p |}|j	 
¡ }| j ¡ }| j ¡ }|o6|j	 ¡ }| j ¡  ¡ }	t|j	 ¡ pM|j	 ¡ pM|j	 ¡ ƒ}
| j ¡ dko_|j	 ¡ o_|j	 ¡ }|rgt d¡ | ¡ sm|r¥z| ¡  d| j_d}
t d¡ W n& ty¤ } zd}
tjddd td	ƒ| }|  |¡ W Y d
}~nd
}~ww |   d¡}|   d¡}|   d¡}|   d¡}|   d¡}| |sÄ|	oÅ|
¡ | | oÏ|oÏ|
¡ | | ¡ | |¡ ||||g}d
}d
}d
}|sø|	sðtdƒ}|søtdƒ}|}|rþtdƒ}|
stdƒ|j	j  }|}|}t!dd„ |D ƒƒs)|D ]}| "¡ r'| #d¡  nq|s=dd„ |D ƒs=| j$tdƒddS | %|pCd¡ | %|pKd¡ | %|pSd¡ | #d¡ |   d¡ &|¡ |   d¡ &|¡ |   d¡ &| ou| ¡ |   d¡ &|
 ¡ d
S )zF
        Set state that is dependent on when capsinfo changes
        rÒ   Úuefiz*UEFI default requested via app preferencesTz"UEFI found, setting it as default.FzError checking for UEFI default©Úexc_infoz5Failed to setup UEFI: %s
Install options are limited.Númethod-treeúmethod-manualrþ   úmethod-importúmethod-container-appz5Libvirt version does not support remote URL installs.z/Connection does not support storage management.z5CDROM/ISO installs not available for paravirt guests.z$Architecture '%s' is not installablec                 S   s   g | ]
}|  ¡ o| ¡ ‘qS r   )Ú
get_activeÚget_sensitive©Ú.0Úwr   r   r   Ú
<listcomp>  s    ÿz/vmmCreateVM._set_caps_state.<locals>.<listcomp>c                 S   s   g | ]}|  ¡ r|‘qS r   )r+  r,  r   r   r   r/  #  s    z1No install methods available for this connection.)rÉ   r×   zcontainer-install-boxúvz-install-boxúvirt-install-boxzkernel-info-box)'rh   r¸   Ú_build_guestdatar‡   rR   r*   Ú	is_remoteÚsupportÚconn_storagerN   Úis_xenpvÚis_container_onlyÚis_vzÚis_containerÚget_backendÚsupport_remote_url_installÚboolÚis_x86Úis_ppc64Úis_s390xr'   Úget_default_firmware_settingÚis_hvmr   r¯   Úprefers_uefiÚenable_uefir:   r\   r   rÓ   rÆ   rä   Úanyr+  r  rÊ   Úset_tooltip_textÚset_visible)rC   rQ   Úis_localÚis_storage_capableÚcan_storageÚis_pvr7  r8  Úis_vz_containerÚcan_remote_urlÚinstallable_archÚdefault_efirb   ÚmsgÚmethod_treeÚmethod_manualÚmethod_localÚmethod_importÚmethod_container_appÚvirt_methodsÚlocal_ttÚtree_ttÚ	import_ttr.  r   r   r   Ú_set_caps_stateË  sÀ   




ÿþÿý
ÿ€û




ÿÿ
ÿÿ
ÿ

þÿþ

ÿzvmmCreateVM._set_caps_statec                 C   s   | j jdddd |  d¡ ¡  |  d¡ d¡ d| _| j  ¡  | j j ¡ s>t	dƒ}| j  
¡ r9|d7 }|t	dƒ7 }|  |¡S |  ¡  |  ¡  |  ¡  |  ¡  |  d	¡ ¡ pi|  d
¡ ¡ pi|  d¡ ¡ pi|  d¡ ¡ }t |  d¡|¡ | j  
¡ rˆ| jj ¡ s‡t	dƒ}|  |¡ nB| j  ¡ rÊd}d}| j jjD ]}|jdkrŸd}|jdkr¦d}q–|  d¡ |¡ |  d¡ |¡ |  d¡ |¡ |  d¡ | oÈ|¡ | j | j ¡ | j ¡  | j  ¡  }t| j ƒ}|oä|}| | |||dœ}	|	 ¡ D ]\}
}|  |
¡  |¡ qót!| j  "¡ ƒ}t	dƒdt#|ƒi }d| }|  d¡ $d|d ¡ |  d¡ %|¡ t!| j  &¡ ƒ}t'dd|ƒdt!|ƒi }d| }|  d¡ $dt(|dƒ¡ |  d ¡ %|¡ | j | j)_ | j) ¡  |  d!¡ *d¡ t+| j | j,| j-ƒ| _.|  d"¡ /| j.j0¡ | j. ¡  dS )#zU
        Update all state that has some dependency on the current connection
        T)ÚpollnetÚpollpoolÚpollnodedevrÃ   rÂ   Nz5No hypervisor options were found for this connection.ú

zoThis usually means that QEMU or KVM is not installed on your machine, or the KVM kernel modules are not loaded.rë   rì   rä   r8   rÄ   z™KVM is not available. This may mean the KVM package is not installed, or the KVM kernel modules are not loaded. Your virtual machines may perform poorly.FÚhvmÚexer   úvz-virt-type-exe)z#install-oscontainer-notsupport-connzinstall-oscontainer-notsupportr  úinstall-oscontainer-sourceúinstall-oscontainer-rootpw-boxz&Up to %(maxmem)s available on the hostÚmaxmemú<span size='small'>%s</span>r"   é2   r   zphys-mem-labelzUp to %(numcpus)d availableÚnumcpusÚcpusr   zphys-cpu-labelúadvanced-expanderúnetdev-ui-align)1r*   Úschedule_priority_tickrh   rZ   rÆ   r†   Úinvalidate_capsÚcapsÚhas_install_optionsr   Úis_qemurÊ   Ú_change_capsÚ_populate_xen_typeÚ_populate_archÚ_populate_virt_typeÚget_visibler   Úset_grid_row_visiblerQ   Úis_kvm_availablerÐ   r8  ÚguestsÚos_typer  r’   Úset_connr  r3  r,   ÚitemsrF  ÚintÚhost_memory_sizer#   Ú	set_rangerÎ   Úhost_active_processor_countÚngettextÚmaxrŽ   r  r   r   r[   rŒ   r   r   )rC   rÈ   Ú	show_archÚhas_hvm_guestsÚhas_exe_guestsÚgrG  Úvb_installedÚ
vb_enabledÚoscontainer_widget_confÚwnameÚvalr=   Ú	mem_labelÚ	phys_cpusÚ	cpu_labelr   r   r   Ú_populate_conn_state5  s¤   þ


ÿþý

€


€
ÿ

û
ÿþ
ý

z vmmCreateVM._populate_conn_statec                 C   s   |  ¡ r
|  ¡  d S d S rK   )Úis_disconnectedr¾   )rC   r*   r   r   r   Ú_conn_state_changed¤  s   ÿzvmmCreateVM._conn_state_changedc              
   C   sÌ   |   d¡ ¡  |   d¡ ¡  | j}|| _|r| | ¡ | jr0|   d¡ | jj¡ | j ¡  d | _| js:|  t	dƒ¡S | j 
d| j¡ z|  ¡ W S  tye } zt d¡ |  t|ƒ¡W  Y d }~S d }~ww )NrÁ   rÒ   ri  z#No active connection to install on.ústate-changedz'Error setting create wizard conn state.)rh   r¸   r*   Údisconnect_by_objrŒ   Úremover   r¿   rÊ   r   r‘   rŽ  rŒ  r\   r   Ú	exceptionr_   )rC   ÚnewconnÚoldconnrb   r   r   r   r»   ¨  s,   

ÿ

€þzvmmCreateVM._set_connc                 C   sš   |du r| j jjD ]}|jdkrd} nq	| j jj|||d}| jr2| jj|jkr2| jj|jkr2dS || _t 	d| jj| jj
| jj¡ |  ¡  |  ¡  dS )zp
        Change the cached capsinfo for the passed values, and trigger
        all needed UI refreshing
        Nr^  )rw  rä   Útypz2Guest type set to os_type=%s, arch=%s, dom_type=%s)r*   rl  rv  rw  Úguest_lookupr†   rQ   Údomainr   r¯   rä   Úhypervisor_typeÚ_populate_machinerY  )rC   Úgtyperä   Údomtyperƒ  r/   r   r   r   ro  Á  s,   
þ
þýzvmmCreateVM._change_capsc                 C   s
  |   d¡ ¡ }| ¡  d}g }| j ¡ s| j ¡ r"| jjjd d … }|D ]C}|js*q$|j	}|jd }|j
}| j ||¡}|D ]}	|	d |krJd } nq>|d u rPq$|| jj	kr`|| jj
kr`t|ƒ}| ||g¡ q$tt|ƒƒ}
t |   d¡|
¡ |
rƒ|   d¡ |¡ d S d S )Nrë   r   )rh   r  r  r*   Úis_xenÚis_testrl  rv  Údomainsrw  r˜  Ú	pretty_hvr†   Úlenr  r<  r   rt  r  )rC   rà   Údefaultrv  rQ   rš  Údomr›  Úlabelrç   rZ   r   r   r   rp  ä  s:   
þÿzvmmCreateVM._populate_xen_typec           	      C   sR  |   d¡ ¡ }| ¡  d}g }| jjjD ]}|j| jjkr#| |j	¡ q| jjj
jj	dkr:d|v r:d|v r:| d¡ | ¡  g d¢}| jjj
jj	|vrMg }|d d … D ]}||vr_| |¡ qS| |¡ qS|rr|rn|d g7 }|| }d}| jj	|v r| | jj	¡}|D ]}| t|ƒ|g¡ qƒt|ƒdk  }t |   d¡|¡ |   d¡ |¡ d S )Nrä   r   Úx86_64Úi686)r¤  r¥  Úaarch64r   Úppc64Úppc64leÚs390xé   )rh   r  r  r*   rl  rv  rw  r†   r  rä   ÚhostÚcpur‘  ÚsortÚindexr   r   r   rt  r  )	rC   rà   r¡  ÚarchsrQ   ÚpriosÚprä   rZ   r   r   r   rq  
  s>   €

zvmmCreateVM._populate_archc                 C   s   |   d¡ ¡ }| ¡  dd„ | jjjd d … D ƒ}| j ¡ s!g }n| jjdv r)g }d}| jj	|v r8| 
| jj	¡}dg}|D ]}||vrDq=| |¡ | d|¡ q=|D ]}| j | jj|¡}| ||g¡ qRtt|ƒdkƒ}t |   d¡|¡ |   d¡ |¡ d S )Nrì   c                 S   s   g | ]}|j ‘qS r   )r˜  )r-  Údr   r   r   r/  :  s    z3vmmCreateVM._populate_virt_type.<locals>.<listcomp>)r¥  r¤  r§  r¨  r   Úkvmr   )rh   r  r  r†   rQ   rž  r*   rn  rä   r˜  r®  r‘  ÚinsertrŸ  rw  r  r<  r   r   rt  r  )rC   rà   rž  r¡  r°  r—  r£  rZ   r   r   r   rr  3  s,   

zvmmCreateVM._populate_virt_typec           
   
   C   sd  |   d¡ ¡ }| jjd d … }| jjdv rg }| ¡  d }g }tj | j¡}|r-|}|g}|d d … D ]}||vr?| 	|¡ q3| 	|¡ q3|rN|d g | }d}|r[||v r[| 
|¡}|   d¡ | j¡ zB| ¡  |D ]}| |g¡ qkt|ƒdk}	t |   d¡|	¡ |	rš|   d¡ |¡ W |   d¡ d| j¡ d S W |   d¡ d| j¡ d S |   d¡ d| j¡ w )Nr8   )r¥  r¤  r   r   rl   )rh   r  r†   Úmachinesrä   r­  rE   rL   Úget_recommended_machiner‘  r®  Údisconnect_by_funcr¡   r  r  r   r   rt  r  r‘   )
rC   rà   rµ  Ú
defmachiner°  Úrecommended_machiner±  r¡  rç   rZ   r   r   r   r™  S  sD   ÿ
ý.zvmmCreateVM._populate_machinec                 C   s,  |   d¡}| ¡ }| ¡  d}t ¡ }|j ¡ D ])}| ¡ sq| ¡ |kr*t	|ƒ}n|dk r6| 
¡ s6t	|ƒ}| | ¡ | ¡ g¡ qt	|ƒdk}|dk rP|sPd}d}d}	d }
|sh| |¡ || \}}	|j| }
|   d¡ |	¡ t	|ƒdkr†|   d¡ ¡  |   d¡ ¡  |
S |   d¡ ¡  |   d¡ ¡  |
S )NrØ   rÿ   r   r×   rÖ   r   )rh   r  r  r	   r³   ÚconnsÚvaluesÚ	is_activeÚget_urir   r3  r  Úget_pretty_descr  rÇ   r¸   rZ   )rC   r  rö   rà   r¡  ÚconnmanagerÚconnobjÚno_connsÚ	activeuriÚ
activedescr   r   r   r   r  |  s>   



ýzvmmCreateVM._populate_conn_listc                 C   sž   d}d}d}| j j}| j j}|r'| ¡ rdt| ¡ ƒ }|s"| ¡ }|| }n|r/||j }ntdƒ}|  	d¡ 
|¡ |  	d¡ t|ƒ¡ |  	d¡ 
|¡ d S )Nrd  r×   z%sÚNonezsummary-storagezsummary-storage-path)r‡   r4   r5   Úwants_storage_creationr    Úget_sizeÚget_source_pathÚsourcer   rh   rÎ   rF  r<  )rC   ÚpathÚstoragetmplÚstoragesizeÚstoragepathr4   Úfsr   r   r   Ú_populate_summary_storage«  s"   
z%vmmCreateVM._populate_summary_storagec                 C   s$  | j  ¡ }tt|jƒƒ}tt|jƒƒ}|  ¡ }d}|tkr"t	dƒ}n5|t
kr+t	dƒ}n,|tkr4t	dƒ}n#|tkr=t	dƒ}n|tkrFt	dƒ}n|tkrOt	dƒ}n|tkrWt	dƒ}|  d	¡ |jj¡ |  d
¡ |¡ |  d¡ |¡ |  d¡ |¡ |  ¡  | j ¡ d }|s|  d¡ d¡ d S d S )Nr×   zLocal CDROM/ISOzURL Install TreezImport existing OS imagezManual installzApplication containerzOperating system containerzVirtuozzo containerz
summary-oszsummary-installzsummary-memzsummary-cpur   rh  T)r‡   rR   r#   rz  r=   r_   r<   Ú_get_config_install_pageÚINSTALL_PAGE_ISOr   ÚINSTALL_PAGE_URLÚINSTALL_PAGE_IMPORTÚINSTALL_PAGE_MANUALÚINSTALL_PAGE_CONTAINER_APPÚINSTALL_PAGE_CONTAINER_OSÚINSTALL_PAGE_VZ_TEMPLATErh   rÇ   Úosinfor£  rÎ  rŒ   Úget_network_selectionr  )rC   rQ   r"   r¬  Ú
instmethodÚinstallÚnsourcer   r   r   Ú_populate_summaryÁ  s8   






ÿzvmmCreateVM._populate_summaryc                 C   ó   |   d¡ ¡ S )Nrý   ©rh   Úget_textri   r   r   r   Ú_get_config_nameæ  rk   zvmmCreateVM._get_config_namec                 C   s   t j|  d¡ddS )Nr8   T)Úcheck_visible)r   Úget_list_selectionrh   ri   r   r   r   Ú_get_config_machineé  s   ÿzvmmCreateVM._get_config_machinec                 C   s¢   |   d¡ ¡ r|   d¡ ¡ rtS |   d¡ ¡ r=|   d¡ ¡ r tS |   d¡ ¡ r)tS |   d¡ ¡ r2tS |   d¡ ¡ r;tS d S |   d¡ ¡ rFtS |   d	¡ ¡ rOt	S d S )
Nr0  r`  r1  rþ   r&  r(  r'  r)  zmethod-container-os)
rh   rs  r*  rÖ  rÐ  rÑ  rÒ  rÓ  rÔ  rÕ  ri   r   r   r   rÏ  í  s$   ÿÿz$vmmCreateVM._get_config_install_pagec                 C   s   |   ¡ tttfv S rK   )rÏ  rÔ  rÕ  rÖ  ri   r   r   r   Ú_is_container_install   s   þz!vmmCreateVM._is_container_installc                 C   rÝ  )Nr  ©rh   r*  ri   r   r   r   Ú!_get_config_oscontainer_bootstrap  rk   z-vmmCreateVM._get_config_oscontainer_bootstrapFc                 C   s*   |   d¡ ¡  ¡ }|r|r| j |¡ |S )Nr  )rh   rß  Ústripr'   Úadd_container_url)rC   Ústore_mediaÚsrc_urlr   r   r   Ú"_get_config_oscontainer_source_url
  s   ÿz.vmmCreateVM._get_config_oscontainer_source_urlc                 C   s   |   d¡ ¡  ¡ S )Nr  )rh   rß  rç  ri   r   r   r   Ú'_get_config_oscontainer_source_username  s   ÿz3vmmCreateVM._get_config_oscontainer_source_usernamec                 C   rÝ  )Nr  rÞ  ri   r   r   r   Ú'_get_config_oscontainer_source_password  rk   z3vmmCreateVM._get_config_oscontainer_source_passwordc                 C   rÝ  )Nr  rå  ri   r   r   r   Ú_get_config_oscontainer_isecure  rk   z+vmmCreateVM._get_config_oscontainer_isecurec                 C   rÝ  )Nr  rÞ  ri   r   r   r   Ú%_get_config_oscontainer_root_password!  rk   z1vmmCreateVM._get_config_oscontainer_root_passwordc                 C   s   |   ¡ ttttfv S rK   )rÏ  rÒ  rÔ  rÕ  rÖ  ri   r   r   r   Ú_should_skip_disk_page%  s
   ýz"vmmCreateVM._should_skip_disk_pagec                 C   s   | j j|dS )N©ré  )r’   Úget_path)rC   ré  r   r   r   Ú_get_config_local_media+  rk   z#vmmCreateVM._get_config_local_mediac                 C   sF   |   ¡ }d }d }|tkr|  ¡ }||fS |tkr|  d¡ ¡ }||fS )Nr  )rÏ  rÐ  ró  rÑ  rh   rß  )rC   Úinstpager@   r?   r   r   r   Ú_get_config_detectable_media.  s   ýz(vmmCreateVM._get_config_detectable_mediac                 C   s@   |   d¡ ¡  ¡ }|   d¡ ¡  ¡ }|r|r| j |¡ ||fS )Nr  r  )rh   rß  rç  r'   Úadd_media_url)rC   ré  ÚmediaÚextrar   r   r   Ú_get_config_url_info:  s
   z vmmCreateVM._get_config_url_infoc                 C   rÝ  ©Nr	  rÞ  ri   r   r   r   Ú_get_config_import_pathC  rk   z#vmmCreateVM._get_config_import_pathc                 C   s   | j  ¡ o	|  ¡  S rK   )rŽ   Úis_default_storagerð  ri   r   r   r   Ú_is_default_storageF  s   
ÿzvmmCreateVM._is_default_storagec                 C   rÝ  )Núinstall-detect-osrå  ri   r   r   r   Ú_is_os_detect_activeJ  rk   z vmmCreateVM._is_os_detect_activec                    s^   ˆ j rˆ j jsˆ  ¡  dS dd„ }‡ fdd„}t|ˆ j jg|g tdƒtdƒˆ jƒ}| ¡  dS )zn
        When user tries to close the dialog, check for any disks that
        we should auto cleanup
        r   c                 S   s   |   ¡ }tj ||¡ d S rK   )Ú	get_meterrE   rF   Úcleanup_created_disks)ÚasyncjobÚ_failed_guestÚmeterr   r   r   Ú_cleanup_disks\  s   z4vmmCreateVM._close_requested.<locals>._cleanup_disksc                    s"   | r	t  d| |¡ ˆ  ˆ j¡ d S )Nz2Error cleaning up disk images:
error=%s
details=%s)r   r¯   Úidle_addr¾   )rÈ   Údetailsri   r   r   Ú_cleanup_disks_finished`  s
   ÿz=vmmCreateVM._close_requested.<locals>._cleanup_disks_finishedzRemoving disk imagesz9Removing disk images we created for this virtual machine.)r‡   r0   r¾   r   r   r[   Úrun)rC   r¼   r½   r  r  ÚprogWinr   ri   r   r—   R  s    ÿ
ûzvmmCreateVM._close_requestedc                 C   sL   t  |¡}d }t ¡ }|r|j| }|  ¡ sd S | j|ur$|  |¡ d S d S rK   )r   râ  r	   r³   rº  r°   r*   r»   )rC   ÚsrcrX   r“  r¿  r   r   r   rœ   r  s   


ÿzvmmCreateVM._conn_changedc                 C   s   |}|   d¡ d S rÚ   )Ú_set_page_num_text)rC   r  rg   r   r   r   r     s   zvmmCreateVM._method_changedc                 C   s   |   ¡  d S rK   )rY  ©rC   rg   r   r   r   r¡   ‡  ó   zvmmCreateVM._machine_changedc                 C   s2   t j|  d¡dd}|sd S |  |¡ |  ¡  d S )Nrë   r   ©Úcolumn)r   râ  rh   ro  rq  )rC   rg   rw  r   r   r   rž   Š  s
   
zvmmCreateVM._xen_type_changedc                 C   s8   t j|  d¡dd}|sd S |  | jj|¡ |  ¡  d S )Nrä   r   r  )r   râ  rh   ro  r†   rw  rr  )rC   rg   rä   r   r   r   rŸ   ’  s
   zvmmCreateVM._arch_changedc                 C   s6   t j|  d¡dd}|sd S |  | jj| jj|¡ d S )Nrì   r   r  )r   râ  rh   ro  r†   rw  rä   )rC   rg   r›  r   r   r   r    š  s   zvmmCreateVM._virt_type_changedc                 C   s.   |   d¡ ¡ }|r|  d¡ d S |  d¡ d S )Nr   r^  r_  )rh   r*  ro  )rC   rg   rA  r   r   r   r¢   ¡  s   z!vmmCreateVM._vz_virt_type_changedc                 C   s,   d| _ |rt|dƒr| ¡ rd S |  ¡  d S )NFrß  )r‰   ÚhasattrÚ	has_focusÚ_start_detect_os_if_needed)rC   rh   Ú
checkfocusr   r   r   Ú _detectable_media_widget_changed©  s   ÿÿz,vmmCreateVM._detectable_media_widget_changedc                 C   s   |   |¡ d S rK   ©r  ©rC   r  r   r   r   r¤   µ  rk   zvmmCreateVM._url_changedc                 C   s   | j |dd d S ©NF)r  r  r  r   r   r   r¥   ·  ó   zvmmCreateVM._url_activatedc                 C   s   |   |¡ d S rK   r  ©rC   Ú
mediacomboÚentryr   r   r   r“   ¹  rk   zvmmCreateVM._iso_changed_cbc                 C   s   | j |dd d S r  r  r  r   r   r   r”   »  r  zvmmCreateVM._iso_activated_cbc                 C   s:   |  ¡ sd S | ¡ }|  | ¡ |rd| _|  ¡  d S d S r.   )r°   r*  Ú_change_os_detectr‰   r  )rC   r  Údodetectr   r   r   rª   ¾  s   þz!vmmCreateVM._detect_os_toggled_cbc                 C   s   | j ddd d S )Nr  T)Úis_dirre   r  r   r   r   r¨   É  r  zvmmCreateVM._browse_oscontainerc                 C   ó   |   d¡ d S )Nr
  re   r  r   r   r   r§   Ë  rk   zvmmCreateVM._browse_appc                 C   r   rú  re   r  r   r   r   r¦   Í  rk   zvmmCreateVM._browse_importc                    s    ‡ fdd„}ˆ j d |dd d S )Nc                    s   ˆ j  |¡ d S rK   )r’   Úset_path)rg   rÉ  ri   r   r   r!  Ð  r!   z)vmmCreateVM._browse_iso.<locals>.set_pathT)ÚcbÚis_mediare   )rC   rg   r!  r   ri   r   r£   Ï  s   zvmmCreateVM._browse_isoc                 C   s   |   d¡ | ¡ ¡ d S )Nrd   )rh   rÆ   r*  r  r   r   r   r«   Ö  ó   z"vmmCreateVM._toggle_enable_storagec                 C   sf   |  ¡ }| ¡ s
d S |sd S z| j|dd\}}| j|d W d S  ty2   tjd|dd Y d S w )NF©Údo_log©rÉ  z8Error generating storage path on name change for name=%sTr$  )rß  r°   Ú_get_storage_pathrÎ  r\   r   r¯   )rC   r  ÚnewnamerÉ  rg   r   r   r   r¬   Û  s   ÿÿzvmmCreateVM._name_changedc                 C   s¦   |   d¡ ¡ }|   d¡ |¡ |   d¡ |¡ |rO|   d¡ ¡ sQdg}t ¡ dkr1tj d¡dg}| j 	¡ }t
j |¡}||g }|   d¡ tjj|Ž ¡ d S d S d S )	Nr  ra  rb  r  z/var/lib/libvirt/filesystems/r   ú~z!.local/share/libvirt/filesystems/)rh   r*  rÆ   rß  rN   ÚgeteuidrÉ  Ú
expanduserr‡   rR   rE   rL   Úgenerate_namerÇ   Újoin)rC   rg   Ú
enable_srcÚfs_dirrQ   Údefault_namerÍ  r   r   r   r©   ë  s   
ÿ

÷z$vmmCreateVM._container_source_togglec                    s°   |rˆj j}n|rˆj j}nˆj j}|r|}n‡ ‡fdd„}ˆjr0ˆjjˆjkr0ˆj ¡  d ˆ_ˆjd u r;tˆjƒˆ_ˆj ˆ 	¡ ¡ ˆj 
|¡ ˆj |¡ ˆj ˆj¡ d S )Nc                    s&   ˆ }t ˆ tƒrˆ ˆ ¡}| |¡ d S rK   )Ú
isinstancer_   rh   rÇ   )rg   rø   rh   ©ÚcbwidgetrC   r   r   Úcallback  s   

z*vmmCreateVM._browse_file.<locals>.callback)r'   ÚCONFIG_DIR_ISO_MEDIAÚCONFIG_DIR_FSÚCONFIG_DIR_IMAGEr‹   r*   r¿   r   Úset_vm_namerà  Úset_finish_cbÚset_browse_reasonrZ   r[   )rC   r4  r"  r#  r  Úreasonr5  r   r3  r   rf     s"   



zvmmCreateVM._browse_filec                 C   sP   |d7 }t d }|  ¡ r|d8 }t||ƒ}tdƒ||dœ }|  d¡ |¡ dS )zG
        Set the 'page 1 of 4' style text in the wizard header
        r   z%Step %(current_page)d of %(max_page)d)Úcurrent_pageÚmax_pagezheader-pagenumN)ÚPAGE_FINISHrð  Úminr   rh   rÎ   )rC   ÚcurÚfinalÚpage_lblr   r   r   r  "  s   
ÿzvmmCreateVM._set_page_num_textc                 C   s8   | j  |¡ |s| j  ¡ s| j j tdƒ¡ d S d S d S )Nz"Waiting for install media / source)ró   rÆ   Úget_selected_osrô   rÇ   r   )rC   Ú	sensitiver   r   r   r  1  s   ÿÿzvmmCreateVM._change_os_detectc                 C   s°   |   ¡ }|  d¡ |  ¡  ¡ d}|tkrd}n|tkr#| j ¡ s#d}|  d¡ |¡ |o3|  d¡ ¡ }|  	| ¡ |t
k}|  d¡ |¡ |sN| jj ¡  |  d¡ |¡ d S )Nzinstall-os-distro-boxFTzinstall-detect-os-boxrþ  rÕ   )rÏ  rh   rF  rä  rÑ  rÐ  r*   r3  r*  r  rÓ  ró   rô   Ú
grab_focusr  )rC   rô  Úenabledetectr  Úhas_installr   r   r   Ú_set_install_page7  s&   
ÿÿzvmmCreateVM._set_install_pagec                 C   s@   |   d¡}| ¡ }|d }|tkr|  ¡ r|d8 }| |¡ d S )NrÔ   r   )rh   Úget_current_pager?  rð  r  )rC   Ú
src_ignoreÚnotebookÚcurpageÚ	next_pager   r   r   r˜   P  s   
zvmmCreateVM._back_clickedc                 C   s$   |d }|t kr|  ¡ r|d7 }|S )Nr   )ÚPAGE_STORAGErð  )rC   rM  rN  r   r   r   Ú_get_next_pagenum[  s   zvmmCreateVM._get_next_pagenumc                 C   sv   |   d¡}| ¡ }|tkr| jdd}|rd S |  |¡dur d S |   d¡ ¡  |tkr/|  ¡  |  |¡}| 	|¡ d S )NrÔ   T)Úforward_after_finishrÂ   )
rh   rJ  ÚPAGE_INSTALLr  Ú	_validaterF  r  rI  rP  r  )rC   rK  rL  rM  Ú	did_startrN  r   r   r   r™   d  s   
ÿ
zvmmCreateVM._forward_clickedc              
   C   sâ   |t kr1z|  ¡  W n ty) } z| j tdƒt|ƒ ¡ W Y d }~d S d }~ww |  d¡ ¡  |  d¡ 	|t
k¡ |  d¡ |t k¡ |  d¡ |t k¡ t|  d¡ ¡ ƒD ]}|  d¡ |¡}| ||k¡ qX|  |¡ d S )Nz!Error populating summary page: %szcreate-finishzcreate-backrÂ   rÔ   )r?  rÜ  r\   r]   r^   r   r_   rh   rF  rÆ   r  rF  ÚrangeÚget_n_pagesÚget_nth_pager  )rC   r¼   r½   Úpagenumrb   ÚnrÚpager   r   r   r›   z  s$   ÿ€ýzvmmCreateVM._page_changedc                 C   s.   t | j ¡ | jƒ}| j ¡ |_| j ¡ |_|S rK   )	r-   r*   r:  r†   r'   Úget_graphics_typer1   Úget_default_cpu_settingr3   )rC   Úgdatar   r   r   r2  –  s   zvmmCreateVM._build_guestdatac              
   C   s    z0|t kr
|  ¡ W S |tkr|  ¡ W S |tkr|  ¡ W S |tkr%|  ¡ W S |tkr.|  	¡ W S W d S  t
yO } z| j tdƒt|ƒ ¡ W Y d }~d S d }~ww )Nz0Uncaught error validating install parameters: %s)r  Ú_validate_intro_pagerR  Ú_validate_install_pageÚPAGE_MEMÚ_validate_mem_pagerO  Ú_validate_storage_pager?  Ú_validate_final_pager\   r]   r^   r   r_   )rC   rX  rb   r   r   r   rS  ž  s&   




ÿÿ€ýzvmmCreateVM._validatec                 C   s   |   ¡ | j_t| j ¡ ƒS rK   )rã  r‡   r8   r<  rR   ri   r   r   r   r^  ¯  s   z vmmCreateVM._validate_intro_pagec                 C   s²   |s
| j  tdƒ¡S |r|stdƒ}| j  |¡S tj |¡s d S tj |¡s2tdƒ| }| j  |¡S t |tj¡sEtdƒ| }| j  |¡S t 	|¡g krNd S | j  
tdƒtdƒ¡S )NzSource URL is requiredz5Please specify password for accessing source registryz%Destination path is not directory: %sz+No write permissions for directory path: %szOS root directory is not emptyzpCreating root file system in a non-empty directory might fail due to file conflicts.
Would you like to continue?)r]   Úval_errr   rN   rÉ  ÚexistsÚisdirÚaccessÚW_OKÚlistdirÚyes_no)rC   rÍ  rê  ÚuserÚpasswdrO  r   r   r   Ú_validate_oscontainer_bootstrap³  s&   þz+vmmCreateVM._validate_oscontainer_bootstrapc              
   C   s:  |   ¡ }d }d }d }d }d}d }d }d }	| j ¡ }
|tkr0|  ¡ }|s-tdƒ}| j |¡S |}n¡|tkrG|  	¡ \}}|sD| j tdƒ¡S |}nŠ|t
krrd}|  ¡ }|s]tdƒ}| j |¡S tj | j ¡ |¡sqtdƒ}| j |¡S n_|tkrˆ|  d¡ ¡ }|s‡| j tdƒ¡S nI|tkr¼|  d	¡ ¡ }|s| j td
ƒ¡S |  ¡ r»|  ¡ }|  ¡ }|  ¡ }|  ||||¡}|du r»dS n|tkrÑ|  d¡ ¡ }	|	sÑ| j tdƒ¡S |  ¡ sé|
sétdƒ}|d| jj 7 }| j |¡S zX|rð|| j_|rt | jj¡}d|_ ||_!|| j_"|	rt | jj¡}d|_ d|_#|	|_!|| j_"|| j_$|| j_%|| j_&d| j_'|
r2|
j(p3d | j_)| j *¡ }| j +¡ }W n t,y_ } ztdƒ}| j ||¡W  Y d }~S d }~ww ztj- .|¡}tj- /| jj|¡ || j_(W n t,y‘ } z| j tdƒ|¡W  Y d }~S d }~ww |  d¡ 0| jj(¡ |r¦|  1¡ s¦dS | 2|¡D ]}| j3 4| | j|¡ q«|j5 6¡ }| 7|j8j9¡}| :|j8j9¡}| ;|j8j9¡}t< =d|j5j(|||¡ t>}|ræ|d }|  d¡ ?|¡ |  d¡ ?|p÷d¡ |r	|d }| j3 d¡ ?|¡ | jdd | jdd | j	dd dS )NFz'An install media selection is required.zAn install tree is required.Tz%A storage path to import is required.z2The import path must point to an existing storage.r
  z An application path is required.r  z!An OS directory path is required.r  zA template name is required.zYou must select an OS.r]  ú/Útemplatez#Error setting installer parameters.zError setting default name.rý   z;Recommended resources for os=%s: ram=%s ncpus=%s storage=%si   r"   rg  r   i   @zstorage-sizerñ  )@rÏ  ró   rD  rÐ  ró  r   r]   rd  rÑ  rù  rÒ  rû  rE   Ú
DeviceDiskÚpath_definitely_existsr*   r:  rÔ  rh   rß  rÕ  ræ  rë  rì  rí  rm  rÖ  rä  Úeol_textr‡   r7   ÚDeviceFilesystemÚtargetrÈ  r5   Útyper?   r@   rA   rB   r;   r9   rR   rJ   r\   rL   r-  Úvalidate_namerÇ   rb  Úget_search_pathsrŽ   Úcheck_path_searchr×  Úget_recommended_resourcesÚget_recommended_ramrN   rä   Úget_recommended_ncpusÚget_recommended_storager   r¯   ÚDEFAULT_MEMÚ	set_value)rC   rÙ  rI   r?   rø  r@   Ú	is_importr7   rÍ  ro  Úosobjr÷  rO  Úimport_pathrê  rk  rl  r+   ÚfsdevrQ   rb   r;   rÉ  ÚresÚramÚn_cpusÚstorageÚram_sizeÚstorage_sizer   r   r   r_  Ò  sô   
þüÿÿ€
€þ€ÿ
ÿ
þz"vmmCreateVM._validate_install_pagec                 C   sL   |   d¡ ¡ }|   d¡ ¡ }t|ƒ| j_t|ƒd | j_t|ƒd | j_dS )Nrg  r"   r   T)rh   Ú	get_valuerz  r‡   r<   r>   r=   )rC   rg  r"   r   r   r   ra  b  s   zvmmCreateVM._validate_mem_pagec                 C   s   d }| j jr
| j j}d }d}|  ¡ tkr|  ¡ }||fS |  ¡ rD|r6| ¡ }|j}|r2t	 
d||¡ ||fS | j |¡}|rDt	 
d|¡ ||fS )NFz.Reusing failed disk path=%s already_created=%szDefault storage path is: %s)r‡   r0   r4   rÏ  rÒ  rû  rý  rÇ  Ústorage_was_createdr   r¯   rŽ   Úget_default_path)rC   Úvmnamer&  Úfailed_diskrÉ  Úpath_already_createdr   r   r   r(  l  s*   óÿüzvmmCreateVM._get_storage_pathc              
   C   sÆ   | j | jjdd\}}d }|  d¡ ¡ }z|r!| jj| jj|d}|r.| j |¡du r.W dS W n tyJ } z| j	 
tdƒ|¡W  Y d }~S d }~ww |  ¡ tkrV| | j_|| j_|s^dS ||_dS )NTr%  r  r'  FzStorage parameter error.)r(  r‡   r;   rh   r*  rŽ   Úbuild_deviceÚvalidate_devicer\   r]   rd  r   rÏ  rÐ  rB   r4   rŠ  )rC   rÉ  rŽ  r4   Ústorage_enabledrb   r   r   r   rb  †  s0   
ÿÿ€€ÿ
z"vmmCreateVM._validate_storage_pagec              
   C   sÂ   |   ¡ }|| jjkrFztj | jj|¡ || j_W n ty6 } z| j 	t
dƒt|ƒ¡W  Y d }~S d }~ww |  ¡ rFt d¡ |  ¡ sFdS tj | j ¡ ¡}| j |¡}| j |¡ || j_dS )NzInvalid guest namez\User changed VM name and using default storage, re-validating with new default storage path.FT)rà  r‡   r;   rE   rL   rv  r*   r\   r]   rd  r   r_   rý  r   r¯   rb  ÚDeviceInterfaceÚgenerate_macr:  rŒ   r  r  r6   )rC   r;   rb   ÚmacaddrÚnetr   r   r   rc  ¢  s(   "€ÿ
ÿz vmmCreateVM._validate_final_pagec                 C   sd   |   d¡ ¡ tk}|  ¡ \}}| jrdS |sdS |s|sdS |  ¡ s$dS | jr)dS |  |||¡ dS )zô
        Will kick off the OS detection thread if all conditions are met,
        like we actually have media to detect, detection isn't already
        in progress, etc.

        Returns True if we actually start the detection process
        rÔ   NT)rh   rJ  rR  rõ  rˆ   rÿ  r‰   Ú_do_start_detect_os)rC   rQ  Úis_install_pager@   r?   r   r   r   r  ¿  s    ÿz&vmmCreateVM._start_detect_os_if_neededc                 C   s–   d| _ t d||¡ |  d¡ d¡ G dd„ dtƒ}|ƒ }tj| jd|||fd}d|_	| 
¡  | jj td	ƒ¡ |  d
¡}| 
¡  |  d||¡ d S )NFz5Starting OS detection thread for cdrom=%s location=%srÂ   c                   @   s@   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dS )z6vmmCreateVM._do_start_detect_os.<locals>.ThreadResultszR
            Helper object to track results from the detection thread
            r   rª  c                 S   ó   | j | _d S rK   )Ú_DETECT_INPROGRESSÚ_resultsri   r   r   r   rD   æ  r  z?vmmCreateVM._do_start_detect_os.<locals>.ThreadResults.__init__c                 S   s   | j | jkS rK   )rš  r™  ri   r   r   r   Úin_progressé  r  zBvmmCreateVM._do_start_detect_os.<locals>.ThreadResults.in_progressc                 S   r˜  rK   )Ú_DETECT_FAILEDrš  ri   r   r   r   Ú
set_failedì  r  zAvmmCreateVM._do_start_detect_os.<locals>.ThreadResults.set_failedc                 S   s
   || _ d S rK   )rš  )rC   Údistror   r   r   Ú
set_distroï  s   
zAvmmCreateVM._do_start_detect_os.<locals>.ThreadResults.set_distroc                 S   s   | j | jkrd S | j S rK   )rš  rœ  ri   r   r   r   Ú
get_distroñ  s   zAvmmCreateVM._do_start_detect_os.<locals>.ThreadResults.get_distroN)rS   rT   rU   rV   rœ  r™  rD   r›  r  rŸ  r   r   r   r   r   ÚThreadResultsà  s    r¡  zActual media detection)rt  r;   ÚargsTzDetecting...úinstall-detect-os-spinnerr   )rˆ   r   r¯   rh   rÆ   ÚobjectÚ	threadingÚThreadÚ_detect_thread_cbÚdaemonÚstartró   rô   rÇ   r   Ú_report_detect_os_progress)rC   r@   r?   rQ  r¡  Úthread_resultsÚdetectThreadÚspinr   r   r   r–  Ù  s&   ÿþ
ÿzvmmCreateVM._do_start_detect_osc                 C   s^   zt j| j ¡ ||d}| | j ¡ ¡}| |¡ W dS  ty.   t	 
d¡ | ¡  Y dS w )z@
        Thread callback that does the actual detection
        )r@   r?   zError detecting distro.N)rE   rF   r*   r:  Údetect_distror‡   rR   rŸ  r\   r   r’  r  )rC   r@   r?   r«  rI   rž  r   r   r   r§    s   þ
þzvmmCreateVM._detect_thread_cbc                 C   sô   z|  ¡ r|td k r|  d| j|d ||¡ W dS | ¡ }W n ty/   d}t d¡ Y nw |  d¡}| 	¡  t 
d¡ |  d¡ d	¡ d	| _d
| _|  ¡ sRdS |r_| j tj |¡¡ n| j ¡  | jj tdƒ¡ |rx|  | jd¡ dS dS )a&  
        Checks detection progress via the _detect_os_results variable
        and updates the UI labels, counts the number of iterations,
        etc.

        We set a hard time limit on the distro detection to avoid the
        chance of the detection hanging (like slow URL lookup)
        rª  iô  r   NzError in distro detect timeoutr£  zFinished UI OS detection.rÂ   TFzNone detectedr   )r›  ÚDETECT_TIMEOUTÚtimeout_addrª  r   r\   r   r’  rh   Ústopr¯   rÆ   r‰   rˆ   rÿ  ró   Ú	select_osrE   ÚOSDBÚ	lookup_osr  rô   rÇ   r   r  r™   )rC   Úidxr«  rQ  rž  r­  r   r   r   rª    s6   


ÿþ


ÿz&vmmCreateVM._report_detect_os_progressc              
   C   sÜ   |   d¡ ¡ }|  |¡durd S t d¡ d | j_z1| j ¡ }| j ¡ }|  	¡  | 
|¡ |   d¡ ¡ s=|  ||¡ W d S t d¡ |  ||¡ W d S  tym } z|  ¡  | j tdƒt|ƒ ¡ W Y d }~d S d }~ww )NrÔ   Tz!Starting create finish() sequencer  z,User requested 'customize', launching dialogzError starting installation: %s)rh   rJ  rS  r   r¯   r‡   r0   rR   rJ   Úset_finish_cursorÚset_install_defaultsr*  Ú_start_installÚ_show_customize_dialogr\   r  r]   r^   r   r_   )rC   rK  rZ  rQ   rI   rb   r   r   r   rš   E  s*   




€ýzvmmCreateVM._finish_clickedc                 C   s6   | j sd S | j }| j j}d | _ | ¡  | ¡  d }d S rK   )rŠ   Úvmr¿   )rC   ÚwindowÚvirtinst_domainr   r   r   r¹   c  s   z%vmmCreateVM._cleanup_customize_windowc                    sl   t ˆj||jˆ ƒ}‡ ‡fdd„}‡fdd„}ˆ ¡  t|ˆjƒˆ_ˆj d|¡ ˆj d|¡ ˆj ¡  d S )Nc                    s2   ˆ  ¡ sd S t d¡ d ˆj_ˆ | ¡ ˆ ¡ d S )Nz0User finished customize dialog, starting install)r°   r   r¯   r‡   r0   r¸  r:  )r  Úvdomain©rI   rC   r   r   Úcustomize_finished_cbs  s
   
zAvmmCreateVM._show_customize_dialog.<locals>.customize_finished_cbc                    s   t  d¡ ˆ  ¡  d S )Nz,User closed customize window, closing wizard)r   r¯   r—   )r  ri   r   r   Úconfig_canceled_cbz  s   
z>vmmCreateVM._show_customize_dialog.<locals>.config_canceled_cbzcustomize-finishedÚclosed)	r   r*   Úuuidr¹   r   r[   rŠ   r‘   rZ   )rC   Ú	origguestrI   Úorig_vdomainr¿  rÀ  r   r¾  r   r¹  o  s   ÿÿz"vmmCreateVM._show_customize_dialogc                 C   s~   |   |j¡ |rtdƒ| }|jj||d || j_d S d }| j ¡ D ]}| 	¡ |j
kr0|} nq#|  ¡  t | |¡ ¡  d S )Nz Unable to complete install: '%s')r  )r  r[   r   r]   r^   r‡   r0   r*   Úlist_vmsÚget_uuidrÂ  r¾   r   r³   rZ   )rC   rÈ   r  rQ   ra   Úfoundvmrº  r   r   r   Ú_install_finished_cb‡  s   þz vmmCreateVM._install_finished_cbc           	      C   s˜   i }|j  ¡ r+|  ¡ r+| j|  d¡j| j| j| j| j	dœ}| 
¡ D ]	\}}|ƒ ||< q!| jp/| }t| j|||g| j||gtdƒtdƒ|jƒ}| ¡  dS )z;
        Launch the async job to start the install
        r  )r  Údestrk  rl  ÚinsecureÚroot_passwordzCreating Virtual Machinez‘The virtual machine is now being created. Allocation of disk storage and retrieval of the installation images may take a few minutes to complete.N)rN   r9  ræ  rë  rh   rß  rì  rí  rî  rï  ry  rŠ   r   Ú_do_async_installrÈ  r   r[   r	  )	rC   rQ   rI   Úbootstrap_argsÚbootstrap_arg_keysÚkeyÚgetterra   r
  r   r   r   r¸  œ  s,   
ÿ
ú

÷
zvmmCreateVM._start_installc              	      s„  |  ¡ }|rˆ  |||¡ | ¡ rdS g }|jjD ]}| ¡ s q| ¡ }|s'q| ¡ }	|	|vr4| |	¡ qt	 
d¡ |j||d t	 
d¡ ˆ jjdd d}
d}|
dk rvˆ j ¡ D ]‰ˆ ¡ |jkreˆ}qZ|rin|
d	7 }
t d
¡ |
dk sU|sttdƒ|j ƒ‚|‰ˆ ¡ rŒˆ ¡  n| ¡ rœ‡ ‡fdd„}ˆ  |¡ |D ]!}	zˆ j |	¡}ˆ  |j¡ W qž ty¿   t	j
d|	dd Y qžw dS )z-
        Kick off the actual install
        Nz#Starting background install process©r  zInstall completedT)Úpollvmr   éÈ   r   gš™™™™™¹?z+VM '%s' didn't show up after expected time.c                      s   ˆ  dˆ j¡ dS )Nr  F)Úconnect_opt_outÚ_check_install_statusr   ©rC   rº  r   r   r"  õ  s   ÿz)vmmCreateVM._do_async_install.<locals>.cbz7Error looking up pool=%s for refresh after VM creation.r$  )r   Ú_create_directory_treeÚ	has_errorÚdevicesr4   rÅ  Úget_parent_poolr;   r  r   r¯   Ústart_installr*   rj  rÅ  rÆ  rÂ  ÚtimeÚsleepÚRuntimeErrorr   Ú
is_shutoffÚstartupÚhas_install_phaser  Úget_pool_by_nameÚrefreshr\   )rC   r  rQ   rI   rÍ  r  Úrefresh_poolsr4   ÚpoolÚpoolnameÚcountrÇ  r"  r   rÖ  r   rÌ  ¼  sh   
€

€
ù	ÿ


ÿÿüzvmmCreateVM._do_async_installc              
   C   s   |  ¡ rt d¡ dS | ¡ sdS | ¡ rt d¡ dS zt d¡ | ¡  W dS  tyG } z| j t	dƒt
|ƒ ¡ W Y d}~dS d}~ww )z‚
        Watch the domain that we are installing, waiting for the state
        to change, so we can restart it as needed
        z%VM crashed, cancelling install plans.TNz>User manually shutdown VM, not restarting guest after install.z)Install should be completed, starting VM.zError continuing install: %s)Ú
is_crashedr   r¯   rß  Úget_install_abortrà  r\   r]   r^   r   r_   )rC   rº  rb   r   r   r   rÕ    s"   



ý"€ýz!vmmCreateVM._check_install_statusc              
      s~  ddl }ˆjjjjrddlm} nddl}ˆ t	dƒd¡ ‡fdd„}ˆ  
¡  G ‡ fdd	„d	|jƒ}t ¡ }| d
¡}	|	 |j¡ | |¡}
|
 | d¡¡ |
 |ƒ ¡ |	 |
¡ |d |d |d |dœ}|d rz|d rz|d |d< |d |d< |d r„|d |d< t d¡ z|jdi |¤Ž ‡fdd„}ˆ |¡ W dS  ty¾ } zˆ  dd|| ¡ f ¡ W Y d}~dS d}~ww )zm
        Call bootstrap method from virtBootstrap and show logger messages
        as state/details.
        r   Nr   )ÚfakeVirtBootstrapzBootstraping containerc                    s   ˆ   t| d ƒd ¡ d S )NÚstatus)r©  r   )ÚprogrÑ  r   r   Úprogress_update_cb.  r$  z>vmmCreateVM._create_directory_tree.<locals>.progress_update_cbc                       s   e Zd Z‡ fdd„ZdS )z:vmmCreateVM._create_directory_tree.<locals>.SetStateFilterc                    s   ˆ   d| ¡  ¡ dS )Nz%s
T)Údetails_updateÚ
getMessage)rC   Úrecord©r  r   r   Úfilter4  s   zAvmmCreateVM._create_directory_tree.<locals>.SetStateFilter.filterN)rS   rT   rU   rò  r   rñ  r   r   ÚSetStateFilter3  s    ró  r$   z%(message)sr  rÉ  rÊ  )rX   rÉ  Ú
not_secureÚprogress_cbrk  rl  ÚusernameÚpasswordrË  zStart container bootstrapc                      s   ˆ   d¡ d¡ d S )Nr  F)rh   r  r   ri   r   r   r"  T  s   z.vmmCreateVM._create_directory_tree.<locals>.cbz,virt-bootstrap did not complete successfullyz%s
%sr   )Úloggingr*   r'   r(   r)   Úlib.testmockrê  r$   r©  r   Údetails_enableÚFilterÚioÚStringIOÚ	getLoggerÚsetLevelÚDEBUGÚStreamHandlerÚsetFormatterÚ	FormatterÚ	addFilterÚ
addHandlerr   r¯   Ú	bootstrapr  r\   Ú	set_errorÚgetvalue)rC   r  r  rÍ  rø  r$   rí  ró  Ú
log_streamÚvbLoggerÚhdlrrH   r"  r]   r   )r  r  rC   r   r×  !  sH   


ý
ÿ€ÿz"vmmCreateVM._create_directory_treerK   )NN)T)NNN)F)NFF)]rS   rT   rU   Úclassmethodrc   rD   rZ   r¾   rÀ   rÊ   rÐ   rÓ   r®   r±   rY  rŒ  rŽ  r»   ro  rp  rq  rr  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©   rf   r  r  rI  r˜   rP  r™   r›   r2  rS  r^  rm  r_  ra  r(  rb  rc  r  r–  r§  rª  rš   r¹   r¹  rÈ  r¸  rÌ  rÕ  r×  r   r   r   r   rW   «   s¸    H




=Kjo
#&) 
)
/%



	 

!
	 

+3 IrW   )<rü  r%   rN   r¥  rÜ  Úgi.repositoryr   r   rE   Úvirtinst.generatenamer   Úlibr   r  r   Ú	baseclassr   r¿  r	   Údevice.addstorager
   Údevice.mediacombor   Údevice.netlistr   Úenginer   Úobject.domainr   Úoslistr   Ústoragebrowser   Úvmwindowr   r¯  r}  rU  r  rR  r`  rO  r?  rÐ  rÑ  rÓ  rÒ  rÔ  rÕ  rÖ  Ú	OS_COL_IDÚOS_COL_LABELÚOS_COL_IS_SEPÚOS_COL_IS_SHOW_ALLr   r    r#   r,   r-   rW   r   r   r   r   Ú<module>   sb   üúýU