#include <config.h>
+#include "bhyve_driver.h"
#include "bhyve_conf.h"
#include "bhyve_device.h"
#include "bhyve_domain.h"
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))
if (!priv->caps)
goto cleanup;
- if (!(priv->xmlopt = virVMXDomainXMLConfInit()))
+ if (!(priv->xmlopt = virVMXDomainXMLConfInit(priv->caps)))
goto cleanup;
conn->privateData = priv;
}
virDomainXMLOptionPtr
-libxlCreateXMLConf(void)
+libxlCreateXMLConf(libxlDriverPrivatePtr driver)
{
+ libxlDomainDefParserConfig.priv = driver;
return virDomainXMLOptionNew(&libxlDomainDefParserConfig,
&libxlDomainXMLPrivateDataCallbacks,
NULL, NULL, NULL);
#endif
virDomainXMLOptionPtr
-libxlCreateXMLConf(void);
+libxlCreateXMLConf(libxlDriverPrivatePtr driver);
#ifdef LIBXL_HAVE_DEVICE_CHANNEL
# define LIBXL_ATTR_UNUSED
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;
goto error;
}
- if (!(libxl_driver->xmlopt = libxlCreateXMLConf()))
+ if (!(libxl_driver->xmlopt = libxlCreateXMLConf(libxl_driver)))
goto error;
/* Add Domain-0 */
virDomainXMLOptionPtr
-lxcDomainXMLConfInit(void)
+lxcDomainXMLConfInit(virLXCDriverPtr driver)
{
+ virLXCDriverDomainDefParserConfig.priv = driver;
return virDomainXMLOptionNew(&virLXCDriverDomainDefParserConfig,
&virLXCDriverPrivateDataCallbacks,
&virLXCDriverDomainXMLNamespace,
virCapsPtr virLXCDriverCapsInit(virLXCDriverPtr driver);
virCapsPtr virLXCDriverGetCapabilities(virLXCDriverPtr driver,
bool refresh);
-virDomainXMLOptionPtr lxcDomainXMLConfInit(void);
+virDomainXMLOptionPtr lxcDomainXMLConfInit(virLXCDriverPtr driver);
static inline void lxcDriverLock(virLXCDriverPtr driver)
{
}
+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)
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,
goto error;
if ((ctrl->vm = virDomainObjParseFile(configFile,
- caps, xmlopt,
+ driver->caps, driver->xmlopt,
0)) == NULL)
goto error;
ctrl->def = ctrl->vm->def;
cleanup:
VIR_FREE(configFile);
- virObjectUnref(caps);
- virObjectUnref(xmlopt);
+ virLXCControllerDriverFree(driver);
return ctrl;
error:
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))
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()))
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;
.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);
}
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);
if (!(driver->caps = openvzCapsInit()))
goto cleanup;
- if (!(driver->xmlopt = openvzXMLOption()))
+ if (!(driver->xmlopt = openvzXMLOption(driver)))
goto cleanup;
if (openvzLoadDomains(driver) < 0)
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;
if ((phyp_driver->caps = phypCapsInit()) == NULL)
goto failure;
+ virPhypDriverDomainDefParserConfig.priv = phyp_driver;
if (!(phyp_driver->xmlopt = virDomainXMLOptionNew(&virPhypDriverDomainDefParserConfig,
NULL, NULL, NULL, NULL)))
goto failure;
}
+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,
bool migratable,
char ***features);
+bool virQEMUCapsIsArchSupported(virQEMUCapsPtr qemuCaps,
+ virArch arch);
+bool virQEMUCapsIsVirtTypeSupported(virQEMUCapsPtr qemuCaps,
+ virDomainVirtType virtType);
bool virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
virArch hostarch,
virDomainVirtType type,
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 (!(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 (!virCapabilitiesDomainSupported(caps, def->os.type,
- def->os.arch,
- def->virtType))
+ 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",
}
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);
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;
};
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);
}
if (!(driver->caps = vmwareCapsInit()))
goto cleanup;
- if (!(driver->xmlopt = vmwareDomainXMLConfigInit()))
+ if (!(driver->xmlopt = vmwareDomainXMLConfigInit(driver)))
goto cleanup;
if (vmwareLoadDomains(driver) < 0)
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))
};
virDomainXMLOptionPtr
-virVMXDomainXMLConfInit(void)
+virVMXDomainXMLConfInit(virCapsPtr caps)
{
+ virVMXDomainDefParserConfig.priv = caps;
return virDomainXMLOptionNew(&virVMXDomainDefParserConfig, NULL,
&virVMXDomainXMLNamespace, NULL, NULL);
}
typedef struct _virVMXContext virVMXContext;
-virDomainXMLOptionPtr virVMXDomainXMLConfInit(void);
+virDomainXMLOptionPtr virVMXDomainXMLConfInit(virCapsPtr caps);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
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;
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);
if (!(driver = virObjectLockableNew(vzDriverClass)))
return NULL;
- vzDomainDefParserConfig.priv = &driver->vzCaps;
+ vzDomainDefParserConfig.priv = driver;
if (!(driver->caps = vzBuildCapabilities()) ||
!(driver->xmlopt = virDomainXMLOptionNew(&vzDomainDefParserConfig,
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)
# define VIR_FROM_THIS VIR_FROM_LIBXL
-static virCapsPtr caps;
+static libxlDriverPrivatePtr driver;
static int
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);
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;
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;
}
return EXIT_FAILURE;
}
- if ((caps = testXLInitCaps()) == NULL)
+ if ((driver = testXLInitDriver()) == NULL)
return EXIT_FAILURE;
# define DO_TEST(name) \
unlink("libxl-driver.log");
+ testXLFreeDriver(driver);
+
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
# define VIR_FROM_THIS VIR_FROM_NONE
-static virCapsPtr caps;
-static virDomainXMLOptionPtr xmlopt;
+static virLXCDriverPtr driver;
static int testSanitizeDef(virDomainDefPtr vmdef)
{
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;
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)
{
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 }; \
DO_TEST3("blkiotune", false);
DO_TEST3("ethernet", false);
- virObjectUnref(xmlopt);
- virObjectUnref(caps);
+ testLXCDriverFree(driver);
return ret;
}
# define VIR_FROM_THIS VIR_FROM_NONE
-static virCapsPtr caps;
-static virDomainXMLOptionPtr xmlopt;
+static virLXCDriverPtr driver;
struct testInfo {
const char *name;
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,
{
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) \
DO_TEST("initdir");
DO_TEST("inituser");
- virObjectUnref(caps);
- virObjectUnref(xmlopt);
+ testLXCDriverFree(driver);
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
" </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;
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());
result = 0;
cleanup:
- virObjectUnref(xmlopt);
+ virObjectUnref(driver.xmlopt);
+ virObjectUnref(driver.caps);
VIR_FREE(actual);
virDomainDefFree(def);
# include "viralloc.h"
# include "domain_conf.h"
+# define VIR_FROM_THIS VIR_FROM_LXC
-virCapsPtr testLXCCapsInit(void)
+virCapsPtr
+testLXCCapsInit(void)
{
virCapsPtr caps;
virCapsGuestPtr guest;
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
#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);
#include "testutilshostcpus.h"
#include "domain_conf.h"
-virCapsPtr
+#define VIR_FROM_THIS VIR_FROM_LIBXL
+
+static virCapsPtr
testXLInitCaps(void)
{
virCapsPtr caps;
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);
+}
#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 */
if (caps == NULL)
return EXIT_FAILURE;
- if (!(xmlopt = virVMXDomainXMLConfInit()))
+ if (!(xmlopt = virVMXDomainXMLConfInit(caps)))
return EXIT_FAILURE;
ctx.opaque = NULL;
#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
int ret = -1;
virDomainDefPtr def = NULL;
char *replacedXML = NULL;
+ g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
if (VIR_ALLOC_N(gotxlcfgData, wrote) < 0)
goto fail;
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;
}
virConnectPtr conn;
virDomainDefPtr def = NULL;
char *replacedXML = NULL;
+ g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
conn = virGetConnect();
if (!conn) goto fail;
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;
{
int ret = 0;
- if (!(caps = testXLInitCaps()))
- return EXIT_FAILURE;
-
- if (!(xmlopt = libxlCreateXMLConf()))
+ if (!(driver = testXLInitDriver()))
return EXIT_FAILURE;
#define DO_TEST_PARSE(name, replace) \
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"))
#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)
virConnectPtr conn = NULL;
int wrote = 4096;
virDomainDefPtr def = NULL;
+ g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
if (VIR_ALLOC_N(gotxmcfgData, wrote) < 0)
goto fail;
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;
}
g_autoptr(virConf) conf = NULL;
int ret = -1;
virDomainDefPtr def = NULL;
+ g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
if (virTestLoadFile(xmcfg, &xmcfgData) < 0)
goto fail;
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)
{
int ret = 0;
- if (!(caps = testXLInitCaps()))
- return EXIT_FAILURE;
-
- if (!(xmlopt = libxlCreateXMLConf()))
+ if (!(driver = testXLInitDriver()))
return EXIT_FAILURE;
#define DO_TEST_PARSE(name) \
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"))
if (caps == NULL)
return EXIT_FAILURE;
- if (!(xmlopt = virVMXDomainXMLConfInit()))
+ if (!(xmlopt = virVMXDomainXMLConfInit(caps)))
return EXIT_FAILURE;
ctx.opaque = NULL;