storage: Introduce iscsi_direct pool type

Introducing the pool as a noop. Integration inside the build
system. Implementation will be in the following commits.

Signed-off-by: Clementine Hayat <clem@lse.epita.fr>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Clementine Hayat 2018-07-31 10:44:21 +02:00 committed by Michal Privoznik
parent 8aa85e0bb7
commit f0bf1be3e7
19 changed files with 293 additions and 6 deletions

View File

@ -566,6 +566,7 @@ LIBVIRT_STORAGE_ARG_DIR
LIBVIRT_STORAGE_ARG_FS
LIBVIRT_STORAGE_ARG_LVM
LIBVIRT_STORAGE_ARG_ISCSI
LIBVIRT_STORAGE_ARG_ISCSI_DIRECT
LIBVIRT_STORAGE_ARG_SCSI
LIBVIRT_STORAGE_ARG_MPATH
LIBVIRT_STORAGE_ARG_DISK
@ -580,6 +581,7 @@ if test "$with_libvirtd" = "no"; then
with_storage_fs=no
with_storage_lvm=no
with_storage_iscsi=no
with_storage_iscsi_direct=no
with_storage_scsi=no
with_storage_mpath=no
with_storage_disk=no
@ -600,6 +602,7 @@ LIBVIRT_STORAGE_CHECK_DIR
LIBVIRT_STORAGE_CHECK_FS
LIBVIRT_STORAGE_CHECK_LVM
LIBVIRT_STORAGE_CHECK_ISCSI
LIBVIRT_STORAGE_CHECK_ISCSI_DIRECT
LIBVIRT_STORAGE_CHECK_SCSI
LIBVIRT_STORAGE_CHECK_MPATH
LIBVIRT_STORAGE_CHECK_DISK
@ -610,7 +613,7 @@ LIBVIRT_STORAGE_CHECK_ZFS
LIBVIRT_STORAGE_CHECK_VSTORAGE
with_storage=no
for backend in dir fs lvm iscsi scsi mpath rbd disk; do
for backend in dir fs lvm iscsi iscsi_direct scsi mpath rbd disk; do
if eval test \$with_storage_$backend = yes; then
with_storage=yes
break
@ -938,6 +941,7 @@ LIBVIRT_STORAGE_RESULT_DIR
LIBVIRT_STORAGE_RESULT_FS
LIBVIRT_STORAGE_RESULT_LVM
LIBVIRT_STORAGE_RESULT_ISCSI
LIBVIRT_STORAGE_RESULT_ISCSI_DIRECT
LIBVIRT_STORAGE_RESULT_SCSI
LIBVIRT_STORAGE_RESULT_MPATH
LIBVIRT_STORAGE_RESULT_DISK

View File

@ -18,6 +18,7 @@
<ref name='poollogical'/>
<ref name='pooldisk'/>
<ref name='pooliscsi'/>
<ref name='pooliscsidirect'/>
<ref name='poolscsi'/>
<ref name='poolmpath'/>
<ref name='poolrbd'/>
@ -101,6 +102,19 @@
</interleave>
</define>
<define name='pooliscsidirect'>
<attribute name='type'>
<value>iscsi-direct</value>
</attribute>
<interleave>
<ref name='commonmetadata'/>
<optional>
<ref name='sizing'/>
</optional>
<ref name='sourceiscsidirect'/>
</interleave>
</define>
<define name='poolscsi'>
<attribute name='type'>
<value>scsi</value>
@ -314,6 +328,14 @@
</element>
</define>
<define name='sourceinfodeviscsidirect'>
<element name='device'>
<attribute name='path'>
<ref name='IscsiQualifiedName'/>
</attribute>
</element>
</define>
<define name='initiatorinfo'>
<element name='initiator'>
<element name='iqn'>
@ -595,6 +617,19 @@
</element>
</define>
<define name='sourceiscsidirect'>
<element name='source'>
<interleave>
<ref name='sourceinfohost'/>
<ref name='sourceinfodeviscsidirect'/>
<ref name='initiatorinfo'/>
<optional>
<ref name='sourceinfoauth'/>
</optional>
</interleave>
</element>
</define>
<define name='sourcescsi'>
<element name='source'>
<interleave>

