[PATCH v3 0/5] Introduce network backed NVRAM

Libvirt domain XML currently allows only local filepaths that can be used to specify a NVRAM disk. It should be possible to support NVRAM disks on network storage as it would give flexibility to start the VM on any host without having to worry about where to get the latest nvram image. This series extends the NVRAM element to support hosting over network-backed disks. It achieves this by embedding virStorageSource pointer for nvram into _virDomainLoaderDef. It introduces a 'type' attribute for NVRAM element to specify 'file' vs 'network' backed NVRAM. XML with new annotation: <nvram type='network'> <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-nopool/0'> <host name='example.com' port='6000'/> <auth username='myname'> <secret type='iscsi' usage='mycluster_myname'/> </auth> </host> </source> </nvram> or <nvram type='network'> <source protocol='nbd' name='bar'> <host name='example.org' port='6000'/> </source> </nvram> or <nvram type='file'> <source file='/var/lib/libvirt/nvram/guest_VARS.fd'/> </nvram> Changes v1->v2: - Split the patch into smaller patches - Added unit test - Updated the doc - Addressed Peter's comment on v1 (https://listman.redhat.com/archives/libvir-list/2022-March/229684.html) Changes v2->v3: - Added authentication with 'iscsi' protocol unit test - Updated the validation logic - Addressed Peter's other comments on v2 patch(https://listman.redhat.com/archives/libvir-list/2022-April/229971.html) Rohit Kumar (5): Make NVRAM a virStorageSource type. Add support to parse/format/validate virStorageSource type NVRAM Update schema, docs, and validation logic to support network backed NVRAM Add unit tests for network backed NVRAM Add unit test to support new 'file' type NVRAM NEWS.rst | 5 + docs/formatdomain.rst | 34 +++++- src/conf/domain_conf.c | 115 +++++++++++++++--- src/conf/domain_conf.h | 3 +- src/conf/schemas/domaincommon.rng | 21 +++- src/qemu/qemu_cgroup.c | 3 +- src/qemu/qemu_command.c | 2 +- src/qemu/qemu_domain.c | 23 +++- src/qemu/qemu_driver.c | 5 +- src/qemu/qemu_firmware.c | 23 +++- src/qemu/qemu_namespace.c | 5 +- src/qemu/qemu_process.c | 5 +- src/qemu/qemu_validate.c | 71 +++++++++++ src/security/security_dac.c | 6 +- src/security/security_selinux.c | 6 +- src/security/virt-aa-helper.c | 5 +- src/vbox/vbox_common.c | 3 +- .../bios-nvram-file.x86_64-latest.args | 37 ++++++ tests/qemuxml2argvdata/bios-nvram-file.xml | 23 ++++ .../bios-nvram-network-iscsi.x86_64-4.1.0.err | 1 + ...ios-nvram-network-iscsi.x86_64-latest.args | 38 ++++++ .../bios-nvram-network-iscsi.xml | 31 +++++ .../bios-nvram-network-nbd.x86_64-latest.args | 37 ++++++ .../bios-nvram-network-nbd.xml | 28 +++++ tests/qemuxml2argvtest.c | 4 + .../bios-nvram-file.x86_64-latest.xml | 39 ++++++ ...bios-nvram-network-iscsi.x86_64-latest.xml | 44 +++++++ .../bios-nvram-network-nbd.x86_64-latest.xml | 41 +++++++ tests/qemuxml2xmltest.c | 3 + 29 files changed, 618 insertions(+), 43 deletions(-) create mode 100644 tests/qemuxml2argvdata/bios-nvram-file.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/bios-nvram-file.xml create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-iscsi.x86_64-4.1.0.err create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-iscsi.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-iscsi.xml create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-nbd.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-nbd.xml create mode 100644 tests/qemuxml2xmloutdata/bios-nvram-file.x86_64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/bios-nvram-network-iscsi.x86_64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/bios-nvram-network-nbd.x86_64-latest.xml -- 2.25.1

Currently, libvirt allows only local filepaths to specify a NVRAM disk. Making it virStorageSource type would allow to support remote NVRAM disk. Signed-off-by: Prerna Saxena <prerna.saxena@nutanix.com> Signed-off-by: Florian Schmidt <flosch@nutanix.com> Signed-off-by: Rohit Kumar <rohit.kumar3@nutanix.com> --- src/conf/domain_conf.c | 13 ++++++++++--- src/conf/domain_conf.h | 2 +- src/qemu/qemu_cgroup.c | 3 ++- src/qemu/qemu_command.c | 2 +- src/qemu/qemu_domain.c | 14 ++++++++------ src/qemu/qemu_driver.c | 5 +++-- src/qemu/qemu_firmware.c | 17 ++++++++++++----- src/qemu/qemu_namespace.c | 5 +++-- src/qemu/qemu_process.c | 5 +++-- src/security/security_dac.c | 6 ++++-- src/security/security_selinux.c | 6 ++++-- src/security/virt-aa-helper.c | 5 +++-- src/vbox/vbox_common.c | 3 ++- 13 files changed, 56 insertions(+), 30 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index bd2884088c..bdd36e777c 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -3540,7 +3540,7 @@ virDomainLoaderDefFree(virDomainLoaderDef *loader) return; g_free(loader->path); - g_free(loader->nvram); + virObjectUnref(loader->nvram); g_free(loader->nvramTemplate); g_free(loader); } @@ -18226,7 +18226,11 @@ virDomainDefParseBootLoaderOptions(virDomainDef *def, fwAutoSelect) < 0) return -1; - def->os.loader->nvram = virXPathString("string(./os/nvram[1])", ctxt); + if (virXPathNode("./os/nvram[1]", ctxt)) { + def->os.loader->nvram = virStorageSourceNew(); + def->os.loader->nvram->path = virXPathString("string(./os/nvram[1])", ctxt); + def->os.loader->nvram->type = VIR_STORAGE_TYPE_FILE; + } if (!fwAutoSelect) def->os.loader->nvramTemplate = virXPathString("string(./os/nvram[1]/@template)", ctxt); @@ -26931,7 +26935,10 @@ virDomainLoaderDefFormat(virBuffer *buf, virXMLFormatElementInternal(buf, "loader", &loaderAttrBuf, &loaderChildBuf, false, false); virBufferEscapeString(&nvramAttrBuf, " template='%s'", loader->nvramTemplate); - virBufferEscapeString(&nvramChildBuf, "%s", loader->nvram); + if (loader->nvram) { + if (loader->nvram->type == VIR_STORAGE_TYPE_FILE) + virBufferEscapeString(&nvramChildBuf, "%s", loader->nvram->path); + } virXMLFormatElementInternal(buf, "nvram", &nvramAttrBuf, &nvramChildBuf, false, false); } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 88a411d00c..3a3164db9c 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2235,7 +2235,7 @@ struct _virDomainLoaderDef { virTristateBool readonly; virDomainLoader type; virTristateBool secure; - char *nvram; /* path to non-volatile RAM */ + virStorageSource *nvram; char *nvramTemplate; /* user override of path to master nvram */ }; diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index aa0c927578..64baed14e6 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -581,7 +581,8 @@ qemuSetupFirmwareCgroup(virDomainObj *vm) return -1; if (vm->def->os.loader->nvram && - qemuSetupImagePathCgroup(vm, vm->def->os.loader->nvram, false) < 0) + virStorageSourceIsLocalStorage(vm->def->os.loader->nvram) && + qemuSetupImagePathCgroup(vm, vm->def->os.loader->nvram->path, false) < 0) return -1; return 0; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 3746f02ff0..419b8243d6 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -9642,7 +9642,7 @@ qemuBuildDomainLoaderPflashCommandLine(virCommand *cmd, if (loader->nvram) { virBufferAddLit(&buf, "file="); - virQEMUBuildBufferEscapeComma(&buf, loader->nvram); + virQEMUBuildBufferEscapeComma(&buf, loader->nvram->path); virBufferAsprintf(&buf, ",if=pflash,format=raw,unit=%d", unit); virCommandAddArg(cmd, "-drive"); diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 7974cdb00b..9dccbbfb1a 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4639,8 +4639,12 @@ qemuDomainDefPostParse(virDomainDef *def, } if (virDomainDefHasOldStyleROUEFI(def) && - !def->os.loader->nvram) - qemuDomainNVRAMPathFormat(cfg, def, &def->os.loader->nvram); + (!def->os.loader->nvram || !def->os.loader->nvram->path)) { + if (!def->os.loader->nvram) + def->os.loader->nvram = virStorageSourceNew(); + def->os.loader->nvram->type = VIR_STORAGE_TYPE_FILE; + qemuDomainNVRAMPathFormat(cfg, def, &def->os.loader->nvram->path); + } if (qemuDomainDefAddDefaultDevices(driver, def, qemuCaps) < 0) return -1; @@ -11274,11 +11278,9 @@ qemuDomainInitializePflashStorageSource(virDomainObj *vm) if (def->os.loader->nvram) { - pflash1 = virStorageSourceNew(); - pflash1->type = VIR_STORAGE_TYPE_FILE; + if (!(pflash1 = virStorageSourceCopy(def->os.loader->nvram, false))) + return -1; pflash1->format = VIR_STORAGE_FILE_RAW; - pflash1->path = g_strdup(def->os.loader->nvram); - pflash1->readonly = false; pflash1->nodeformat = g_strdup("libvirt-pflash1-format"); pflash1->nodestorage = g_strdup("libvirt-pflash1-storage"); } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ee0963c30d..da6824dde1 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6615,8 +6615,9 @@ qemuDomainUndefineFlags(virDomainPtr dom, } } - if (vm->def->os.loader && vm->def->os.loader->nvram) { - nvram_path = g_strdup(vm->def->os.loader->nvram); + if (vm->def->os.loader && vm->def->os.loader->nvram && + virStorageSourceIsLocalStorage(vm->def->os.loader->nvram)) { + nvram_path = g_strdup(vm->def->os.loader->nvram->path); } else if (vm->def->os.firmware == VIR_DOMAIN_OS_DEF_FIRMWARE_EFI) { qemuDomainNVRAMPathFormat(cfg, vm->def, &nvram_path); } diff --git a/src/qemu/qemu_firmware.c b/src/qemu/qemu_firmware.c index 51223faadf..ab5151dc9f 100644 --- a/src/qemu/qemu_firmware.c +++ b/src/qemu/qemu_firmware.c @@ -1192,13 +1192,16 @@ qemuFirmwareEnableFeatures(virQEMUDriver *driver, VIR_FREE(def->os.loader->nvramTemplate); def->os.loader->nvramTemplate = g_strdup(flash->nvram_template.filename); - if (!def->os.loader->nvram) - qemuDomainNVRAMPathFormat(cfg, def, &def->os.loader->nvram); + if (!def->os.loader->nvram) { + def->os.loader->nvram = virStorageSourceNew(); + def->os.loader->nvram->type = VIR_STORAGE_TYPE_FILE; + qemuDomainNVRAMPathFormat(cfg, def, &def->os.loader->nvram->path); + } VIR_DEBUG("decided on firmware '%s' template '%s' NVRAM '%s'", def->os.loader->path, def->os.loader->nvramTemplate, - def->os.loader->nvram); + def->os.loader->nvram->path); break; case QEMU_FIRMWARE_DEVICE_KERNEL: @@ -1364,8 +1367,12 @@ qemuFirmwareFillDomain(virQEMUDriver *driver, * its path in domain XML) but no template for NVRAM was * specified and the varstore doesn't exist ... */ if (!virDomainDefHasOldStyleROUEFI(def) || - def->os.loader->nvramTemplate || - (!reset_nvram && virFileExists(def->os.loader->nvram))) + def->os.loader->nvramTemplate) + return 0; + + if (!reset_nvram && def->os.loader->nvram && + virStorageSourceIsLocalStorage(def->os.loader->nvram) && + virFileExists(def->os.loader->nvram->path)) return 0; /* ... then we want to consult JSON FW descriptors first, diff --git a/src/qemu/qemu_namespace.c b/src/qemu/qemu_namespace.c index 23681b14a4..9e133587b7 100644 --- a/src/qemu/qemu_namespace.c +++ b/src/qemu/qemu_namespace.c @@ -572,8 +572,9 @@ qemuDomainSetupLoader(virDomainObj *vm, case VIR_DOMAIN_LOADER_TYPE_PFLASH: *paths = g_slist_prepend(*paths, g_strdup(loader->path)); - if (loader->nvram) - *paths = g_slist_prepend(*paths, g_strdup(loader->nvram)); + if (loader->nvram && + virStorageSourceIsLocalStorage(loader->nvram)) + *paths = g_slist_prepend(*paths, g_strdup(loader->nvram->path)); break; case VIR_DOMAIN_LOADER_TYPE_NONE: diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index b0b00eb0a2..fee3d9ba73 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4471,7 +4471,8 @@ qemuPrepareNVRAM(virQEMUDriver *driver, struct qemuPrepareNVRAMHelperData data; if (!loader || !loader->nvram || - (virFileExists(loader->nvram) && !reset_nvram)) + !virStorageSourceIsLocalStorage(loader->nvram) || + (virFileExists(loader->nvram->path) && !reset_nvram)) return 0; master_nvram_path = loader->nvramTemplate; @@ -4503,7 +4504,7 @@ qemuPrepareNVRAM(virQEMUDriver *driver, data.srcFD = srcFD; data.srcPath = master_nvram_path; - if (virFileRewrite(loader->nvram, + if (virFileRewrite(loader->nvram->path, S_IRUSR | S_IWUSR, cfg->user, cfg->group, qemuPrepareNVRAMHelper, diff --git a/src/security/security_dac.c b/src/security/security_dac.c index e9e316551e..9bef2468c3 100644 --- a/src/security/security_dac.c +++ b/src/security/security_dac.c @@ -1971,7 +1971,8 @@ virSecurityDACRestoreAllLabel(virSecurityManager *mgr, } if (def->os.loader && def->os.loader->nvram && - virSecurityDACRestoreFileLabel(mgr, def->os.loader->nvram) < 0) + virStorageSourceIsLocalStorage(def->os.loader->nvram) && + virSecurityDACRestoreFileLabel(mgr, def->os.loader->nvram->path) < 0) rc = -1; if (def->os.kernel && @@ -2182,8 +2183,9 @@ virSecurityDACSetAllLabel(virSecurityManager *mgr, } if (def->os.loader && def->os.loader->nvram && + virStorageSourceIsLocalStorage(def->os.loader->nvram) && virSecurityDACSetOwnership(mgr, NULL, - def->os.loader->nvram, + def->os.loader->nvram->path, user, group, true) < 0) return -1; diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c index 6f02baf2ce..e026212b13 100644 --- a/src/security/security_selinux.c +++ b/src/security/security_selinux.c @@ -2806,7 +2806,8 @@ virSecuritySELinuxRestoreAllLabel(virSecurityManager *mgr, } if (def->os.loader && def->os.loader->nvram && - virSecuritySELinuxRestoreFileLabel(mgr, def->os.loader->nvram, true) < 0) + virStorageSourceIsLocalStorage(def->os.loader->nvram) && + virSecuritySELinuxRestoreFileLabel(mgr, def->os.loader->nvram->path, true) < 0) rc = -1; if (def->os.kernel && @@ -3212,8 +3213,9 @@ virSecuritySELinuxSetAllLabel(virSecurityManager *mgr, /* This is different than kernel or initrd. The nvram store * is really a disk, qemu can read and write to it. */ if (def->os.loader && def->os.loader->nvram && + virStorageSourceIsLocalStorage(def->os.loader->nvram) && secdef && secdef->imagelabel && - virSecuritySELinuxSetFilecon(mgr, def->os.loader->nvram, + virSecuritySELinuxSetFilecon(mgr, def->os.loader->nvram->path, secdef->imagelabel, true) < 0) return -1; diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c index 1f1cce8b3d..d2ed9417b6 100644 --- a/src/security/virt-aa-helper.c +++ b/src/security/virt-aa-helper.c @@ -1006,8 +1006,9 @@ get_files(vahControl * ctl) if (vah_add_file(&buf, ctl->def->os.loader->path, "rk") != 0) goto cleanup; - if (ctl->def->os.loader && ctl->def->os.loader->nvram) - if (vah_add_file(&buf, ctl->def->os.loader->nvram, "rwk") != 0) + if (ctl->def->os.loader && ctl->def->os.loader->nvram && + virStorageSourceIsLocalStorage(ctl->def->os.loader->nvram)) + if (vah_add_file(&buf, ctl->def->os.loader->nvram->path, "rwk") != 0) goto cleanup; for (i = 0; i < ctl->def->ngraphics; i++) { diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 34e555644c..e249980195 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -992,7 +992,8 @@ vboxSetBootDeviceOrder(virDomainDef *def, struct _vboxDriver *data, VIR_DEBUG("def->os.loader->path %s", def->os.loader->path); VIR_DEBUG("def->os.loader->readonly %d", def->os.loader->readonly); VIR_DEBUG("def->os.loader->type %d", def->os.loader->type); - VIR_DEBUG("def->os.loader->nvram %s", def->os.loader->nvram); + if (def->os.loader->nvram) + VIR_DEBUG("def->os.loader->nvram->path %s", def->os.loader->nvram->path); } VIR_DEBUG("def->os.bootloader %s", def->os.bootloader); VIR_DEBUG("def->os.bootloaderArgs %s", def->os.bootloaderArgs); -- 2.25.1

This patch introduces the logic to format and parse remote NVRAM. This also adds 'type' attribute to nvram element and validates 'file' type NVRAM for unsupported configurations. Sample XML with new annotation: <nvram type='network'> <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-nopool/0'> <host name='example.com' port='6000'/> </source> </nvram> or <nvram type='file'> <source file='/var/lib/libvirt/nvram/guest_VARS.fd'/> </nvram> Signed-off-by: Prerna Saxena <prerna.saxena@nutanix.com> Signed-off-by: Florian Schmidt <flosch@nutanix.com> Signed-off-by: Rohit Kumar <rohit.kumar3@nutanix.com> --- src/conf/domain_conf.c | 110 +++++++++++++++++++++++++++++++++------ src/conf/domain_conf.h | 1 + src/qemu/qemu_domain.c | 9 ++++ src/qemu/qemu_firmware.c | 6 +++ src/qemu/qemu_validate.c | 61 ++++++++++++++++++++++ 5 files changed, 172 insertions(+), 15 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index bdd36e777c..0429ff659e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -17826,6 +17826,64 @@ virDomainLoaderDefParseXML(xmlNodePtr node, } +static int +virDomainNvramDefParseXML(virDomainLoaderDef *loader, + xmlXPathContextPtr ctxt, + virDomainXMLOption *opt, + unsigned int flags) +{ + g_autofree char *nvramType = NULL; + + nvramType = virXPathString("string(./os/nvram/@type)", ctxt); + + /* if nvramType==NULL read old-style, else + * if there's a type, read new style */ + if (!nvramType) { + loader->newStyleNVRAM = false; + loader->nvram->type = VIR_STORAGE_TYPE_FILE; + loader->nvram->path = virXPathString("string(./os/nvram[1])", ctxt); + return 0; + } else { + xmlNodePtr source; + g_autofree char *srcProtocol = NULL; + g_autofree char *srcFile = NULL; + + loader->newStyleNVRAM = true; + if ((loader->nvram->type = virStorageTypeFromString(nvramType)) <= 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unknown disk type '%s'"), nvramType); + return -1; + } + + srcProtocol = virXPathString("string(./os/nvram/source/@protocol)", ctxt); + if (srcProtocol && (loader->nvram->type != VIR_STORAGE_TYPE_NETWORK)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Source 'protocol' field is not supported with nvram type '%s'"), + nvramType); + return -1; + } + + srcFile = virXPathString("string(./os/nvram/source/@file)", ctxt); + if (!srcFile && (loader->nvram->type == VIR_STORAGE_TYPE_FILE)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Source 'file' attribute is missing with nvram type '%s'"), + nvramType); + return -1; + } + + source = virXPathNode("./os/nvram/source[1]", ctxt); + if (!source) { + virReportError(VIR_ERR_XML_ERROR, + _("Missing source element with nvram type '%s'"), + nvramType); + return -1; + } + return virDomainStorageSourceParse(source, ctxt, loader->nvram, flags, opt); + } + return 0; +} + + static int virDomainSchedulerParseCommonAttrs(xmlNodePtr node, virProcessSchedPolicy *policy, @@ -18211,7 +18269,9 @@ virDomainDefParseBootFirmwareOptions(virDomainDef *def, static int virDomainDefParseBootLoaderOptions(virDomainDef *def, - xmlXPathContextPtr ctxt) + xmlXPathContextPtr ctxt, + virDomainXMLOption *xmlopt, + unsigned int flags) { xmlNodePtr loader_node = virXPathNode("./os/loader[1]", ctxt); const bool fwAutoSelect = def->os.firmware != VIR_DOMAIN_OS_DEF_FIRMWARE_NONE; @@ -18228,8 +18288,10 @@ virDomainDefParseBootLoaderOptions(virDomainDef *def, if (virXPathNode("./os/nvram[1]", ctxt)) { def->os.loader->nvram = virStorageSourceNew(); - def->os.loader->nvram->path = virXPathString("string(./os/nvram[1])", ctxt); - def->os.loader->nvram->type = VIR_STORAGE_TYPE_FILE; + + if (virDomainNvramDefParseXML(def->os.loader, + ctxt, xmlopt, flags) < 0) + return -1; } if (!fwAutoSelect) def->os.loader->nvramTemplate = virXPathString("string(./os/nvram[1]/@template)", ctxt); @@ -18284,7 +18346,9 @@ virDomainDefParseBootAcpiOptions(virDomainDef *def, static int virDomainDefParseBootOptions(virDomainDef *def, - xmlXPathContextPtr ctxt) + xmlXPathContextPtr ctxt, + virDomainXMLOption *xmlopt, + unsigned int flags) { /* * Booting options for different OS types.... @@ -18302,7 +18366,7 @@ virDomainDefParseBootOptions(virDomainDef *def, if (virDomainDefParseBootFirmwareOptions(def, ctxt) < 0) return -1; - if (virDomainDefParseBootLoaderOptions(def, ctxt) < 0) + if (virDomainDefParseBootLoaderOptions(def, ctxt, xmlopt, flags) < 0) return -1; if (virDomainDefParseBootAcpiOptions(def, ctxt) < 0) @@ -18318,7 +18382,7 @@ virDomainDefParseBootOptions(virDomainDef *def, case VIR_DOMAIN_OSTYPE_UML: virDomainDefParseBootKernelOptions(def, ctxt); - if (virDomainDefParseBootLoaderOptions(def, ctxt) < 0) + if (virDomainDefParseBootLoaderOptions(def, ctxt, xmlopt, flags) < 0) return -1; break; @@ -19609,7 +19673,7 @@ virDomainDefParseXML(xmlXPathContextPtr ctxt, if (virDomainDefClockParse(def, ctxt) < 0) return NULL; - if (virDomainDefParseBootOptions(def, ctxt) < 0) + if (virDomainDefParseBootOptions(def, ctxt, xmlopt, flags) < 0) return NULL; /* analysis of the disk devices */ @@ -26909,14 +26973,16 @@ virDomainHugepagesFormat(virBuffer *buf, virBufferAddLit(buf, "</hugepages>\n"); } -static void +static int virDomainLoaderDefFormat(virBuffer *buf, - virDomainLoaderDef *loader) + virDomainLoaderDef *loader, + virDomainXMLOption *xmlopt, + unsigned int flags) { g_auto(virBuffer) loaderAttrBuf = VIR_BUFFER_INITIALIZER; g_auto(virBuffer) loaderChildBuf = VIR_BUFFER_INITIALIZER; g_auto(virBuffer) nvramAttrBuf = VIR_BUFFER_INITIALIZER; - g_auto(virBuffer) nvramChildBuf = VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) nvramChildBuf = VIR_BUFFER_INIT_CHILD(buf); if (loader->readonly != VIR_TRISTATE_BOOL_ABSENT) virBufferAsprintf(&loaderAttrBuf, " readonly='%s'", @@ -26935,11 +27001,24 @@ virDomainLoaderDefFormat(virBuffer *buf, virXMLFormatElementInternal(buf, "loader", &loaderAttrBuf, &loaderChildBuf, false, false); virBufferEscapeString(&nvramAttrBuf, " template='%s'", loader->nvramTemplate); - if (loader->nvram) { - if (loader->nvram->type == VIR_STORAGE_TYPE_FILE) + if (loader->nvram || loader->nvramTemplate) { + bool childNewline; + if (!loader->newStyleNVRAM) { + virBufferSetIndent(&nvramChildBuf, 0); virBufferEscapeString(&nvramChildBuf, "%s", loader->nvram->path); + childNewline = false; + } else { + virBufferAsprintf(&nvramAttrBuf, " type='%s'", virStorageTypeToString(loader->nvram->type)); + if (virDomainDiskSourceFormat(&nvramChildBuf, loader->nvram, "source", 0, + false, flags, false, false, xmlopt) < 0) { + return -1; + } + childNewline = true; + } + virXMLFormatElementInternal(buf, "nvram", &nvramAttrBuf, &nvramChildBuf, false, childNewline); } - virXMLFormatElementInternal(buf, "nvram", &nvramAttrBuf, &nvramChildBuf, false, false); + + return 0; } static void @@ -28140,8 +28219,9 @@ virDomainDefFormatInternalSetRootName(virDomainDef *def, if (def->os.initgroup) virBufferAsprintf(buf, "<initgroup>%s</initgroup>\n", def->os.initgroup); - if (def->os.loader) - virDomainLoaderDefFormat(buf, def->os.loader); + if (def->os.loader && + virDomainLoaderDefFormat(buf, def->os.loader, xmlopt, flags) < 0) + return -1; virBufferEscapeString(buf, "<kernel>%s</kernel>\n", def->os.kernel); virBufferEscapeString(buf, "<initrd>%s</initrd>\n", diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 3a3164db9c..6523abaa0c 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2236,6 +2236,7 @@ struct _virDomainLoaderDef { virDomainLoader type; virTristateBool secure; virStorageSource *nvram; + bool newStyleNVRAM; char *nvramTemplate; /* user override of path to master nvram */ }; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 9dccbbfb1a..afe94eb018 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -11283,6 +11283,15 @@ qemuDomainInitializePflashStorageSource(virDomainObj *vm) pflash1->format = VIR_STORAGE_FILE_RAW; pflash1->nodeformat = g_strdup("libvirt-pflash1-format"); pflash1->nodestorage = g_strdup("libvirt-pflash1-storage"); + + if (!pflash1->privateData && + !(pflash1->privateData = qemuDomainStorageSourcePrivateNew())) + return -1; + + if (qemuDomainSecretStorageSourcePrepare(priv, pflash1, + pflash1->nodestorage, + pflash1->nodeformat) < 0) + return -1; } priv->pflash0 = g_steal_pointer(&pflash0); diff --git a/src/qemu/qemu_firmware.c b/src/qemu/qemu_firmware.c index ab5151dc9f..55808efd70 100644 --- a/src/qemu/qemu_firmware.c +++ b/src/qemu/qemu_firmware.c @@ -1375,6 +1375,12 @@ qemuFirmwareFillDomain(virQEMUDriver *driver, virFileExists(def->os.loader->nvram->path)) return 0; + + if (!reset_nvram && def->os.loader->nvram && + def->os.loader->nvram->type == VIR_STORAGE_TYPE_NETWORK && + def->os.loader->nvram->path) + return 0; + /* ... then we want to consult JSON FW descriptors first, * but we don't want to fail if we haven't found a match. */ needResult = false; diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index b576efe375..28597ac702 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -603,6 +603,64 @@ qemuValidateDomainDefBoot(const virDomainDef *def) } +static int +qemuValidateDomainDefNvram(const virDomainDef *def, + virQEMUCaps *qemuCaps) +{ + int actualType; + if (!def->os.loader || !def->os.loader->nvram) + return 0; + + if (qemuDomainValidateStorageSource(def->os.loader->nvram, qemuCaps, false) < 0) + return -1; + + actualType = virStorageSourceGetActualType(def->os.loader->nvram); + + switch (actualType) { + case VIR_STORAGE_TYPE_FILE: + break; + + case VIR_STORAGE_TYPE_NETWORK: + case VIR_STORAGE_TYPE_BLOCK: + case VIR_STORAGE_TYPE_DIR: + case VIR_STORAGE_TYPE_VOLUME: + case VIR_STORAGE_TYPE_NVME: + case VIR_STORAGE_TYPE_VHOST_USER: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unsupported nvram disk type %s"), + virStorageTypeToString(actualType)); + return -1; + + case VIR_STORAGE_TYPE_NONE: + case VIR_STORAGE_TYPE_LAST: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected nvram disk type %s"), + virStorageTypeToString(actualType)); + return -1; + } + + if (def->os.loader->nvram->encryption) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Encryption is not supported with NVRAM")); + return -1; + } + + if (def->os.loader->nvram->seclabels) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Security labels are not supported with NVRAM")); + return -1; + } + + if (def->os.loader->nvram->auth) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Auth is not supported with NVRAM")); + return -1; + } + + return 0; +} + + /** * qemuValidateDefGetVcpuHotplugGranularity: * @def: domain definition @@ -1177,6 +1235,9 @@ qemuValidateDomainDef(const virDomainDef *def, if (qemuValidateDomainDefBoot(def) < 0) return -1; + if (qemuValidateDomainDefNvram(def, qemuCaps) < 0) + return -1; + if (qemuValidateDomainVCpuTopology(def, qemuCaps) < 0) return -1; -- 2.25.1

Update NVRAM element schema, docs and validation logic for supporting network backed NVRAM. NVRAM backed over network would give the flexibility to start the VM on any host without having to worry about where to get the latest nvram image. Signed-off-by: Prerna Saxena <prerna.saxena@nutanix.com> Signed-off-by: Florian Schmidt <flosch@nutanix.com> Signed-off-by: Rohit Kumar <rohit.kumar3@nutanix.com> --- NEWS.rst | 5 +++++ docs/formatdomain.rst | 34 ++++++++++++++++++++++++++++++- src/conf/schemas/domaincommon.rng | 21 ++++++++++++++++++- src/qemu/qemu_validate.c | 14 +++++++++++-- 4 files changed, 70 insertions(+), 4 deletions(-) diff --git a/NEWS.rst b/NEWS.rst index 4a213682a4..592bedfec0 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -34,6 +34,11 @@ v8.3.0 (2022-05-02) * **New features** + * qemu: Introduce support for network backed NVRAM + + Users can now use remote store NVRAM image by specifying attribute + `type='network'` with `<nvram>` element. + * qemu: Introduce support for virtio-iommu This IOMMU device can be used with both Q35 and ARM virt guests. diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 9be305f3e6..a27346f6fa 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -141,6 +141,34 @@ harddisk, cdrom, network) determining where to obtain/find the boot image. </os> ... + <!-- QEMU with UEFI manual firmware, secure boot and with NVRAM type 'file'--> + ... + <os> + <type>hvm</type> + <loader readonly='yes' secure='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader> + <nvram type='file' template='/usr/share/OVMF/OVMF_VARS.fd'> + <source file='/var/lib/libvirt/nvram/guest_VARS.fd'/> + <boot dev='hd'/> + </os> + ... + + <!-- QEMU with UEFI manual firmware, secure boot and with network backed NVRAM'--> + ... + <os> + <type>hvm</type> + <loader readonly='yes' secure='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader> + <nvram type='network'> + <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-nopool/0'> + <host name='example.com' port='6000'/> + <auth username='myname'> + <secret type='iscsi' usage='mycluster_myname'/> + </auth> + </source> + </nvram> + <boot dev='hd'/> + </os> + ... + <!-- QEMU with automatic UEFI firmware and secure boot --> ... <os firmware='efi'> @@ -222,7 +250,11 @@ harddisk, cdrom, network) determining where to obtain/find the boot image. :since:`Since 2.1.0` ``nvram`` Some UEFI firmwares may want to use a non-volatile memory to store some - variables. In the host, this is represented as a file and the absolute path + variables. They can be present on host or on some network storage. + :since:`Since 8.3.0`, it's possible for the element to have ``type`` attribute + (accepts values ``file`` and ``network``). For remote store NVRAM, please refer + back to ``<source>`` element definition at `Disk configuration <#hard-drives-floppy-disks-cdroms>`__ + section. In the host, this is represented as a file and the absolute path to the file is stored in this element. Moreover, when the domain is started up libvirt copies so called master NVRAM store file defined in ``qemu.conf``. If needed, the ``template`` attribute can be used to per domain override map diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng index 8afb0dadd4..acebaa8295 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -333,7 +333,26 @@ </attribute> </optional> <optional> - <ref name="absFilePath"/> + <choice> + <group> + <ref name="absFilePath"/> + </group> + <group> + <attribute name="type"> + <value>file</value> + </attribute> + <element name="source"> + <attribute name="file"> + <choice> + <ref name="absFilePath"/> + </choice> + </attribute> + </element> + </group> + <group> + <ref name="diskSourceNetwork"/> + </group> + </choice> </optional> </element> </optional> diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 28597ac702..e7fc2b9772 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -621,6 +621,13 @@ qemuValidateDomainDefNvram(const virDomainDef *def, break; case VIR_STORAGE_TYPE_NETWORK: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("remote NVRAM is not supported by this QEMU")); + return -1; + } + break; + case VIR_STORAGE_TYPE_BLOCK: case VIR_STORAGE_TYPE_DIR: case VIR_STORAGE_TYPE_VOLUME: @@ -651,9 +658,12 @@ qemuValidateDomainDefNvram(const virDomainDef *def, return -1; } - if (def->os.loader->nvram->auth) { + if (def->os.loader->nvram->auth && + !(actualType == VIR_STORAGE_TYPE_NETWORK && + (def->os.loader->nvram->protocol == VIR_STORAGE_NET_PROTOCOL_ISCSI || + def->os.loader->nvram->protocol == VIR_STORAGE_NET_PROTOCOL_RBD))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Auth is not supported with NVRAM")); + _("Auth is only supported with 'iSCSI' and 'nbd' protocols")); return -1; } -- 2.25.1

This patch adds unit tests for remote NVRAM. Examples: <nvram type='network'> <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-nopool/0'> <host name='example.com' port='6000'/> <auth username='myname'> <secret type='iscsi' usage='mycluster_myname'/> </auth> </source> </nvram> and <nvram type='network'> <source protocol='nbd' name='bar'> <host name='example.org' port='6000'/> </source> </nvram> Signed-off-by: Prerna Saxena <prerna.saxena@nutanix.com> Signed-off-by: Florian Schmidt <flosch@nutanix.com> Signed-off-by: Rohit Kumar <rohit.kumar3@nutanix.com> --- .../bios-nvram-network-iscsi.x86_64-4.1.0.err | 1 + ...ios-nvram-network-iscsi.x86_64-latest.args | 38 ++++++++++++++++ .../bios-nvram-network-iscsi.xml | 31 +++++++++++++ .../bios-nvram-network-nbd.x86_64-latest.args | 37 ++++++++++++++++ .../bios-nvram-network-nbd.xml | 28 ++++++++++++ tests/qemuxml2argvtest.c | 3 ++ ...bios-nvram-network-iscsi.x86_64-latest.xml | 44 +++++++++++++++++++ .../bios-nvram-network-nbd.x86_64-latest.xml | 41 +++++++++++++++++ tests/qemuxml2xmltest.c | 2 + 9 files changed, 225 insertions(+) create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-iscsi.x86_64-4.1.0.err create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-iscsi.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-iscsi.xml create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-nbd.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-nbd.xml create mode 100644 tests/qemuxml2xmloutdata/bios-nvram-network-iscsi.x86_64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/bios-nvram-network-nbd.x86_64-latest.xml diff --git a/tests/qemuxml2argvdata/bios-nvram-network-iscsi.x86_64-4.1.0.err b/tests/qemuxml2argvdata/bios-nvram-network-iscsi.x86_64-4.1.0.err new file mode 100644 index 0000000000..741683c33e --- /dev/null +++ b/tests/qemuxml2argvdata/bios-nvram-network-iscsi.x86_64-4.1.0.err @@ -0,0 +1 @@ +unsupported configuration: remote NVRAM is not supported by this QEMU diff --git a/tests/qemuxml2argvdata/bios-nvram-network-iscsi.x86_64-latest.args b/tests/qemuxml2argvdata/bios-nvram-network-iscsi.x86_64-latest.args new file mode 100644 index 0000000000..b8a323358d --- /dev/null +++ b/tests/qemuxml2argvdata/bios-nvram-network-iscsi.x86_64-latest.args @@ -0,0 +1,38 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-test-bios \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-test-bios/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-test-bios/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-test-bios/.config \ +/usr/bin/qemu-system-x86_64 \ +-name guest=test-bios,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-test-bios/master-key.aes"}' \ +-blockdev '{"driver":"file","filename":"/usr/share/OVMF/OVMF_CODE.fd","node-name":"libvirt-pflash0-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-pflash0-format","read-only":true,"driver":"raw","file":"libvirt-pflash0-storage"}' \ +-object '{"qom-type":"secret","id":"libvirt-pflash1-storage-auth-secret0","data":"9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1","keyid":"masterKey0","iv":"AAECAwQFBgcICQoLDA0ODw==","format":"base64"}' \ +-blockdev '{"driver":"iscsi","portal":"example.com:6000","target":"iqn.2013-07.com.example:iscsi-nopool","lun":0,"transport":"tcp","user":"myname","password-secret":"libvirt-pflash1-storage-auth-secret0","node-name":"libvirt-pflash1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-pflash1-format","read-only":false,"driver":"raw","file":"libvirt-pflash1-storage"}' \ +-machine pc,usb=off,dump-guest-core=off,pflash0=libvirt-pflash0-format,pflash1=libvirt-pflash1-format,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 1024 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":1073741824}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 362d1fc1-df7d-193e-5c18-49a71bd1da66 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot menu=on,strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/bios-nvram-network-iscsi.xml b/tests/qemuxml2argvdata/bios-nvram-network-iscsi.xml new file mode 100644 index 0000000000..d8a354126d --- /dev/null +++ b/tests/qemuxml2argvdata/bios-nvram-network-iscsi.xml @@ -0,0 +1,31 @@ +<domain type='qemu'> + <name>test-bios</name> + <uuid>362d1fc1-df7d-193e-5c18-49a71bd1da66</uuid> + <memory unit='KiB'>1048576</memory> + <currentMemory unit='KiB'>1048576</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='pc'>hvm</type> + <loader readonly='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader> + <nvram type='network'> + <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-nopool'> + <host name='example.com' port='6000'/> + <auth username='myname'> + <secret type='iscsi' usage='mycluster_myname'/> + </auth> + </source> + </nvram> + <boot dev='hd'/> + <bootmenu enable='yes'/> + </os> + <features> + <acpi/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/bios-nvram-network-nbd.x86_64-latest.args b/tests/qemuxml2argvdata/bios-nvram-network-nbd.x86_64-latest.args new file mode 100644 index 0000000000..08dbd99335 --- /dev/null +++ b/tests/qemuxml2argvdata/bios-nvram-network-nbd.x86_64-latest.args @@ -0,0 +1,37 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-test-bios \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-test-bios/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-test-bios/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-test-bios/.config \ +/usr/bin/qemu-system-x86_64 \ +-name guest=test-bios,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-test-bios/master-key.aes"}' \ +-blockdev '{"driver":"file","filename":"/usr/share/OVMF/OVMF_CODE.fd","node-name":"libvirt-pflash0-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-pflash0-format","read-only":true,"driver":"raw","file":"libvirt-pflash0-storage"}' \ +-blockdev '{"driver":"nbd","server":{"type":"inet","host":"example.org","port":"6000"},"export":"bar","node-name":"libvirt-pflash1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-pflash1-format","read-only":false,"driver":"raw","file":"libvirt-pflash1-storage"}' \ +-machine pc,usb=off,dump-guest-core=off,pflash0=libvirt-pflash0-format,pflash1=libvirt-pflash1-format,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 1024 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":1073741824}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 362d1fc1-df7d-193e-5c18-49a71bd1da66 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot menu=on,strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/bios-nvram-network-nbd.xml b/tests/qemuxml2argvdata/bios-nvram-network-nbd.xml new file mode 100644 index 0000000000..3350914607 --- /dev/null +++ b/tests/qemuxml2argvdata/bios-nvram-network-nbd.xml @@ -0,0 +1,28 @@ +<domain type='qemu'> + <name>test-bios</name> + <uuid>362d1fc1-df7d-193e-5c18-49a71bd1da66</uuid> + <memory unit='KiB'>1048576</memory> + <currentMemory unit='KiB'>1048576</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='pc'>hvm</type> + <loader readonly='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader> + <nvram type='network'> + <source protocol='nbd' name='bar'> + <host name='example.org' port='6000'/> + </source> + </nvram> + <boot dev='hd'/> + <bootmenu enable='yes'/> + </os> + <features> + <acpi/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 1f080daba7..c00aa7e049 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1198,6 +1198,9 @@ mymain(void) QEMU_CAPS_ICH9_AHCI, QEMU_CAPS_VIRTIO_SCSI); DO_TEST_CAPS_LATEST("bios-nvram-template"); + DO_TEST_CAPS_LATEST("bios-nvram-network-iscsi"); + DO_TEST_CAPS_VER_PARSE_ERROR("bios-nvram-network-iscsi", "4.1.0"); + DO_TEST_CAPS_LATEST("bios-nvram-network-nbd"); /* Make sure all combinations of ACPI and UEFI behave as expected */ DO_TEST_NOCAPS("q35-acpi-uefi"); diff --git a/tests/qemuxml2xmloutdata/bios-nvram-network-iscsi.x86_64-latest.xml b/tests/qemuxml2xmloutdata/bios-nvram-network-iscsi.x86_64-latest.xml new file mode 100644 index 0000000000..73b7aefe7b --- /dev/null +++ b/tests/qemuxml2xmloutdata/bios-nvram-network-iscsi.x86_64-latest.xml @@ -0,0 +1,44 @@ +<domain type='qemu'> + <name>test-bios</name> + <uuid>362d1fc1-df7d-193e-5c18-49a71bd1da66</uuid> + <memory unit='KiB'>1048576</memory> + <currentMemory unit='KiB'>1048576</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='pc'>hvm</type> + <loader readonly='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader> + <nvram type='network'> + <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-nopool'> + <host name='example.com' port='6000'/> + <auth username='myname'> + <secret type='iscsi' usage='mycluster_myname'/> + </auth> + </source> + </nvram> + <boot dev='hd'/> + <bootmenu enable='yes'/> + </os> + <features> + <acpi/> + </features> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <controller type='usb' index='0' model='piix3-uhci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <audio id='1' type='none'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/bios-nvram-network-nbd.x86_64-latest.xml b/tests/qemuxml2xmloutdata/bios-nvram-network-nbd.x86_64-latest.xml new file mode 100644 index 0000000000..bc78be11b6 --- /dev/null +++ b/tests/qemuxml2xmloutdata/bios-nvram-network-nbd.x86_64-latest.xml @@ -0,0 +1,41 @@ +<domain type='qemu'> + <name>test-bios</name> + <uuid>362d1fc1-df7d-193e-5c18-49a71bd1da66</uuid> + <memory unit='KiB'>1048576</memory> + <currentMemory unit='KiB'>1048576</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='pc'>hvm</type> + <loader readonly='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader> + <nvram type='network'> + <source protocol='nbd' name='bar'> + <host name='example.org' port='6000'/> + </source> + </nvram> + <boot dev='hd'/> + <bootmenu enable='yes'/> + </os> + <features> + <acpi/> + </features> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <controller type='usb' index='0' model='piix3-uhci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <audio id='1' type='none'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 58ee29cd33..63240856ce 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -1094,6 +1094,8 @@ mymain(void) DO_TEST_NOCAPS("bios-nvram"); DO_TEST_NOCAPS("bios-nvram-os-interleave"); + DO_TEST_CAPS_LATEST("bios-nvram-network-iscsi"); + DO_TEST_CAPS_LATEST("bios-nvram-network-nbd"); DO_TEST_NOCAPS("tap-vhost"); DO_TEST_NOCAPS("tap-vhost-incorrect"); -- 2.25.1

