Use the virDomainXMLConf structure to hold this data.
/* Move to virDomainXMLOption later */
unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN];
int (*defaultConsoleTargetType)(const char *ostype, virArch guestarch);
- bool hasWideScsiBus;
};
}
int
-virDomainDiskDefAssignAddress(virCapsPtr caps, virDomainDiskDefPtr def)
+virDomainDiskDefAssignAddress(virDomainXMLOptionPtr xmlopt,
+ virDomainDiskDefPtr def)
{
int idx = virDiskNameToIndex(def->dst);
if (idx < 0) {
case VIR_DOMAIN_DISK_BUS_SCSI:
def->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE;
- if (caps->hasWideScsiBus) {
+ if (xmlopt->config.hasWideScsiBus) {
/* For a wide SCSI bus we define the default mapping to be
* 16 units per bus, 1 bus per controller, many controllers.
* Unit 7 is the SCSI controller itself. Therefore unit 7
* @param node XML nodeset to parse for disk definition
*/
static virDomainDiskDefPtr
-virDomainDiskDefParseXML(virCapsPtr caps,
+virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
xmlNodePtr node,
xmlXPathContextPtr ctxt,
virBitmapPtr bootMap,
}
if (def->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE
- && virDomainDiskDefAssignAddress(caps, def) < 0)
+ && virDomainDiskDefAssignAddress(xmlopt, def) < 0)
goto error;
cleanup:
if (xmlStrEqual(node->name, BAD_CAST "disk")) {
dev->type = VIR_DOMAIN_DEVICE_DISK;
- if (!(dev->data.disk = virDomainDiskDefParseXML(caps, node, ctxt,
+ if (!(dev->data.disk = virDomainDiskDefParseXML(xmlopt, node, ctxt,
NULL, def->seclabels,
def->nseclabels,
flags)))
goto no_memory;
for (i = 0 ; i < n ; i++) {
- virDomainDiskDefPtr disk = virDomainDiskDefParseXML(caps,
+ virDomainDiskDefPtr disk = virDomainDiskDefParseXML(xmlopt,
nodes[i],
ctxt,
bootMap,
typedef struct _virDomainDefParserConfig virDomainDefParserConfig;
typedef virDomainDefParserConfig *virDomainDefParserConfigPtr;
struct _virDomainDefParserConfig {
+ /* driver domain definition callbacks */
virDomainDefPostParseCallback domainPostParseCallback;
virDomainDeviceDefPostParseCallback devicesPostParseCallback;
+ /* private data for the callbacks */
void *priv;
virFreeCallback privFree;
+
+ /* data */
+ bool hasWideScsiBus;
};
typedef struct _virDomainXMLPrivateDataCallbacks virDomainXMLPrivateDataCallbacks;
virDomainDiskDefPtr disk);
void virDomainDiskInsertPreAlloced(virDomainDefPtr def,
virDomainDiskDefPtr disk);
-int virDomainDiskDefAssignAddress(virCapsPtr caps, virDomainDiskDefPtr def);
+int virDomainDiskDefAssignAddress(virDomainXMLOptionPtr xmlopt,
+ virDomainDiskDefPtr def);
virDomainDiskDefPtr
virDomainDiskRemove(virDomainDefPtr def, size_t i);
virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x0c, 0x29 });
virCapabilitiesAddHostMigrateTransport(caps, "vpxmigr");
- caps->hasWideScsiBus = true;
caps->defaultConsoleTargetType = esxDefaultConsoleType;
if (esxLookupHostSystemBiosUuid(priv, caps->host.host_uuid) < 0) {
goto cleanup;
}
- if (!(priv->xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL)))
+ if (!(priv->xmlopt = virVMXDomainXMLConfInit()))
goto cleanup;
conn->privateData = priv;
ctx.formatFileName = NULL;
ctx.autodetectSCSIControllerModel = NULL;
- def = virVMXParseConfig(&ctx, priv->caps, vmx);
+ def = virVMXParseConfig(&ctx, priv->xmlopt, vmx);
if (def != NULL) {
if (powerState != esxVI_VirtualMachinePowerState_PoweredOff) {
ctx.formatFileName = NULL;
ctx.autodetectSCSIControllerModel = NULL;
- def = virVMXParseConfig(&ctx, priv->caps, nativeConfig);
+ def = virVMXParseConfig(&ctx, priv->xmlopt, nativeConfig);
if (def != NULL) {
xml = virDomainDefFormat(def, VIR_DOMAIN_XML_INACTIVE);
ctx.formatFileName = esxFormatVMXFileName;
ctx.autodetectSCSIControllerModel = esxAutodetectSCSIControllerModel;
- vmx = virVMXFormatConfig(&ctx, priv->caps, def, virtualHW_version);
+ vmx = virVMXFormatConfig(&ctx, priv->xmlopt, def, virtualHW_version);
virDomainDefFree(def);
ctx.formatFileName = esxFormatVMXFileName;
ctx.autodetectSCSIControllerModel = esxAutodetectSCSIControllerModel;
- vmx = virVMXFormatConfig(&ctx, priv->caps, def, virtualHW_version);
+ vmx = virVMXFormatConfig(&ctx, priv->xmlopt, def, virtualHW_version);
if (vmx == NULL) {
goto cleanup;
# vmx/vmx.h
virVMXConvertToUTF8;
+virVMXDomainXMLConfInit;
virVMXEscapeHex;
virVMXFormatCDROM;
virVMXFormatConfig;
* Will fail if not using the 'index' keyword
*/
static virDomainDiskDefPtr
-qemuParseCommandLineDisk(virCapsPtr qemuCaps,
+qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt,
const char *val,
int nvirtiodisk,
bool old_style_ceph_args)
else
def->dst[2] = 'a' + idx;
- if (virDomainDiskDefAssignAddress(qemuCaps, def) < 0) {
+ if (virDomainDiskDefAssignAddress(xmlopt, def) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("invalid device name '%s'"), def->dst);
virDomainDiskDefFree(def);
!disk->dst)
goto no_memory;
- if (virDomainDiskDefAssignAddress(qemuCaps, disk) < 0) {
+ if (virDomainDiskDefAssignAddress(xmlopt, disk) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Cannot assign address for device name '%s'"),
disk->dst);
}
} else if (STREQ(arg, "-drive")) {
WANT_VALUE();
- if (!(disk = qemuParseCommandLineDisk(qemuCaps, val, nvirtiodisk,
+ if (!(disk = qemuParseCommandLineDisk(xmlopt, val,
+ nvirtiodisk,
ceph_args != NULL)))
goto error;
if (VIR_REALLOC_N(def->disks, def->ndisks+1) < 0)
goto cleanup;
if ((vmdef =
- virVMXParseConfig(&ctx, driver->caps, vmx)) == NULL) {
+ virVMXParseConfig(&ctx, driver->xmlopt, vmx)) == NULL) {
goto cleanup;
}
goto cleanup;
/* generate vmx file */
- vmx = virVMXFormatConfig(&ctx, driver->caps, vmdef, 7);
+ vmx = virVMXFormatConfig(&ctx, driver->xmlopt, vmdef, 7);
if (vmx == NULL)
goto cleanup;
goto cleanup;
/* generate vmx file */
- vmx = virVMXFormatConfig(&ctx, driver->caps, vmdef, 7);
+ vmx = virVMXFormatConfig(&ctx, driver->xmlopt, vmdef, 7);
if (vmx == NULL)
goto cleanup;
ctx.parseFileName = vmwareCopyVMXFileName;
- def = virVMXParseConfig(&ctx, driver->caps, nativeConfig);
+ def = virVMXParseConfig(&ctx, driver->xmlopt, nativeConfig);
if (def != NULL)
xml = virDomainDefFormat(def, VIR_DOMAIN_XML_INACTIVE);
* Helpers
*/
+virDomainDefParserConfig virVMXDomainDefParserConfig = {
+ .hasWideScsiBus = true,
+};
+
+
+virDomainXMLOptionPtr
+virVMXDomainXMLConfInit(void)
+{
+ return virDomainXMLOptionNew(&virVMXDomainDefParserConfig,
+ NULL, NULL);
+}
+
char *
virVMXEscapeHex(const char *string, char escape, const char *special)
{
static int
-virVMXVerifyDiskAddress(virCapsPtr caps, virDomainDiskDefPtr disk)
+virVMXVerifyDiskAddress(virDomainXMLOptionPtr xmlopt, virDomainDiskDefPtr disk)
{
virDomainDiskDef def;
virDomainDeviceDriveAddressPtr drive;
def.dst = disk->dst;
def.bus = disk->bus;
- if (virDomainDiskDefAssignAddress(caps, &def) < 0) {
+ if (virDomainDiskDefAssignAddress(xmlopt, &def) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Could not verify disk address"));
return -1;
*/
virDomainDefPtr
-virVMXParseConfig(virVMXContext *ctx, virCapsPtr caps, const char *vmx)
+virVMXParseConfig(virVMXContext *ctx,
+ virDomainXMLOptionPtr xmlopt,
+ const char *vmx)
{
bool success = false;
virConfPtr conf = NULL;
continue;
}
- if (virVMXParseDisk(ctx, caps, conf, VIR_DOMAIN_DISK_DEVICE_DISK,
+ if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_DISK,
VIR_DOMAIN_DISK_BUS_SCSI, controller, unit,
&def->disks[def->ndisks]) < 0) {
goto cleanup;
continue;
}
- if (virVMXParseDisk(ctx, caps, conf, VIR_DOMAIN_DISK_DEVICE_CDROM,
+ if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_CDROM,
VIR_DOMAIN_DISK_BUS_SCSI, controller, unit,
&def->disks[def->ndisks]) < 0) {
goto cleanup;
/* def:disks (ide) */
for (bus = 0; bus < 2; ++bus) {
for (unit = 0; unit < 2; ++unit) {
- if (virVMXParseDisk(ctx, caps, conf, VIR_DOMAIN_DISK_DEVICE_DISK,
+ if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_DISK,
VIR_DOMAIN_DISK_BUS_IDE, bus, unit,
&def->disks[def->ndisks]) < 0) {
goto cleanup;
continue;
}
- if (virVMXParseDisk(ctx, caps, conf, VIR_DOMAIN_DISK_DEVICE_CDROM,
+ if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_CDROM,
VIR_DOMAIN_DISK_BUS_IDE, bus, unit,
&def->disks[def->ndisks]) < 0) {
goto cleanup;
/* def:disks (floppy) */
for (unit = 0; unit < 2; ++unit) {
- if (virVMXParseDisk(ctx, caps, conf, VIR_DOMAIN_DISK_DEVICE_FLOPPY,
+ if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_FLOPPY,
VIR_DOMAIN_DISK_BUS_FDC, 0, unit,
&def->disks[def->ndisks]) < 0) {
goto cleanup;
int
-virVMXParseDisk(virVMXContext *ctx, virCapsPtr caps, virConfPtr conf,
+virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virConfPtr conf,
int device, int busType, int controllerOrBus, int unit,
virDomainDiskDefPtr *def)
{
goto cleanup;
}
- if (virDomainDiskDefAssignAddress(caps, *def) < 0) {
+ if (virDomainDiskDefAssignAddress(xmlopt, *def) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Could not assign address to disk '%s'"), (*def)->src);
goto cleanup;
*/
char *
-virVMXFormatConfig(virVMXContext *ctx, virCapsPtr caps, virDomainDefPtr def,
+virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDefPtr def,
int virtualHW_version)
{
char *vmx = NULL;
/* def:disks */
for (i = 0; i < def->ndisks; ++i) {
- if (virVMXVerifyDiskAddress(caps, def->disks[i]) < 0 ||
+ if (virVMXVerifyDiskAddress(xmlopt, def->disks[i]) < 0 ||
virVMXHandleLegacySCSIDiskDriverName(def, def->disks[i]) < 0) {
goto cleanup;
}
typedef struct _virVMXContext virVMXContext;
+virDomainXMLOptionPtr virVMXDomainXMLConfInit(void);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VMX -> Domain XML
*/
-virDomainDefPtr virVMXParseConfig(virVMXContext *ctx, virCapsPtr caps,
+virDomainDefPtr virVMXParseConfig(virVMXContext *ctx,
+ virDomainXMLOptionPtr xmlopt,
const char *vmx);
int virVMXParseVNC(virConfPtr conf, virDomainGraphicsDefPtr *def);
int virVMXParseSCSIController(virConfPtr conf, int controller, bool *present,
int *virtualDev);
-int virVMXParseDisk(virVMXContext *ctx, virCapsPtr caps, virConfPtr conf,
- int device, int busType, int controllerOrBus, int unit,
- virDomainDiskDefPtr *def);
+int virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt,
+ virConfPtr conf, int device, int busType,
+ int controllerOrBus, int unit, virDomainDiskDefPtr *def);
int virVMXParseFileSystem(virConfPtr conf, int number, virDomainFSDefPtr *def);
* Domain XML -> VMX
*/
-char *virVMXFormatConfig(virVMXContext *ctx, virCapsPtr caps,
+char *virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt,
virDomainDefPtr def, int virtualHW_version);
int virVMXFormatVNC(virDomainGraphicsDefPtr def, virBufferPtr buffer);
# include "vmx/vmx.h"
static virCapsPtr caps;
+static virDomainXMLOptionPtr xmlopt;
static virVMXContext ctx;
static int testDefaultConsoleType(const char *ostype ATTRIBUTE_UNUSED,
virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x0c, 0x29 });
virCapabilitiesAddHostMigrateTransport(caps, "esx");
- caps->hasWideScsiBus = true;
-
/* i686 guest */
guest =
virCapabilitiesAddGuest(caps, "hvm",
goto failure;
}
- def = virVMXParseConfig(&ctx, caps, vmxData);
+ def = virVMXParseConfig(&ctx, xmlopt, vmxData);
if (def == NULL) {
err = virGetLastError();
return EXIT_FAILURE;
}
+ if (!(xmlopt = virVMXDomainXMLConfInit()))
+ return EXIT_FAILURE;
+
ctx.opaque = NULL;
ctx.parseFileName = testParseVMXFileName;
ctx.formatFileName = NULL;
DO_TEST("svga", "svga");
virObjectUnref(caps);
+ virObjectUnref(xmlopt);
return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x0c, 0x29 });
virCapabilitiesAddHostMigrateTransport(caps, "esx");
- caps->hasWideScsiBus = true;
/* i686 guest */
guest =
goto failure;
}
- formatted = virVMXFormatConfig(&ctx, caps, def, virtualHW_version);
+ formatted = virVMXFormatConfig(&ctx, xmlopt, def, virtualHW_version);
if (formatted == NULL) {
goto failure;
return EXIT_FAILURE;
}
- if (!(xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL)))
+ if (!(xmlopt = virVMXDomainXMLConfInit()))
return EXIT_FAILURE;
ctx.opaque = NULL;
DO_TEST("svga", "svga", 4);
virObjectUnref(caps);
+ virObjectUnref(xmlopt);
return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}