add a radio button for sparse vs. non-sparse viles. Add appropriate cautions and text to the progress dialog.

This commit is contained in:
Hugh O. Brock 2006-12-17 16:33:37 -05:00
parent 522d1da8e0
commit 7b2cbb18ad
3 changed files with 181 additions and 12 deletions

View File

@ -4280,16 +4280,16 @@ For all domains</property>
<property name="spacing">0</property>
<child>
<widget class="GtkLabel" id="label94">
<widget class="GtkLabel" id="window-text">
<property name="visible">True</property>
<property name="label" translatable="yes">Please wait...</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="wrap">True</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.600000023842</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
@ -4298,9 +4298,9 @@ For all domains</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="padding">10</property>
<property name="padding">13</property>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="fill">True</property>
</packing>
</child>
@ -7396,7 +7396,7 @@ TB</property>
<child>
<widget class="GtkTable" id="table23">
<property name="visible">True</property>
<property name="n_rows">7</property>
<property name="n_rows">9</property>
<property name="n_columns">5</property>
<property name="homogeneous">False</property>
<property name="row_spacing">2</property>
@ -7859,6 +7859,146 @@ TB</property>
<property name="y_options">fill</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label348">
<property name="visible">True</property>
<property name="label" translatable="yes">File _Type:</property>
<property name="use_underline">True</property>
<property name="use_markup">True</property>
<property name="justify">GTK_JUSTIFY_RIGHT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">1</property>
<property name="yalign">0.5</property>
<property name="xpad">4</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">2</property>
<property name="right_attach">3</property>
<property name="top_attach">7</property>
<property name="bottom_attach">8</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox48">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkRadioButton" id="sparse">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">sparse</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkRadioButton" id="non-sparse">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">non-sparse</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">True</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
<property name="group">sparse</property>
</widget>
<packing>
<property name="padding">6</property>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
</widget>
<packing>
<property name="left_attach">3</property>
<property name="right_attach">4</property>
<property name="top_attach">7</property>
<property name="bottom_attach">8</property>
<property name="x_options">fill</property>
<property name="y_options">fill</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox49">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkImage" id="image98">
<property name="visible">True</property>
<property name="icon_size">4</property>
<property name="icon_name">gtk-dialog-warning</property>
<property name="xalign">0.5</property>
<property name="yalign">0</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label349">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;small&gt;&lt;b&gt;Warning:&lt;/b&gt; Creating a guest with sparse file storage is quicker, but it can lead to catastrophic failure of the guest in the event the host file system runs out of space.&lt;/small&gt;</property>
<property name="use_underline">False</property>
<property name="use_markup">True</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">True</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">7</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
<packing>
<property name="left_attach">2</property>
<property name="right_attach">5</property>
<property name="top_attach">8</property>
<property name="bottom_attach">9</property>
<property name="x_options">fill</property>
</packing>
</child>
</widget>
</child>
</widget>

View File

@ -35,13 +35,14 @@ class vmmAsyncJob(gobject.GObject):
def run(self):
threading.Thread.run(self)
def __init__(self, config, callback, args=None, title="Progress"):
def __init__(self, config, callback, args=None, title="Progress", text="Please wait..."):
self.__gobject_init__()
self.config = config
self.pbar_glade = gtk.glade.XML(self.config.get_glade_file(), "vmm-progress", domain="virt-manager")
self.pbar_win = self.pbar_glade.get_widget("vmm-progress")
self.pbar = self.pbar_glade.get_widget("pbar")
self.pbar_win.set_title(title)
self.pbar_glade.get_widget("window-text").set_label(text)
self.pbar_win.hide()
self.bg_thread = vmmAsyncJob.asyncJobWorker(callback, args)

View File

