From: Ashish Mittal <Ashish.Mittal@veritas.com>
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.0.type=tcp,file.server.0.host=192.168.0.1,\
file.server.0.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 combines the rest of v5 patch1 (the src/qemu/qemu_*.c files)
and patch2. The changes are:
* Remove qemuBuildVxHSDriveJSONHost and replace with call to
qemuBlockStorageSourceBuildHostsJSONSocketAddress
* Add QEMU_CAPS_VXHS to qemuBlockStorageSourceGetVxHSProps
* Remove the unnecessary "ret = NULL;" from error path as when an
error is returned, ret will be NULL.
* Add @qemuCaps to qemuBlockStorageSourceGetBackendProps since it's
going to be necessary to check the capabilities for VxHS.
* Altered the output *.args file to have the "file.server.0" as well
as adding "file.server.0.type=tcp".
* Altered the qemuxml2argvtest to pass the QEMU_CAPS_VXHS bit/flag.
src/qemu/qemu_block.c | 48 +++++++++++++++++++++-
src/qemu/qemu_block.h | 3 +-
src/qemu/qemu_command.c | 12 +++++-
src/qemu/qemu_parse_command.c | 16 +++++++-
.../qemuxml2argv-disk-drive-network-vxhs.args | 27 ++++++++++++
tests/qemuxml2argvtest.c | 1 +
6 files changed, 101 insertions(+), 6 deletions(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args
diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c
index d07269f..cb765ab 100644
--- a/src/qemu/qemu_block.c
+++ b/src/qemu/qemu_block.c
@@ -482,6 +482,45 @@ qemuBlockStorageSourceGetGlusterProps(virStorageSourcePtr src)
}
+static virJSONValuePtr
+qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr src,
+ virQEMUCapsPtr qemuCaps)
+{
+ const char *protocol = virStorageNetProtocolTypeToString(src->protocol);
+ virJSONValuePtr server = NULL;
+ virJSONValuePtr ret = NULL;
+
+
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VXHS)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("VxHS protocol is not supported with this QEMU binary"));
+ return NULL;
+ }
+
+ if (src->nhosts != 1) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("VxHS protocol accepts only one host"));
+ return NULL;
+ }
+
+ if (!(server = qemuBlockStorageSourceBuildHostsJSONSocketAddress(src, 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:
* @src: disk source
@@ -490,7 +529,8 @@ qemuBlockStorageSourceGetGlusterProps(virStorageSourcePtr src)
* storage source. Returns NULL on error and reports an appropriate error message.
*/
virJSONValuePtr
-qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src)
+qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src,
+ virQEMUCapsPtr qemuCaps)
{
int actualType = virStorageSourceGetActualType(src);
virJSONValuePtr fileprops = NULL;
@@ -512,6 +552,11 @@ qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src)
goto cleanup;
break;
+ case VIR_STORAGE_NET_PROTOCOL_VXHS:
+ if (!(fileprops = qemuBlockStorageSourceGetVxHSProps(src, qemuCaps)))
+ goto cleanup;
+ break;
+
case VIR_STORAGE_NET_PROTOCOL_NBD:
case VIR_STORAGE_NET_PROTOCOL_RBD:
case VIR_STORAGE_NET_PROTOCOL_SHEEPDOG:
@@ -522,7 +567,6 @@ qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src)
case VIR_STORAGE_NET_PROTOCOL_FTPS:
case VIR_STORAGE_NET_PROTOCOL_TFTP:
case VIR_STORAGE_NET_PROTOCOL_SSH:
- case VIR_STORAGE_NET_PROTOCOL_VXHS:
case VIR_STORAGE_NET_PROTOCOL_NONE:
case VIR_STORAGE_NET_PROTOCOL_LAST:
break;
diff --git a/src/qemu/qemu_block.h b/src/qemu/qemu_block.h
index f0a2c9a..90f78e3 100644
--- a/src/qemu/qemu_block.h
+++ b/src/qemu/qemu_block.h
@@ -54,6 +54,7 @@ virHashTablePtr
qemuBlockGetNodeData(virJSONValuePtr data);
virJSONValuePtr
-qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src);
+qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src,
+ virQEMUCapsPtr qemuCaps);
#endif /* __QEMU_BLOCK_H__ */
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index b7a896e..3205a59 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -991,12 +991,16 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src,
ret = virBufferContentAndReset(&buf);
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:
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("'ssh' protocol is not yet supported"));
goto cleanup;
- case VIR_STORAGE_NET_PROTOCOL_VXHS:
case VIR_STORAGE_NET_PROTOCOL_LAST:
case VIR_STORAGE_NET_PROTOCOL_NONE:
virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -1326,6 +1330,10 @@ qemuDiskSourceNeedsProps(virStorageSourcePtr src)
src->nhosts > 1)
return true;
+ if (actualType == VIR_STORAGE_TYPE_NETWORK &&
+ src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS)
+ return true;
+
return false;
}
@@ -1345,7 +1353,7 @@ qemuBuildDriveSourceStr(virDomainDiskDefPtr disk,
int ret = -1;
if (qemuDiskSourceNeedsProps(disk->src) &&
- !(srcprops = qemuBlockStorageSourceGetBackendProps(disk->src)))
+ !(srcprops = qemuBlockStorageSourceGetBackendProps(disk->src, qemuCaps)))
goto cleanup;
if (!srcprops &&
diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c
index 9190a37..6286c2e 100644
--- a/src/qemu/qemu_parse_command.c
+++ b/src/qemu/qemu_parse_command.c
@@ -736,6 +736,11 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt,
if (VIR_STRDUP(def->src->path, vdi) < 0)
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 {
def->src->type = VIR_STORAGE_TYPE_FILE;
}
@@ -1944,6 +1949,10 @@ qemuParseCommandLine(virCapsPtr caps,
disk->src->type = VIR_STORAGE_TYPE_NETWORK;
disk->src->protocol = VIR_STORAGE_NET_PROTOCOL_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 {
disk->src->type = VIR_STORAGE_TYPE_FILE;
}
@@ -2020,13 +2029,18 @@ qemuParseCommandLine(virCapsPtr caps,
goto error;
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_HTTPS:
case VIR_STORAGE_NET_PROTOCOL_FTP:
case VIR_STORAGE_NET_PROTOCOL_FTPS:
case VIR_STORAGE_NET_PROTOCOL_TFTP:
case VIR_STORAGE_NET_PROTOCOL_SSH:
- case VIR_STORAGE_NET_PROTOCOL_VXHS:
case VIR_STORAGE_NET_PROTOCOL_LAST:
case VIR_STORAGE_NET_PROTOCOL_NONE:
/* ignored for now */
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args
new file mode 100644
index 0000000..86da1af
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args
@@ -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.0.type=tcp,file.server.0.host=192.168.0.1,file.server.0.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
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 18f06e5..b92ded8 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -931,6 +931,7 @@ mymain(void)
# endif
DO_TEST("disk-drive-network-rbd-ipv6", 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",
QEMU_CAPS_BOOTINDEX);
DO_TEST_PARSE_ERROR("disk-device-lun-type-invalid",
--
2.9.5
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On Wed, Aug 30, 2017 at 18:46:06 -0400, John Ferlan wrote: > From: Ashish Mittal <Ashish.Mittal@veritas.com> > > 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.0.type=tcp,file.server.0.host=192.168.0.1,\ > file.server.0.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> > --- [...] > src/qemu/qemu_block.c | 48 +++++++++++++++++++++- > src/qemu/qemu_block.h | 3 +- > src/qemu/qemu_command.c | 12 +++++- > src/qemu/qemu_parse_command.c | 16 +++++++- > .../qemuxml2argv-disk-drive-network-vxhs.args | 27 ++++++++++++ > tests/qemuxml2argvtest.c | 1 + > 6 files changed, 101 insertions(+), 6 deletions(-) > create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args > > diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c > index d07269f..cb765ab 100644 > --- a/src/qemu/qemu_block.c > +++ b/src/qemu/qemu_block.c > @@ -482,6 +482,45 @@ qemuBlockStorageSourceGetGlusterProps(virStorageSourcePtr src) > } > > > +static virJSONValuePtr > +qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr src, > + virQEMUCapsPtr qemuCaps) Please don't drag 'caps' into the options formatter. Add a function that validates whether the disk backend is supported (it should accept a virStorageSourcePtr and be called somewhere in qemuProcessStartValidate). The 'json' syntax may be used even for qemu-img's arguments and thus would make this non-reusable. Rest looks okay. -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
On 08/31/2017 06:39 AM, Peter Krempa wrote: > On Wed, Aug 30, 2017 at 18:46:06 -0400, John Ferlan wrote: >> From: Ashish Mittal <Ashish.Mittal@veritas.com> >> >> 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.0.type=tcp,file.server.0.host=192.168.0.1,\ >> file.server.0.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> >> --- > > [...] > >> src/qemu/qemu_block.c | 48 +++++++++++++++++++++- >> src/qemu/qemu_block.h | 3 +- >> src/qemu/qemu_command.c | 12 +++++- >> src/qemu/qemu_parse_command.c | 16 +++++++- >> .../qemuxml2argv-disk-drive-network-vxhs.args | 27 ++++++++++++ >> tests/qemuxml2argvtest.c | 1 + >> 6 files changed, 101 insertions(+), 6 deletions(-) >> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args >> >> diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c >> index d07269f..cb765ab 100644 >> --- a/src/qemu/qemu_block.c >> +++ b/src/qemu/qemu_block.c >> @@ -482,6 +482,45 @@ qemuBlockStorageSourceGetGlusterProps(virStorageSourcePtr src) >> } >> >> >> +static virJSONValuePtr >> +qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr src, >> + virQEMUCapsPtr qemuCaps) > > Please don't drag 'caps' into the options formatter. Add a function that > validates whether the disk backend is supported (it should accept a > virStorageSourcePtr and be called somewhere in > qemuProcessStartValidate). > > The 'json' syntax may be used even for qemu-img's arguments and thus > would make this non-reusable. > > Rest looks okay. > So essentially, if the attached patch got merged? I can update the series again eventually, but figured I'd get 'buy in' first on the approach. This will cause merge conflicts in/by patch11 though where I had also added a diskAlias argument. I suppose I could go with private data approach too - adding the alias to _qemuDomainDiskPrivate during qemuDomainPrepareDiskSourceTLS (from patch10)... Tks - John -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
On Thu, Aug 31, 2017 at 08:02:33 -0400, John Ferlan wrote: > > > On 08/31/2017 06:39 AM, Peter Krempa wrote: > > On Wed, Aug 30, 2017 at 18:46:06 -0400, John Ferlan wrote: > >> From: Ashish Mittal <Ashish.Mittal@veritas.com> > >> > >> 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.0.type=tcp,file.server.0.host=192.168.0.1,\ > >> file.server.0.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> > >> --- > > > > [...] > > > >> src/qemu/qemu_block.c | 48 +++++++++++++++++++++- > >> src/qemu/qemu_block.h | 3 +- > >> src/qemu/qemu_command.c | 12 +++++- > >> src/qemu/qemu_parse_command.c | 16 +++++++- > >> .../qemuxml2argv-disk-drive-network-vxhs.args | 27 ++++++++++++ > >> tests/qemuxml2argvtest.c | 1 + > >> 6 files changed, 101 insertions(+), 6 deletions(-) > >> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args > >> > >> diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c > >> index d07269f..cb765ab 100644 > >> --- a/src/qemu/qemu_block.c > >> +++ b/src/qemu/qemu_block.c > >> @@ -482,6 +482,45 @@ qemuBlockStorageSourceGetGlusterProps(virStorageSourcePtr src) > >> } > >> > >> > >> +static virJSONValuePtr > >> +qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr src, > >> + virQEMUCapsPtr qemuCaps) > > > > Please don't drag 'caps' into the options formatter. Add a function that > > validates whether the disk backend is supported (it should accept a > > virStorageSourcePtr and be called somewhere in > > qemuProcessStartValidate). > > > > The 'json' syntax may be used even for qemu-img's arguments and thus > > would make this non-reusable. > > > > Rest looks okay. > > > > So essentially, if the attached patch got merged? I can update the > series again eventually, but figured I'd get 'buy in' first on the approach. > > This will cause merge conflicts in/by patch11 though where I had also > added a diskAlias argument. I suppose I could go with private data > approach too - adding the alias to _qemuDomainDiskPrivate during > qemuDomainPrepareDiskSourceTLS (from patch10)... I have a solution for this in mind. Basically the TLS object name should be added as a property to virStorageSource. The code then sets the secret names at first and then both the object and disk get added. virStorageSource currently contains quite a lot qemu-isms so it won't be an regression in code looks. I might eventually convert that to some kind of private data, but at this point it's a convenient way to shove things. In that way the secret name won't depend on the disk source from the point of view of the json struct generator (as it makes sense) and thus the code will stay generic enough to use with qemu-img, where a different secret name can be generated if necessary. -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
© 2016 - 2025 Red Hat, Inc.