diff --git a/src/virt-manager.glade b/src/virt-manager.glade index 7feab47dc..6a8943115 100644 --- a/src/virt-manager.glade +++ b/src/virt-manager.glade @@ -4280,16 +4280,16 @@ For all domains 0 - + True Please wait... False False GTK_JUSTIFY_LEFT - False + True False 0.5 - 0.600000023842 + 0.5 0 0 PANGO_ELLIPSIZE_NONE @@ -4298,9 +4298,9 @@ For all domains 0 - 10 + 13 False - False + True @@ -7396,7 +7396,7 @@ TB True - 7 + 9 5 False 2 @@ -7859,6 +7859,146 @@ TB fill + + + + True + File _Type: + True + True + GTK_JUSTIFY_RIGHT + False + False + 1 + 0.5 + 4 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 7 + 8 + fill + + + + + + + True + False + 0 + + + + True + True + sparse + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + True + + + + + + True + True + non-sparse + True + GTK_RELIEF_NORMAL + True + True + False + True + sparse + + + 6 + False + True + + + + + 3 + 4 + 7 + 8 + fill + fill + + + + + + True + False + 0 + + + + True + 4 + gtk-dialog-warning + 0.5 + 0 + 0 + 0 + + + 0 + False + True + + + + + + True + <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> + False + True + GTK_JUSTIFY_LEFT + True + False + 0.5 + 0.5 + 7 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 2 + 5 + 8 + 9 + fill + + diff --git a/src/virtManager/asyncjob.py b/src/virtManager/asyncjob.py index a356bbae8..8df4d8452 100644 --- a/src/virtManager/asyncjob.py +++ b/src/virtManager/asyncjob.py @@ -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) diff --git a/src/virtManager/create.py b/src/virtManager/create.py index 01f371144..400534921 100644 --- a/src/virtManager/create.py +++ b/src/virtManager/create.py @@ -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 +