[virt-tools-list] [virt-manager PATCH 3/3] virtinst: add support for memory device

Pavel Hrdina phrdina at redhat.com
Fri May 5 10:22:25 UTC 2017


This is the actual memory device that is used to hot(un)plug memory
to(from) a guest.

Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
---
 man/virt-install.pod                               |  7 +++
 man/virt-xml.pod                                   |  2 +
 .../compare/virt-install-memory-device-dimm.xml    | 53 ++++++++++++++++++++
 .../compare/virt-install-memory-device-nvdimm.xml  | 55 ++++++++++++++++++++
 tests/clitest.py                                   |  2 +
 virtinst/cli.py                                    | 35 ++++++++++++-
 virtinst/device.py                                 |  4 +-
 virtinst/devicememory.py                           | 58 ++++++++++++++++++++++
 8 files changed, 213 insertions(+), 3 deletions(-)
 create mode 100644 tests/cli-test-xml/compare/virt-install-memory-device-dimm.xml
 create mode 100644 tests/cli-test-xml/compare/virt-install-memory-device-nvdimm.xml
 create mode 100644 virtinst/devicememory.py

diff --git a/man/virt-install.pod b/man/virt-install.pod
index 4ed9684e..02db3435 100644
--- a/man/virt-install.pod
+++ b/man/virt-install.pod
@@ -99,6 +99,8 @@ and 'hotplugmemoryslots'.  The memory parameter is mapped to <currentMemory> ele
 the 'maxmemory' sub-option is mapped to <memory> element and 'hotplugmemorymax'
 and 'hotplugmemoryslots' are mapped to <maxMemory> element.
 
+To configure memory modules which can be hotunplugged see B<--memdev> description.
+
 Use --memory=? to see a list of all available sub options. Complete details at L<http://libvirt.org/formatdomain.html#elementsMemoryAllocation>
 
 =item B<--memorybacking> OPTIONS
@@ -1577,7 +1579,12 @@ Attach a panic notifier device to the guest. For the recommended settings, use:
 
 Use --panic=? to see a list of all available sub options. Complete details at L<http://libvirt.org/formatdomain.html#elementsPanic>
 
+=item B<--memdev> OPTS
 
+Add a memory module to a guest which can be hotunplugged. To add a memdev you need
+to configure hotplugmemory and NUMA for a guest.
+
+Use --memdev=? to see a list of all available sub options. Complete details at L<http://libvirt.org/formatdomain.html#elementsMemory>.
 
 
 =back
diff --git a/man/virt-xml.pod b/man/virt-xml.pod
index fa75cb31..6416eb88 100644
--- a/man/virt-xml.pod
+++ b/man/virt-xml.pod
@@ -222,6 +222,8 @@ Before defining or updating the domain, show the generated XML diff and interact
 
 =item B<--panic>
 
+=item B<--memdev>
+
 =item B<--qemu-commandline>
 
 These options alter the XML for a single class of XML elements. More complete documentation is found in L<virt-install(1)>.