@ -42,6 +42,7 @@ VM_INSTALL_FROM_CD = 2
VM_STORAGE_PARTITION = 1
VM_STORAGE_FILE = 2
VM_STORAGE_FILE_SPARSE = False
DEFAULT_STORAGE_FILE_SIZE = 500
@ -185,6 +186,8 @@ class vmmCreate(gobject.GObject):
self.window.get_widget("create-memory-max").set_value(500)
self.window.get_widget("create-memory-startup").set_value(500)
self.window.get_widget("create-vcpus").set_value(1)
self.window.get_widget("non-sparse").set_active(True)
self.window.get_widget("sparse").set_active(False)
model = self.window.get_widget("pv-media-url").get_model()
self.populate_url_model(model, self.config.get_media_urls())
model = self.window.get_widget("pv-ks-url").get_model()
@ -370,11 +373,16 @@ class vmmCreate(gobject.GObject):
if self.get_config_disk_size() != None:
filesize = self.get_config_disk_size() / 1024.0
try:
d = virtinst.XenDisk(self.get_config_disk_image(), filesize)
d = virtinst.XenDisk(self.get_config_disk_image(), filesize, sparse = self.is_sparse_file())
if d.type == virtinst.XenDisk.TYPE_FILE and \
self.get_config_method() == VM_PARA_VIRT \
and virtinst.util.is_blktap_capable():
d.driver_name = virtinst.XenDisk.DRIVER_TAP
if d.type == virtinst.XenDisk.TYPE_FILE and not \
self.is_sparse_file():
self.non_sparse = True
else:
self.non_sparse = False
except ValueError, e:
self._validation_error_box(_("Invalid storage address"), e.args[0])
return
@ -397,14 +405,22 @@ class vmmCreate(gobject.GObject):
"\n Memory: " + str(guest.memory) + \
"\n # VCPUs: " + str(guest.vcpus) + \
"\n Filesize: " + str(filesize) + \
"\n Disk image: " + str(self.get_config_disk_image()))
"\n Disk image: " + str(self.get_config_disk_image()) +\
"\n Non-sparse file: " + str(self.non_sparse))
#let's go
self.install_error = None
self.topwin.set_sensitive(False)
self.topwin.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
if not self.non_sparse:
text=_("Please wait...")
logging.debug("Sparse file or partition selected")
else:
text=_("Creating the storage file for your guest can take 30 seconds or more per GB, please be patient.")
logging.debug("Non-sparse file selected")
progWin = vmmAsyncJob(self.config, self.do_install, [guest],
title=_("Creating Virtual Machine"))
title=_("Creating Virtual Machine"),
text=text)
progWin.run()
if self.install_error != None:
logging.error("Async job failed to create VM " + str(self.install_error))
@ -495,15 +511,17 @@ class vmmCreate(gobject.GObject):
file = fcdialog.get_filename()
if file != None:
self.window.get_widget("storage-file-address").set_text(file)
size = os.stat(file).st_size/(1024*1024)
self.window.get_widget("storage-file-size").set_value(size)
def toggle_storage_size(self, ignore1=None, ignore2=None):
file = self.get_config_disk_image()
if file != None and len(file) > 0 and not(os.path.exists(file)):
self.window.get_widget("storage-file-size").set_sensitive(True)
self.window.get_widget("sparse").set_sensitive(True)
self.window.get_widget("non-sparse").set_sensitive(True)
else:
self.window.get_widget("storage-file-size").set_sensitive(False)
self.window.get_widget("sparse").set_sensitive(False)
self.window.get_widget("non-sparse").set_sensitive(False)
if file != None and len(file) > 0 and os.path.isfile(file):
size = os.path.getsize(file)/(1024*1024)
self.window.get_widget("storage-file-size").set_value(size)
@ -529,6 +547,8 @@ class vmmCreate(gobject.GObject):
self.window.get_widget("storage-partition-box").set_sensitive(True)
self.window.get_widget("storage-file-box").set_sensitive(False)
self.window.get_widget("storage-file-size").set_sensitive(False)
self.window.get_widget("sparse").set_sensitive(False)
self.window.get_widget("non-sparse").set_sensitive(False)
else:
self.window.get_widget("storage-partition-box").set_sensitive(False)
self.window.get_widget("storage-file-box").set_sensitive(True)
@ -700,3 +720,11 @@ class vmmCreate(gobject.GObject):
else:
return "%2.2f MB" % (mem/1024.0)
def is_sparse_file(self):
if self.window.get_widget("sparse").get_active():
return True
elif self.window.get_widget("non-sparse").get_active():
return False
else:
return None