From: zhangshengyu <zhangshengyu@xxxxxxxxxxxxxx> --- src/conf/domain_conf.c | 10 ++++++ src/qemu/qemu_block.c | 24 +++++++++++-- src/qemu/qemu_command.c | 3 ++ src/qemu/qemu_parse_command.c | 10 +++++- src/storage/storage_backend_gluster.c | 1 + src/util/virstoragefile.c | 3 +- src/util/virstoragefile.h | 1 + .../qemuargv2xmldata/disk-drive-network-iser.args | 25 +++++++++++++ tests/qemuargv2xmldata/disk-drive-network-iser.xml | 41 ++++++++++++++++++++++ tests/qemuargv2xmltest.c | 1 + .../qemuxml2argvdata/disk-drive-network-iser.args | 29 +++++++++++++++ tests/qemuxml2argvdata/disk-drive-network-iser.xml | 37 +++++++++++++++++++ tests/qemuxml2argvtest.c | 1 + .../qemuxml2xmloutdata/disk-drive-network-iser.xml | 41 ++++++++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 15 files changed, 224 insertions(+), 4 deletions(-) create mode 100644 tests/qemuargv2xmldata/disk-drive-network-iser.args create mode 100644 tests/qemuargv2xmldata/disk-drive-network-iser.xml create mode 100644 tests/qemuxml2argvdata/disk-drive-network-iser.args create mode 100644 tests/qemuxml2argvdata/disk-drive-network-iser.xml create mode 100644 tests/qemuxml2xmloutdata/disk-drive-network-iser.xml diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 9a62bc472..5767575d0 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -7080,6 +7080,7 @@ virDomainStorageNetworkParseHosts(xmlNodePtr node, virStorageNetHostDefPtr *hosts, size_t *nhosts) { + char *transport = NULL; xmlNodePtr child; for (child = node->children; child; child = child->next) { @@ -7091,6 +7092,11 @@ virDomainStorageNetworkParseHosts(xmlNodePtr node, } } + if ((*hosts) && (transport = virXMLPropString(node, "transport"))) { + //VIR_WARN("missing network source transport type"); + (*hosts)->transport = virStorageNetHostTransportTypeFromString(transport); + } + return 0; } @@ -8495,6 +8501,7 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node, if (virDomainStorageNetworkParseHosts(node, &src->hosts, &src->nhosts) < 0) goto cleanup; + virStorageSourceNetworkAssignDefaultPorts(src); ret = 0; @@ -22364,6 +22371,9 @@ virDomainDiskSourceFormatNetwork(virBufferPtr attrBuf, VIR_FREE(path); + if (src->hosts->transport == VIR_STORAGE_NET_HOST_TRANS_ISER) + virBufferEscapeString(attrBuf, " transport='%s'", "iser"); + if (src->haveTLS != VIR_TRISTATE_BOOL_ABSENT && !(flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE && src->tlsFromConfig)) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index 585f0255e..49837205f 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -433,6 +433,12 @@ qemuBlockStorageSourceGetURI(virStorageSourcePtr src) if (VIR_STRDUP(uri->scheme, virStorageNetProtocolTypeToString(src->protocol)) < 0) goto cleanup; + } else if (src->hosts->transport == VIR_STORAGE_NET_HOST_TRANS_ISER) { + uri->port = src->hosts->port; + + if (VIR_STRDUP(uri->scheme, + virStorageNetHostTransportTypeToString(src->hosts->transport)) < 0) + goto cleanup; } else { if (virAsprintf(&uri->scheme, "%s+%s", virStorageNetProtocolTypeToString(src->protocol), @@ -506,6 +512,19 @@ qemuBlockStorageSourceBuildJSONSocketAddress(virStorageNetHostDefPtr host, goto cleanup; break; + case VIR_STORAGE_NET_HOST_TRANS_ISER: + transport = "iser"; + if (virAsprintf(&port, "%u", host->port) < 0) + goto cleanup; + + if (virJSONValueObjectCreate(&server, + "s:type", transport, + "s:host", host->name, + "s:port", port, + NULL) < 0) + goto cleanup; + break; + case VIR_STORAGE_NET_HOST_TRANS_UNIX: if (virJSONValueObjectCreate(&server, "s:type", "unix", @@ -590,7 +609,8 @@ qemuBlockStorageSourceBuildJSONInetSocketAddress(virStorageNetHostDefPtr host) virJSONValuePtr ret = NULL; char *port = NULL; - if (host->transport != VIR_STORAGE_NET_HOST_TRANS_TCP) { + if (host->transport != VIR_STORAGE_NET_HOST_TRANS_TCP && + host->transport != VIR_STORAGE_NET_HOST_TRANS_ISER) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("only TCP protocol can be converted to InetSocketAddress")); return NULL; @@ -831,7 +851,7 @@ qemuBlockStorageSourceGetISCSIProps(virStorageSourcePtr src) "s:portal", portal, "s:target", target, "u:lun", lun, - "s:transport", "tcp", + "s:transport", virStorageNetHostTransportTypeToString(src->hosts->transport), "S:user", username, "S:password-secret", objalias, NULL)); diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 4d0c141e5..eb482097f 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -883,6 +883,8 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src, if (!((src->hosts->name && strchr(src->hosts->name, ':')) || (src->hosts->transport == VIR_STORAGE_NET_HOST_TRANS_TCP && !src->hosts->name) || + (src->hosts->transport == VIR_STORAGE_NET_HOST_TRANS_ISER && + !src->hosts->name) || (src->hosts->transport == VIR_STORAGE_NET_HOST_TRANS_UNIX && src->hosts->socket && src->hosts->socket[0] != '/'))) { @@ -891,6 +893,7 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src, switch (src->hosts->transport) { case VIR_STORAGE_NET_HOST_TRANS_TCP: + case VIR_STORAGE_NET_HOST_TRANS_ISER: virBufferAsprintf(&buf, "%s:%u", src->hosts->name, src->hosts->port); break; diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c index 5fe3f97d0..d376af208 100644 --- a/src/qemu/qemu_parse_command.c +++ b/src/qemu/qemu_parse_command.c @@ -70,7 +70,9 @@ qemuParseDriveURIString(virDomainDiskDefPtr def, virURIPtr uri, if (transp) *transp++ = 0; - if (STRNEQ(uri->scheme, scheme)) { + if (STREQ(uri->scheme, "iser")) { + transp = (char *)"iser"; + } else if (STRNEQ(uri->scheme, scheme)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid transport/scheme '%s'"), uri->scheme); goto error; @@ -709,6 +711,12 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt, if (qemuParseISCSIString(def) < 0) goto error; + } else if (STRPREFIX(def->src->path, "iser:")) { + def->src->type = VIR_STORAGE_TYPE_NETWORK; + def->src->protocol = VIR_STORAGE_NET_PROTOCOL_ISCSI; + + if (qemuParseISCSIString(def) < 0) + goto error; } else if (STRPREFIX(def->src->path, "sheepdog:")) { char *p = def->src->path; char *port, *vdi; diff --git a/src/storage/storage_backend_gluster.c b/src/storage/storage_backend_gluster.c index 5eea84f16..1452fa0cd 100644 --- a/src/storage/storage_backend_gluster.c +++ b/src/storage/storage_backend_gluster.c @@ -608,6 +608,7 @@ virStorageFileBackendGlusterInitServer(virStorageFileBackendGlusterPrivPtr priv, hoststr = host->socket; break; + case VIR_STORAGE_NET_HOST_TRANS_ISER: case VIR_STORAGE_NET_HOST_TRANS_LAST: break; } diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index 5780180a9..63253a9c4 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -92,7 +92,8 @@ VIR_ENUM_IMPL(virStorageNetProtocol, VIR_STORAGE_NET_PROTOCOL_LAST, VIR_ENUM_IMPL(virStorageNetHostTransport, VIR_STORAGE_NET_HOST_TRANS_LAST, "tcp", "unix", - "rdma") + "rdma", + "iser") VIR_ENUM_IMPL(virStorageSourcePoolMode, VIR_STORAGE_SOURCE_POOL_MODE_LAST, diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h index ecd806c93..5a6ec7776 100644 --- a/src/util/virstoragefile.h +++ b/src/util/virstoragefile.h @@ -147,6 +147,7 @@ typedef enum { VIR_STORAGE_NET_HOST_TRANS_TCP, VIR_STORAGE_NET_HOST_TRANS_UNIX, VIR_STORAGE_NET_HOST_TRANS_RDMA, + VIR_STORAGE_NET_HOST_TRANS_ISER, VIR_STORAGE_NET_HOST_TRANS_LAST } virStorageNetHostTransport; diff --git a/tests/qemuargv2xmldata/disk-drive-network-iser.args b/tests/qemuargv2xmldata/disk-drive-network-iser.args new file mode 100644 index 000000000..c476e759e --- /dev/null +++ b/tests/qemuargv2xmldata/disk-drive-network-iser.args @@ -0,0 +1,25 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name QEMUGuest1 \ +-S \ +-M pc \ +-m 214 \ +-smp 1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-nographic \ +-monitor unix:/tmp/test-monitor,server,nowait \ +-no-acpi \ +-boot c \ +-usb \ +-drive file=iser://example.org:6000/iqn.1992-01.com.example,format=raw,\ +if=virtio \ +-drive file=iser://example.org:6000/iqn.1992-01.com.example/1,format=raw,\ +if=virtio \ +-net none \ +-serial none \ +-parallel none diff --git a/tests/qemuargv2xmldata/disk-drive-network-iser.xml b/tests/qemuargv2xmldata/disk-drive-network-iser.xml new file mode 100644 index 000000000..88f043f66 --- /dev/null +++ b/tests/qemuargv2xmldata/disk-drive-network-iser.xml @@ -0,0 +1,41 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-i686</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='raw'/> + <source protocol='iscsi' name='iqn.1992-01.com.example/0' transport='iser'> + <host name='example.org' port='6000' transport='iser'/> + </source> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='raw'/> + <source protocol='iscsi' name='iqn.1992-01.com.example/1' transport='iser'> + <host name='example.org' port='6000' transport='iser'/> + </source> + <target dev='vdb' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </disk> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='none'/> + </devices> +</domain> diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c index cb010268c..3a82630e0 100644 --- a/tests/qemuargv2xmltest.c +++ b/tests/qemuargv2xmltest.c @@ -213,6 +213,7 @@ mymain(void) DO_TEST("disk-drive-network-nbd-unix"); DO_TEST("disk-drive-network-iscsi"); DO_TEST("disk-drive-network-iscsi-auth"); + DO_TEST("disk-drive-network-iser"); DO_TEST("disk-drive-network-gluster"); DO_TEST("disk-drive-network-rbd"); DO_TEST("disk-drive-network-rbd-auth"); diff --git a/tests/qemuxml2argvdata/disk-drive-network-iser.args b/tests/qemuxml2argvdata/disk-drive-network-iser.args new file mode 100644 index 000000000..49ea467ff --- /dev/null +++ b/tests/qemuxml2argvdata/disk-drive-network-iser.args @@ -0,0 +1,29 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-i686 \ +-name QEMUGuest1 \ +-S \ +-M pc \ +-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=iser://example.org:6000/iqn.1992-01.com.example/0,format=raw,\ +if=none,id=drive-virtio-disk0 \ +-device virtio-blk-pci,bus=pci.0,addr=0x3,drive=drive-virtio-disk0,\ +id=virtio-disk0 \ +-drive file=iser://example.org:6000/iqn.1992-01.com.example/1,format=raw,\ +if=none,id=drive-virtio-disk1 \ +-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk1,\ +id=virtio-disk1 diff --git a/tests/qemuxml2argvdata/disk-drive-network-iser.xml b/tests/qemuxml2argvdata/disk-drive-network-iser.xml new file mode 100644 index 000000000..b1634555c --- /dev/null +++ b/tests/qemuxml2argvdata/disk-drive-network-iser.xml @@ -0,0 +1,37 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-i686</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='raw'/> + <source protocol='iscsi' name='iqn.1992-01.com.example' transport='iser'> + <host name='example.org' port='6000'/> + </source> + <target dev='vda' bus='virtio'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='raw'/> + <source protocol='iscsi' name='iqn.1992-01.com.example/1' transport='iser'> + <host name='example.org' port='6000'/> + </source> + <target dev='vdb' bus='virtio'/> + </disk> + <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='none'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index ca24e0bbb..accfdaf4b 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -936,6 +936,7 @@ mymain(void) DO_TEST("disk-drive-network-iscsi-lun", QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_BLOCK); + DO_TEST("disk-drive-network-iser", NONE); DO_TEST("disk-drive-network-gluster", QEMU_CAPS_GLUSTER_DEBUG_LEVEL); DO_TEST("disk-drive-network-rbd", NONE); diff --git a/tests/qemuxml2xmloutdata/disk-drive-network-iser.xml b/tests/qemuxml2xmloutdata/disk-drive-network-iser.xml new file mode 100644 index 000000000..88f043f66 --- /dev/null +++ b/tests/qemuxml2xmloutdata/disk-drive-network-iser.xml @@ -0,0 +1,41 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-i686</emulator> + <disk type='network' device='disk'> + <driver name='qemu' type='raw'/> + <source protocol='iscsi' name='iqn.1992-01.com.example/0' transport='iser'> + <host name='example.org' port='6000' transport='iser'/> + </source> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </disk> + <disk type='network' device='disk'> + <driver name='qemu' type='raw'/> + <source protocol='iscsi' name='iqn.1992-01.com.example/1' transport='iser'> + <host name='example.org' port='6000' transport='iser'/> + </source> + <target dev='vdb' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </disk> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='none'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 2be8eb2c1..23f9292c4 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -515,6 +515,7 @@ mymain(void) DO_TEST("disk-drive-network-nbd-unix", NONE); DO_TEST("disk-drive-network-iscsi", NONE); DO_TEST("disk-drive-network-iscsi-auth", NONE); + DO_TEST("disk-drive-network-iser", NONE); DO_TEST("disk-drive-network-gluster", NONE); DO_TEST("disk-drive-network-rbd", NONE); DO_TEST("disk-drive-network-rbd-auth", NONE); -- 2.13.6 (Apple Git-96) -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list