View File

@ -433,6 +433,36 @@
The iSCSI volume pool does not use the volume format type element.
</p>
<h2><a id="StorageBackendISCSIDirect">iSCSI direct pool</a></h2>
<p>
This is a variant of the iSCSI pool. Instead of unsing iscsiadm, it uses
libiscsi.
It require a host, a path which is the target iqn and an initiator iqn.
</p>
<h3>Example pool input</h3>
<pre>
&lt;pool type="iscsi-direct"&gt;
&lt;name&gt;virtimages&lt;/name&gt;
&lt;source&gt;
&lt;host name="iscsi.example.com"/&gt;
&lt;device path="iqn.2013-06.com.example:iscsi-pool"/&gt;
&lt;/source&gt;
&lt;initiator&gt;
&lt;iqn name="iqn.2013-06.com.example:iscsi-initiator"/&gt;
&lt;/initiator&gt;
&lt;/pool&gt;</pre>
<h3>Valid pool format types</h3>
<p>
The iSCSI volume pool does not use the pool format type element.
</p>
<h3>Valid volume format types</h3>
<p>
The iSCSI volume pool does not use the volume format type element.
</p>
<h2><a id="StorageBackendSCSI">SCSI pool</a></h2>
<p>
This provides a pool based on a SCSI HBA. Volumes are preexisting SCSI

View File

@ -0,0 +1,41 @@
dnl Iscsi-direct storage
dnl
dnl Copyright (C) 2018 Clementine Hayat.
dnl
dnl This library is free software; you can redistribute it and/or
dnl modify it under the terms of the GNU Lesser General Public
dnl License as published by the Free Software Foundation; either
dnl version 2.1 of the License, or (at your option) any later version.
dnl
dnl This library is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
dnl Lesser General Public License for more details.
dnl
dnl You should have received a copy of the GNU Lesser General Public
dnl License along with this library. If not, see
dnl <http://www.gnu.org/licenses/>.
dnl
AC_DEFUN([LIBVIRT_STORAGE_ARG_ISCSI_DIRECT], [
LIBVIRT_ARG_WITH_FEATURE([STORAGE_ISCSI_DIRECT],
[iscsi-direct backend for the storage driver],
[check])
])
AC_DEFUN([LIBVIRT_STORAGE_CHECK_ISCSI_DIRECT], [
AC_REQUIRE([LIBVIRT_CHECK_LIBISCSI])
if test "$with_storage_iscsi_direct" = "check"; then
with_storage_iscsi_direct=$with_libiscsi
fi
if test "$with_storage_iscsi_direct" = "yes"; then
AC_DEFINE_UNQUOTED([WITH_STORAGE_ISCSI_DIRECT], [1],
[whether iSCSI backend for storage driver is enabled])
fi
AM_CONDITIONAL([WITH_STORAGE_ISCSI_DIRECT],
[test "$with_storage_iscsi_direct" = "yes"])
])
AC_DEFUN([LIBVIRT_STORAGE_RESULT_ISCSI_DIRECT], [
LIBVIRT_RESULT([iscsi-direct], [$with_storage_iscsi_direct])
])

View File