This patch adds an unit test to test xml when NVRAM type 'file' is provided. Example: <nvram type='file'> <source file='/var/lib/libvirt/nvram/guest_VARS.fd'/> </nvram> Signed-off-by: Prerna Saxena <prerna.saxena@nutanix.com> Signed-off-by: Florian Schmidt <flosch@nutanix.com> Signed-off-by: Rohit Kumar <rohit.kumar3@nutanix.com> --- .../bios-nvram-file.x86_64-latest.args | 37 ++++++++++++++++++ tests/qemuxml2argvdata/bios-nvram-file.xml | 23 +++++++++++ tests/qemuxml2argvtest.c | 1 + .../bios-nvram-file.x86_64-latest.xml | 39 +++++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 5 files changed, 101 insertions(+) create mode 100644 tests/qemuxml2argvdata/bios-nvram-file.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/bios-nvram-file.xml create mode 100644 tests/qemuxml2xmloutdata/bios-nvram-file.x86_64-latest.xml diff --git a/tests/qemuxml2argvdata/bios-nvram-file.x86_64-latest.args b/tests/qemuxml2argvdata/bios-nvram-file.x86_64-latest.args new file mode 100644 index 0000000000..4b0aec7539 --- /dev/null +++ b/tests/qemuxml2argvdata/bios-nvram-file.x86_64-latest.args @@ -0,0 +1,37 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-test-bios \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-test-bios/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-test-bios/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-test-bios/.config \ +/usr/bin/qemu-system-x86_64 \ +-name guest=test-bios,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-test-bios/master-key.aes"}' \ +-blockdev '{"driver":"file","filename":"/usr/share/OVMF/OVMF_CODE.fd","node-name":"libvirt-pflash0-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-pflash0-format","read-only":true,"driver":"raw","file":"libvirt-pflash0-storage"}' \ +-blockdev '{"driver":"file","filename":"/var/lib/libvirt/nvram/guest_VARS.fd","node-name":"libvirt-pflash1-storage","auto-read-only":true,"discard":"unmap"}' \ +-blockdev '{"node-name":"libvirt-pflash1-format","read-only":false,"driver":"raw","file":"libvirt-pflash1-storage"}' \ +-machine pc,usb=off,dump-guest-core=off,pflash0=libvirt-pflash0-format,pflash1=libvirt-pflash1-format,memory-backend=pc.ram \ +-accel tcg \ +-cpu qemu64 \ +-m 1024 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":1073741824}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 362d1fc1-df7d-193e-5c18-49a71bd1da66 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot menu=on,strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/bios-nvram-file.xml b/tests/qemuxml2argvdata/bios-nvram-file.xml new file mode 100644 index 0000000000..8df9412112 --- /dev/null +++ b/tests/qemuxml2argvdata/bios-nvram-file.xml @@ -0,0 +1,23 @@ +<domain type='qemu'> + <name>test-bios</name> + <uuid>362d1fc1-df7d-193e-5c18-49a71bd1da66</uuid> + <memory unit='KiB'>1048576</memory> + <currentMemory unit='KiB'>1048576</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='pc'>hvm</type> + <loader readonly='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader> + <nvram type='file'> + <source file='/var/lib/libvirt/nvram/guest_VARS.fd'/> + </nvram> + <boot dev='hd'/> + <bootmenu enable='yes'/> + </os> + <features> + <acpi/> + </features> + <clock offset='utc'/> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index c00aa7e049..5fae9a1e42 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1201,6 +1201,7 @@ mymain(void) DO_TEST_CAPS_LATEST("bios-nvram-network-iscsi"); DO_TEST_CAPS_VER_PARSE_ERROR("bios-nvram-network-iscsi", "4.1.0"); DO_TEST_CAPS_LATEST("bios-nvram-network-nbd"); + DO_TEST_CAPS_LATEST("bios-nvram-file"); /* Make sure all combinations of ACPI and UEFI behave as expected */ DO_TEST_NOCAPS("q35-acpi-uefi"); diff --git a/tests/qemuxml2xmloutdata/bios-nvram-file.x86_64-latest.xml b/tests/qemuxml2xmloutdata/bios-nvram-file.x86_64-latest.xml new file mode 100644 index 0000000000..97e029f70b --- /dev/null +++ b/tests/qemuxml2xmloutdata/bios-nvram-file.x86_64-latest.xml @@ -0,0 +1,39 @@ +<domain type='qemu'> + <name>test-bios</name> + <uuid>362d1fc1-df7d-193e-5c18-49a71bd1da66</uuid> + <memory unit='KiB'>1048576</memory> + <currentMemory unit='KiB'>1048576</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='pc'>hvm</type> + <loader readonly='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader> + <nvram type='file'> + <source file='/var/lib/libvirt/nvram/guest_VARS.fd'/> + </nvram> + <boot dev='hd'/> + <bootmenu enable='yes'/> + </os> + <features> + <acpi/> + </features> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <controller type='usb' index='0' model='piix3-uhci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <audio id='1' type='none'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 63240856ce..ee11fd1877 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -1096,6 +1096,7 @@ mymain(void) DO_TEST_NOCAPS("bios-nvram-os-interleave"); DO_TEST_CAPS_LATEST("bios-nvram-network-iscsi"); DO_TEST_CAPS_LATEST("bios-nvram-network-nbd"); + DO_TEST_CAPS_LATEST("bios-nvram-file"); DO_TEST_NOCAPS("tap-vhost"); DO_TEST_NOCAPS("tap-vhost-incorrect"); -- 2.25.1

