mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
qemu: Add qemu command line generation for a VxHS block device
The VxHS block device will only use the newer formatting options and avoid the legacy URI syntax. An excerpt for a sample QEMU command line is: -drive file.driver=vxhs,file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,\ file.server.type=tcp,file.server.host=192.168.0.1,\ file.server.port=9999,format=raw,if=none,id=drive-virtio-disk0,cache=none \ -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ id=virtio-disk0 Update qemuxml2argvtest with a simple test. Signed-off-by: Ashish Mittal <Ashish.Mittal@veritas.com> Signed-off-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
8b5e76e913
commit
dbd98380b9
@ -516,6 +516,37 @@ qemuBlockStorageSourceGetGlusterProps(virStorageSourcePtr src)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static virJSONValuePtr
|
||||||
|
qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr src)
|
||||||
|
{
|
||||||
|
const char *protocol = virStorageNetProtocolTypeToString(src->protocol);
|
||||||
|
virJSONValuePtr server = NULL;
|
||||||
|
virJSONValuePtr ret = NULL;
|
||||||
|
|
||||||
|
if (src->nhosts != 1) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("VxHS protocol accepts only one host"));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(server = qemuBlockStorageSourceBuildJSONSocketAddress(src->hosts, true)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* VxHS disk specification example:
|
||||||
|
* { driver:"vxhs",
|
||||||
|
* vdisk-id:"eb90327c-8302-4725-4e85ed4dc251",
|
||||||
|
* server:{type:"tcp", host:"1.2.3.4", port:9999}}
|
||||||
|
*/
|
||||||
|
if (virJSONValueObjectCreate(&ret,
|
||||||
|
"s:driver", protocol,
|
||||||
|
"s:vdisk-id", src->path,
|
||||||
|
"a:server", server, NULL) < 0)
|
||||||
|
virJSONValueFree(server);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qemuBlockStorageSourceGetBackendProps:
|
* qemuBlockStorageSourceGetBackendProps:
|
||||||
* @src: disk source
|
* @src: disk source
|
||||||
@ -546,6 +577,11 @@ qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case VIR_STORAGE_NET_PROTOCOL_VXHS:
|
||||||
|
if (!(fileprops = qemuBlockStorageSourceGetVxHSProps(src)))
|
||||||
|
goto cleanup;
|
||||||
|
break;
|
||||||
|
|
||||||
case VIR_STORAGE_NET_PROTOCOL_NBD:
|
case VIR_STORAGE_NET_PROTOCOL_NBD:
|
||||||
case VIR_STORAGE_NET_PROTOCOL_RBD:
|
case VIR_STORAGE_NET_PROTOCOL_RBD:
|
||||||
case VIR_STORAGE_NET_PROTOCOL_SHEEPDOG:
|
case VIR_STORAGE_NET_PROTOCOL_SHEEPDOG:
|
||||||
@ -556,7 +592,6 @@ qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src)
|
|||||||
case VIR_STORAGE_NET_PROTOCOL_FTPS:
|
case VIR_STORAGE_NET_PROTOCOL_FTPS:
|
||||||
case VIR_STORAGE_NET_PROTOCOL_TFTP:
|
case VIR_STORAGE_NET_PROTOCOL_TFTP:
|
||||||
case VIR_STORAGE_NET_PROTOCOL_SSH:
|
case VIR_STORAGE_NET_PROTOCOL_SSH:
|
||||||
case VIR_STORAGE_NET_PROTOCOL_VXHS:
|
|
||||||
case VIR_STORAGE_NET_PROTOCOL_NONE:
|
case VIR_STORAGE_NET_PROTOCOL_NONE:
|
||||||
case VIR_STORAGE_NET_PROTOCOL_LAST:
|
case VIR_STORAGE_NET_PROTOCOL_LAST:
|
||||||
break;
|
break;
|
||||||
|
@ -994,12 +994,16 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src,
|
|||||||
ret = virBufferContentAndReset(&buf);
|
ret = virBufferContentAndReset(&buf);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case VIR_STORAGE_NET_PROTOCOL_VXHS:
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("VxHS protocol does not support URI syntax"));
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
case VIR_STORAGE_NET_PROTOCOL_SSH:
|
case VIR_STORAGE_NET_PROTOCOL_SSH:
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
_("'ssh' protocol is not yet supported"));
|
_("'ssh' protocol is not yet supported"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
case VIR_STORAGE_NET_PROTOCOL_VXHS:
|
|
||||||
case VIR_STORAGE_NET_PROTOCOL_LAST:
|
case VIR_STORAGE_NET_PROTOCOL_LAST:
|
||||||
case VIR_STORAGE_NET_PROTOCOL_NONE:
|
case VIR_STORAGE_NET_PROTOCOL_NONE:
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
@ -1329,6 +1333,10 @@ qemuDiskSourceNeedsProps(virStorageSourcePtr src)
|
|||||||
src->nhosts > 1)
|
src->nhosts > 1)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
if (actualType == VIR_STORAGE_TYPE_NETWORK &&
|
||||||
|
src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS)
|
||||||
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -736,6 +736,11 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt,
|
|||||||
if (VIR_STRDUP(def->src->path, vdi) < 0)
|
if (VIR_STRDUP(def->src->path, vdi) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
} else if (STRPREFIX(def->src->path, "vxhs:")) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("VxHS protocol does not support URI syntax '%s'"),
|
||||||
|
def->src->path);
|
||||||
|
goto error;
|
||||||
} else {
|
} else {
|
||||||
def->src->type = VIR_STORAGE_TYPE_FILE;
|
def->src->type = VIR_STORAGE_TYPE_FILE;
|
||||||
}
|
}
|
||||||
@ -1944,6 +1949,10 @@ qemuParseCommandLine(virCapsPtr caps,
|
|||||||
disk->src->type = VIR_STORAGE_TYPE_NETWORK;
|
disk->src->type = VIR_STORAGE_TYPE_NETWORK;
|
||||||
disk->src->protocol = VIR_STORAGE_NET_PROTOCOL_SHEEPDOG;
|
disk->src->protocol = VIR_STORAGE_NET_PROTOCOL_SHEEPDOG;
|
||||||
val += strlen("sheepdog:");
|
val += strlen("sheepdog:");
|
||||||
|
} else if (STRPREFIX(val, "vxhs:")) {
|
||||||
|
disk->src->type = VIR_STORAGE_TYPE_NETWORK;
|
||||||
|
disk->src->protocol = VIR_STORAGE_NET_PROTOCOL_VXHS;
|
||||||
|
val += strlen("vxhs:");
|
||||||
} else {
|
} else {
|
||||||
disk->src->type = VIR_STORAGE_TYPE_FILE;
|
disk->src->type = VIR_STORAGE_TYPE_FILE;
|
||||||
}
|
}
|
||||||
@ -2020,13 +2029,18 @@ qemuParseCommandLine(virCapsPtr caps,
|
|||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
case VIR_STORAGE_NET_PROTOCOL_VXHS:
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("VxHS protocol does not support URI "
|
||||||
|
"syntax '%s'"), disk->src->path);
|
||||||
|
goto error;
|
||||||
|
break;
|
||||||
case VIR_STORAGE_NET_PROTOCOL_HTTP:
|
case VIR_STORAGE_NET_PROTOCOL_HTTP:
|
||||||
case VIR_STORAGE_NET_PROTOCOL_HTTPS:
|
case VIR_STORAGE_NET_PROTOCOL_HTTPS:
|
||||||
case VIR_STORAGE_NET_PROTOCOL_FTP:
|
case VIR_STORAGE_NET_PROTOCOL_FTP:
|
||||||
case VIR_STORAGE_NET_PROTOCOL_FTPS:
|
case VIR_STORAGE_NET_PROTOCOL_FTPS:
|
||||||
case VIR_STORAGE_NET_PROTOCOL_TFTP:
|
case VIR_STORAGE_NET_PROTOCOL_TFTP:
|
||||||
case VIR_STORAGE_NET_PROTOCOL_SSH:
|
case VIR_STORAGE_NET_PROTOCOL_SSH:
|
||||||
case VIR_STORAGE_NET_PROTOCOL_VXHS:
|
|
||||||
case VIR_STORAGE_NET_PROTOCOL_LAST:
|
case VIR_STORAGE_NET_PROTOCOL_LAST:
|
||||||
case VIR_STORAGE_NET_PROTOCOL_NONE:
|
case VIR_STORAGE_NET_PROTOCOL_NONE:
|
||||||
/* ignored for now */
|
/* ignored for now */
|
||||||
|
@ -4579,6 +4579,32 @@ qemuProcessStartValidateShmem(virDomainObjPtr vm)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
qemuProcessStartValidateDisks(virDomainObjPtr vm,
|
||||||
|
virQEMUCapsPtr qemuCaps)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < vm->def->ndisks; i++) {
|
||||||
|
virStorageSourcePtr src = vm->def->disks[i]->src;
|
||||||
|
|
||||||
|
/* This is a best effort check as we can only check if the command
|
||||||
|
* option exists, but we cannot determine whether the running QEMU
|
||||||
|
* was build with '--enable-vxhs'. */
|
||||||
|
if (src->type == VIR_STORAGE_TYPE_NETWORK &&
|
||||||
|
src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS &&
|
||||||
|
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VXHS)) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("VxHS protocol is not supported with this "
|
||||||
|
"QEMU binary"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
qemuProcessStartValidateXML(virQEMUDriverPtr driver,
|
qemuProcessStartValidateXML(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
@ -4665,6 +4691,9 @@ qemuProcessStartValidate(virQEMUDriverPtr driver,
|
|||||||
virCPUValidateFeatures(vm->def->os.arch, vm->def->cpu) < 0)
|
virCPUValidateFeatures(vm->def->os.arch, vm->def->cpu) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
if (qemuProcessStartValidateDisks(vm, qemuCaps) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
VIR_DEBUG("Checking for any possible (non-fatal) issues");
|
VIR_DEBUG("Checking for any possible (non-fatal) issues");
|
||||||
|
|
||||||
qemuProcessStartWarnShmem(vm);
|
qemuProcessStartWarnShmem(vm);
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
LC_ALL=C \
|
||||||
|
PATH=/bin \
|
||||||
|
HOME=/home/test \
|
||||||
|
USER=test \
|
||||||
|
LOGNAME=test \
|
||||||
|
QEMU_AUDIO_DRV=none \
|
||||||
|
/usr/bin/qemu-system-x86_64 \
|
||||||
|
-name QEMUGuest1 \
|
||||||
|
-S \
|
||||||
|
-M pc \
|
||||||
|
-cpu qemu32 \
|
||||||
|
-m 214 \
|
||||||
|
-smp 1,sockets=1,cores=1,threads=1 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-nographic \
|
||||||
|
-nodefaults \
|
||||||
|
-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
|
||||||
|
server,nowait \
|
||||||
|
-mon chardev=charmonitor,id=monitor,mode=readline \
|
||||||
|
-no-acpi \
|
||||||
|
-boot c \
|
||||||
|
-usb \
|
||||||
|
-drive file.driver=vxhs,file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,\
|
||||||
|
file.server.type=tcp,file.server.host=192.168.0.1,file.server.port=9999,\
|
||||||
|
format=raw,if=none,id=drive-virtio-disk0,cache=none \
|
||||||
|
-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\
|
||||||
|
id=virtio-disk0
|
@ -933,6 +933,7 @@ mymain(void)
|
|||||||
# endif
|
# endif
|
||||||
DO_TEST("disk-drive-network-rbd-ipv6", NONE);
|
DO_TEST("disk-drive-network-rbd-ipv6", NONE);
|
||||||
DO_TEST_FAILURE("disk-drive-network-rbd-no-colon", NONE);
|
DO_TEST_FAILURE("disk-drive-network-rbd-no-colon", NONE);
|
||||||
|
DO_TEST("disk-drive-network-vxhs", QEMU_CAPS_VXHS);
|
||||||
DO_TEST("disk-drive-no-boot",
|
DO_TEST("disk-drive-no-boot",
|
||||||
QEMU_CAPS_BOOTINDEX);
|
QEMU_CAPS_BOOTINDEX);
|
||||||
DO_TEST_PARSE_ERROR("disk-device-lun-type-invalid",
|
DO_TEST_PARSE_ERROR("disk-device-lun-type-invalid",
|
||||||
|
Loading…
Reference in New Issue
Block a user