mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-02-25 18:55:27 -06:00
add a radio button for sparse vs. non-sparse viles. Add appropriate cautions and text to the progress dialog.
This commit is contained in:
parent
522d1da8e0
commit
7b2cbb18ad
@ -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"><small><b>Warning:</b> 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.</small></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>
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user