Ping. Hi, requesting review on this patchset. Thanks! On 04/05/22 10:21 pm, Rohit Kumar wrote:
Libvirt domain XML currently allows only local filepaths that can be used to specify a NVRAM disk. It should be possible to support NVRAM disks on network storage as it would give flexibility to start the VM on any host without having to worry about where to get the latest nvram image.
This series extends the NVRAM element to support hosting over network-backed disks. It achieves this by embedding virStorageSource pointer for nvram into _virDomainLoaderDef.
It introduces a 'type' attribute for NVRAM element to specify 'file' vs 'network' backed NVRAM.
XML with new annotation:
<nvram type='network'> <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-nopool/0'> <host name='example.com' port='6000'/> <auth username='myname'> <secret type='iscsi' usage='mycluster_myname'/> </auth> </host> </source> </nvram>
or
<nvram type='network'> <source protocol='nbd' name='bar'> <host name='example.org' port='6000'/> </source> </nvram>
or
<nvram type='file'> <source file='/var/lib/libvirt/nvram/guest_VARS.fd'/> </nvram>
Changes v1->v2: - Split the patch into smaller patches - Added unit test - Updated the doc - Addressed Peter's comment on v1 (https://listman.redhat.com/archives/libvir-list/2022-March/229684.html)
Changes v2->v3: - Added authentication with 'iscsi' protocol unit test - Updated the validation logic - Addressed Peter's other comments on v2 patch(https://listman.redhat.com/archives/libvir-list/2022-April/229971.html)
Rohit Kumar (5): Make NVRAM a virStorageSource type. Add support to parse/format/validate virStorageSource type NVRAM Update schema, docs, and validation logic to support network backed NVRAM Add unit tests for network backed NVRAM Add unit test to support new 'file' type NVRAM
NEWS.rst | 5 + docs/formatdomain.rst | 34 +++++- src/conf/domain_conf.c | 115 +++++++++++++++--- src/conf/domain_conf.h | 3 +- src/conf/schemas/domaincommon.rng | 21 +++- src/qemu/qemu_cgroup.c | 3 +- src/qemu/qemu_command.c | 2 +- src/qemu/qemu_domain.c | 23 +++- src/qemu/qemu_driver.c | 5 +- src/qemu/qemu_firmware.c | 23 +++- src/qemu/qemu_namespace.c | 5 +- src/qemu/qemu_process.c | 5 +- src/qemu/qemu_validate.c | 71 +++++++++++ src/security/security_dac.c | 6 +- src/security/security_selinux.c | 6 +- src/security/virt-aa-helper.c | 5 +- src/vbox/vbox_common.c | 3 +- .../bios-nvram-file.x86_64-latest.args | 37 ++++++ tests/qemuxml2argvdata/bios-nvram-file.xml | 23 ++++ .../bios-nvram-network-iscsi.x86_64-4.1.0.err | 1 + ...ios-nvram-network-iscsi.x86_64-latest.args | 38 ++++++ .../bios-nvram-network-iscsi.xml | 31 +++++ .../bios-nvram-network-nbd.x86_64-latest.args | 37 ++++++ .../bios-nvram-network-nbd.xml | 28 +++++ tests/qemuxml2argvtest.c | 4 + .../bios-nvram-file.x86_64-latest.xml | 39 ++++++ ...bios-nvram-network-iscsi.x86_64-latest.xml | 44 +++++++ .../bios-nvram-network-nbd.x86_64-latest.xml | 41 +++++++ tests/qemuxml2xmltest.c | 3 + 29 files changed, 618 insertions(+), 43 deletions(-) create mode 100644 tests/qemuxml2argvdata/bios-nvram-file.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/bios-nvram-file.xml create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-iscsi.x86_64-4.1.0.err create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-iscsi.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-iscsi.xml create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-nbd.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-nbd.xml create mode 100644 tests/qemuxml2xmloutdata/bios-nvram-file.x86_64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/bios-nvram-network-iscsi.x86_64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/bios-nvram-network-nbd.x86_64-latest.xml

