From 65f93e5d60c5076aeba8a3059db4832e4e0db5de Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Thu, 10 Sep 2020 12:06:13 -0400 Subject: [PATCH] cli: support --sysinfo type=fwcfg,entry... Signed-off-by: Cole Robinson --- .../virt-install-singleton-config-3.xml | 3 ++ tests/test_cli.py | 2 ++ virtinst/cli.py | 32 +++++++++++++++++-- virtinst/domain/sysinfo.py | 10 +++++- virtinst/guest.py | 2 +- 5 files changed, 44 insertions(+), 5 deletions(-) diff --git a/tests/data/cli/compare/virt-install-singleton-config-3.xml b/tests/data/cli/compare/virt-install-singleton-config-3.xml index cc26ff3b6..d2e7a363a 100644 --- a/tests/data/cli/compare/virt-install-singleton-config-3.xml +++ b/tests/data/cli/compare/virt-install-singleton-config-3.xml @@ -38,6 +38,9 @@ Chassis + + baz + hvm /tmp/foo diff --git a/tests/test_cli.py b/tests/test_cli.py index 7006e2839..7f8d23907 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -540,6 +540,7 @@ memnode0.cellid=1,memnode0.mode=strict,memnode0.nodeset=2 --sysinfo type=smbios,baseBoard_manufacturer="Acme Corp.",baseBoard_product=Motherboard,baseBoard_version=A01,baseBoard_serial=1234-5678,baseBoard_asset=Tag,baseBoard_location=Chassis --sysinfo type=smbios,chassis.manufacturer="Chassis Corp.",chassis.serial=1234chassis,chassis.asset=chasset,chassis.sku=chassku,chassis.version=4.0 --sysinfo type=smbios,oemStrings.entry2="complicated parsing, foo=bar",oemStrings.entry1=test1,oemStrings.entry0=test0 + --pm suspend_to_mem=yes,suspend_to_disk=no --resource partition=/virtualmachines/production --events on_poweroff=destroy,on_reboot=restart,on_crash=preserve,on_lockfailure=ignore @@ -576,6 +577,7 @@ c.add_compare(""" --memballoon default --sysinfo bios.vendor="Acme LLC",bios.version=1.2.3,bios.date=01/01/1970,bios.release=10.22,system.manufacturer="Acme Inc.",system.product=Computer,system.version=3.2.1,system.serial=123456789,system.uuid=00000000-1111-2222-3333-444444444444,system.sku=abc-123,system.family=Server,baseBoard.manufacturer="Acme Corp.",baseBoard.product=Motherboard,baseBoard.version=A01,baseBoard.serial=1234-5678,baseBoard.asset=Tag,baseBoard.location=Chassis +--sysinfo type=fwcfg,entry0.name=foo,entry0.file=bar,entry0=baz """, "singleton-config-3", predefine_check="5.7.0") diff --git a/virtinst/cli.py b/virtinst/cli.py index 8eaaee1d0..4a49a38dd 100644 --- a/virtinst/cli.py +++ b/virtinst/cli.py @@ -2837,13 +2837,24 @@ class ParserSysinfo(VirtCLIParser): "baseBoard.location": "baseBoard_location", } - def _parse(self, inst): + def parse(self, inst): if self.optstr and 'type' not in self.optdict: # If any string specified, default to type=smbios otherwise # libvirt errors. User args can still override this though self.optdict['type'] = 'smbios' - return super()._parse(inst) + # Previously libvirt treated sysinfo as a singleton object, but + # that changed with fwcfg support. Our cli would merge all options + # together but now needs to support multiple. Maintain sorta + # backcompat behavior by mergin options if 'type' matches + if not inst: + typ = self.optdict["type"] + for sysinfo in self.guest.sysinfo: + if sysinfo.type == typ: + inst = sysinfo + break + + return super().parse(inst) ################### @@ -2874,6 +2885,14 @@ class ParserSysinfo(VirtCLIParser): cb = self._make_find_inst_cb(cliarg, list_propname) return cb(*args, **kwargs) + def entry_find_inst_cb(self, *args, **kwargs): + # pylint: disable=protected-access + cliarg = "entry" # entry[0-9]* + list_propname = "entries" # sysinfo.entries + cb = self._make_find_inst_cb(cliarg, list_propname) + return cb(*args, **kwargs) + + @classmethod def _init_class(cls, **kwargs): VirtCLIParser._init_class(**kwargs) @@ -2909,9 +2928,16 @@ class ParserSysinfo(VirtCLIParser): cls.add_arg("chassis.asset", "chassis_asset") cls.add_arg("chassis.sku", "chassis_sku") - cls.add_arg("oemStrings.entry[0-9]", "value", can_comma=True, + cls.add_arg("oemStrings.entry[0-9]*", "value", can_comma=True, find_inst_cb=cls.oem_find_inst_cb) + cls.add_arg("entry[0-9]*", "value", can_comma=True, + find_inst_cb=cls.entry_find_inst_cb) + cls.add_arg("entry[0-9]*.name", "name", can_comma=True, + find_inst_cb=cls.entry_find_inst_cb) + cls.add_arg("entry[0-9]*.file", "file", can_comma=True, + find_inst_cb=cls.entry_find_inst_cb) + ############################## # --qemu-commandline parsing # diff --git a/virtinst/domain/sysinfo.py b/virtinst/domain/sysinfo.py index c2eb147f3..f13c25b03 100644 --- a/virtinst/domain/sysinfo.py +++ b/virtinst/domain/sysinfo.py @@ -10,7 +10,13 @@ from ..xmlbuilder import XMLBuilder, XMLChildProperty, XMLProperty class _SysinfoEntry(XMLBuilder): XML_NAME = "entry" + name = XMLProperty("./@name") value = XMLProperty(".") + file = XMLProperty("./@file") + + +class _SysinfoOemString(_SysinfoEntry): + pass class DomainSysinfo(XMLBuilder): @@ -57,4 +63,6 @@ class DomainSysinfo(XMLBuilder): chassis_asset = XMLProperty("./chassis/entry[@name='asset']") chassis_sku = XMLProperty("./chassis/entry[@name='sku']") - oemStrings = XMLChildProperty(_SysinfoEntry, relative_xpath="./oemStrings") + oemStrings = XMLChildProperty( + _SysinfoOemString, relative_xpath="./oemStrings") + entries = XMLChildProperty(_SysinfoEntry) diff --git a/virtinst/guest.py b/virtinst/guest.py index 9df0e828e..3269f72e3 100644 --- a/virtinst/guest.py +++ b/virtinst/guest.py @@ -277,7 +277,7 @@ class Guest(XMLBuilder): memoryBacking = XMLChildProperty(DomainMemoryBacking, is_single=True) idmap = XMLChildProperty(DomainIdmap, is_single=True) resource = XMLChildProperty(DomainResource, is_single=True) - sysinfo = XMLChildProperty(DomainSysinfo, is_single=True) + sysinfo = XMLChildProperty(DomainSysinfo) launchSecurity = XMLChildProperty(DomainLaunchSecurity, is_single=True) _metadata = XMLChildProperty(DomainMetadata, is_single=True)