summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMenno Lageman <menno.lageman@oracle.com>2018-01-22 13:36:00 +0100
committerCole Robinson <crobinso@redhat.com>2018-01-30 11:19:54 -0500
commitae5239358a1c162921eb4698c088e28e767fc68b (patch)
treee8b70321a68214d64c4924c2494456e303a9b9f3
parentcb6fc2021037f41d6fcb4ea9b520906bc0a97ab9 (diff)
downloadvirt-manager-ae5239358a1c162921eb4698c088e28e767fc68b.tar.gz
virtinst: Add NUMA distance support
Now that libvirt has support for administration of distances between NUMA cells it would be nice to be able to set those with virt-install directly instead of having to 'virsh edit' the domain XML manually after installation. For example --cpu cell0.memory=1234,cell0.cpus=0-3,cell1.memory=5678,cell1.cpus=4-7,\ cell0.distances.sibling0.id=0,cell0.distances.sibling0.value=10,\ cell0.distances.sibling1.id=1,cell0.distances.sibling1.value=21,\ cell1.distances.sibling0.id=0,cell1.distances.sibling0.value=21,\ cell1.distances.sibling1.id=1,cell1.distances.sibling1.value=10 would generate the following XML: <cpu> <numa> <cell cpus="0-3" memory="1234"> <distances> <sibling id="0" value="10"/> <sibling id="1" value="21"/> </distances> </cell> <cell cpus="4-7" memory="5678"> <distances> <sibling id="0" value="21"/> <sibling id="1" value="10"/> </distances> </cell> </numa> </cpu> Signed-off-by: Menno Lageman <menno.lageman@oracle.com> (crobinso: rework cli format, drop some validation, drop man changes)
-rw-r--r--tests/cli-test-xml/compare/virt-install-singleton-config-2.xml28
-rw-r--r--tests/clitest.py9
-rw-r--r--virtinst/cli.py14
-rw-r--r--virtinst/cpu.py17
4 files changed, 63 insertions, 5 deletions
diff --git a/tests/cli-test-xml/compare/virt-install-singleton-config-2.xml b/tests/cli-test-xml/compare/virt-install-singleton-config-2.xml
index c2c641e4..3b9210f5 100644
--- a/tests/cli-test-xml/compare/virt-install-singleton-config-2.xml
+++ b/tests/cli-test-xml/compare/virt-install-singleton-config-2.xml
@@ -92,8 +92,18 @@
<feature policy="forbid" name="foo"/>
<feature policy="forbid" name="bar"/>
<numa>
- <cell id="0" cpus="1,2,3" memory="1024"/>
- <cell id="1" cpus="5-8" memory="256"/>
+ <cell id="0" cpus="1,2,3" memory="1024">
+ <distances>
+ <sibling id="0" value="10"/>
+ <sibling id="1" value="21"/>
+ </distances>
+ </cell>
+ <cell id="1" cpus="5-8" memory="256">
+ <distances>
+ <sibling id="0" value="21"/>
+ <sibling id="1" value="10"/>
+ </distances>
+ </cell>
</numa>
<cache mode="emulate" level="3"/>
</cpu>
@@ -247,8 +257,18 @@
<feature policy="forbid" name="foo"/>
<feature policy="forbid" name="bar"/>
<numa>
- <cell id="0" cpus="1,2,3" memory="1024"/>
- <cell id="1" cpus="5-8" memory="256"/>
+ <cell id="0" cpus="1,2,3" memory="1024">
+ <distances>
+ <sibling id="0" value="10"/>
+ <sibling id="1" value="21"/>
+ </distances>
+ </cell>
+ <cell id="1" cpus="5-8" memory="256">
+ <distances>
+ <sibling id="0" value="21"/>
+ <sibling id="1" value="10"/>
+ </distances>
+ </cell>
</numa>
<cache mode="emulate" level="3"/>
</cpu>
diff --git a/tests/clitest.py b/tests/clitest.py
index 94b6cbb4..a7d38b6d 100644
--- a/tests/clitest.py
+++ b/tests/clitest.py
@@ -422,7 +422,14 @@ c.add_compare(""" \
c.add_compare("""--pxe \
--memory 512,maxmemory=1024 \
--vcpus 4,cores=2,threads=2,sockets=2 \
---cpu foobar,+x2apic,+x2apicagain,-distest,forbid=foo,forbid=bar,disable=distest2,optional=opttest,require=reqtest,match=strict,vendor=meee,cell.id=0,cell.cpus=1,2,3,cell.memory=1024,cell1.id=1,cell1.memory=256,cell1.cpus=5-8,cache.mode=emulate,cache.level=3 \
+--cpu foobar,+x2apic,+x2apicagain,-distest,forbid=foo,forbid=bar,disable=distest2,optional=opttest,require=reqtest,match=strict,vendor=meee,\
+cell.id=0,cell.cpus=1,2,3,cell.memory=1024,\
+cell1.id=1,cell1.memory=256,cell1.cpus=5-8,\
+cell0.distances.sibling0.id=0,cell0.distances.sibling0.value=10,\
+cell0.distances.sibling1.id=1,cell0.distances.sibling1.value=21,\
+cell1.distances.sibling0.id=0,cell1.distances.sibling0.value=21,\
+cell1.distances.sibling1.id=1,cell1.distances.sibling1.value=10,\
+cache.mode=emulate,cache.level=3 \
--metadata title=my-title,description=my-description,uuid=00000000-1111-2222-3333-444444444444 \
--boot cdrom,fd,hd,network,menu=off,loader=/foo/bar \
--idmap uid_start=0,uid_target=1000,uid_count=10,gid_start=0,gid_target=1000,gid_count=10 \
diff --git a/virtinst/cli.py b/virtinst/cli.py
index 4d13e659..50b366e6 100644
--- a/virtinst/cli.py
+++ b/virtinst/cli.py
@@ -1464,6 +1464,16 @@ class ParserCPU(VirtCLIParser):
cb = self._make_find_inst_cb(cliarg, objpropname, objaddfn)
return cb(*args, **kwargs)
+ def sibling_find_inst_cb(self, inst, *args, **kwargs):
+ cell = self.cell_find_inst_cb(inst, *args, **kwargs)
+ inst = cell
+
+ cliarg = "sibling" # cell[0-9]*.distances.sibling[0-9]*
+ objpropname = "siblings" # cell.siblings
+ objaddfn = "add_sibling" # cell.add_sibling
+ cb = self._make_find_inst_cb(cliarg, objpropname, objaddfn)
+ return cb(inst, *args, **kwargs)
+
def set_model_cb(self, inst, val, virtarg):
if val == "host":
val = inst.SPECIAL_MODE_HOST_MODEL
@@ -1542,6 +1552,10 @@ ParserCPU.add_arg("cpus", "cell[0-9]*.cpus", can_comma=True,
find_inst_cb=ParserCPU.cell_find_inst_cb)
ParserCPU.add_arg("memory", "cell[0-9]*.memory",
find_inst_cb=ParserCPU.cell_find_inst_cb)
+ParserCPU.add_arg("id", "cell[0-9]*.distances.sibling[0-9]*.id",
+ find_inst_cb=ParserCPU.sibling_find_inst_cb)
+ParserCPU.add_arg("value", "cell[0-9]*.distances.sibling[0-9]*.value",
+ find_inst_cb=ParserCPU.sibling_find_inst_cb)
# Options for CPU.cache
ParserCPU.add_arg("mode", "cache.mode", find_inst_cb=ParserCPU.set_l3_cache_cb)
diff --git a/virtinst/cpu.py b/virtinst/cpu.py
index 049f8cfb..70ea5647 100644
--- a/virtinst/cpu.py
+++ b/virtinst/cpu.py
@@ -20,6 +20,17 @@
from .xmlbuilder import XMLBuilder, XMLProperty, XMLChildProperty
+class _CPUCellSibling(XMLBuilder):
+ """
+ Class for generating <distances> <sibling> nodes
+ """
+ _XML_ROOT_NAME = "sibling"
+ _XML_PROP_ORDER = ["id", "value"]
+
+ id = XMLProperty("./@id", is_int=True)
+ value = XMLProperty("./@value", is_int=True)
+
+
class _CPUCell(XMLBuilder):
"""
Class for generating <cpu><numa> child <cell> XML
@@ -30,6 +41,12 @@ class _CPUCell(XMLBuilder):
id = XMLProperty("./@id", is_int=True)
cpus = XMLProperty("./@cpus")
memory = XMLProperty("./@memory", is_int=True)
+ siblings = XMLChildProperty(_CPUCellSibling, relative_xpath="./distances")
+
+ def add_sibling(self):
+ obj = _CPUCellSibling(self.conn)
+ self.add_child(obj)
+ return obj
class CPUCache(XMLBuilder):