Ping. Hi Peter, can you please take a look on this v3 patchset ? Thanks, Rohit On 09/05/22 12:38 pm, Rohit Kumar wrote:
Ping. Hi, requesting review on this patchset. Thanks!
On 04/05/22 10:21 pm, Rohit Kumar wrote:
Libvirt domain XML currently allows only local filepaths that can be used to specify a NVRAM disk. It should be possible to support NVRAM disks on network storage as it would give flexibility to start the VM on any host without having to worry about where to get the latest nvram image.
This series extends the NVRAM element to support hosting over network-backed disks. It achieves this by embedding virStorageSource pointer for nvram into _virDomainLoaderDef.
It introduces a 'type' attribute for NVRAM element to specify 'file' vs 'network' backed NVRAM.
XML with new annotation:
<nvram type='network'> <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-nopool/0'> <host name='example.com' port='6000'/> <auth username='myname'> <secret type='iscsi' usage='mycluster_myname'/> </auth> </host> </source> </nvram>
or
<nvram type='network'> <source protocol='nbd' name='bar'> <host name='example.org' port='6000'/> </source> </nvram>
or
<nvram type='file'> <source file='/var/lib/libvirt/nvram/guest_VARS.fd'/> </nvram>
Changes v1->v2: - Split the patch into smaller patches - Added unit test - Updated the doc - Addressed Peter's comment on v1 (https://listman.redhat.com/archives/libvir-list/2022-March/229684.html)
Changes v2->v3: - Added authentication with 'iscsi' protocol unit test - Updated the validation logic - Addressed Peter's other comments on v2 patch(https://listman.redhat.com/archives/libvir-list/2022-April/229971.html)
Rohit Kumar (5): Make NVRAM a virStorageSource type. Add support to parse/format/validate virStorageSource type NVRAM Update schema, docs, and validation logic to support network backed NVRAM Add unit tests for network backed NVRAM Add unit test to support new 'file' type NVRAM
NEWS.rst | 5 + docs/formatdomain.rst | 34 +++++- src/conf/domain_conf.c | 115 +++++++++++++++--- src/conf/domain_conf.h | 3 +- src/conf/schemas/domaincommon.rng | 21 +++- src/qemu/qemu_cgroup.c | 3 +- src/qemu/qemu_command.c | 2 +- src/qemu/qemu_domain.c | 23 +++- src/qemu/qemu_driver.c | 5 +- src/qemu/qemu_firmware.c | 23 +++- src/qemu/qemu_namespace.c | 5 +- src/qemu/qemu_process.c | 5 +- src/qemu/qemu_validate.c | 71 +++++++++++ src/security/security_dac.c | 6 +- src/security/security_selinux.c | 6 +- src/security/virt-aa-helper.c | 5 +- src/vbox/vbox_common.c | 3 +- .../bios-nvram-file.x86_64-latest.args | 37 ++++++ tests/qemuxml2argvdata/bios-nvram-file.xml | 23 ++++ .../bios-nvram-network-iscsi.x86_64-4.1.0.err | 1 + ...ios-nvram-network-iscsi.x86_64-latest.args | 38 ++++++ .../bios-nvram-network-iscsi.xml | 31 +++++ .../bios-nvram-network-nbd.x86_64-latest.args | 37 ++++++ .../bios-nvram-network-nbd.xml | 28 +++++ tests/qemuxml2argvtest.c | 4 + .../bios-nvram-file.x86_64-latest.xml | 39 ++++++ ...bios-nvram-network-iscsi.x86_64-latest.xml | 44 +++++++ .../bios-nvram-network-nbd.x86_64-latest.xml | 41 +++++++ tests/qemuxml2xmltest.c | 3 + 29 files changed, 618 insertions(+), 43 deletions(-) create mode 100644 tests/qemuxml2argvdata/bios-nvram-file.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/bios-nvram-file.xml create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-iscsi.x86_64-4.1.0.err create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-iscsi.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-iscsi.xml create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-nbd.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/bios-nvram-network-nbd.xml create mode 100644 tests/qemuxml2xmloutdata/bios-nvram-file.x86_64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/bios-nvram-network-iscsi.x86_64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/bios-nvram-network-nbd.x86_64-latest.xml