@ -30252,6 +30252,7 @@ virDomainDiskTranslateSourcePool(virDomainDiskDefPtr def)
break;
case VIR_STORAGE_POOL_ISCSI_DIRECT:
case VIR_STORAGE_POOL_ISCSI:
if (def->startupPolicy) {
virReportError(VIR_ERR_XML_ERROR, "%s",

View File

@ -62,9 +62,9 @@ VIR_ENUM_IMPL(virStoragePool,
VIR_STORAGE_POOL_LAST,
"dir", "fs", "netfs",
"logical", "disk", "iscsi",
"scsi", "mpath", "rbd",
"sheepdog", "gluster", "zfs",
"vstorage")
"iscsi-direct", "scsi", "mpath",
"rbd", "sheepdog", "gluster",
"zfs", "vstorage")
VIR_ENUM_IMPL(virStoragePoolFormatFileSystem,
VIR_STORAGE_POOL_FS_LAST,
@ -207,6 +207,17 @@ static virStoragePoolTypeInfo poolTypeInfo[] = {
.formatToString = virStoragePoolFormatDiskTypeToString,
}
},
{.poolType = VIR_STORAGE_POOL_ISCSI_DIRECT,
.poolOptions = {
.flags = (VIR_STORAGE_POOL_SOURCE_HOST |
VIR_STORAGE_POOL_SOURCE_DEVICE |
VIR_STORAGE_POOL_SOURCE_NETWORK |
VIR_STORAGE_POOL_SOURCE_INITIATOR_IQN),
},
.volOptions = {
.formatToString = virStoragePoolFormatDiskTypeToString,
}
},
{.poolType = VIR_STORAGE_POOL_SCSI,
.poolOptions = {
.flags = (VIR_STORAGE_POOL_SOURCE_ADAPTER),
@ -803,6 +814,13 @@ virStoragePoolDefParseXML(xmlXPathContextPtr ctxt)
goto error;
}
if (ret->type == VIR_STORAGE_POOL_ISCSI_DIRECT &&
!ret->source.initiator.iqn) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("missing initiator IQN"));
goto error;
}
cleanup:
VIR_FREE(uuid);
VIR_FREE(type);
@ -1000,11 +1018,12 @@ virStoragePoolDefFormatBuf(virBufferPtr buf,
if (virStoragePoolSourceFormat(buf, options, &def->source) < 0)
return -1;
/* RBD, Sheepdog, and Gluster devices are not local block devs nor
/* RBD, Sheepdog, Gluster and Iscsi-direct devices are not local block devs nor
* files, so they don't have a target */
if (def->type != VIR_STORAGE_POOL_RBD &&
def->type != VIR_STORAGE_POOL_SHEEPDOG &&
def->type != VIR_STORAGE_POOL_GLUSTER) {
def->type != VIR_STORAGE_POOL_GLUSTER &&
def->type != VIR_STORAGE_POOL_ISCSI_DIRECT) {
virBufferAddLit(buf, "<target>\n");
virBufferAdjustIndent(buf, 2);

View File

@ -85,6 +85,7 @@ typedef enum {
VIR_STORAGE_POOL_LOGICAL, /* Logical volume groups / volumes */
VIR_STORAGE_POOL_DISK, /* Disk partitions */
VIR_STORAGE_POOL_ISCSI, /* iSCSI targets */
VIR_STORAGE_POOL_ISCSI_DIRECT, /* iSCSI targets using libiscsi */
VIR_STORAGE_POOL_SCSI, /* SCSI HBA */
VIR_STORAGE_POOL_MPATH, /* Multipath devices */
VIR_STORAGE_POOL_RBD, /* RADOS Block Device */

View File

@ -1838,11 +1838,13 @@ virStoragePoolObjSourceFindDuplicateCb(const void *payload,
break;
case VIR_STORAGE_POOL_ISCSI:
case VIR_STORAGE_POOL_ISCSI_DIRECT:
case VIR_STORAGE_POOL_FS:
case VIR_STORAGE_POOL_LOGICAL:
case VIR_STORAGE_POOL_DISK:
case VIR_STORAGE_POOL_ZFS:
if ((data->def->type == VIR_STORAGE_POOL_ISCSI ||
data->def->type == VIR_STORAGE_POOL_ISCSI_DIRECT ||
data->def->type == VIR_STORAGE_POOL_FS ||
data->def->type == VIR_STORAGE_POOL_LOGICAL ||
data->def->type == VIR_STORAGE_POOL_DISK ||

View File

@ -31,6 +31,11 @@ STORAGE_DRIVER_ISCSI_SOURCES = \
storage/storage_backend_iscsi.c \
$(NULL)
STORAGE_DRIVER_ISCSI_DIRECT_SOURCES = \
storage/storage_backend_iscsi_direct.h \
storage/storage_backend_iscsi_direct.c \
$(NULL)
STORAGE_DRIVER_SCSI_SOURCES = \
storage/storage_backend_scsi.h \
storage/storage_backend_scsi.c \
@ -89,6 +94,7 @@ EXTRA_DIST += \
$(STORAGE_FILE_FS_SOURCES) \
$(STORAGE_DRIVER_LVM_SOURCES) \
$(STORAGE_DRIVER_ISCSI_SOURCES) \
$(STORAGE_DRIVER_ISCSI_DIRECT_SOURCES) \
$(STORAGE_DRIVER_SCSI_SOURCES) \
$(STORAGE_DRIVER_MPATH_SOURCES) \
$(STORAGE_DRIVER_DISK_SOURCES) \
@ -193,6 +199,22 @@ libvirt_storage_backend_iscsi_la_LIBADD = \
$(NULL)
endif WITH_STORAGE_ISCSI
if WITH_STORAGE_ISCSI_DIRECT
libvirt_storage_backend_iscsi_direct_la_SOURCES = $(STORAGE_DRIVER_ISCSI_DIRECT_SOURCES)
libvirt_storage_backend_iscsi_direct_la_CFLAGS = \
-I$(srcdir)/conf \
$(LIBISCSI_CFLAGS) \
$(AM_CFLAGS) \
$(NULL)
storagebackend_LTLIBRARIES += libvirt_storage_backend_iscsi-direct.la
libvirt_storage_backend_iscsi_direct_la_LDFLAGS = $(AM_LDFLAGS_MOD)
libvirt_storage_backend_iscsi_direct_la_LIBADD = \
libvirt.la \
../gnulib/lib/libgnu.la \
$(NULL)
endif WITH_STORAGE_ISCSI_DIRECT
if WITH_STORAGE_SCSI
libvirt_storage_backend_scsi_la_SOURCES = $(STORAGE_DRIVER_SCSI_SOURCES)
libvirt_storage_backend_scsi_la_CFLAGS = \

View File

@ -43,6 +43,9 @@
#if WITH_STORAGE_ISCSI
# include "storage_backend_iscsi.h"
#endif
#if WITH_STORAGE_ISCSI_DIRECT
# include "storage_backend_iscsi_direct.h"
#endif
#if WITH_STORAGE_SCSI
# include "storage_backend_scsi.h"
#endif
@ -122,6 +125,9 @@ virStorageBackendDriversRegister(bool allbackends ATTRIBUTE_UNUSED)
#if WITH_STORAGE_ISCSI
VIR_STORAGE_BACKEND_REGISTER(virStorageBackendISCSIRegister, "iscsi");
#endif
#if WITH_STORAGE_ISCSI_DIRECT
VIR_STORAGE_BACKEND_REGISTER(virStorageBackendISCSIDirectRegister, "iscsi-direct");
#endif
#if WITH_STORAGE_SCSI
VIR_STORAGE_BACKEND_REGISTER(virStorageBackendSCSIRegister, "scsi");
#endif

View File

@ -0,0 +1,58 @@
/*
* storage_backend_iscsi_direct.c: storage backend for iSCSI using libiscsi
*
* Copyright (C) 2018 Clementine Hayat.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see
* <http://www.gnu.org/licenses/>.
*
* Author: Clementine Hayat <clem@lse.epita.fr>
*/
#include <config.h>
#include "storage_backend_iscsi_direct.h"
#include "storage_util.h"
#include "virlog.h"
#define VIR_FROM_THIS VIR_FROM_STORAGE
VIR_LOG_INIT("storage.storage_backend_iscsi_direct");
static int
virStorageBackendISCSIDirectCheckPool(virStoragePoolObjPtr pool ATTRIBUTE_UNUSED,
bool *isActive ATTRIBUTE_UNUSED)
{
return 0;
}
static int
virStorageBackendISCSIDirectRefreshPool(virStoragePoolObjPtr pool ATTRIBUTE_UNUSED)
{
return 0;
}
virStorageBackend virStorageBackendISCSIDirect = {
.type = VIR_STORAGE_POOL_ISCSI_DIRECT,
.checkPool = virStorageBackendISCSIDirectCheckPool,
.refreshPool = virStorageBackendISCSIDirectRefreshPool,
};
int
virStorageBackendISCSIDirectRegister(void)
{
return virStorageBackendRegister(&virStorageBackendISCSIDirect);
}

View File

@ -0,0 +1,6 @@
#ifndef __VIR_STORAGE_BACKEND_ISCSI_H__
# define __VIR_STORAGE_BACKEND_ISCSI_H__
int virStorageBackendISCSIDirectRegister(void);
#endif /* __VIR_STORAGE_BACKEND_ISCSI_H__ */

View File

@ -1566,6 +1566,7 @@ storageVolLookupByPathCallback(virStoragePoolObjPtr obj,
case VIR_STORAGE_POOL_LOGICAL:
case VIR_STORAGE_POOL_DISK:
case VIR_STORAGE_POOL_ISCSI:
case VIR_STORAGE_POOL_ISCSI_DIRECT:
case VIR_STORAGE_POOL_SCSI:
case VIR_STORAGE_POOL_MPATH:
case VIR_STORAGE_POOL_VSTORAGE:

View File

@ -0,0 +1,14 @@
<pool type="iscsi-direct">
<name>iscsi-direct-auth</name>
<uuid>034d66fc-f507-437a-b552-c479ffd63820</uuid>
<source>
<host name="iscsi.example.com"/>
<device path="iqn.2013-06.com.example:iscsi-pool"/>
<initiator>
<iqn name='iqn.2013-06.com.example:iscsi-initiator'/>
</initiator>
<auth type='chap' username='user'>
<secret uuid='10ed4ad4-c7b0-4696-b574-b40e04fea84b'/>
</auth>
</source>
</pool>

View File

@ -0,0 +1,11 @@
<pool type="iscsi-direct">
<name>iscsi-direct</name>
<uuid>034d66fc-f507-437a-b552-c479ffd63819</uuid>
<source>
<host name="iscsi.example.com"/>
<device path="iqn.2013-06.com.example:iscsi-pool"/>
<initiator>
<iqn name='iqn.2013-06.com.example:iscsi-initiator'/>
</initiator>
</source>
</pool>

View File

@ -0,0 +1,17 @@
<pool type='iscsi-direct'>
<name>iscsi-direct-auth</name>
<uuid>034d66fc-f507-437a-b552-c479ffd63820</uuid>
<capacity unit='bytes'>0</capacity>
<allocation unit='bytes'>0</allocation>
<available unit='bytes'>0</available>
<source>
<host name='iscsi.example.com'/>
<device path='iqn.2013-06.com.example:iscsi-pool'/>
<initiator>
<iqn name='iqn.2013-06.com.example:iscsi-initiator'/>
</initiator>
<auth type='chap' username='user'>
<secret uuid='10ed4ad4-c7b0-4696-b574-b40e04fea84b'/>
</auth>
</source>
</pool>

View File

@ -0,0 +1,14 @@
<pool type='iscsi-direct'>
<name>iscsi-direct</name>
<uuid>034d66fc-f507-437a-b552-c479ffd63819</uuid>
<capacity unit='bytes'>0</capacity>
<allocation unit='bytes'>0</allocation>
<available unit='bytes'>0</available>
<source>
<host name='iscsi.example.com'/>
<device path='iqn.2013-06.com.example:iscsi-pool'/>
<initiator>
<iqn name='iqn.2013-06.com.example:iscsi-initiator'/>
</initiator>
</source>
</pool>

View File

@ -102,6 +102,8 @@ mymain(void)
DO_TEST("pool-zfs-sourcedev");
DO_TEST("pool-rbd");
DO_TEST("pool-vstorage");
DO_TEST("pool-iscsi-direct-auth");
DO_TEST("pool-iscsi-direct");
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}

View File

@ -1203,6 +1203,9 @@ cmdPoolList(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
case VIR_STORAGE_POOL_ISCSI:
flags |= VIR_CONNECT_LIST_STORAGE_POOLS_ISCSI;
break;
case VIR_STORAGE_POOL_ISCSI_DIRECT:
flags |= VIR_CONNECT_LIST_STORAGE_POOLS_ISCSI;
break;
case VIR_STORAGE_POOL_SCSI:
flags |= VIR_CONNECT_LIST_STORAGE_POOLS_SCSI;
break;