conf: don't use passed in caps in post parse method

To enable the virCapsPtr parameter to the post parse method to be
eliminated, the drivers must fetch the virCapsPtr from their own
driver via the opaque parameter, or use an alternative approach
to validate the parsed data.

Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrangé 2019-12-03 10:49:49 +00:00
parent 2578d74aee
commit 4a4132b462
35 changed files with 301 additions and 144 deletions

View File

@ -20,6 +20,7 @@
#include <config.h>
#include "bhyve_driver.h"
#include "bhyve_conf.h"
#include "bhyve_device.h"
#include "bhyve_domain.h"
@ -74,11 +75,16 @@ bhyveDomainDefNeedsISAController(virDomainDefPtr def)
static int
bhyveDomainDefPostParse(virDomainDefPtr def,
virCapsPtr caps,
virCapsPtr _caps G_GNUC_UNUSED,
unsigned int parseFlags G_GNUC_UNUSED,
void *opaque G_GNUC_UNUSED,
void *opaque,
void *parseOpaque G_GNUC_UNUSED)
{
bhyveConnPtr driver = opaque;
g_autoptr(virCaps) caps = bhyveDriverGetCapabilities(driver);
if (!caps)
return -1;
if (!virCapabilitiesDomainSupported(caps, def->os.type,
def->os.arch,
def->virtType))

View File

@ -928,7 +928,7 @@ esxConnectOpen(virConnectPtr conn, virConnectAuthPtr auth,
if (!priv->caps)
goto cleanup;
if (!(priv->xmlopt = virVMXDomainXMLConfInit()))
if (!(priv->xmlopt = virVMXDomainXMLConfInit(priv->caps)))
goto cleanup;
conn->privateData = priv;

View File

@ -2470,8 +2470,9 @@ libxlBuildDomainConfig(virPortAllocatorRangePtr graphicsports,
}
virDomainXMLOptionPtr
libxlCreateXMLConf(void)
libxlCreateXMLConf(libxlDriverPrivatePtr driver)
{
libxlDomainDefParserConfig.priv = driver;
return virDomainXMLOptionNew(&libxlDomainDefParserConfig,
&libxlDomainXMLPrivateDataCallbacks,
NULL, NULL, NULL);

View File

@ -207,7 +207,7 @@ libxlMakeUSB(virDomainHostdevDefPtr hostdev, libxl_device_usbdev *usbdev);
#endif
virDomainXMLOptionPtr
libxlCreateXMLConf(void);
libxlCreateXMLConf(libxlDriverPrivatePtr driver);
#ifdef LIBXL_HAVE_DEVICE_CHANNEL
# define LIBXL_ATTR_UNUSED

View File

@ -367,12 +367,15 @@ libxlDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
static int
libxlDomainDefPostParse(virDomainDefPtr def,
virCapsPtr caps,
virCapsPtr caps G_GNUC_UNUSED,
unsigned int parseFlags G_GNUC_UNUSED,
void *opaque G_GNUC_UNUSED,
void *opaque,
void *parseOpaque G_GNUC_UNUSED)
{
if (!virCapabilitiesDomainSupported(caps, def->os.type,
libxlDriverPrivatePtr driver = opaque;
g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
if (!virCapabilitiesDomainSupported(cfg->caps, def->os.type,
def->os.arch,
def->virtType))
return -1;

View File

@ -769,7 +769,7 @@ libxlStateInitialize(bool privileged,
goto error;
}
if (!(libxl_driver->xmlopt = libxlCreateXMLConf()))
if (!(libxl_driver->xmlopt = libxlCreateXMLConf(libxl_driver)))
goto error;
/* Add Domain-0 */

View File

@ -207,8 +207,9 @@ virCapsPtr virLXCDriverGetCapabilities(virLXCDriverPtr driver,
virDomainXMLOptionPtr
lxcDomainXMLConfInit(void)
lxcDomainXMLConfInit(virLXCDriverPtr driver)
{
virLXCDriverDomainDefParserConfig.priv = driver;
return virDomainXMLOptionNew(&virLXCDriverDomainDefParserConfig,
&virLXCDriverPrivateDataCallbacks,
&virLXCDriverDomainXMLNamespace,

View File

@ -112,7 +112,7 @@ int virLXCLoadDriverConfig(virLXCDriverConfigPtr cfg,
virCapsPtr virLXCDriverCapsInit(virLXCDriverPtr driver);
virCapsPtr virLXCDriverGetCapabilities(virLXCDriverPtr driver,
bool refresh);
virDomainXMLOptionPtr lxcDomainXMLConfInit(void);
virDomainXMLOptionPtr lxcDomainXMLConfInit(virLXCDriverPtr driver);
static inline void lxcDriverLock(virLXCDriverPtr driver)
{

View File

@ -159,11 +159,41 @@ static void virLXCControllerQuitTimer(int timer G_GNUC_UNUSED, void *opaque)
}
static virLXCDriverPtr
virLXCControllerDriverNew(void)
{
virLXCDriverPtr driver = g_new0(virLXCDriver, 1);
if (virMutexInit(&driver->lock) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("cannot initialize mutex"));
g_free(driver);
return NULL;
}
driver->caps = virLXCDriverCapsInit(NULL);
driver->xmlopt = lxcDomainXMLConfInit(driver);
return driver;
}
static void
virLXCControllerDriverFree(virLXCDriverPtr driver)
{
if (!driver)
return;
virObjectUnref(driver->xmlopt);
virObjectUnref(driver->caps);
virMutexDestroy(&driver->lock);
g_free(driver);
}
static virLXCControllerPtr virLXCControllerNew(const char *name)
{
virLXCControllerPtr ctrl = NULL;
virCapsPtr caps = NULL;
virDomainXMLOptionPtr xmlopt = NULL;
virLXCDriverPtr driver = NULL;
char *configFile = NULL;
if (VIR_ALLOC(ctrl) < 0)
@ -174,10 +204,7 @@ static virLXCControllerPtr virLXCControllerNew(const char *name)
ctrl->name = g_strdup(name);
if (!(caps = virLXCDriverCapsInit(NULL)))
goto error;
if (!(xmlopt = lxcDomainXMLConfInit()))
if (!(driver = virLXCControllerDriverNew()))
goto error;
if ((configFile = virDomainConfigFile(LXC_STATE_DIR,
@ -185,7 +212,7 @@ static virLXCControllerPtr virLXCControllerNew(const char *name)
goto error;
if ((ctrl->vm = virDomainObjParseFile(configFile,
caps, xmlopt,
driver->caps, driver->xmlopt,
0)) == NULL)
goto error;
ctrl->def = ctrl->vm->def;
@ -197,8 +224,7 @@ static virLXCControllerPtr virLXCControllerNew(const char *name)
cleanup:
VIR_FREE(configFile);
virObjectUnref(caps);
virObjectUnref(xmlopt);
virLXCControllerDriverFree(driver);
return ctrl;
error:

View File

@ -351,11 +351,15 @@ virDomainXMLPrivateDataCallbacks virLXCDriverPrivateDataCallbacks = {
static int
virLXCDomainDefPostParse(virDomainDefPtr def,
virCapsPtr caps,
virCapsPtr _caps G_GNUC_UNUSED,
unsigned int parseFlags G_GNUC_UNUSED,
void *opaque G_GNUC_UNUSED,
void *opaque,
void *parseOpaque G_GNUC_UNUSED)
{
virLXCDriverPtr driver = opaque;
g_autoptr(virCaps) caps = virLXCDriverGetCapabilities(driver, false);
if (!caps)
return -1;
if (!virCapabilitiesDomainSupported(caps, def->os.type,
def->os.arch,
def->virtType))

View File

@ -1584,7 +1584,7 @@ static int lxcStateInitialize(bool privileged,
if (!(caps = virLXCDriverGetCapabilities(lxc_driver, true)))
goto cleanup;
if (!(lxc_driver->xmlopt = lxcDomainXMLConfInit()))
if (!(lxc_driver->xmlopt = lxcDomainXMLConfInit(lxc_driver)))
goto cleanup;
if (!(lxc_driver->closeCallbacks = virCloseCallbacksNew()))

View File

@ -1082,12 +1082,13 @@ int openvzGetVEID(const char *name)
static int
openvzDomainDefPostParse(virDomainDefPtr def,
virCapsPtr caps,
virCapsPtr caps G_GNUC_UNUSED,
unsigned int parseFlags G_GNUC_UNUSED,
void *opaque G_GNUC_UNUSED,
void *opaque,
void *parseOpaque G_GNUC_UNUSED)
{
if (!virCapabilitiesDomainSupported(caps, def->os.type,
struct openvz_driver *driver = opaque;
if (!virCapabilitiesDomainSupported(driver->caps, def->os.type,
def->os.arch,
def->virtType))
return -1;
@ -1133,8 +1134,9 @@ virDomainDefParserConfig openvzDomainDefParserConfig = {
.features = VIR_DOMAIN_DEF_FEATURE_NAME_SLASH,
};
virDomainXMLOptionPtr openvzXMLOption(void)
virDomainXMLOptionPtr openvzXMLOption(struct openvz_driver *driver)
{
openvzDomainDefParserConfig.priv = driver;
return virDomainXMLOptionNew(&openvzDomainDefParserConfig,
NULL, NULL, NULL, NULL);
}

View File

@ -63,4 +63,4 @@ int strtoI(const char *str);
int openvzSetDefinedUUID(int vpsid, unsigned char *uuid);
int openvzGetVEID(const char *name);
int openvzReadNetworkConf(virDomainDefPtr def, int veid);
virDomainXMLOptionPtr openvzXMLOption(void);
virDomainXMLOptionPtr openvzXMLOption(struct openvz_driver *driver);

View File

@ -1311,7 +1311,7 @@ static virDrvOpenStatus openvzConnectOpen(virConnectPtr conn,
if (!(driver->caps = openvzCapsInit()))
goto cleanup;
if (!(driver->xmlopt = openvzXMLOption()))
if (!(driver->xmlopt = openvzXMLOption(driver)))
goto cleanup;
if (openvzLoadDomains(driver) < 0)

View File

@ -1062,12 +1062,13 @@ openSSHSession(virConnectPtr conn, virConnectAuthPtr auth,
static int
phypDomainDefPostParse(virDomainDefPtr def,
virCapsPtr caps,
virCapsPtr caps G_GNUC_UNUSED,
unsigned int parseFlags G_GNUC_UNUSED,
void *opaque G_GNUC_UNUSED,
void *opaque,
void *parseOpaque G_GNUC_UNUSED)
{
if (!virCapabilitiesDomainSupported(caps, def->os.type,
phyp_driverPtr driver = opaque;
if (!virCapabilitiesDomainSupported(driver->caps, def->os.type,
def->os.arch,
def->virtType))
return -1;
@ -1157,6 +1158,7 @@ phypConnectOpen(virConnectPtr conn,
if ((phyp_driver->caps = phypCapsInit()) == NULL)
goto failure;
virPhypDriverDomainDefParserConfig.priv = phyp_driver;
if (!(phyp_driver->xmlopt = virDomainXMLOptionNew(&virPhypDriverDomainDefParserConfig,
NULL, NULL, NULL, NULL)))
goto failure;

View File

@ -2094,6 +2094,44 @@ virQEMUCapsSetHostModel(virQEMUCapsPtr qemuCaps,
}
bool
virQEMUCapsIsArchSupported(virQEMUCapsPtr qemuCaps,
virArch arch)
{
if (arch == qemuCaps->arch)
return true;
if (qemuCaps->arch == VIR_ARCH_X86_64 && arch == VIR_ARCH_I686)
return true;
if (qemuCaps->arch == VIR_ARCH_AARCH64 && arch == VIR_ARCH_ARMV7L)
return true;
if (qemuCaps->arch == VIR_ARCH_ARMV7L && arch == VIR_ARCH_ARMV6L)
return true;
if (qemuCaps->arch == VIR_ARCH_PPC64 && arch == VIR_ARCH_PPC64LE)
return true;
return false;
}
bool
virQEMUCapsIsVirtTypeSupported(virQEMUCapsPtr qemuCaps,
virDomainVirtType virtType)
{
if (virtType == VIR_DOMAIN_VIRT_QEMU)
return true;
if (virtType == VIR_DOMAIN_VIRT_KVM &&
virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
return true;
return false;
}
bool
virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
virArch hostarch,

View File

@ -603,6 +603,10 @@ int virQEMUCapsGetCPUFeatures(virQEMUCapsPtr qemuCaps,
bool migratable,
char ***features);
bool virQEMUCapsIsArchSupported(virQEMUCapsPtr qemuCaps,
virArch arch);
bool virQEMUCapsIsVirtTypeSupported(virQEMUCapsPtr qemuCaps,
virDomainVirtType virtType);
bool virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
virArch hostarch,
virDomainVirtType type,

View File

@ -4691,22 +4691,40 @@ qemuDomainDefPostParseBasic(virDomainDefPtr def,
static int
qemuDomainDefPostParse(virDomainDefPtr def,
virCapsPtr caps,
virCapsPtr caps G_GNUC_UNUSED,
unsigned int parseFlags,
void *opaque,
void *parseOpaque)
void *parseOpaque G_GNUC_UNUSED)
{
virQEMUDriverPtr driver = opaque;
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
/* Note that qemuCaps may be NULL when this function is called. This
* function shall not fail in that case. It will be re-run on VM startup
* with the capabilities populated. */
virQEMUCapsPtr qemuCaps = parseOpaque;
g_autoptr(virQEMUCaps) qemuCaps = NULL;
if (!virCapabilitiesDomainSupported(caps, def->os.type,
def->os.arch,
def->virtType))
if (!(qemuCaps = virQEMUCapsCacheLookup(driver->qemuCapsCache,
def->emulator))) {
return 1;
}
if (def->os.type != VIR_DOMAIN_OSTYPE_HVM) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Emulator '%s' does not support os type '%s'"),
def->emulator, virDomainOSTypeToString(def->os.type));
return -1;
}
if (!virQEMUCapsIsArchSupported(qemuCaps, def->os.arch)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Emulator '%s' does not support arch '%s'"),
def->emulator, virArchToString(def->os.arch));
return -1;
}
if (!virQEMUCapsIsVirtTypeSupported(qemuCaps, def->virtType)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Emulator '%s' does not support virt type '%s'"),
def->emulator, virDomainVirtTypeToString(def->virtType));
return -1;
}
if (def->os.bootloader || def->os.bootloaderArgs) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
@ -4715,15 +4733,9 @@ qemuDomainDefPostParse(virDomainDefPtr def,
}
if (!def->os.machine) {
g_autofree virCapsDomainDataPtr capsdata = NULL;
if (!(capsdata = virCapabilitiesDomainDataLookup(caps, def->os.type,
def->os.arch,
def->virtType,
NULL, NULL))) {
return -1;
}
def->os.machine = g_strdup(capsdata->machinetype);
const char *machine = virQEMUCapsGetPreferredMachine(qemuCaps,
def->virtType);
def->os.machine = g_strdup(machine);
}
qemuDomainNVRAMPathGenerate(cfg, def);

View File

@ -117,12 +117,13 @@ vmwareDataFreeFunc(void *data)
static int
vmwareDomainDefPostParse(virDomainDefPtr def,
virCapsPtr caps,
virCapsPtr caps G_GNUC_UNUSED,
unsigned int parseFlags G_GNUC_UNUSED,
void *opaque G_GNUC_UNUSED,
void *parseOpaque G_GNUC_UNUSED)
{
if (!virCapabilitiesDomainSupported(caps, def->os.type,
struct vmware_driver *driver = opaque;
if (!virCapabilitiesDomainSupported(driver->caps, def->os.type,
def->os.arch,
def->virtType))
return -1;
@ -148,11 +149,11 @@ virDomainDefParserConfig vmwareDomainDefParserConfig = {
};
static virDomainXMLOptionPtr
vmwareDomainXMLConfigInit(void)
vmwareDomainXMLConfigInit(struct vmware_driver *driver)
{
virDomainXMLPrivateDataCallbacks priv = { .alloc = vmwareDataAllocFunc,
.free = vmwareDataFreeFunc };
vmwareDomainDefParserConfig.priv = driver;
return virDomainXMLOptionNew(&vmwareDomainDefParserConfig, &priv,
NULL, NULL, NULL);
}
@ -235,7 +236,7 @@ vmwareConnectOpen(virConnectPtr conn,
if (!(driver->caps = vmwareCapsInit()))
goto cleanup;
if (!(driver->xmlopt = vmwareDomainXMLConfigInit()))
if (!(driver->xmlopt = vmwareDomainXMLConfigInit(driver)))
goto cleanup;
if (vmwareLoadDomains(driver) < 0)

View File

@ -530,11 +530,12 @@ VIR_ENUM_IMPL(virVMXControllerModelSCSI,
static int
virVMXDomainDefPostParse(virDomainDefPtr def,
virCapsPtr caps,
virCapsPtr _caps G_GNUC_UNUSED,
unsigned int parseFlags G_GNUC_UNUSED,
void *opaque G_GNUC_UNUSED,
void *opaque,
void *parseOpaque G_GNUC_UNUSED)
{
virCapsPtr caps = opaque;
if (!virCapabilitiesDomainSupported(caps, def->os.type,
def->os.arch,
def->virtType))
@ -612,8 +613,9 @@ static virXMLNamespace virVMXDomainXMLNamespace = {
};
virDomainXMLOptionPtr
virVMXDomainXMLConfInit(void)
virVMXDomainXMLConfInit(virCapsPtr caps)
{
virVMXDomainDefParserConfig.priv = caps;
return virDomainXMLOptionNew(&virVMXDomainDefParserConfig, NULL,
&virVMXDomainXMLNamespace, NULL, NULL);
}

View File

@ -29,7 +29,7 @@
typedef struct _virVMXContext virVMXContext;
virDomainXMLOptionPtr virVMXDomainXMLConfInit(void);
virDomainXMLOptionPtr virVMXDomainXMLConfInit(virCapsPtr caps);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

View File

@ -241,12 +241,13 @@ vzDomainDefAddDefaultInputDevices(virDomainDefPtr def)
static int
vzDomainDefPostParse(virDomainDefPtr def,
virCapsPtr caps,
virCapsPtr caps G_GNUC_UNUSED,
unsigned int parseFlags G_GNUC_UNUSED,
void *opaque G_GNUC_UNUSED,
void *opaque,
void *parseOpaque G_GNUC_UNUSED)
{
if (!virCapabilitiesDomainSupported(caps, def->os.type,
vzDriverPtr driver = opaque;
if (!virCapabilitiesDomainSupported(driver->caps, def->os.type,
def->os.arch,
def->virtType))
return -1;
@ -289,10 +290,12 @@ vzDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
static int
vzDomainDeviceDefValidate(const virDomainDeviceDef *dev,
const virDomainDef *def,
void *opaque G_GNUC_UNUSED)
void *opaque)
{
vzDriverPtr driver = opaque;
if (dev->type == VIR_DOMAIN_DEVICE_DISK)
return vzCheckUnsupportedDisk(def, dev->data.disk, opaque);
return vzCheckUnsupportedDisk(def, dev->data.disk, driver->vzCaps);
else if (dev->type == VIR_DOMAIN_DEVICE_GRAPHICS)
return vzCheckUnsupportedGraphics(dev->data.graphics);
@ -323,7 +326,7 @@ vzDriverObjNew(void)
if (!(driver = virObjectLockableNew(vzDriverClass)))
return NULL;
vzDomainDefParserConfig.priv = &driver->vzCaps;
vzDomainDefParserConfig.priv = driver;
if (!(driver->caps = vzBuildCapabilities()) ||
!(driver->xmlopt = virDomainXMLOptionNew(&vzDomainDefParserConfig,

View File

@ -1048,11 +1048,17 @@ endif WITH_LXC
if WITH_QEMU
vircapstest_SOURCES += testutilsqemu.c testutilsqemu.h
endif WITH_QEMU
vircapstest_LDADD =
if WITH_QEMU
vircapstest_LDADD = $(qemu_LDADDS)
else ! WITH_QEMU
vircapstest_LDADD = $(LDADDS)
endif ! WITH_QEMU
vircapstest_LDADD += ../src/libvirt_driver_qemu_impl.la
if WITH_DTRACE_PROBES
vircapstest_LDADD += ../src/libvirt_qemu_probes.lo
endif WITH_DTRACE_PROBES
endif WITH_QEMU
if WITH_LXC
vircapstest_LDADD += ../src/libvirt_driver_lxc_impl.la
endif WITH_LXC
vircapstest_LDADD += $(LDADDS)
libdomaincapsmock_la_SOURCES = domaincapsmock.c
libdomaincapsmock_la_LDFLAGS = $(MOCKLIBS_LDFLAGS)

View File

@ -41,7 +41,7 @@
# define VIR_FROM_THIS VIR_FROM_LIBXL
static virCapsPtr caps;
static libxlDriverPrivatePtr driver;
static int
testCompareXMLToDomConfig(const char *xmlfile,
@ -50,19 +50,13 @@ testCompareXMLToDomConfig(const char *xmlfile,
int ret = -1;
libxl_domain_config actualconfig;
libxl_domain_config expectconfig;
libxlDriverConfigPtr cfg;
xentoollog_logger *log = NULL;
virPortAllocatorRangePtr gports = NULL;
virDomainXMLOptionPtr xmlopt = NULL;
virDomainDefPtr vmdef = NULL;
char *actualjson = NULL;
char *tempjson = NULL;
char *expectjson = NULL;
if (!(cfg = libxlDriverConfigNew()))
return -1;
cfg->caps = caps;
g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
libxl_domain_config_init(&actualconfig);
libxl_domain_config_init(&expectconfig);
@ -82,10 +76,7 @@ testCompareXMLToDomConfig(const char *xmlfile,
if (!(gports = virPortAllocatorRangeNew("vnc", 5900, 6000)))
goto cleanup;
if (!(xmlopt = libxlCreateXMLConf()))
goto cleanup;
if (!(vmdef = virDomainDefParseFile(xmlfile, caps, xmlopt,
if (!(vmdef = virDomainDefParseFile(xmlfile, cfg->caps, driver->xmlopt,
NULL, VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
@ -128,12 +119,9 @@ testCompareXMLToDomConfig(const char *xmlfile,
VIR_FREE(tempjson);
virDomainDefFree(vmdef);
virPortAllocatorRangeFree(gports);
virObjectUnref(xmlopt);
libxl_domain_config_dispose(&actualconfig);
libxl_domain_config_dispose(&expectconfig);
xtl_logger_destroy(log);
cfg->caps = NULL;
virObjectUnref(cfg);
return ret;
}
@ -177,7 +165,7 @@ mymain(void)
return EXIT_FAILURE;
}
if ((caps = testXLInitCaps()) == NULL)
if ((driver = testXLInitDriver()) == NULL)
return EXIT_FAILURE;
# define DO_TEST(name) \
@ -216,6 +204,8 @@ mymain(void)
unlink("libxl-driver.log");
testXLFreeDriver(driver);
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}

View File

@ -10,8 +10,7 @@
# define VIR_FROM_THIS VIR_FROM_NONE
static virCapsPtr caps;
static virDomainXMLOptionPtr xmlopt;
static virLXCDriverPtr driver;
static int testSanitizeDef(virDomainDefPtr vmdef)
{
@ -34,7 +33,7 @@ testCompareXMLToConfigFiles(const char *xmlfile,
if (virTestLoadFile(configfile, &config) < 0)
goto fail;
vmdef = lxcParseConfigString(config, caps, xmlopt);
vmdef = lxcParseConfigString(config, driver->caps, driver->xmlopt);
if ((vmdef && expectError) || (!vmdef && !expectError))
goto fail;
@ -42,7 +41,7 @@ testCompareXMLToConfigFiles(const char *xmlfile,
if (testSanitizeDef(vmdef) < 0)
goto fail;
if (!(actualxml = virDomainDefFormat(vmdef, xmlopt, caps, 0)))
if (!(actualxml = virDomainDefFormat(vmdef, driver->xmlopt, driver->caps, 0)))
goto fail;
if (virTestCompareToFile(actualxml, xmlfile) < 0)
@ -109,14 +108,9 @@ mymain(void)
{
int ret = EXIT_SUCCESS;
if (!(caps = testLXCCapsInit()))
if (!(driver = testLXCDriverInit()))
return EXIT_FAILURE;
if (!(xmlopt = lxcDomainXMLConfInit())) {
virObjectUnref(caps);
return EXIT_FAILURE;
}
# define DO_TEST(name, expectError) \
do { \
const struct testInfo info = { name, expectError }; \
@ -166,8 +160,7 @@ mymain(void)
DO_TEST3("blkiotune", false);
DO_TEST3("ethernet", false);
virObjectUnref(xmlopt);
virObjectUnref(caps);
testLXCDriverFree(driver);
return ret;
}

View File

@ -16,8 +16,7 @@
# define VIR_FROM_THIS VIR_FROM_NONE
static virCapsPtr caps;
static virDomainXMLOptionPtr xmlopt;
static virLXCDriverPtr driver;
struct testInfo {
const char *name;
@ -39,7 +38,7 @@ testCompareXMLToXMLHelper(const void *data)
xml_out = g_strdup_printf("%s/lxcxml2xmloutdata/lxc-%s.xml",
abs_srcdir, info->name);
ret = testCompareDomXML2XMLFiles(caps, xmlopt, xml_in,
ret = testCompareDomXML2XMLFiles(driver->caps, driver->xmlopt, xml_in,
info->different ? xml_out : xml_in,
!info->inactive_only,
info->parse_flags,
@ -55,10 +54,7 @@ mymain(void)
{
int ret = 0;
if ((caps = testLXCCapsInit()) == NULL)
return EXIT_FAILURE;
if (!(xmlopt = lxcDomainXMLConfInit()))
if (!(driver = testLXCDriverInit()))
return EXIT_FAILURE;
# define DO_TEST_FULL(name, is_different, inactive, parse_flags) \
@ -95,8 +91,7 @@ mymain(void)
DO_TEST("initdir");
DO_TEST("inituser");
virObjectUnref(caps);
virObjectUnref(xmlopt);
testLXCDriverFree(driver);
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}

View File

@ -98,7 +98,10 @@ testReadNetworkConf(const void *data G_GNUC_UNUSED)
" </interface>\n"
" </devices>\n"
"</domain>\n";
virDomainXMLOptionPtr xmlopt = openvzXMLOption();
struct openvz_driver driver = {0};
driver.xmlopt = openvzXMLOption(&driver);
driver.caps = openvzCapsInit();
if (!(def = virDomainDefNew()))
goto cleanup;
@ -113,7 +116,7 @@ testReadNetworkConf(const void *data G_GNUC_UNUSED)
goto cleanup;
}
actual = virDomainDefFormat(def, xmlopt, NULL, VIR_DOMAIN_DEF_FORMAT_INACTIVE);
actual = virDomainDefFormat(def, driver.xmlopt, driver.caps, VIR_DOMAIN_DEF_FORMAT_INACTIVE);
if (actual == NULL) {
fprintf(stderr, "ERROR: %s\n", virGetLastErrorMessage());
@ -128,7 +131,8 @@ testReadNetworkConf(const void *data G_GNUC_UNUSED)
result = 0;
cleanup:
virObjectUnref(xmlopt);
virObjectUnref(driver.xmlopt);
virObjectUnref(driver.caps);
VIR_FREE(actual);
virDomainDefFree(def);

View File

@ -6,8 +6,10 @@
# include "viralloc.h"
# include "domain_conf.h"
# define VIR_FROM_THIS VIR_FROM_LXC
virCapsPtr testLXCCapsInit(void)
virCapsPtr
testLXCCapsInit(void)
{
virCapsPtr caps;
virCapsGuestPtr guest;
@ -54,4 +56,34 @@ virCapsPtr testLXCCapsInit(void)
virObjectUnref(caps);
return NULL;
}
virLXCDriverPtr
testLXCDriverInit(void)
{
virLXCDriverPtr driver = g_new0(virLXCDriver, 1);
if (virMutexInit(&driver->lock) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", "cannot initialize mutex");
g_free(driver);
return NULL;
}
driver->caps = testLXCCapsInit();
driver->xmlopt = lxcDomainXMLConfInit(driver);
return driver;
}
void
testLXCDriverFree(virLXCDriverPtr driver)
{
virObjectUnref(driver->xmlopt);
virObjectUnref(driver->caps);
virMutexDestroy(&driver->lock);
g_free(driver);
}
#endif

View File

@ -18,7 +18,11 @@
#include "capabilities.h"
#include "lxc/lxc_conf.h"
#define FAKEDEVDIR0 "/fakedevdir0/bla/fasl"
#define FAKEDEVDIR1 "/fakedevdir1/bla/fasl"
virCapsPtr testLXCCapsInit(void);
virLXCDriverPtr testLXCDriverInit(void);
void testLXCDriverFree(virLXCDriverPtr driver);

View File

@ -6,7 +6,9 @@
#include "testutilshostcpus.h"
#include "domain_conf.h"
virCapsPtr
#define VIR_FROM_THIS VIR_FROM_LIBXL
static virCapsPtr
testXLInitCaps(void)
{
virCapsPtr caps;
@ -79,3 +81,33 @@ testXLInitCaps(void)
virObjectUnref(caps);
return NULL;
}
libxlDriverPrivatePtr testXLInitDriver(void)
{
libxlDriverPrivatePtr driver = g_new0(libxlDriverPrivate, 1);
if (virMutexInit(&driver->lock) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", "cannot initialize mutex");
g_free(driver);
return NULL;
}
driver->config = libxlDriverConfigNew();
driver->config->caps = testXLInitCaps();
driver->xmlopt = libxlCreateXMLConf(driver);
return driver;
}
void testXLFreeDriver(libxlDriverPrivatePtr driver)
{
virObjectUnref(driver->config->caps);
virObjectUnref(driver->config);
virObjectUnref(driver->xmlopt);
virMutexDestroy(&driver->lock);
g_free(driver);
}

View File

@ -18,7 +18,10 @@
#include "capabilities.h"
#ifdef WITH_LIBXL
# include "libxl/libxl_capabilities.h"
#endif
# include "libxl/libxl_conf.h"
virCapsPtr testXLInitCaps(void);
libxlDriverPrivatePtr testXLInitDriver(void);
void testXLFreeDriver(libxlDriverPrivatePtr driver);
#endif /* WITH_LIBXL */

View File

@ -186,7 +186,7 @@ mymain(void)
if (caps == NULL)
return EXIT_FAILURE;
if (!(xmlopt = virVMXDomainXMLConfInit()))
if (!(xmlopt = virVMXDomainXMLConfInit(caps)))
return EXIT_FAILURE;
ctx.opaque = NULL;

View File

@ -36,9 +36,7 @@
#define VIR_FROM_THIS VIR_FROM_NONE
static virCapsPtr caps;
static virDomainXMLOptionPtr xmlopt;
static libxlDriverPrivatePtr driver;
/*
* This function provides a mechanism to replace variables in test
@ -74,6 +72,7 @@ testCompareParseXML(const char *xlcfg, const char *xml, bool replaceVars)
int ret = -1;
virDomainDefPtr def = NULL;
char *replacedXML = NULL;
g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
if (VIR_ALLOC_N(gotxlcfgData, wrote) < 0)
goto fail;
@ -84,16 +83,16 @@ testCompareParseXML(const char *xlcfg, const char *xml, bool replaceVars)
if (replaceVars) {
if (!(replacedXML = testReplaceVarsXML(xml)))
goto fail;
if (!(def = virDomainDefParseString(replacedXML, caps, xmlopt,
if (!(def = virDomainDefParseString(replacedXML, cfg->caps, driver->xmlopt,
NULL, VIR_DOMAIN_XML_INACTIVE)))
goto fail;
} else {
if (!(def = virDomainDefParseFile(xml, caps, xmlopt,
if (!(def = virDomainDefParseFile(xml, cfg->caps, driver->xmlopt,
NULL, VIR_DOMAIN_XML_INACTIVE)))
goto fail;
}
if (!virDomainDefCheckABIStability(def, def, xmlopt)) {
if (!virDomainDefCheckABIStability(def, def, driver->xmlopt)) {
fprintf(stderr, "ABI stability check failed on %s", xml);
goto fail;
}
@ -133,6 +132,7 @@ testCompareFormatXML(const char *xlcfg, const char *xml, bool replaceVars)
virConnectPtr conn;
virDomainDefPtr def = NULL;
char *replacedXML = NULL;
g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
conn = virGetConnect();
if (!conn) goto fail;
@ -143,10 +143,10 @@ testCompareFormatXML(const char *xlcfg, const char *xml, bool replaceVars)
if (!(conf = virConfReadString(xlcfgData, 0)))
goto fail;
if (!(def = xenParseXL(conf, caps, xmlopt)))
if (!(def = xenParseXL(conf, cfg->caps, driver->xmlopt)))
goto fail;
if (!(gotxml = virDomainDefFormat(def, xmlopt, caps,
if (!(gotxml = virDomainDefFormat(def, driver->xmlopt, cfg->caps,
VIR_DOMAIN_XML_INACTIVE |
VIR_DOMAIN_XML_SECURE)))
goto fail;
@ -208,10 +208,7 @@ mymain(void)
{
int ret = 0;
if (!(caps = testXLInitCaps()))
return EXIT_FAILURE;
if (!(xmlopt = libxlCreateXMLConf()))
if (!(driver = testXLInitDriver()))
return EXIT_FAILURE;
#define DO_TEST_PARSE(name, replace) \
@ -303,10 +300,9 @@ mymain(void)
DO_TEST("usb");
DO_TEST("usbctrl");
virObjectUnref(caps);
virObjectUnref(xmlopt);
testXLFreeDriver(driver);
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
VIR_TEST_MAIN(mymain)
VIR_TEST_MAIN_PRELOAD(mymain, VIR_TEST_MOCK("xl"))

View File

@ -34,8 +34,7 @@
#define VIR_FROM_THIS VIR_FROM_NONE
static virCapsPtr caps;
static virDomainXMLOptionPtr xmlopt;
static libxlDriverPrivatePtr driver;
static int
testCompareParseXML(const char *xmcfg, const char *xml)
@ -46,6 +45,7 @@ testCompareParseXML(const char *xmcfg, const char *xml)
virConnectPtr conn = NULL;
int wrote = 4096;
virDomainDefPtr def = NULL;
g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
if (VIR_ALLOC_N(gotxmcfgData, wrote) < 0)
goto fail;
@ -53,11 +53,11 @@ testCompareParseXML(const char *xmcfg, const char *xml)
conn = virGetConnect();
if (!conn) goto fail;
if (!(def = virDomainDefParseFile(xml, caps, xmlopt, NULL,
if (!(def = virDomainDefParseFile(xml, cfg->caps, driver->xmlopt, NULL,
VIR_DOMAIN_DEF_PARSE_INACTIVE)))
goto fail;
if (!virDomainDefCheckABIStability(def, def, xmlopt)) {
if (!virDomainDefCheckABIStability(def, def, driver->xmlopt)) {
fprintf(stderr, "ABI stability check failed on %s", xml);
goto fail;
}
@ -90,6 +90,7 @@ testCompareFormatXML(const char *xmcfg, const char *xml)
g_autoptr(virConf) conf = NULL;
int ret = -1;
virDomainDefPtr def = NULL;
g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
if (virTestLoadFile(xmcfg, &xmcfgData) < 0)
goto fail;
@ -97,10 +98,10 @@ testCompareFormatXML(const char *xmcfg, const char *xml)
if (!(conf = virConfReadString(xmcfgData, 0)))
goto fail;
if (!(def = xenParseXM(conf, caps, xmlopt)))
if (!(def = xenParseXM(conf, cfg->caps, driver->xmlopt)))
goto fail;
if (!(gotxml = virDomainDefFormat(def, xmlopt, caps, VIR_DOMAIN_DEF_FORMAT_SECURE)))
if (!(gotxml = virDomainDefFormat(def, driver->xmlopt, cfg->caps, VIR_DOMAIN_DEF_FORMAT_SECURE)))
goto fail;
if (virTestCompareToFile(gotxml, xml) < 0)
@ -152,10 +153,7 @@ mymain(void)
{
int ret = 0;
if (!(caps = testXLInitCaps()))
return EXIT_FAILURE;
if (!(xmlopt = libxlCreateXMLConf()))
if (!(driver = testXLInitDriver()))
return EXIT_FAILURE;
#define DO_TEST_PARSE(name) \
@ -225,10 +223,9 @@ mymain(void)
DO_TEST("disk-drv-blktap-raw");
DO_TEST("disk-drv-blktap2-raw");
virObjectUnref(caps);
virObjectUnref(xmlopt);
testXLFreeDriver(driver);
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
VIR_TEST_MAIN(mymain)
VIR_TEST_MAIN_PRELOAD(mymain, VIR_TEST_MOCK("xl"))

View File

@ -207,7 +207,7 @@ mymain(void)
if (caps == NULL)
return EXIT_FAILURE;
if (!(xmlopt = virVMXDomainXMLConfInit()))
if (!(xmlopt = virVMXDomainXMLConfInit(caps)))
return EXIT_FAILURE;
ctx.opaque = NULL;