On Mon, May 16, 2022 at 16:03:21 +0530, Rohit Kumar wrote:
Ping.
Hi Peter, can you please take a look on this v3 patchset ?
Yes, don't worry and please be patient. There are some intricacies that are not properly handled by your series and rather than me using you as a email operated remote editor I'll have a proper look and fix certain aspects.

On 17/05/22 8:55 pm, Peter Krempa wrote:
On Mon, May 16, 2022 at 16:03:21 +0530, Rohit Kumar wrote:
Ping.
Hi Peter, can you please take a look on this v3 patchset ? Yes, don't worry and please be patient. There are some intricacies that are not properly handled by your series and rather than me using you as a email operated remote editor I'll have a proper look and fix certain aspects.
Peter, Thanks a lot for taking the time to look at patches and for volunteering to fix the bits that are not handled properly in this patch. Do let me know if there is anything I can assist you with, I would be happy to be a part on this. Thanks, Rohit

On 17/05/22 8:55 pm, Peter Krempa wrote:
On Mon, May 16, 2022 at 16:03:21 +0530, Rohit Kumar wrote:
Ping.
Hi Peter, can you please take a look on this v3 patchset ? Yes, don't worry and please be patient. There are some intricacies that are not properly handled by your series and rather than me using you as a email operated remote editor I'll have a proper look and fix certain aspects.
Peter, Thanks a lot for taking the time to look at patches and volunteering to fix the bits that are not handled properly in this patch. Do let me know if there is anything I can assist you with, I would be happy to be a part on this. Thanks, Rohit. PS: please ignore the previous reply to this thread. I sent it with wrong formatting.

