2014-06-11 15:36:28 +04:00
# Copyright (C) 2008, 2013, 2014 Red Hat, Inc.
2008-08-15 19:22:20 +04:00
# Copyright (C) 2008 Cole Robinson <crobinso@redhat.com>
#
2018-04-04 16:35:41 +03:00
# This work is licensed under the GNU GPLv2 or later.
2018-03-20 22:00:02 +03:00
# See the COPYING file in the top-level directory.
2008-08-15 19:22:20 +04:00
2016-06-07 18:33:21 +03:00
import logging
2012-05-14 17:24:56 +04:00
from gi . repository import Gdk
2015-04-09 21:42:25 +03:00
from gi . repository import Gtk
2008-08-15 19:22:20 +04:00
2016-12-13 20:36:49 +03:00
from virtinst import StoragePool
2014-09-13 00:10:45 +04:00
from . baseclass import vmmGObjectUI
from . asyncjob import vmmAsyncJob
from . import uiutil
2008-08-15 19:22:20 +04:00
2013-04-13 22:34:52 +04:00
2010-12-09 01:26:19 +03:00
class vmmCreatePool ( vmmGObjectUI ) :
2015-04-09 21:42:25 +03:00
__gsignals__ = {
2018-03-15 15:10:09 +03:00
" pool-created " : ( vmmGObjectUI . RUN_FIRST , None , [ str ] ) ,
2015-04-09 21:42:25 +03:00
}
2010-12-09 01:26:19 +03:00
def __init__ ( self , conn ) :
2013-09-23 00:10:16 +04:00
vmmGObjectUI . __init__ ( self , " createpool.ui " , " vmm-create-pool " )
2008-08-15 19:22:20 +04:00
self . conn = conn
2013-02-16 22:31:46 +04:00
self . builder . connect_signals ( {
2017-08-05 09:39:32 +03:00
" on_pool_cancel_clicked " : self . close ,
" on_vmm_create_pool_delete_event " : self . close ,
2019-05-04 21:37:56 +03:00
" on_pool_finish_clicked " : self . _finish_clicked_cb ,
2019-05-04 20:08:06 +03:00
" on_pool_type_changed " : self . _pool_type_changed_cb ,
2013-09-27 20:13:01 +04:00
2019-05-04 21:37:56 +03:00
" on_pool_source_button_clicked " : self . _browse_source_cb ,
" on_pool_target_button_clicked " : self . _browse_target_cb ,
2009-01-25 23:41:44 +03:00
2019-05-04 21:37:56 +03:00
" on_pool_hostname_activate " : self . _hostname_changed_cb ,
" on_pool_iqn_chk_toggled " : self . _iqn_toggled_cb ,
2008-08-15 19:22:20 +04:00
} )
2011-04-18 19:25:28 +04:00
self . bind_escape_key_close ( )
2008-08-15 19:22:20 +04:00
2019-05-04 21:37:56 +03:00
self . _init_ui ( )
#######################
# Standard UI methods #
#######################
2008-08-15 19:22:20 +04:00
2011-04-14 16:47:42 +04:00
def show ( self , parent ) :
2012-02-01 03:16:54 +04:00
logging . debug ( " Showing new pool wizard " )
2019-05-04 21:37:56 +03:00
self . _reset_state ( )
2011-04-14 16:47:42 +04:00
self . topwin . set_transient_for ( parent )
2008-08-15 19:22:20 +04:00
self . topwin . present ( )
def close ( self , ignore1 = None , ignore2 = None ) :
2012-02-01 03:16:54 +04:00
logging . debug ( " Closing new pool wizard " )
2008-08-15 19:22:20 +04:00
self . topwin . hide ( )
return 1
2011-07-24 05:16:54 +04:00
def _cleanup ( self ) :
2011-04-13 17:27:02 +04:00
self . conn = None
2019-05-04 21:37:56 +03:00
###########
# UI init #
###########
2011-04-13 17:27:02 +04:00
2019-05-04 20:08:06 +03:00
def _build_pool_type_list ( self ) :
# [pool type, label]
model = Gtk . ListStore ( str , str )
type_list = self . widget ( " pool-type " )
type_list . set_model ( model )
uiutil . init_combo_text_column ( type_list , 1 )
for typ in sorted ( StoragePool . get_pool_types ( ) ) :
desc = StoragePool . get_pool_type_desc ( typ )
model . append ( [ typ , " %s : %s " % ( typ , desc ) ] )
2019-05-04 21:37:56 +03:00
def _init_ui ( self ) :
2013-09-27 20:13:01 +04:00
blue = Gdk . Color . parse ( " #0072A8 " ) [ 1 ]
self . widget ( " header " ) . modify_bg ( Gtk . StateType . NORMAL , blue )
2011-07-14 21:13:13 +04:00
format_list = self . widget ( " pool-format " )
2012-05-14 17:24:56 +04:00
format_model = Gtk . ListStore ( str , str )
2008-08-15 19:22:20 +04:00
format_list . set_model ( format_model )
2015-04-10 20:04:02 +03:00
uiutil . init_combo_text_column ( format_list , 1 )
2018-09-06 03:24:23 +03:00
for f in [ " auto " ] :
format_model . append ( [ f , f ] )
2008-08-15 19:22:20 +04:00
2009-10-21 05:12:35 +04:00
# Target path combo box entry
2011-07-14 21:13:13 +04:00
target_list = self . widget ( " pool-target-path " )
2009-10-21 05:12:35 +04:00
# target_path, Label, pool class instance
2012-05-14 17:24:56 +04:00
target_model = Gtk . ListStore ( str , str , object )
target_model . set_sort_column_id ( 0 , Gtk . SortType . ASCENDING )
2009-10-21 05:12:35 +04:00
target_list . set_model ( target_model )
2013-01-13 01:13:53 +04:00
target_list . set_entry_text_column ( 0 )
2009-10-21 05:12:35 +04:00
2009-10-19 23:55:19 +04:00
# Source path combo box entry
2011-07-14 21:13:13 +04:00
source_list = self . widget ( " pool-source-path " )
2009-10-21 04:20:59 +04:00
# source_path, Label, pool class instance
2012-05-14 17:24:56 +04:00
source_model = Gtk . ListStore ( str , str , object )
source_model . set_sort_column_id ( 0 , Gtk . SortType . ASCENDING )
2009-10-19 23:55:19 +04:00
source_list . set_model ( source_model )
2013-01-13 01:13:53 +04:00
source_list . set_entry_text_column ( 0 )
2009-10-19 23:55:19 +04:00
2019-05-04 20:08:06 +03:00
self . _build_pool_type_list ( )
2019-05-04 21:37:56 +03:00
def _reset_state ( self ) :
2019-05-04 20:08:06 +03:00
defaultname = StoragePool . find_free_name (
self . conn . get_backend ( ) , " pool " )
self . widget ( " pool-name " ) . set_text ( defaultname )
2011-07-14 21:13:13 +04:00
self . widget ( " pool-name " ) . grab_focus ( )
2012-05-14 17:24:56 +04:00
self . widget ( " pool-target-path " ) . get_child ( ) . set_text ( " " )
self . widget ( " pool-source-path " ) . get_child ( ) . set_text ( " " )
2011-07-14 21:13:13 +04:00
self . widget ( " pool-hostname " ) . set_text ( " " )
2011-07-24 03:42:41 +04:00
self . widget ( " pool-iqn-chk " ) . set_active ( False )
self . widget ( " pool-iqn-chk " ) . toggled ( )
self . widget ( " pool-iqn " ) . set_text ( " " )
2018-09-06 03:24:23 +03:00
self . widget ( " pool-format " ) . set_active ( 0 )
2011-07-14 21:13:13 +04:00
self . widget ( " pool-build " ) . set_sensitive ( True )
self . widget ( " pool-build " ) . set_active ( False )
2008-08-15 19:22:20 +04:00
2019-05-04 20:08:06 +03:00
uiutil . set_list_selection ( self . widget ( " pool-type " ) , 0 )
2019-05-04 21:37:56 +03:00
self . _show_options_by_pool ( )
2008-08-15 19:22:20 +04:00
2009-10-21 17:48:12 +04:00
2019-05-04 21:37:56 +03:00
#################
# UI populating #
#################
2011-07-24 03:42:41 +04:00
2019-05-04 21:37:56 +03:00
def _populate_pool_sources ( self ) :
pooltype = self . _get_config_pool_type ( )
2011-07-14 21:13:13 +04:00
source_list = self . widget ( " pool-source-path " )
2009-10-21 05:12:35 +04:00
source_model = source_list . get_model ( )
source_model . clear ( )
2011-07-14 21:13:13 +04:00
target_list = self . widget ( " pool-target-path " )
2009-10-21 05:12:35 +04:00
target_model = target_list . get_model ( )
target_model . clear ( )
2009-10-19 23:55:19 +04:00
2009-10-21 05:12:35 +04:00
use_list = source_list
use_model = source_model
2009-10-19 23:55:19 +04:00
entry_list = [ ]
2019-05-04 21:37:56 +03:00
if pooltype == StoragePool . TYPE_SCSI :
entry_list = self . _list_scsi_adapters ( )
2009-10-21 05:12:35 +04:00
use_list = source_list
use_model = source_model
2019-05-04 21:37:56 +03:00
elif pooltype == StoragePool . TYPE_LOGICAL :
pool_list = self . _list_pool_sources ( pooltype )
2013-04-12 00:32:00 +04:00
entry_list = [ [ p . target_path , p . target_path , p ]
for p in pool_list ]
2009-10-21 05:12:35 +04:00
use_list = target_list
use_model = target_model
2009-10-19 23:55:19 +04:00
2019-05-04 21:37:56 +03:00
elif pooltype == StoragePool . TYPE_DISK :
entry_list = self . _list_disk_devs ( )
2011-07-24 00:37:30 +04:00
use_list = source_list
use_model = source_model
2019-05-04 21:37:56 +03:00
elif pooltype == StoragePool . TYPE_NETFS :
host = self . _get_config_host ( )
2009-10-21 17:48:12 +04:00
if host :
2019-05-04 21:37:56 +03:00
pool_list = self . _list_pool_sources ( pooltype , host = host )
2013-04-12 00:32:00 +04:00
entry_list = [ [ p . source_path , p . source_path , p ]
for p in pool_list ]
2009-10-21 17:48:12 +04:00
use_list = source_list
use_model = source_model
2009-10-19 23:55:19 +04:00
for e in entry_list :
2009-10-21 05:12:35 +04:00
use_model . append ( e )
2009-10-19 23:55:19 +04:00
if entry_list :
2009-10-21 05:12:35 +04:00
use_list . set_active ( 0 )
2009-10-19 23:55:19 +04:00
2019-05-04 21:37:56 +03:00
def _list_scsi_adapters ( self ) :
2015-04-10 16:37:03 +03:00
scsi_hosts = self . conn . filter_nodedevs ( " scsi_host " )
2015-04-07 21:12:00 +03:00
host_list = [ dev . xmlobj . host for dev in scsi_hosts ]
2009-10-19 23:55:19 +04:00
clean_list = [ ]
for h in host_list :
name = " host %s " % h
2013-09-20 04:18:12 +04:00
tmppool = self . _make_stub_pool ( )
2009-10-21 04:20:59 +04:00
tmppool . source_path = name
2013-09-20 04:18:12 +04:00
entry = [ name , name , tmppool ]
2013-04-12 00:32:00 +04:00
if name not in [ l [ 0 ] for l in clean_list ] :
2009-10-19 23:55:19 +04:00
clean_list . append ( entry )
return clean_list
2019-05-04 21:37:56 +03:00
def _list_disk_devs ( self ) :
2015-04-10 16:37:03 +03:00
devs = self . conn . filter_nodedevs ( " storage " )
2011-07-24 00:37:30 +04:00
devlist = [ ]
for dev in devs :
2015-04-07 21:12:00 +03:00
if dev . xmlobj . drive_type != " disk " or not dev . xmlobj . block :
2011-07-24 00:37:30 +04:00
continue
2015-04-07 21:12:00 +03:00
devlist . append ( dev . xmlobj . block )
2011-07-24 00:37:30 +04:00
devlist . sort ( )
clean_list = [ ]
for dev in devlist :
2013-09-20 04:18:12 +04:00
tmppool = self . _make_stub_pool ( )
2011-07-24 00:37:30 +04:00
tmppool . source_path = dev
entry = [ dev , dev , tmppool ]
2013-04-12 00:32:00 +04:00
if dev not in [ l [ 0 ] for l in clean_list ] :
2011-07-24 00:37:30 +04:00
clean_list . append ( entry )
return clean_list
2019-05-04 21:37:56 +03:00
def _list_pool_sources ( self , pool_type , host = None ) :
2009-10-21 05:12:35 +04:00
plist = [ ]
try :
2013-09-20 04:18:12 +04:00
plist = StoragePool . pool_list_from_sources (
2013-07-05 16:59:58 +04:00
self . conn . get_backend ( ) ,
2013-09-20 04:18:12 +04:00
pool_type ,
2013-07-05 16:59:58 +04:00
host = host )
2009-10-29 03:35:13 +03:00
except Exception :
2009-10-21 05:12:35 +04:00
logging . exception ( " Pool enumeration failed " )
return plist
2019-05-04 21:37:56 +03:00
def _get_build_default ( self , pooltype ) :
""" Return (default value, whether build option can be changed) """
if not pooltype :
return ( False , False )
if pooltype in [ StoragePool . TYPE_DIR ,
StoragePool . TYPE_FS ,
StoragePool . TYPE_NETFS ] :
# Building for these simply entails creating a directory
return ( True , False )
elif pooltype in [ StoragePool . TYPE_LOGICAL ,
StoragePool . TYPE_DISK ] :
# This is a dangerous operation, anything (False, True)
# should be assumed to be one.
return ( False , True )
return ( False , False )
def _show_options_by_pool ( self ) :
2011-07-24 00:22:02 +04:00
def show_row ( base , do_show ) :
2013-09-27 20:13:01 +04:00
widget = self . widget ( base + " -label " )
2014-01-27 03:15:50 +04:00
uiutil . set_grid_row_visible ( widget , do_show )
2011-07-24 00:22:02 +04:00
2019-05-04 21:37:56 +03:00
pool = self . _make_stub_pool ( )
src = pool . supports_property ( " source_path " )
2013-09-20 04:18:12 +04:00
src_b = src and not self . conn . is_remote ( )
2019-05-04 21:37:56 +03:00
tgt = pool . supports_property ( " target_path " )
2013-09-20 04:18:12 +04:00
tgt_b = tgt and not self . conn . is_remote ( )
2019-05-04 21:37:56 +03:00
host = pool . supports_property ( " hosts " )
fmt = pool . supports_property ( " format " )
iqn = pool . supports_property ( " iqn " )
builddef , buildsens = self . _get_build_default ( pool . type )
2009-10-21 00:53:13 +04:00
2014-12-10 00:05:02 +03:00
# We don't show source_name for logical pools, since we use
# pool-sources to avoid the need for it
2019-05-04 21:37:56 +03:00
src_name = ( pool . supports_property ( " source_name " ) and
pool . type != pool . TYPE_LOGICAL )
2014-12-10 00:05:02 +03:00
2014-06-11 15:36:28 +04:00
# Source path browsing is meaningless for net pools
2019-05-04 21:37:56 +03:00
if pool . type in [ StoragePool . TYPE_NETFS ,
2013-09-20 04:18:12 +04:00
StoragePool . TYPE_ISCSI ,
2014-12-10 00:05:02 +03:00
StoragePool . TYPE_SCSI ,
StoragePool . TYPE_GLUSTER ] :
2009-10-21 00:53:13 +04:00
src_b = False
2011-07-24 00:22:02 +04:00
show_row ( " pool-target " , tgt )
show_row ( " pool-source " , src )
show_row ( " pool-hostname " , host )
show_row ( " pool-format " , fmt )
show_row ( " pool-build " , buildsens )
2011-07-24 03:42:41 +04:00
show_row ( " pool-iqn " , iqn )
2014-02-12 14:52:46 +04:00
show_row ( " pool-source-name " , src_name )
2011-07-24 00:22:02 +04:00
2014-04-03 19:19:03 +04:00
if iqn :
self . widget ( " pool-source-label " ) . set_label ( _ ( " _Source IQN: " ) )
else :
self . widget ( " pool-source-label " ) . set_label ( _ ( " _Source Path: " ) )
2014-02-12 13:29:22 +04:00
if tgt :
self . widget ( " pool-target-path " ) . get_child ( ) . set_text (
2019-05-04 21:37:56 +03:00
pool . default_target_path ( ) or " " )
2014-02-12 13:29:22 +04:00
2011-07-14 21:13:13 +04:00
self . widget ( " pool-target-button " ) . set_sensitive ( tgt_b )
self . widget ( " pool-source-button " ) . set_sensitive ( src_b )
2011-07-24 00:22:02 +04:00
self . widget ( " pool-build " ) . set_active ( builddef )
2008-08-15 19:22:20 +04:00
2014-02-12 14:52:46 +04:00
if src_name :
2018-09-02 21:47:34 +03:00
self . widget ( " pool-source-name " ) . set_text (
2019-05-04 21:37:56 +03:00
pool . default_source_name ( ) )
2014-02-12 14:52:46 +04:00
2019-05-04 21:37:56 +03:00
self . _populate_pool_sources ( )
2009-10-19 23:55:19 +04:00
2008-08-15 19:22:20 +04:00
2019-05-04 21:37:56 +03:00
################
# UI accessors #
################
2008-08-15 19:22:20 +04:00
2019-05-04 21:37:56 +03:00
def _get_config_pool_type ( self ) :
return uiutil . get_list_selection ( self . widget ( " pool-type " ) )
2008-08-15 19:22:20 +04:00
2019-05-04 21:37:56 +03:00
def _get_config_target_path ( self ) :
2011-07-14 21:13:13 +04:00
src = self . widget ( " pool-target-path " )
2012-11-09 15:13:22 +04:00
if not src . get_sensitive ( ) :
2009-10-21 05:12:35 +04:00
return None
2015-05-20 00:17:53 +03:00
ret = uiutil . get_list_selection ( src , column = 1 )
2014-01-27 05:21:12 +04:00
if ret is not None :
return ret
2012-05-14 17:24:56 +04:00
return src . get_child ( ) . get_text ( )
2008-08-15 19:22:20 +04:00
2019-05-04 21:37:56 +03:00
def _get_config_source_path ( self ) :
2011-07-14 21:13:13 +04:00
src = self . widget ( " pool-source-path " )
2012-11-09 15:13:22 +04:00
if not src . get_sensitive ( ) :
2009-10-19 23:55:19 +04:00
return None
2015-05-20 00:17:53 +03:00
ret = uiutil . get_list_selection ( src , column = 1 )
2014-01-27 05:21:12 +04:00
if ret is not None :
return ret
2012-05-14 17:24:56 +04:00
return src . get_child ( ) . get_text ( ) . strip ( )
2008-08-15 19:22:20 +04:00
2019-05-04 21:37:56 +03:00
def _get_config_host ( self ) :
2011-07-14 21:13:13 +04:00
host = self . widget ( " pool-hostname " )
2012-11-09 15:13:22 +04:00
if host . get_sensitive ( ) :
2011-02-02 19:47:01 +03:00
return host . get_text ( ) . strip ( )
2008-08-15 19:22:20 +04:00
return None
2019-05-04 21:37:56 +03:00
def _get_config_source_name ( self ) :
2014-02-12 14:52:46 +04:00
name = self . widget ( " pool-source-name " )
if name . get_sensitive ( ) :
return name . get_text ( ) . strip ( )
return None
2019-05-04 21:37:56 +03:00
def _get_config_format ( self ) :
2015-05-20 00:17:53 +03:00
return uiutil . get_list_selection ( self . widget ( " pool-format " ) )
2008-08-15 19:22:20 +04:00
2019-05-04 21:37:56 +03:00
def _get_config_iqn ( self ) :
2011-07-24 03:42:41 +04:00
iqn = self . widget ( " pool-iqn " )
2013-09-09 19:02:34 +04:00
if iqn . get_sensitive ( ) and iqn . get_visible ( ) :
2011-07-24 03:42:41 +04:00
return iqn . get_text ( ) . strip ( )
return None
2013-09-27 20:13:01 +04:00
2019-05-04 21:37:56 +03:00
###################
# Object building #
###################
2013-11-27 19:10:34 +04:00
2019-05-04 21:37:56 +03:00
def _get_pool_from_sourcelist ( self ) :
2009-10-21 04:20:59 +04:00
"""
2019-05-04 21:37:56 +03:00
If an enumerated pool source was selected , use that as the
basis for our pool object
2009-10-21 04:20:59 +04:00
"""
2011-07-14 21:13:13 +04:00
source_list = self . widget ( " pool-source-path " )
target_list = self . widget ( " pool-target-path " )
2009-10-21 04:20:59 +04:00
2015-06-21 22:47:31 +03:00
pool = uiutil . get_list_selection ( source_list , column = 2 ,
check_entry = False )
2014-01-27 05:21:12 +04:00
if pool is None :
2015-06-21 22:47:31 +03:00
pool = uiutil . get_list_selection ( target_list , column = 2 ,
check_entry = False )
2009-10-21 04:20:59 +04:00
return pool
2013-09-20 04:18:12 +04:00
def _make_stub_pool ( self ) :
2019-05-04 21:37:56 +03:00
pool = self . _get_pool_from_sourcelist ( )
if not pool :
pool = StoragePool ( self . conn . get_backend ( ) )
pool . type = self . _get_config_pool_type ( )
pool . name = self . widget ( " pool-name " ) . get_text ( )
2013-09-20 04:18:12 +04:00
return pool
2008-08-15 19:22:20 +04:00
2019-05-04 21:37:56 +03:00
def _build_pool ( self ) :
target = self . _get_config_target_path ( )
host = self . _get_config_host ( )
source = self . _get_config_source_path ( )
fmt = self . _get_config_format ( )
iqn = self . _get_config_iqn ( )
source_name = self . _get_config_source_name ( )
2013-09-20 04:18:12 +04:00
try :
2019-05-04 21:37:56 +03:00
pool = self . _make_stub_pool ( )
2019-05-04 20:08:06 +03:00
2019-05-04 21:37:56 +03:00
pool . target_path = target
2013-09-20 04:18:12 +04:00
if host :
2019-05-04 21:37:56 +03:00
hostobj = pool . hosts . add_new ( )
2018-02-08 01:27:56 +03:00
hostobj . name = host
2013-09-20 04:18:12 +04:00
if source :
2019-05-04 21:37:56 +03:00
pool . source_path = source
if fmt and pool . supports_property ( " format " ) :
pool . format = fmt
2013-09-20 04:18:12 +04:00
if iqn :
2019-05-04 21:37:56 +03:00
pool . iqn = iqn
2014-02-12 14:52:46 +04:00
if source_name :
2019-05-04 21:37:56 +03:00
pool . source_name = source_name
2013-09-20 04:18:12 +04:00
2019-05-04 21:37:56 +03:00
pool . validate ( )
2017-05-05 19:47:21 +03:00
except ValueError as e :
2013-09-20 04:18:12 +04:00
return self . err . val_err ( _ ( " Pool Parameter Error " ) , e )
buildval = self . widget ( " pool-build " ) . get_active ( )
buildsen = ( self . widget ( " pool-build " ) . get_sensitive ( ) and
2013-09-27 20:13:01 +04:00
self . widget ( " pool-build " ) . get_visible ( ) )
2013-09-20 04:18:12 +04:00
if buildsen and buildval :
ret = self . err . yes_no ( _ ( " Building a pool of this type will "
" format the source device. Are you "
" sure you want to ' build ' this pool? " ) )
if not ret :
return ret
2019-05-04 21:37:56 +03:00
return pool
##################
# Object install #
##################
2013-09-20 04:18:12 +04:00
2019-05-04 21:37:56 +03:00
def _pool_added_cb ( self , src , connkey , created_name ) :
if connkey == created_name :
self . emit ( " pool-created " , connkey )
def _finish_cb ( self , error , details , pool ) :
self . reset_finish_cursor ( )
if error :
error = _ ( " Error creating pool: %s " ) % error
self . err . show_err ( error ,
details = details )
else :
self . conn . connect_once ( " pool-added " , self . _pool_added_cb ,
pool . name )
self . conn . schedule_priority_tick ( pollpool = True )
self . close ( )
2009-03-08 22:14:00 +03:00
2019-05-04 21:37:56 +03:00
def _async_pool_create ( self , asyncjob , pool , build ) :
meter = asyncjob . get_meter ( )
logging . debug ( " Starting background pool creation. " )
poolobj = pool . install ( create = True , meter = meter , build = build )
poolobj . setAutostart ( True )
logging . debug ( " Pool creation succeeded " )
def _finish ( self ) :
try :
pool = self . _build_pool ( )
if not pool :
return
except Exception as e :
self . err . show_err (
_ ( " Uncaught error validating input: %s " ) % str ( e ) )
return
self . reset_finish_cursor ( )
build = self . widget ( " pool-build " ) . get_active ( )
progWin = vmmAsyncJob ( self . _async_pool_create , [ pool , build ] ,
self . _finish_cb , [ pool ] ,
_ ( " Creating storage pool... " ) ,
_ ( " Creating the storage pool may take a "
" while... " ) ,
self . topwin )
progWin . run ( )
################
# UI listeners #
################
def _finish_clicked_cb ( self , src ) :
self . _finish ( )
def _pool_type_changed_cb ( self , src ) :
self . _show_options_by_pool ( )
def _browse_source_cb ( self , src ) :
source = self . err . browse_local ( self . conn ,
_ ( " Choose source path " ) ,
dialog_type = Gtk . FileChooserAction . OPEN ,
start_folder = " /dev " )
if source :
self . widget ( " pool-source-path " ) . get_child ( ) . set_text ( source )
def _browse_target_cb ( self , src ) :
startfolder = StoragePool . get_default_dir ( self . conn . get_backend ( ) )
target = self . err . browse_local ( self . conn ,
_ ( " Choose target directory " ) ,
dialog_type = Gtk . FileChooserAction . SELECT_FOLDER ,
start_folder = startfolder )
if target :
self . widget ( " pool-target-path " ) . get_child ( ) . set_text ( target )
def _hostname_changed_cb ( self , src ) :
# If a hostname was entered, try to lookup valid pool sources.
self . _populate_pool_sources ( )
def _iqn_toggled_cb ( self , src ) :
self . widget ( " pool-iqn " ) . set_sensitive ( src . get_active ( ) )