2008-09-07 18:56:30 -04:00
#
# Copyright (C) 2008 Red Hat, Inc.
# Copyright (C) 2008 Cole Robinson <crobinso@redhat.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA.
#
import logging
2009-03-08 15:14:00 -04:00
import gtk
2009-06-18 10:38:15 -04:00
import libxml2
2009-06-23 19:30:12 -04:00
import os . path
2008-09-07 18:56:30 -04:00
import libvirt
2009-03-09 01:04:29 -04:00
import virtManager
2008-09-07 18:56:30 -04:00
import virtinst
DEFAULT_POOL_NAME = " default "
DEFAULT_POOL_PATH = " /var/lib/libvirt/images "
def build_default_pool ( conn ) :
""" Helper to build the ' default ' storage pool """
2009-03-09 16:19:39 -04:00
# FIXME: This should use config.get_default_image_path ?
2008-09-07 18:56:30 -04:00
if not virtinst . util . is_storage_capable ( conn ) :
# VirtualDisk will raise an error for us
return
pool = None
try :
pool = conn . storagePoolLookupByName ( DEFAULT_POOL_NAME )
except libvirt . libvirtError :
pass
if pool :
return
try :
logging . debug ( " Attempting to build default pool with target ' %s ' " %
DEFAULT_POOL_PATH )
defpool = virtinst . Storage . DirectoryPool ( conn = conn ,
name = DEFAULT_POOL_NAME ,
target_path = DEFAULT_POOL_PATH )
newpool = defpool . install ( build = True , create = True )
newpool . setAutostart ( True )
except Exception , e :
raise RuntimeError ( _ ( " Couldn ' t create default storage pool ' %s ' : %s " ) %
( DEFAULT_POOL_PATH , str ( e ) ) )
2009-01-26 11:12:43 -05:00
def tooltip_wrapper ( obj , txt , func = " set_tooltip_text " ) :
# Catch & ignore errors - set_tooltip_* is in gtk >= 2.12
# and we can easily work with lower versions
try :
funcptr = getattr ( obj , func )
funcptr ( txt )
except :
2009-03-13 14:33:52 -04:00
ver = gtk . gtk_version
if ver [ 0 ] > = 2 and ver [ 1 ] > = 12 :
logging . exception ( " Couldn ' t set tooltip. " )
2009-06-18 10:38:15 -04:00
def xml_parse_wrapper ( xml , parse_func , * args , * * kwargs ) :
"""
Parse the passed xml string into an xpath context , which is passed
to parse_func , along with any extra arguments .
"""
doc = None
ctx = None
ret = None
try :
doc = libxml2 . parseDoc ( xml )
ctx = doc . xpathNewContext ( )
ret = parse_func ( doc , ctx , * args , * * kwargs )
finally :
if ctx != None :
ctx . xpathFreeContext ( )
if doc != None :
doc . freeDoc ( )
return ret
2009-03-08 15:14:00 -04:00
2009-06-23 19:30:12 -04:00
def browse_local ( parent , dialog_name , config , conn , start_folder = None ,
_type = None , dialog_type = gtk . FILE_CHOOSER_ACTION_OPEN ,
confirm_func = None , browse_reason = None ) :
2009-06-22 14:24:09 -04:00
"""
Helper function for launching a filechooser
@param parent : Parent window for the filechooser
@param dialog_name : String to use in the title bar of the filechooser .
2009-06-23 19:30:12 -04:00
@param config : vmmConfig used by calling class
@param conn : vmmConnection used by calling class
2009-06-22 14:24:09 -04:00
@param start_folder : Folder the filechooser is viewing at startup
@param _type : File extension to filter by ( e . g . " iso " , " png " )
@param dialog_type : Maps to FileChooserDialog ' action '
@param confirm_func : Optional callback function if file is chosen .
2009-06-23 19:30:12 -04:00
@param browse_reason : The vmmConfig . CONFIG_DIR * reason we are browsing .
If set , this will override the ' folder ' parameter with the gconf
value , and store the user chosen path .
2009-06-22 14:24:09 -04:00
"""
2009-03-08 15:14:00 -04:00
overwrite_confirm = False
choose_button = gtk . STOCK_OPEN
if dialog_type == gtk . FILE_CHOOSER_ACTION_SAVE :
choose_button = gtk . STOCK_SAVE
overwrite_confirm = True
2009-06-23 19:30:12 -04:00
if browse_reason :
start_folder = config . get_default_directory ( conn , browse_reason )
2009-03-08 15:14:00 -04:00
fcdialog = gtk . FileChooserDialog ( dialog_name , parent ,
dialog_type ,
( gtk . STOCK_CANCEL , gtk . RESPONSE_CANCEL ,
choose_button , gtk . RESPONSE_ACCEPT ) ,
None )
fcdialog . set_default_response ( gtk . RESPONSE_ACCEPT )
if confirm_func :
overwrite_confirm = True
fcdialog . connect ( " confirm-overwrite " , confirm_func )
fcdialog . set_do_overwrite_confirmation ( overwrite_confirm )
if _type != None :
pattern = _type
name = None
if type ( _type ) is tuple :
pattern = _type [ 0 ]
name = _type [ 1 ]
f = gtk . FileFilter ( )
f . add_pattern ( " *. " + pattern )
if name :
f . set_name ( name )
fcdialog . set_filter ( f )
if start_folder != None :
fcdialog . set_current_folder ( start_folder )
response = fcdialog . run ( )
fcdialog . hide ( )
if ( response == gtk . RESPONSE_ACCEPT ) :
filename = fcdialog . get_filename ( )
fcdialog . destroy ( )
2009-06-23 19:30:12 -04:00
ret = filename
2009-03-08 15:14:00 -04:00
else :
fcdialog . destroy ( )
2009-06-23 19:30:12 -04:00
ret = None
2009-06-25 22:12:09 -04:00
if ret and browse_reason and not ret . startswith ( " /dev " ) :
2009-06-23 19:30:12 -04:00
config . set_default_directory ( os . path . dirname ( ret ) , browse_reason )
return ret
2009-03-08 15:14:00 -04:00
2009-04-03 14:15:25 -04:00
def dup_conn ( config , conn , libconn = None , return_conn_class = False ) :
2009-03-09 01:04:29 -04:00
is_readonly = False
if libconn :
uri = libconn . getURI ( )
is_test = uri . startswith ( " test " )
vmm = libconn
else :
is_test = conn . is_test_conn ( )
is_readonly = conn . is_read_only ( )
uri = conn . get_uri ( )
vmm = conn . vmm
if is_test :
# Skip duplicating a test conn, since it doesn't maintain state
# between instances
return vmm
logging . debug ( " Duplicating connection for async operation. " )
newconn = virtManager . connection . vmmConnection ( config , uri , is_readonly )
newconn . open ( )
newconn . connectThreadEvent . wait ( )
2009-04-03 14:15:25 -04:00
if return_conn_class :
return newconn
else :
return newconn . vmm
2009-05-12 13:09:08 -04:00
def pretty_hv ( gtype , domtype ) :
"""
Convert XML < domain type = ' foo ' > and < os > < type > bar < / type >
into a more human relevant string .
"""
gtype = gtype . lower ( )
domtype = domtype . lower ( )
label = domtype
if domtype == " kvm " :
if gtype == " xen " :
label = " xenner "
elif domtype == " xen " :
if gtype == " xen " :
label = " xen (paravirt) "
elif gtype == " hvm " :
label = " xen (fullvirt) "
elif domtype == " test " :
if gtype == " xen " :
label = " test (xen) "
elif gtype == " hvm " :
label = " test (hvm) "
return label