On Thu, Jun 02, 2022 at 16:50:42 +0530, Rohit Kumar wrote:
On 17/05/22 8:55 pm, Peter Krempa wrote:
On Mon, May 16, 2022 at 16:03:21 +0530, Rohit Kumar wrote:
Ping.
Hi Peter, can you please take a look on this v3 patchset ? Yes, don't worry and please be patient. There are some intricacies that are not properly handled by your series and rather than me using you as a email operated remote editor I'll have a proper look and fix certain aspects.
Peter, Thanks a lot for taking the time to look at patches and volunteering to fix the bits that are not handled properly in this patch. Do let me know if there is anything I can assist you with, I would be happy to be a part on this.
Hi Rohit, I've finally managed to make all adjustments I'd be proposing. I've posted the series: https://listman.redhat.com/archives/libvir-list/2022-June/232167.html alternatively you can fetch it at: git fetch https://gitlab.com/pipo.sk/libvirt.git network-nvram2 Please give it a try and test all your cases. I've ran out of time to give it testing this week. Ideally also test the old cases. You can now also provide a 'NEWS.rst' entry I've stripped out of the original series as we require that changes to 'NEWS.rst' are done separately from anything else.

On 03/06/22 5:21 pm, Peter Krempa wrote:
On Thu, Jun 02, 2022 at 16:50:42 +0530, Rohit Kumar wrote:
On 17/05/22 8:55 pm, Peter Krempa wrote:
On Mon, May 16, 2022 at 16:03:21 +0530, Rohit Kumar wrote:
Ping.
Hi Peter, can you please take a look on this v3 patchset ? Yes, don't worry and please be patient. There are some intricacies that are not properly handled by your series and rather than me using you as a email operated remote editor I'll have a proper look and fix certain aspects.
Peter, Thanks a lot for taking the time to look at patches and volunteering to fix the bits that are not handled properly in this patch. Do let me know if there is anything I can assist you with, I would be happy to be a part on this. Hi Rohit,
I've finally managed to make all adjustments I'd be proposing. I've posted the series:
alternatively you can fetch it at:
Please give it a try and test all your cases. I've ran out of time to give it testing this week. Ideally also test the old cases.
Hi Peter, Thanks for the working on this. I have tested the v4 patchset with tests related to UEFI and secureboot. All tests are passing.
You can now also provide a 'NEWS.rst' entry I've stripped out of the original series as we require that changes to 'NEWS.rst' are done separately from anything else.
Sure. I will send a patch soon to update 'NEWS.rst'. Thanks, Rohit.

