diff --git a/AUTHORS b/AUTHORS index 80138678d..ec73a696a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -86,6 +86,7 @@ Further patches have been submitted by: Michal Privoznik Martin Kletzander ChenHanxiao + David Shane Holden <...send a patch & get your name here...> diff --git a/src/virtManager/details.py b/src/virtManager/details.py index aeff71d52..69be82bcc 100644 --- a/src/virtManager/details.py +++ b/src/virtManager/details.py @@ -51,7 +51,7 @@ _comboentry_xml = """ """ # Parameters that can be editted in the details window -EDIT_TOTAL = 36 +EDIT_TOTAL = 37 (EDIT_NAME, EDIT_ACPI, EDIT_APIC, @@ -80,6 +80,7 @@ EDIT_DISK_IO, EDIT_DISK_BUS, EDIT_DISK_SERIAL, EDIT_DISK_FORMAT, +EDIT_DISK_IOTUNE, EDIT_SOUND_MODEL, @@ -445,6 +446,8 @@ class vmmDetails(vmmGObjectUI): "on_disk_format_changed": (self.enable_apply, EDIT_DISK_FORMAT), "on_disk_serial_changed": (self.enable_apply, EDIT_DISK_SERIAL), + "on_disk_iotune_changed": self.iotune_changed, + "on_network_source_combo_changed": (self.enable_apply, EDIT_NET_SOURCE), "on_network_bridge_changed": (self.enable_apply, @@ -937,6 +940,10 @@ class vmmDetails(vmmGObjectUI): disk_bus = self.widget("disk-bus-combo") uihelpers.build_disk_bus_combo(self.vm, disk_bus) + # Disk iotune expander + if not (self.conn.is_qemu() or self.conn.is_test_conn()): + self.widget("iotune-expander").set_property("visible", False) + # Network source net_source = self.widget("network-source-combo") net_bridge = self.widget("network-bridge-box") @@ -1870,6 +1877,52 @@ class vmmDetails(vmmGObjectUI): self.repopulate_boot_list(boot_devs, boot_selection) self.enable_apply(EDIT_BOOTORDER) + # IO Tuning + def iotune_changed(self, ignore): + iotune_read_bytes_sec = int(self.get_text("disk-iotune-read-bytes-sec") or 0) + iotune_read_iops_sec = int(self.get_text("disk-iotune-read-iops-sec") or 0) + iotune_total_bytes_sec = int(self.get_text("disk-iotune-total-bytes-sec") or 0) + iotune_total_iops_sec = int(self.get_text("disk-iotune-total-iops-sec") or 0) + iotune_write_bytes_sec = int(self.get_text("disk-iotune-write-bytes-sec") or 0) + iotune_write_iops_sec = int(self.get_text("disk-iotune-write-iops-sec") or 0) + + # libvirt doesn't support having read/write settings along side total + # settings, so disable the widgets accordingly. + + if (iotune_read_bytes_sec > 0 or iotune_write_bytes_sec > 0): + iotune_total_bytes_sec = int(0) + self.widget("disk-iotune-total-bytes-sec").get_adjustment().value = int(0) + self.widget("disk-iotune-total-bytes-sec").set_sensitive(False) + else: + self.widget("disk-iotune-total-bytes-sec").set_sensitive(True) + + if (iotune_total_bytes_sec > 0): + self.widget("disk-iotune-read-bytes-sec").get_adjustment().value = int(0) + self.widget("disk-iotune-write-bytes-sec").get_adjustment().value = int(0) + self.widget("disk-iotune-read-bytes-sec").set_sensitive(False) + self.widget("disk-iotune-write-bytes-sec").set_sensitive(False) + else: + self.widget("disk-iotune-read-bytes-sec").set_sensitive(True) + self.widget("disk-iotune-write-bytes-sec").set_sensitive(True) + + if (iotune_read_iops_sec > 0 or iotune_write_iops_sec > 0): + iotune_total_iops_sec = int(0) + self.widget("disk-iotune-total-iops-sec").get_adjustment().value = int(0) + self.widget("disk-iotune-total-iops-sec").set_sensitive(False) + else: + self.widget("disk-iotune-total-iops-sec").set_sensitive(True) + + if (iotune_total_iops_sec > 0): + self.widget("disk-iotune-read-iops-sec").get_adjustment().value = int(0) + self.widget("disk-iotune-write-iops-sec").get_adjustment().value = int(0) + self.widget("disk-iotune-read-iops-sec").set_sensitive(False) + self.widget("disk-iotune-write-iops-sec").set_sensitive(False) + else: + self.widget("disk-iotune-read-iops-sec").set_sensitive(True) + self.widget("disk-iotune-write-iops-sec").set_sensitive(True) + + self.enable_apply(EDIT_DISK_IOTUNE) + # CDROM Eject/Connect def toggle_storage_media(self, src_ignore): disk = self.get_hw_selection(HW_LIST_COL_DEVICE) @@ -2216,6 +2269,21 @@ class vmmDetails(vmmGObjectUI): serial = self.get_text("disk-serial") add_define(self.vm.define_disk_serial, dev_id_info, serial) + if self.editted(EDIT_DISK_IOTUNE): + iotune_read_bytes_sec = int(self.widget("disk-iotune-read-bytes-sec").get_adjustment().value * 1024) + iotune_read_iops_sec = int(self.widget("disk-iotune-read-iops-sec").get_adjustment().value) + iotune_total_bytes_sec = int(self.widget("disk-iotune-total-bytes-sec").get_adjustment().value * 1024) + iotune_total_iops_sec = int(self.widget("disk-iotune-total-iops-sec").get_adjustment().value) + iotune_write_bytes_sec = int(self.widget("disk-iotune-write-bytes-sec").get_adjustment().value * 1024) + iotune_write_iops_sec = int(self.widget("disk-iotune-write-iops-sec").get_adjustment().value) + + add_define(self.vm.define_disk_iotune_read_bytes_sec, dev_id_info, iotune_read_bytes_sec) + add_define(self.vm.define_disk_iotune_read_iops_sec, dev_id_info, iotune_read_iops_sec) + add_define(self.vm.define_disk_iotune_total_bytes_sec, dev_id_info, iotune_total_bytes_sec) + add_define(self.vm.define_disk_iotune_total_iops_sec, dev_id_info, iotune_total_iops_sec) + add_define(self.vm.define_disk_iotune_write_bytes_sec, dev_id_info, iotune_write_bytes_sec) + add_define(self.vm.define_disk_iotune_write_iops_sec, dev_id_info, iotune_write_iops_sec) + # Do this last since it can change uniqueness info of the dev if self.editted(EDIT_DISK_BUS): bus = self.get_combo_label_value("disk-bus") @@ -2826,6 +2894,14 @@ class vmmDetails(vmmGObjectUI): io = disk.driver_io driver_type = disk.driver_type or "" serial = disk.serial + + iotune_read_bytes_sec = disk.iotune_read_bytes_sec / 1024 + iotune_read_iops_sec = disk.iotune_read_iops_sec + iotune_total_bytes_sec = disk.iotune_total_bytes_sec / 1024 + iotune_total_iops_sec = disk.iotune_total_iops_sec + iotune_write_bytes_sec = disk.iotune_write_bytes_sec / 1024 + iotune_write_iops_sec = disk.iotune_write_iops_sec + show_format = (not self.is_customize_dialog or disk.path_exists(disk.conn, disk.path)) @@ -2868,6 +2944,13 @@ class vmmDetails(vmmGObjectUI): self.set_combo_label("disk-bus", bus) self.widget("disk-serial").set_text(serial or "") + self.widget("disk-iotune-read-bytes-sec").get_adjustment().value = iotune_read_bytes_sec + self.widget("disk-iotune-read-iops-sec").get_adjustment().value = iotune_read_iops_sec + self.widget("disk-iotune-total-bytes-sec").get_adjustment().value = iotune_total_bytes_sec + self.widget("disk-iotune-total-iops-sec").get_adjustment().value = iotune_total_iops_sec + self.widget("disk-iotune-write-bytes-sec").get_adjustment().value = iotune_write_bytes_sec + self.widget("disk-iotune-write-iops-sec").get_adjustment().value = iotune_write_iops_sec + button = self.widget("config-cdrom-connect") if is_cdrom or is_floppy: if not path: diff --git a/src/virtManager/domain.py b/src/virtManager/domain.py index a8a7ea85f..bd482cd55 100644 --- a/src/virtManager/domain.py +++ b/src/virtManager/domain.py @@ -616,6 +616,36 @@ class vmmDomain(vmmLibvirtObject): editdev.serial = val or None return self._redefine_device(change, devobj) + def define_disk_iotune_read_bytes_sec(self, devobj, val): + def change(editdev): + editdev.iotune_read_bytes_sec = val + return self._redefine_device(change, devobj) + + def define_disk_iotune_read_iops_sec(self, devobj, val): + def change(editdev): + editdev.iotune_read_iops_sec = val + return self._redefine_device(change, devobj) + + def define_disk_iotune_total_bytes_sec(self, devobj, val): + def change(editdev): + editdev.iotune_total_bytes_sec = val + return self._redefine_device(change, devobj) + + def define_disk_iotune_total_iops_sec(self, devobj, val): + def change(editdev): + editdev.iotune_total_iops_sec = val + return self._redefine_device(change, devobj) + + def define_disk_iotune_write_bytes_sec(self, devobj, val): + def change(editdev): + editdev.iotune_write_bytes_sec = val + return self._redefine_device(change, devobj) + + def define_disk_iotune_write_iops_sec(self, devobj, val): + def change(editdev): + editdev.iotune_write_iops_sec = val + return self._redefine_device(change, devobj) + # Network define methods def define_network_source(self, devobj, newtype, newsource, newmode): diff --git a/src/vmm-details.ui b/src/vmm-details.ui index 39372d811..565808c04 100644 --- a/src/vmm-details.ui +++ b/src/vmm-details.ui @@ -51,6 +51,30 @@ 1 2 + + 1000000000 + 1024 + + + 1000000000 + 10 + + + 1000000000 + 1024 + + + 1000000000 + 10 + + + 1000000000 + 1024 + + + 1000000000 + 10 + True False @@ -3994,7 +4018,7 @@ I/O: True False - 4 + 5 2 8 3 @@ -4277,6 +4301,241 @@ I/O: 4 + + + True + True + + + True + False + start + 4 + 3 + 8 + 3 + + + True + False + 1 + Read: + True + + + 1 + 2 + GTK_FILL + + + + + True + False + 1 + Write: + True + + + 2 + 3 + GTK_FILL + + + + + True + False + 1 + 2 + True + + + GTK_FILL + + + + + True + False + 1 + Total: + True + + + 3 + 4 + GTK_FILL + + + + + True + False + 1 + KBytes/Sec + True + 20 + + + 1 + 2 + + + + + + True + False + 1 + IOPS/Sec + True + 20 + + + 2 + 3 + + + + + + True + True + + 16 + adjustment8 + 1 + True + if-valid + + + + 1 + 2 + 1 + 2 + GTK_FILL + + + + + True + True + + 16 + adjustment9 + 1 + True + if-valid + + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + + True + True + + 16 + adjustment10 + 1 + True + if-valid + + + + 1 + 2 + 2 + 3 + GTK_FILL + + + + + True + True + + 16 + adjustment11 + 1 + True + if-valid + + + + 2 + 3 + 2 + 3 + GTK_FILL + + + + + True + True + + 16 + adjustment12 + 1 + True + if-valid + + + + 1 + 2 + 3 + 4 + GTK_FILL + + + + + True + True + + 16 + adjustment13 + 1 + True + if-valid + + + + 2 + 3 + 3 + 4 + GTK_FILL + + + + + + + True + False + IO _Tuning + True + iotune-expander + + + + + 2 + 4 + 5 + +