diff --git a/src/virtManager/details.py b/src/virtManager/details.py
index 61286db79..2e62572b4 100644
--- a/src/virtManager/details.py
+++ b/src/virtManager/details.py
@@ -60,8 +60,8 @@ HW_LIST_TYPE_HOSTDEV = 11
HW_LIST_TYPE_VIDEO = 12
apply_pages = [ HW_LIST_TYPE_GENERAL, HW_LIST_TYPE_CPU, HW_LIST_TYPE_MEMORY,
- HW_LIST_TYPE_BOOT]
-remove_pages = [ HW_LIST_TYPE_DISK, HW_LIST_TYPE_NIC, HW_LIST_TYPE_INPUT,
+ HW_LIST_TYPE_BOOT, HW_LIST_TYPE_DISK]
+remove_pages = [ HW_LIST_TYPE_NIC, HW_LIST_TYPE_INPUT,
HW_LIST_TYPE_GRAPHICS, HW_LIST_TYPE_SOUND, HW_LIST_TYPE_CHAR,
HW_LIST_TYPE_HOSTDEV, HW_LIST_TYPE_VIDEO ]
@@ -176,11 +176,13 @@ class vmmDetails(gobject.GObject):
"on_overview_acpi_changed": self.config_enable_apply,
"on_overview_apic_changed": self.config_enable_apply,
"on_overview_clock_changed": self.config_enable_apply,
- "on_config_vcpus_changed": self.config_vcpus_changed,
+ "on_config_vcpus_changed": self.config_enable_apply,
"on_config_memory_changed": self.config_memory_changed,
"on_config_maxmem_changed": self.config_maxmem_changed,
"on_config_boot_device_changed": self.config_boot_options_changed,
"on_config_autostart_changed": self.config_boot_options_changed,
+ "on_disk_readonly_changed": self.config_enable_apply,
+ "on_disk_shareable_changed": self.config_enable_apply,
"on_config_apply_clicked": self.config_apply,
@@ -825,10 +827,6 @@ class vmmDetails(gobject.GObject):
self.window.get_widget("config-apply").set_sensitive(True)
self.window.get_widget("security-label").set_sensitive(not button.get_active())
- # CPUS
- def config_vcpus_changed(self, src):
- self.window.get_widget("config-apply").set_sensitive(True)
-
# Memory
def config_get_maxmem(self):
maxadj = self.window.get_widget("config-maxmem").get_adjustment()
@@ -901,6 +899,8 @@ class vmmDetails(gobject.GObject):
pagetype = self.get_hw_selection(HW_LIST_COL_TYPE)
ret = False
+ info = self.get_hw_selection(HW_LIST_COL_DEVICE)
+
if pagetype is HW_LIST_TYPE_GENERAL:
ret = self.config_overview_apply()
elif pagetype is HW_LIST_TYPE_CPU:
@@ -909,6 +909,8 @@ class vmmDetails(gobject.GObject):
ret = self.config_memory_apply()
elif pagetype is HW_LIST_TYPE_BOOT:
ret = self.config_boot_options_apply()
+ elif pagetype is HW_LIST_TYPE_DISK:
+ ret = self.config_disk_apply(info[1])
else:
ret = False
@@ -1007,6 +1009,17 @@ class vmmDetails(gobject.GObject):
self.vm.hotplug_cdrom_media,
(dev_id_info, newpath, _type))
+ # Disk options
+ def config_disk_apply(self, dev_id_info):
+ do_readonly = self.window.get_widget("disk-readonly").get_active()
+ do_shareable = self.window.get_widget("disk-shareable").get_active()
+
+ return self._change_config_helper([self.vm.define_disk_readonly,
+ self.vm.define_disk_shareable],
+ [(dev_id_info, do_readonly),
+ (dev_id_info, do_shareable)])
+
+
# Device removal
def remove_device(self, dev_type, dev_id_info):
@@ -1282,6 +1295,8 @@ class vmmDetails(gobject.GObject):
share = diskinfo[7]
bus = diskinfo[8]
+ is_cdrom = (devtype == virtinst.VirtualDisk.DEVICE_CDROM)
+
if devtype == virtinst.VirtualDisk.DEVICE_FLOPPY:
pretty_name = "floppy"
elif bus:
@@ -1294,6 +1309,7 @@ class vmmDetails(gobject.GObject):
self.window.get_widget("disk-target-type").set_text(pretty_name)
self.window.get_widget("disk-readonly").set_active(ro)
+ self.window.get_widget("disk-readonly").set_sensitive(not is_cdrom)
self.window.get_widget("disk-shareable").set_active(share)
bus = diskinfo[8] or _("Unknown")
diff --git a/src/virtManager/domain.py b/src/virtManager/domain.py
index 8245d592e..25c128b7c 100644
--- a/src/virtManager/domain.py
+++ b/src/virtManager/domain.py
@@ -426,6 +426,9 @@ class vmmDomain(gobject.GObject):
return doc.serialize(), disk_fragment.serialize()
def define_cdrom_media(self, dev_id_info, newpath, _type=None):
+ if not self.check_device_is_present("disk", dev_id_info):
+ return
+
if not newpath:
func = self._media_xml_disconnect
else:
@@ -593,6 +596,7 @@ class vmmDomain(gobject.GObject):
return util.xml_parse_wrapper(xml, change_feature)
+ # 'Overview' section settings
def define_acpi(self, do_enable):
if do_enable == self.get_acpi():
return
@@ -618,6 +622,41 @@ class vmmDomain(gobject.GObject):
return self.redefine(util.xml_parse_wrapper, change_clock, newclock)
+ def _change_disk_param(self, doc, ctx, dev_id_info, node_name, newvalue):
+ disk_node = self._get_device_xml_nodes(ctx, "disk", dev_id_info)[0]
+
+ found_node = None
+ for child in disk_node.children:
+ if child.name == node_name:
+ found_node = child
+ break
+ child = child.next
+
+ if bool(found_node) != newvalue:
+ if not newvalue:
+ found_node.unlinkNode()
+ found_node.freeNode()
+ else:
+ disk_node.newChild(None, node_name, None)
+
+ return doc.serialize()
+
+ # Disk properties
+ def define_disk_readonly(self, dev_id_info, do_readonly):
+ if not self.check_device_is_present("disk", dev_id_info):
+ return
+
+ return self.redefine(util.xml_parse_wrapper, self._change_disk_param,
+ dev_id_info, "readonly", do_readonly)
+
+ def define_disk_shareable(self, dev_id_info, do_shareable):
+ if not self.check_device_is_present("disk", dev_id_info):
+ return
+
+ return self.redefine(util.xml_parse_wrapper, self._change_disk_param,
+ dev_id_info, "shareable", do_shareable)
+
+
########################
# End XML Altering API #
########################
diff --git a/src/vmm-details.glade b/src/vmm-details.glade
index 4ec7e3acc..696103ddd 100644
--- a/src/vmm-details.glade
+++ b/src/vmm-details.glade
@@ -2465,6 +2465,7 @@ I/O:
True
False
True
+
1
@@ -2480,6 +2481,7 @@ I/O:
True
False
True
+
1