On Mon, Jun 13, 2022 at 10:15 AM Rohit Kumar <rohit.kumar3@nutanix.com> wrote:
On 03/06/22 5:21 pm, Peter Krempa wrote:
On Thu, Jun 02, 2022 at 16:50:42 +0530, Rohit Kumar wrote:
On 17/05/22 8:55 pm, Peter Krempa wrote:
On Mon, May 16, 2022 at 16:03:21 +0530, Rohit Kumar wrote:
Ping.
Hi Peter, can you please take a look on this v3 patchset ? Yes, don't worry and please be patient. There are some intricacies that are not properly handled by your series and rather than me using you as a email operated remote editor I'll have a proper look and fix certain aspects.
Peter, Thanks a lot for taking the time to look at patches and volunteering to fix the bits that are not handled properly in this patch. Do let me know if there is anything I can assist you with, I would be happy to be a part on this. Hi Rohit,
I've finally managed to make all adjustments I'd be proposing. I've posted the series:
alternatively you can fetch it at:
Please give it a try and test all your cases. I've ran out of time to give it testing this week. Ideally also test the old cases.
Hi Peter,
Thanks for the working on this.
I have tested the v4 patchset with tests related to UEFI and secureboot. All tests are passing.
You can now also provide a 'NEWS.rst' entry I've stripped out of the original series as we require that changes to 'NEWS.rst' are done separately from anything else.
Sure. I will send a patch soon to update 'NEWS.rst'.
When you send updated patchset with NEWS.rst, please add Tested-by: Rohit Kumar <rohit.kumar3@nutanix.com> tag to the patches.

