Allow viewing and setting domain 'description' field.

This commit is contained in:
Cole Robinson 2010-02-10 12:16:59 -05:00
parent 4da1af635a
commit 0273c0c501
3 changed files with 110 additions and 9 deletions

View File

@ -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())

View File

@ -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)

View File

@ -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>