Blob Blame History Raw
From 20313689571aafbc000318addb7f5b3799d273ef Mon Sep 17 00:00:00 2001
From: Pavel Hrdina <phrdina@redhat.com>
Date: Thu, 4 May 2017 13:08:14 +0200
Subject: virtinst: introduce support for <maxMemory> element

This element controls hot(un)plugable memory for the guest in
addition to the initial memory configured by <memory> element.

One has to configure <maxMemory> and guest numa nodes using <numa>
element to enable hot(un)plug of memory modules.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
(cherry picked from commit 3ebbeef80ee089cfa8b7f0861828d4e2bf100946)

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1281526

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
---
 man/virt-install.pod                               |  7 +++-
 .../compare/virt-install-memory-hotplug.xml        | 43 ++++++++++++++++++++++
 tests/clitest.py                                   |  7 ++++
 virtinst/cli.py                                    |  7 +++-
 virtinst/guest.py                                  |  8 ++--
 5 files changed, 66 insertions(+), 6 deletions(-)
 create mode 100644 tests/cli-test-xml/compare/virt-install-memory-hotplug.xml

diff --git a/man/virt-install.pod b/man/virt-install.pod
index 7167775f..effe33f8 100644
--- a/man/virt-install.pod
+++ b/man/virt-install.pod
@@ -93,8 +93,11 @@ running C<virt-install>.
 
 =item B<--memory> OPTIONS
 
-Memory to allocate for the guest, in MiB. Sub options are available,
-like 'maxmemory' and 'hugepages'. This deprecates the -r/--ram option.
+Memory to allocate for the guest, in MiB. This deprecates the -r/--ram option.
+Sub options are available, like 'maxmemory', 'hugepages', 'hotplugmemorymax'
+and 'hotplugmemoryslots'.  The memory parameter is mapped to <currentMemory> element,
+the 'maxmemory' sub-option is mapped to <memory> element and 'hotplugmemorymax'
+and 'hotplugmemoryslots' are mapped to <maxMemory> element.
 
 Use --memory=? to see a list of all available sub options. Complete details at L<http://libvirt.org/formatdomain.html#elementsMemoryAllocation>
 
diff --git a/tests/cli-test-xml/compare/virt-install-memory-hotplug.xml b/tests/cli-test-xml/compare/virt-install-memory-hotplug.xml
new file mode 100644
index 00000000..a4c7356d
--- /dev/null
+++ b/tests/cli-test-xml/compare/virt-install-memory-hotplug.xml
@@ -0,0 +1,43 @@
+<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"/>
+  </devices>
+</domain>
diff --git a/tests/clitest.py b/tests/clitest.py
index 20dccd77..9f7391b6 100644
--- a/tests/clitest.py
+++ b/tests/clitest.py
@@ -552,6 +552,13 @@ c.add_compare(""" \
 """, "spice-gl", compare_check=support.SUPPORT_CONN_VMPORT)
 
 
+######################################
+# Memory hot(un)plug install options #
+######################################
+
+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")
+
 
 ####################################################
 # CPU/RAM/numa and other singleton VM config tests #
diff --git a/virtinst/cli.py b/virtinst/cli.py
index e5097f8d..fe7d21bd 100644
--- a/virtinst/cli.py
+++ b/virtinst/cli.py
@@ -595,7 +595,9 @@ def add_memory_option(grp, backcompat=False):
     grp.add_argument("--memory",
         help=_("Configure guest memory allocation. Ex:\n"
                "--memory 1024 (in MiB)\n"
-               "--memory 512,maxmemory=1024"))
+               "--memory 512,maxmemory=1024\n"
+               "--memory 512,maxmemory=1024,hotplugmemorymax=2048,"
+               "hotplugmemoryslots=2"))
     if backcompat:
         grp.add_argument("-r", "--ram", type=int, dest="oldmemory",
             help=argparse.SUPPRESS)
@@ -1351,6 +1353,9 @@ _register_virt_parser(ParserMemory)
 ParserMemory.add_arg("memory", "memory", cb=ParserMemory.set_memory_cb)
 ParserMemory.add_arg("maxmemory", "maxmemory", cb=ParserMemory.set_memory_cb)
 ParserMemory.add_arg("memoryBacking.hugepages", "hugepages", is_onoff=True)
+ParserMemory.add_arg("hotplugmemorymax", "hotplugmemorymax",
+                     cb=ParserMemory.set_memory_cb)
+ParserMemory.add_arg("hotplugmemoryslots", "hotplugmemoryslots")
 
 
 #####################
diff --git a/virtinst/guest.py b/virtinst/guest.py
index f3e3b092..0c63434a 100644
--- a/virtinst/guest.py
+++ b/virtinst/guest.py
@@ -105,9 +105,9 @@ class Guest(XMLBuilder):
 
     _XML_ROOT_NAME = "domain"
     _XML_PROP_ORDER = ["type", "name", "uuid", "title", "description",
-        "maxmemory", "memory", "blkiotune", "memtune", "memoryBacking",
-        "vcpus", "curvcpus", "vcpu_placement", "cpuset",
-        "numatune", "resource", "sysinfo", "bootloader", "os", "idmap",
+        "hotplugmemorymax", "hotplugmemoryslots", "maxmemory", "memory", "blkiotune",
+        "memtune", "memoryBacking", "vcpus", "curvcpus", "vcpu_placement",
+        "cpuset", "numatune", "resource", "sysinfo", "bootloader", "os", "idmap",
         "features", "cpu", "clock", "on_poweroff", "on_reboot", "on_crash",
         "pm", "emulator", "_devices", "seclabels"]
 
@@ -163,6 +163,8 @@ class Guest(XMLBuilder):
                          default_cb=lambda s: 1,
                          set_converter=_set_memory)
     maxmemory = XMLProperty("./memory", is_int=True)
+    hotplugmemorymax = XMLProperty("./maxMemory", is_int=True)
+    hotplugmemoryslots = XMLProperty("./maxMemory/@slots", is_int=True)
 
     def _set_vcpus(self, val):
         if val is None:
-- 
2.13.0