On Tue, Jun 14, 2022 at 12:18:34 +0530, Ani Sinha wrote:
On Mon, Jun 13, 2022 at 10:15 AM Rohit Kumar <rohit.kumar3@nutanix.com> wrote:
On 03/06/22 5:21 pm, Peter Krempa wrote:
On Thu, Jun 02, 2022 at 16:50:42 +0530, Rohit Kumar wrote:
On 17/05/22 8:55 pm, Peter Krempa wrote:
On Mon, May 16, 2022 at 16:03:21 +0530, Rohit Kumar wrote:
[...]
You can now also provide a 'NEWS.rst' entry I've stripped out of the original series as we require that changes to 'NEWS.rst' are done separately from anything else.
Sure. I will send a patch soon to update 'NEWS.rst'.
When you send updated patchset with NEWS.rst, please add
I'm hadnlding the patches adding the code and they don't need to be re-posted any more. Rohit is only supposed to send the patch adding the NEWS entry as that is in a separate patch anyways.
Tested-by: Rohit Kumar <rohit.kumar3@nutanix.com>
I can add this tag to the patches but only if Rohit agrees (ideally by responding to my posting of the series, to track it properly). I can't add patches on behalf of others.

On 14/06/22 3:51 pm, Peter Krempa wrote:
On Tue, Jun 14, 2022 at 12:18:34 +0530, Ani Sinha wrote:
On Mon, Jun 13, 2022 at 10:15 AM Rohit Kumar <rohit.kumar3@nutanix.com> wrote:
On 03/06/22 5:21 pm, Peter Krempa wrote:
On Thu, Jun 02, 2022 at 16:50:42 +0530, Rohit Kumar wrote:
On 17/05/22 8:55 pm, Peter Krempa wrote:
On Mon, May 16, 2022 at 16:03:21 +0530, Rohit Kumar wrote:
[...]
You can now also provide a 'NEWS.rst' entry I've stripped out of the original series as we require that changes to 'NEWS.rst' are done separately from anything else. Sure. I will send a patch soon to update 'NEWS.rst'. When you send updated patchset with NEWS.rst, please add I'm hadnlding the patches adding the code and they don't need to be re-posted any more. Rohit is only supposed to send the patch adding the NEWS entry as that is in a separate patch anyways.
Tested-by: Rohit Kumar <rohit.kumar3@nutanix.com> I can add this tag to the patches but only if Rohit agrees (ideally by responding to my posting of the series, to track it properly). I can't add patches on behalf of others. Hi Peter, feel free to add "Tested-by" tag on my behalf on v4 patches of the series.
Tested-by: Rohit Kumar <rohit.kumar3@nutanix.com> I'll reply to v4 patchset as well regarding this.
participants (3)
-
Ani Sinha
-
Peter Krempa
-
Rohit Kumar