mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-02-04 17:47:19 +03:00
Allow viewing and setting domain 'description' field.
This commit is contained in:
parent
4da1af635a
commit
0273c0c501
@ -433,6 +433,12 @@ class vmmDetails(gobject.GObject):
|
||||
hwCol.add_attribute(hw_img, 'icon-name', HW_LIST_COL_ICON_NAME)
|
||||
self.window.get_widget("hw-list").append_column(hwCol)
|
||||
|
||||
# Description text view
|
||||
desc = self.window.get_widget("overview-description")
|
||||
buf = gtk.TextBuffer()
|
||||
buf.connect("changed", self.config_enable_apply)
|
||||
desc.set_buffer(buf)
|
||||
|
||||
# Clock combo
|
||||
clock_combo = self.window.get_widget("overview-clock-combo")
|
||||
clock_model = gtk.ListStore(str)
|
||||
@ -917,7 +923,7 @@ class vmmDetails(gobject.GObject):
|
||||
# Details/Hardware listeners #
|
||||
##############################
|
||||
|
||||
def config_enable_apply(self, ignore):
|
||||
def config_enable_apply(self, ignore1=None, ignore2=None):
|
||||
self.window.get_widget("config-apply").set_sensitive(True)
|
||||
|
||||
# Overview -> Security
|
||||
@ -1018,6 +1024,7 @@ class vmmDetails(gobject.GObject):
|
||||
|
||||
info = self.get_hw_selection(HW_LIST_COL_DEVICE)
|
||||
|
||||
print pagetype
|
||||
if pagetype is HW_LIST_TYPE_GENERAL:
|
||||
ret = self.config_overview_apply()
|
||||
elif pagetype is HW_LIST_TYPE_CPU:
|
||||
@ -1062,14 +1069,20 @@ class vmmDetails(gobject.GObject):
|
||||
|
||||
selabel = self.window.get_widget("security-label").get_text()
|
||||
|
||||
# Description
|
||||
desc_widget = self.window.get_widget("overview-description")
|
||||
desc = desc_widget.get_buffer().get_property("text") or ""
|
||||
|
||||
return self._change_config_helper([self.vm.define_acpi,
|
||||
self.vm.define_apic,
|
||||
self.vm.define_clock,
|
||||
self.vm.define_seclabel],
|
||||
self.vm.define_seclabel,
|
||||
self.vm.define_description,],
|
||||
[(enable_acpi,),
|
||||
(enable_apic,),
|
||||
(clock,),
|
||||
(semodel, setype, selabel)])
|
||||
(semodel, setype, selabel),
|
||||
(desc,)])
|
||||
|
||||
# CPUs
|
||||
def config_vcpus_apply(self):
|
||||
@ -1317,6 +1330,9 @@ class vmmDetails(gobject.GObject):
|
||||
# Basic details
|
||||
self.window.get_widget("overview-name").set_text(self.vm.get_name())
|
||||
self.window.get_widget("overview-uuid").set_text(self.vm.get_uuid())
|
||||
desc = self.vm.get_description() or ""
|
||||
desc_widget = self.window.get_widget("overview-description")
|
||||
desc_widget.get_buffer().set_text(desc)
|
||||
|
||||
# Hypervisor Details
|
||||
self.window.get_widget("overview-hv").set_text(self.vm.get_pretty_hv_type())
|
||||
|
@ -170,6 +170,8 @@ class vmmDomainBase(gobject.GObject):
|
||||
raise NotImplementedError()
|
||||
def define_clock(self, newvalue):
|
||||
raise NotImplementedError()
|
||||
def define_description(self, newvalue):
|
||||
raise NotImplementedError()
|
||||
|
||||
def define_disk_readonly(self, dev_id_info, do_readonly):
|
||||
raise NotImplementedError()
|
||||
@ -252,6 +254,9 @@ class vmmDomainBase(gobject.GObject):
|
||||
def get_clock(self):
|
||||
return vutil.get_xml_path(self.get_xml(), "/domain/clock/@offset")
|
||||
|
||||
def get_description(self):
|
||||
return vutil.get_xml_path(self.get_xml(), "/domain/description")
|
||||
|
||||
def vcpu_pinning(self):
|
||||
cpuset = vutil.get_xml_path(self.get_xml(), "/domain/vcpu/@cpuset")
|
||||
# We need to set it to empty string not to show None in the entry
|
||||
@ -1734,6 +1739,30 @@ class vmmDomain(vmmDomainBase):
|
||||
|
||||
return self._redefine(util.xml_parse_wrapper, change_clock, newclock)
|
||||
|
||||
def define_description(self, newvalue):
|
||||
newvalue = vutil.xml_escape(newvalue)
|
||||
if newvalue == self.get_description():
|
||||
return
|
||||
|
||||
def change_desc(doc, ctx, newdesc):
|
||||
desc_node = ctx.xpathEval("/domain/description")
|
||||
desc_node = (desc_node and desc_node[0] or None)
|
||||
dom_node = ctx.xpathEval("/domain")[0]
|
||||
|
||||
if newdesc:
|
||||
if not desc_node:
|
||||
desc_node = dom_node.newChild(None, "description", None)
|
||||
|
||||
desc_node.setContent(newdesc)
|
||||
|
||||
elif desc_node:
|
||||
desc_node.unlinkNode()
|
||||
desc_node.freeNode()
|
||||
|
||||
return doc.serialize()
|
||||
|
||||
return self._redefine(util.xml_parse_wrapper, change_desc, newvalue)
|
||||
|
||||
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]
|
||||
|
||||
@ -2013,6 +2042,11 @@ class vmmDomainVirtinst(vmmDomainBase):
|
||||
self._backend.clock.offset = newvalue
|
||||
self._redefine(change_clock)
|
||||
|
||||
def define_description(self, newvalue):
|
||||
def change_desc():
|
||||
self._backend.description = newvalue
|
||||
self._redefine(change_desc)
|
||||
|
||||
def define_disk_readonly(self, dev_id_info, do_readonly):
|
||||
dev = self._get_device_xml_object(VirtualDevice.VIRTUAL_DEV_DISK,
|
||||
dev_id_info)
|
||||
@ -2105,7 +2139,7 @@ class vmmDomainVirtinst(vmmDomainBase):
|
||||
# This whole process is a little funky, since we need a decent
|
||||
# amount of info to determine which specific hostdev to remove
|
||||
|
||||
def found_func(rmdev):
|
||||
def test_func(rmdev):
|
||||
host_type = dev_id_info["type"]
|
||||
addr = dev_id_info.get("address")
|
||||
vend = dev_id_info.get("vendor")
|
||||
@ -2136,15 +2170,18 @@ class vmmDomainVirtinst(vmmDomainBase):
|
||||
|
||||
return False
|
||||
|
||||
found_func = test_func
|
||||
|
||||
elif dev_type == VirtualDevice.VIRTUAL_DEV_VIDEO:
|
||||
model, ram, heads = dev_id_info
|
||||
|
||||
def found_func(rmdev):
|
||||
def test_func(rmdev):
|
||||
return (rmdev.model_type == model and
|
||||
rmdev.vram == ram and
|
||||
rmdev.heads == heads)
|
||||
|
||||
found_func = test_func
|
||||
|
||||
else:
|
||||
raise RuntimeError(_("Unknown device type '%s'") % dev_type)
|
||||
|
||||
|
@ -922,14 +922,14 @@
|
||||
<widget class="GtkTable" id="table5">
|
||||
<property name="visible">True</property>
|
||||
<property name="border_width">3</property>
|
||||
<property name="n_rows">3</property>
|
||||
<property name="n_rows">5</property>
|
||||
<property name="n_columns">2</property>
|
||||
<property name="column_spacing">6</property>
|
||||
<property name="row_spacing">6</property>
|
||||
<child>
|
||||
<widget class="GtkLabel" id="label44">
|
||||
<property name="visible">True</property>
|
||||
<property name="xalign">1</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="label" translatable="yes">Status:</property>
|
||||
</widget>
|
||||
<packing>
|
||||
@ -942,7 +942,7 @@
|
||||
<child>
|
||||
<widget class="GtkLabel" id="label68">
|
||||
<property name="visible">True</property>
|
||||
<property name="xalign">1</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="label" translatable="yes">UUID:</property>
|
||||
</widget>
|
||||
<packing>
|
||||
@ -955,7 +955,7 @@
|
||||
<child>
|
||||
<widget class="GtkLabel" id="label43">
|
||||
<property name="visible">True</property>
|
||||
<property name="xalign">1</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="label" translatable="yes">Name:</property>
|
||||
</widget>
|
||||
<packing>
|
||||
@ -1027,6 +1027,54 @@
|
||||
<property name="y_options">GTK_FILL</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkLabel" id="label24">
|
||||
<property name="visible">True</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="label" translatable="yes">Description:</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="top_attach">3</property>
|
||||
<property name="bottom_attach">4</property>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
<property name="y_options">GTK_FILL</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkScrolledWindow" id="scrolledwindow2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="hscrollbar_policy">automatic</property>
|
||||
<property name="vscrollbar_policy">automatic</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<child>
|
||||
<widget class="GtkTextView" id="overview-description">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="wrap_mode">word</property>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">3</property>
|
||||
<property name="bottom_attach">5</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkAlignment" id="alignment14">
|
||||
<property name="visible">True</property>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="top_attach">4</property>
|
||||
<property name="bottom_attach">5</property>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
|
Loading…
x
Reference in New Issue
Block a user