This revealed that GuestDefaultEmulator was a bit buggy, capable of returning an emulator that didn't match the passed domain type. Fix up the test suite input to continue to pass. --- src/conf/capabilities.c | 122 ----------------------------- src/conf/capabilities.h | 15 ---- src/conf/domain_conf.c | 21 ++--- src/libvirt_private.syms | 3 - src/qemu/qemu_capabilities.c | 13 +-- src/qemu/qemu_command.c | 19 +++-- src/xenconfig/xen_common.c | 37 ++++----- tests/securityselinuxlabeldata/chardev.xml | 2 +- tests/securityselinuxlabeldata/disks.xml | 2 +- tests/securityselinuxlabeldata/kernel.xml | 2 +- tests/securityselinuxlabeldata/nfs.xml | 2 +- 11 files changed, 43 insertions(+), 195 deletions(-) diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index a2b6451..c9e5a64 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -729,128 +729,6 @@ virCapabilitiesDomainDataLookup(virCapsPtr caps, return ret; } -/** - * virCapabilitiesDefaultGuestArch: - * @caps: capabilities to query - * @ostype: guest operating system type, of enum VIR_DOMAIN_OSTYPE - * @domain: domain type to search for, of enum VIR_DOMAIN_VIRT - * - * Returns the first architecture able to run the - * requested operating system type - */ -extern virArch -virCapabilitiesDefaultGuestArch(virCapsPtr caps, - int ostype, - int domain) -{ - size_t i, j; - - /* First try to find one matching host arch */ - for (i = 0; i < caps->nguests; i++) { - if (caps->guests[i]->ostype == ostype) { - for (j = 0; j < caps->guests[i]->arch.ndomains; j++) { - if (caps->guests[i]->arch.domains[j]->type == domain && - caps->guests[i]->arch.id == caps->host.arch) - return caps->guests[i]->arch.id; - } - } - } - - /* Otherwise find the first match */ - for (i = 0; i < caps->nguests; i++) { - if (caps->guests[i]->ostype == ostype) { - for (j = 0; j < caps->guests[i]->arch.ndomains; j++) { - if (caps->guests[i]->arch.domains[j]->type == domain) - return caps->guests[i]->arch.id; - } - } - } - - return VIR_ARCH_NONE; -} - -/** - * virCapabilitiesDefaultGuestMachine: - * @caps: capabilities to query - * @ostype: guest operating system type, of enum VIR_DOMAIN_OSTYPE - * @arch: architecture to search for - * @domain: domain type to search for, of enum VIR_DOMAIN_VIRT - * - * Returns the first machine variant associated with - * the requested operating system type, architecture - * and domain type - */ -extern const char * -virCapabilitiesDefaultGuestMachine(virCapsPtr caps, - int ostype, - virArch arch, - int domain) -{ - size_t i; - - for (i = 0; i < caps->nguests; i++) { - virCapsGuestPtr guest = caps->guests[i]; - size_t j; - - if (guest->ostype != ostype || - guest->arch.id != arch) - continue; - - for (j = 0; j < guest->arch.ndomains; j++) { - virCapsGuestDomainPtr dom = guest->arch.domains[j]; - - if (dom->type != domain) - continue; - - if (!dom->info.nmachines) - break; - - return dom->info.machines[0]->name; - } - - if (guest->arch.defaultInfo.nmachines) - return caps->guests[i]->arch.defaultInfo.machines[0]->name; - } - - return NULL; -} - -/** - * virCapabilitiesDefaultGuestEmulator: - * @caps: capabilities to query - * @ostype: guest operating system type, of enum VIR_DOMAIN_OSTYPE - * @arch: architecture to search for - * @domain: domain type to search for, of enum VIR_DOMAIN_VIRT - * - * Returns the first emulator path associated with - * the requested operating system type, architecture - * and domain type - */ -extern const char * -virCapabilitiesDefaultGuestEmulator(virCapsPtr caps, - int ostype, - virArch arch, - int domain) -{ - size_t i, j; - - for (i = 0; i < caps->nguests; i++) { - char *emulator; - if (caps->guests[i]->ostype == ostype && - caps->guests[i]->arch.id == arch) { - emulator = caps->guests[i]->arch.defaultInfo.emulator; - for (j = 0; j < caps->guests[i]->arch.ndomains; j++) { - if (caps->guests[i]->arch.domains[j]->type == domain) { - if (caps->guests[i]->arch.domains[j]->info.emulator) - emulator = caps->guests[i]->arch.domains[j]->info.emulator; - } - } - return emulator; - } - } - return NULL; -} - static int virCapabilitiesFormatNUMATopology(virBufferPtr buf, size_t ncells, diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h index 948a1a5..2a3a8f0 100644 --- a/src/conf/capabilities.h +++ b/src/conf/capabilities.h @@ -284,21 +284,6 @@ void virCapabilitiesClearHostNUMACellCPUTopology(virCapsHostNUMACellCPUPtr cpu, size_t ncpus); -extern virArch -virCapabilitiesDefaultGuestArch(virCapsPtr caps, - int ostype, - int domain); -extern const char * -virCapabilitiesDefaultGuestMachine(virCapsPtr caps, - int ostype, - virArch arch, - int domain); -extern const char * -virCapabilitiesDefaultGuestEmulator(virCapsPtr caps, - int ostype, - virArch arch, - int domain); - extern char * virCapabilitiesFormatXML(virCapsPtr caps); diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 4d9d4b5..911cee3 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -12959,25 +12959,18 @@ char * virDomainDefGetDefaultEmulator(virDomainDefPtr def, virCapsPtr caps) { - const char *emulator; char *retemu; + virCapsDomainDataPtr capsdata; - emulator = virCapabilitiesDefaultGuestEmulator(caps, - def->os.type, - def->os.arch, - def->virtType); + if (!(capsdata = virCapabilitiesDomainDataLookup(caps, def->os.type, + def->os.arch, def->virtType, NULL, NULL))) + return NULL; - if (!emulator) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("no emulator for domain %s os type %s " - "on architecture %s"), - virDomainVirtTypeToString(def->virtType), - virDomainOSTypeToString(def->os.type), - virArchToString(def->os.arch)); + if (VIR_STRDUP(retemu, capsdata->emulator) < 0) { + VIR_FREE(capsdata); return NULL; } - - ignore_value(VIR_STRDUP(retemu, emulator)); + VIR_FREE(capsdata); return retemu; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 5843061..48785d1 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -51,9 +51,6 @@ virCapabilitiesAddHostMigrateTransport; virCapabilitiesAddHostNUMACell; virCapabilitiesAllocMachines; virCapabilitiesClearHostNUMACellCPUTopology; -virCapabilitiesDefaultGuestArch; -virCapabilitiesDefaultGuestEmulator; -virCapabilitiesDefaultGuestMachine; virCapabilitiesDomainDataLookup; virCapabilitiesFormatXML; virCapabilitiesFreeMachines; diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index ad50360..01ed1e2 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1888,25 +1888,26 @@ int virQEMUCapsGetDefaultVersion(virCapsPtr caps, virQEMUCapsCachePtr capsCache, unsigned int *version) { - const char *binary; virQEMUCapsPtr qemucaps; virArch hostarch; + virCapsDomainDataPtr capsdata; if (*version > 0) return 0; hostarch = virArchFromHost(); - if ((binary = virCapabilitiesDefaultGuestEmulator(caps, - VIR_DOMAIN_OSTYPE_HVM, - hostarch, - VIR_DOMAIN_VIRT_QEMU)) == NULL) { + if (!(capsdata = virCapabilitiesDomainDataLookup(caps, + VIR_DOMAIN_OSTYPE_HVM, hostarch, VIR_DOMAIN_VIRT_QEMU, + NULL, NULL))) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Cannot find suitable emulator for %s"), virArchToString(hostarch)); return -1; } - if (!(qemucaps = virQEMUCapsCacheLookup(capsCache, binary))) + qemucaps = virQEMUCapsCacheLookup(capsCache, capsdata->emulator); + VIR_FREE(capsdata); + if (!qemucaps) return -1; *version = virQEMUCapsGetVersion(qemucaps); diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 8e7b689..29b876e 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -13145,14 +13145,17 @@ qemuParseCommandLine(virCapsPtr qemuCaps, } if (!def->os.machine) { - const char *defaultMachine = - virCapabilitiesDefaultGuestMachine(qemuCaps, - def->os.type, - def->os.arch, - def->virtType); - if (defaultMachine != NULL) - if (VIR_STRDUP(def->os.machine, defaultMachine) < 0) - goto error; + virCapsDomainDataPtr capsdata; + + if (!(capsdata = virCapabilitiesDomainDataLookup(qemuCaps, def->os.type, + def->os.arch, def->virtType, NULL, NULL))) + goto error; + + if (VIR_STRDUP(def->os.machine, capsdata->machinetype) < 0) { + VIR_FREE(capsdata); + goto error; + } + VIR_FREE(capsdata); } if (!nographics && def->ngraphics == 0) { diff --git a/src/xenconfig/xen_common.c b/src/xenconfig/xen_common.c index 728b910..0dfe60e 100644 --- a/src/xenconfig/xen_common.c +++ b/src/xenconfig/xen_common.c @@ -983,15 +983,15 @@ xenParseEmulatedDevices(virConfPtr conf, virDomainDefPtr def) static int xenParseGeneralMeta(virConfPtr conf, virDomainDefPtr def, virCapsPtr caps) { - const char *defaultMachine; + virCapsDomainDataPtr capsdata = NULL; const char *str; - int hvm = 0; + int hvm = 0, ret = -1; if (xenConfigCopyString(conf, "name", &def->name) < 0) - return -1; + goto out; if (xenConfigGetUUID(conf, "uuid", def->uuid) < 0) - return -1; + goto out; if ((xenConfigGetString(conf, "builder", &str, "linux") == 0) && STREQ(str, "hvm")) @@ -999,27 +999,18 @@ xenParseGeneralMeta(virConfPtr conf, virDomainDefPtr def, virCapsPtr caps) def->os.type = (hvm ? VIR_DOMAIN_OSTYPE_HVM : VIR_DOMAIN_OSTYPE_XEN); - def->os.arch = - virCapabilitiesDefaultGuestArch(caps, - def->os.type, - def->virtType); - if (!def->os.arch) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("no supported architecture for os type '%s'"), - virDomainOSTypeToString(def->os.type)); - return -1; - } + if (!(capsdata = virCapabilitiesDomainDataLookup(caps, def->os.type, + VIR_ARCH_NONE, def->virtType, NULL, NULL))) + goto out; - defaultMachine = virCapabilitiesDefaultGuestMachine(caps, - def->os.type, - def->os.arch, - def->virtType); - if (defaultMachine != NULL) { - if (VIR_STRDUP(def->os.machine, defaultMachine) < 0) - return -1; - } + def->os.arch = capsdata->arch; + if (VIR_STRDUP(def->os.machine, capsdata->machinetype) < 0) + goto out; - return 0; + ret = 0; + out: + VIR_FREE(capsdata); + return ret; } diff --git a/tests/securityselinuxlabeldata/chardev.xml b/tests/securityselinuxlabeldata/chardev.xml index 64b6b5f..33002e4 100644 --- a/tests/securityselinuxlabeldata/chardev.xml +++ b/tests/securityselinuxlabeldata/chardev.xml @@ -3,7 +3,7 @@ <uuid>c7b3edbd-edaf-9455-926a-d65c16db1800</uuid> <memory unit='KiB'>219200</memory> <os> - <type arch='i686' machine='pc-1.0'>hvm</type> + <type arch='x86_64' machine='pc-1.0'>hvm</type> <boot dev='cdrom'/> </os> <devices> diff --git a/tests/securityselinuxlabeldata/disks.xml b/tests/securityselinuxlabeldata/disks.xml index 33e8763..08f0587 100644 --- a/tests/securityselinuxlabeldata/disks.xml +++ b/tests/securityselinuxlabeldata/disks.xml @@ -3,7 +3,7 @@ <uuid>c7b3edbd-edaf-9455-926a-d65c16db1800</uuid> <memory unit='KiB'>219200</memory> <os> - <type arch='i686' machine='pc-1.0'>hvm</type> + <type arch='x86_64' machine='pc-1.0'>hvm</type> <boot dev='cdrom'/> </os> <devices> diff --git a/tests/securityselinuxlabeldata/kernel.xml b/tests/securityselinuxlabeldata/kernel.xml index 0fd551d..1e0cd15 100644 --- a/tests/securityselinuxlabeldata/kernel.xml +++ b/tests/securityselinuxlabeldata/kernel.xml @@ -3,7 +3,7 @@ <uuid>c7b3edbd-edaf-9455-926a-d65c16db1800</uuid> <memory unit='KiB'>219200</memory> <os> - <type arch='i686' machine='pc-1.0'>hvm</type> + <type arch='x86_64' machine='pc-1.0'>hvm</type> <kernel>/vmlinuz.raw</kernel> <initrd>/initrd.raw</initrd> </os> diff --git a/tests/securityselinuxlabeldata/nfs.xml b/tests/securityselinuxlabeldata/nfs.xml index 46a1440..cac12dd 100644 --- a/tests/securityselinuxlabeldata/nfs.xml +++ b/tests/securityselinuxlabeldata/nfs.xml @@ -3,7 +3,7 @@ <uuid>c7b3edbd-edaf-9455-926a-d65c16db1800</uuid> <memory unit='KiB'>219200</memory> <os> - <type arch='i686' machine='pc-1.0'>hvm</type> + <type arch='x86_64' machine='pc-1.0'>hvm</type> <boot dev='cdrom'/> </os> <devices> -- 2.3.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list