diff --git a/tests/cli-test-xml/compare/virt-install-memory-device-dimm.xml b/tests/cli-test-xml/compare/virt-install-memory-device-dimm.xml
new file mode 100644
index 00000000..73309d92
--- /dev/null
+++ b/tests/cli-test-xml/compare/virt-install-memory-device-dimm.xml
@@ -0,0 +1,53 @@
+<domain type="test">
+  <name>foobar</name>
+  <uuid>00000000-1111-2222-3333-444444444444</uuid>
+  <maxMemory slots="2">2097152</maxMemory>
+  <memory>1048576</memory>
+  <currentMemory>1048576</currentMemory>
+  <vcpu>1</vcpu>
+  <os>
+    <type arch="i686">hvm</type>
+    <boot dev="hd"/>
+  </os>
+  <features>
+    <pae/>
+  </features>
+  <cpu>
+    <numa>
+      <cell cpus="0" memory="1048576"/>
+    </numa>
+  </cpu>
+  <clock offset="utc"/>
+  <pm>
+    <suspend-to-mem enabled="no"/>
+    <suspend-to-disk enabled="no"/>
+  </pm>
+  <devices>
+    <emulator>/usr/bin/test-hv</emulator>
+    <controller type="usb" index="0" model="ich9-ehci1"/>
+    <controller type="usb" index="0" model="ich9-uhci1">
+      <master startport="0"/>
+    </controller>
+    <controller type="usb" index="0" model="ich9-uhci2">
+      <master startport="2"/>
+    </controller>
+    <controller type="usb" index="0" model="ich9-uhci3">
+      <master startport="4"/>
+    </controller>
+    <interface type="user">
+      <mac address="00:11:22:33:44:55"/>
+    </interface>
+    <input type="mouse" bus="ps2"/>
+    <console type="pty"/>
+    <memory model="dimm" access="private">
+      <source>
+        <pagesize>4</pagesize>
+        <nodemask>1-2</nodemask>
+      </source>
+      <target>
+        <size>524288</size>
+        <node>0</node>
+      </target>
+    </memory>
+  </devices>
+</domain>
diff --git a/tests/cli-test-xml/compare/virt-install-memory-device-nvdimm.xml b/tests/cli-test-xml/compare/virt-install-memory-device-nvdimm.xml
new file mode 100644
index 00000000..e70f841e
--- /dev/null
+++ b/tests/cli-test-xml/compare/virt-install-memory-device-nvdimm.xml
@@ -0,0 +1,55 @@
+<domain type="test">
+  <name>foobar</name>
+  <uuid>00000000-1111-2222-3333-444444444444</uuid>
+  <maxMemory slots="2">2097152</maxMemory>
+  <memory>1048576</memory>
+  <currentMemory>1048576</currentMemory>
+  <vcpu>1</vcpu>
+  <os>
+    <type arch="i686">hvm</type>
+    <boot dev="hd"/>
+  </os>
+  <features>
+    <pae/>
+  </features>
+  <cpu>
+    <numa>
+      <cell cpus="0" memory="1048576"/>
+    </numa>
+  </cpu>
+  <clock offset="utc"/>
+  <pm>
+    <suspend-to-mem enabled="no"/>
+    <suspend-to-disk enabled="no"/>
+  </pm>
+  <devices>
+    <emulator>/usr/bin/test-hv</emulator>
+    <controller type="usb" index="0" model="ich9-ehci1"/>
+    <controller type="usb" index="0" model="ich9-uhci1">
+      <master startport="0"/>
+    </controller>
+    <controller type="usb" index="0" model="ich9-uhci2">
+      <master startport="2"/>
+    </controller>
+    <controller type="usb" index="0" model="ich9-uhci3">
+      <master startport="4"/>
+    </controller>
+    <interface type="user">
+      <mac address="00:11:22:33:44:55"/>
+    </interface>
+    <input type="mouse" bus="ps2"/>
+    <console type="pty"/>
+    <memory model="nvdimm">
+      <source>
+        <path>/path/to/nvdimm</path>
+      </source>
+      <target>
+        <size>524288</size>
+        <node>0</node>
+        <label>
+          <size>131072</size>
+        </label>
+      </target>
+    </memory>
+  </devices>
+</domain>
diff --git a/tests/clitest.py b/tests/clitest.py
index 7e76893a..5824a9c2 100644
--- a/tests/clitest.py
+++ b/tests/clitest.py
@@ -558,6 +558,8 @@ c.add_compare(""" \
 
 c = vinst.add_category("memory-hotplug", "--nographics --noautoconsole --import --disk none")
 c.add_compare("--memory 1024,hotplugmemorymax=2048,hotplugmemoryslots=2 --cpu cell0.cpus=0,cell0.memory=1048576", "memory-hotplug")
+c.add_compare("--memory 1024,hotplugmemorymax=2048,hotplugmemoryslots=2 --cpu cell0.cpus=0,cell0.memory=1048576 --memdev dimm,access=private,target_size=512,target_node=0,source_pagesize=4,source_nodemask=1-2", "memory-device-dimm")
+c.add_compare("--memory 1024,hotplugmemorymax=2048,hotplugmemoryslots=2 --cpu cell0.cpus=0,cell0.memory=1048576 --memdev nvdimm,source_path=/path/to/nvdimm,target_size=512,target_node=0,target_label_size=128", "memory-device-nvdimm")
 
 
 ####################################################
diff --git a/virtinst/cli.py b/virtinst/cli.py
index 7d100bdb..7debb4f4 100644
--- a/virtinst/cli.py
+++ b/virtinst/cli.py
@@ -48,6 +48,7 @@ from .devicehostdev import VirtualHostDevice
 from .deviceinput import VirtualInputDevice
 from .deviceinterface import VirtualNetworkInterface
 from .devicememballoon import VirtualMemballoon
+from .devicememory import VirtualMemoryDevice
 from .devicepanic import VirtualPanicDevice
 from .deviceredirdev import VirtualRedirDevice
 from .devicerng import VirtualRNGDevice
@@ -705,6 +706,9 @@ def add_device_options(devg, sound_back_compat=False):
     devg.add_argument("--panic", action="append",
                     help=_("Configure a guest panic device. Ex:\n"
                            "--panic default"))
+    devg.add_argument("--memdev", action="append",
+                    help=_("Configure a guest memory device. Ex:\n"
+                           "--memdev dimm,target_size=1024"))
 
 
 def add_guest_xml_options(geng):
@@ -794,6 +798,10 @@ def _on_off_convert(key, val):
     raise fail(_("%(key)s must be 'yes' or 'no'") % {"key": key})
 
 
+def _set_attribute(obj, attr, val):  # pylint: disable=unused-argument
+    exec("obj." + attr + " = val ")  # pylint: disable=exec-used
+
+
 class _VirtCLIArgument(object):
     """
     A single subargument passed to compound command lines like --disk,
@@ -916,8 +924,7 @@ class _VirtCLIArgument(object):
             self.cb(parser, inst,  # pylint: disable=not-callable
                     self.val, self)
         else:
-            exec(  # pylint: disable=exec-used
-                "inst." + self.attrname + " = self.val")
+            _set_attribute(inst, self.attrname, self.val)
 
     def lookup_param(self, parser, inst):
         """
@@ -2443,6 +2450,30 @@ ParserWatchdog.add_arg("model", "model")
 ParserWatchdog.add_arg("action", "action")
 
 
+####################
+# --memdev parsing #
+####################
+
+class ParseMemdev(VirtCLIParser):
+    cli_arg_name = "memdev"
+    objclass = VirtualMemoryDevice
+    remove_first = "model"
+
+    def set_target_size(self, inst, val, virtarg):
+        _set_attribute(inst, virtarg.attrname, int(val) * 1024)
+
+_register_virt_parser(ParseMemdev)
+ParseMemdev.add_arg("model", "model")
+ParseMemdev.add_arg("access", "access")
+ParseMemdev.add_arg("target.size", "target_size", cb=ParseMemdev.set_target_size)
+ParseMemdev.add_arg("target.node", "target_node")
+ParseMemdev.add_arg("target.label_size", "target_label_size",
+                    cb=ParseMemdev.set_target_size)
+ParseMemdev.add_arg("source.pagesize", "source_pagesize")
+ParseMemdev.add_arg("source.path", "source_path")
+ParseMemdev.add_arg("source.nodemask", "source_nodemask", can_comma=True)
+
+
 ########################
 # --memballoon parsing #
 ########################
diff --git a/virtinst/device.py b/virtinst/device.py
index 807aa543..4f9dcb2c 100644
--- a/virtinst/device.py
+++ b/virtinst/device.py
@@ -123,6 +123,7 @@ class VirtualDevice(XMLBuilder):
     VIRTUAL_DEV_TPM             = "tpm"
     VIRTUAL_DEV_RNG             = "rng"
     VIRTUAL_DEV_PANIC           = "panic"
+    VIRTUAL_DEV_MEMORY          = "memory"
 
     # Ordering in this list is important: it will be the order the
     # Guest class outputs XML. So changing this may upset the test suite
@@ -145,7 +146,8 @@ class VirtualDevice(XMLBuilder):
                             VIRTUAL_DEV_MEMBALLOON,
                             VIRTUAL_DEV_TPM,
                             VIRTUAL_DEV_RNG,
-                            VIRTUAL_DEV_PANIC]
+                            VIRTUAL_DEV_PANIC,
+                            VIRTUAL_DEV_MEMORY]
 
     virtual_device_classes = {}
 
diff --git a/virtinst/devicememory.py b/virtinst/devicememory.py
new file mode 100644
index 00000000..577c589c
--- /dev/null
+++ b/virtinst/devicememory.py
@@ -0,0 +1,58 @@
+#
+# Copyright 2017 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301 USA.
+
+
+from .device import VirtualDevice
+from .xmlbuilder import XMLBuilder, XMLChildProperty, XMLProperty
+
+
+class VirtualMemoryTarget(XMLBuilder):
+    _XML_ROOT_NAME = "target"
+
+    size = XMLProperty("./size", is_int=True)
+    node = XMLProperty("./node", is_int=True)
+    label_size = XMLProperty("./label/size", is_int=True)
+
+
+class VirtualMemorySource(XMLBuilder):
+    _XML_ROOT_NAME = "source"
+
+    pagesize = XMLProperty("./pagesize", is_int=True)
+    nodemask = XMLProperty("./nodemask")
+    path = XMLProperty("./path")
+
+
+class VirtualMemoryDevice(VirtualDevice):
+    virtual_device_type = VirtualDevice.VIRTUAL_DEV_MEMORY
+
+    MODEL_DIMM = "dimm"
+    MODEL_NVDIMM = "nvdimm"
+    models = [MODEL_DIMM, MODEL_NVDIMM]
+
+    ACCESS_SHARED = "shared"
+    ACCESS_PRIVATE = "private"
+    accesses = [ACCESS_SHARED, ACCESS_PRIVATE]
+
+    model = XMLProperty("./@model")
+    access = XMLProperty("./@access")
+
+    source = XMLChildProperty(VirtualMemorySource, is_single=True)
+    target = XMLChildProperty(VirtualMemoryTarget, is_single=True)
+
+
+VirtualMemoryDevice.register_type()
-- 
2.12.2




More information about the virt-tools-list mailing list