Regenerate the iSCSI patch
Change-Id: Ide9366dd9cbc1f6c5e2b54448e0cd29e909b98cb
diff --git a/patches/openstack/cinder/sep-sp-iscsi.patch b/patches/openstack/cinder/sep-sp-iscsi.patch
index 71e3356..6df5e6e 100644
--- a/patches/openstack/cinder/sep-sp-iscsi.patch
+++ b/patches/openstack/cinder/sep-sp-iscsi.patch
@@ -1,39 +1,39 @@
-From 06914652d6de93e3d14209ff6a78b930826f0823 Mon Sep 17 00:00:00 2001
+From bfc35f997b9ad20ac9a7ad0c363594230ab820c8 Mon Sep 17 00:00:00 2001
From: Peter Penchev <openstack-dev@storpool.com>
Date: Mon, 12 Mar 2018 12:00:10 +0200
-Subject: [PATCH 9/9] Add iSCSI export support to the StorPool driver
+Subject: [PATCH] Add iSCSI export support to the StorPool driver
Add four new driver options:
-- iscsi_cinder_volume: use StorPool iSCSI attachments whenever
+- storpool_iscsi_cinder_volume: use StorPool iSCSI attachments whenever
the cinder-volume service needs to attach a volume to the controller,
e.g. for copying an image to a volume or vice versa
-- iscsi_export_to:
- - an empty string to use the StorPool native protocol for exporting volumes
- protocol for exporting volumes)
+- storpool_iscsi_export_to:
+ - an empty string to use the StorPool native protocol for exporting
+ volumes
- the string "*" to always use iSCSI for exporting volumes
- an experimental, not fully supported list of IQN patterns to export
volumes to using iSCSI; this results in a Cinder driver that exports
different volumes using different storage protocols
-- iscsi_portal_group: the name of the iSCSI portal group defined in
- the StorPool configuration to use for these export
-- iscsi_learn_initiator_iqns: automatically create StorPool configuration
- records for an initiator when a volume is first exported to it
+- storpool_iscsi_portal_group: the name of the iSCSI portal group
+ defined in the StorPool configuration to use for these export
+- storpool_iscsi_learn_initiator_iqns: automatically create StorPool
+ configuration records for an initiator when a volume is first exported
+ to it
-When exporting volumes via iSCSI, report the storage protocol as "iSCSI" and
-disable multiattach (the StorPool CI failures with iSCSI multiattach may need
-further investigation).
+When exporting volumes via iSCSI, report the storage protocol as
+"iSCSI".
Change-Id: I9de64306e0e6976268df782053b0651dd1cca96f
---
- .../unit/volume/drivers/test_storpool.py | 437 +++++++++++++++++-
- cinder/volume/drivers/storpool.py | 374 ++++++++++++++-
- .../drivers/storpool-volume-driver.rst | 60 ++-
- .../storpool-iscsi-cefcfe590a07c5c7.yaml | 13 +
- 4 files changed, 874 insertions(+), 10 deletions(-)
+ .../unit/volume/drivers/test_storpool.py | 522 +++++++++++++++++-
+ cinder/volume/drivers/storpool.py | 379 ++++++++++++-
+ .../drivers/storpool-volume-driver.rst | 68 ++-
+ .../storpool-iscsi-cefcfe590a07c5c7.yaml | 15 +
+ 4 files changed, 973 insertions(+), 11 deletions(-)
create mode 100644 releasenotes/notes/storpool-iscsi-cefcfe590a07c5c7.yaml
diff --git a/cinder/tests/unit/volume/drivers/test_storpool.py b/cinder/tests/unit/volume/drivers/test_storpool.py
-index 2dbbe2861..32a5d5c45 100644
+index 80b68a8af..d0bb568a6 100644
--- a/cinder/tests/unit/volume/drivers/test_storpool.py
+++ b/cinder/tests/unit/volume/drivers/test_storpool.py
@@ -14,14 +14,24 @@
@@ -94,7 +94,7 @@
class MockDisk(object):
def __init__(self, diskId):
self.id = diskId
-@@ -194,6 +217,273 @@ def MockVolumeUpdateDesc(size):
+@@ -194,6 +217,315 @@ def MockVolumeUpdateDesc(size):
return {'size': size}
@@ -264,6 +264,30 @@
+ },
+ )
+
++ def _handle_delete_export(
++ self,
++ cfg: MockIscsiConfig,
++ cmd: dict[str, Any],
++ ) -> MockIscsiConfig:
++ """Delete an export for an initiator."""
++ self._asrt.assertDictEqual(
++ cmd,
++ {
++ 'initiator': _ISCSI_IQN_OURS,
++ 'portalGroup': _ISCSI_PORTAL_GROUP,
++ 'volumeName': volumeName(fconst.VOLUME_ID),
++ },
++ )
++ self._asrt.assertEqual(cfg.initiators['1'].name, cmd['initiator'])
++ self._asrt.assertListEqual(
++ cfg.initiators['1'].exports,
++ [MockIscsiExport(portalGroup=_ISCSI_PORTAL_GROUP,
++ target=cfg.targets['1'].name)])
++
++ updated_initiators = cfg.initiators
++ del updated_initiators['1']
++ return dataclasses.replace(cfg, initiators=updated_initiators)
++
+ def _handle_create_initiator(
+ self,
+ cfg: MockIscsiConfig,
@@ -314,6 +338,22 @@
+ },
+ )
+
++ def _handle_delete_target(
++ self,
++ cfg: MockIscsiConfig,
++ cmd: dict[str, Any]
++ ) -> MockIscsiConfig:
++ """Remove a target for a volume."""
++ self._asrt.assertDictEqual(
++ cmd,
++ {'volumeName': volumeName(fconst.VOLUME_ID)},
++ )
++
++ self._asrt.assertListEqual(sorted(cfg.targets), ['0', '1'])
++ updated_targets = cfg.targets
++ del updated_targets['1']
++ return dataclasses.replace(cfg, targets=updated_targets)
++
+ def _handle_initiator_add_network(
+ self,
+ cfg: MockIscsiConfig,
@@ -332,7 +372,9 @@
+ _CMD_HANDLERS = {
+ 'createInitiator': _handle_create_initiator,
+ 'createTarget': _handle_create_target,
++ 'deleteTarget': _handle_delete_target,
+ 'export': _handle_export,
++ 'exportDelete': _handle_delete_export,
+ 'initiatorAddNetwork': _handle_initiator_add_network,
+ }
+
@@ -368,23 +410,23 @@
def MockSPConfig(section = 's01'):
res = {}
m = re.match('^s0*([A-Za-z0-9]+)$', section)
-@@ -236,7 +526,15 @@ class StorPoolTestCase(test.TestCase):
+@@ -236,7 +568,15 @@ class StorPoolTestCase(test.TestCase):
self.cfg.volume_backend_name = 'storpool_test'
self.cfg.storpool_template = None
self.cfg.storpool_replication = 3
-+ self.cfg.iscsi_cinder_volume = False
-+ self.cfg.iscsi_export_to = ''
-+ self.cfg.iscsi_learn_initiator_iqns = True
-+ self.cfg.iscsi_portal_group = _ISCSI_PORTAL_GROUP
-+
-+ self._setup_test_driver()
++ self.cfg.storpool_iscsi_cinder_volume = False
++ self.cfg.storpool_iscsi_export_to = ''
++ self.cfg.storpool_iscsi_learn_initiator_iqns = True
++ self.cfg.storpool_iscsi_portal_group = _ISCSI_PORTAL_GROUP
++ self._setup_test_driver()
++
+ def _setup_test_driver(self):
+ """Initialize a StorPool driver as per the current configuration."""
mock_exec = mock.Mock()
mock_exec.return_value = ('', '')
-@@ -245,7 +543,7 @@ class StorPoolTestCase(test.TestCase):
+@@ -245,7 +585,7 @@ class StorPoolTestCase(test.TestCase):
self.driver.check_for_setup_error()
@ddt.data(
@@ -393,7 +435,7 @@
({'no-host': None}, KeyError),
({'host': 'sbad'}, driver.StorPoolConfigurationInvalid),
({'host': 's01'}, None),
-@@ -261,7 +559,7 @@ class StorPoolTestCase(test.TestCase):
+@@ -261,7 +601,7 @@ class StorPoolTestCase(test.TestCase):
conn)
@ddt.data(
@@ -402,7 +444,7 @@
({'no-host': None}, KeyError),
({'host': 'sbad'}, driver.StorPoolConfigurationInvalid),
)
-@@ -300,7 +598,7 @@ class StorPoolTestCase(test.TestCase):
+@@ -300,7 +640,7 @@ class StorPoolTestCase(test.TestCase):
self.assertEqual(21, pool['total_capacity_gb'])
self.assertEqual(5, int(pool['free_capacity_gb']))
@@ -411,10 +453,10 @@
self.assertFalse(pool['QoS_support'])
self.assertFalse(pool['thick_provisioning_support'])
self.assertTrue(pool['thin_provisioning_support'])
-@@ -656,6 +954,139 @@ class StorPoolTestCase(test.TestCase):
- 'volume_type': volume_type
- }))
-
+@@ -703,3 +1043,179 @@ class StorPoolTestCase(test.TestCase):
+ 'No such volume',
+ self.driver.revert_to_snapshot, None,
+ {'id': vol_id}, {'id': snap_id})
+
+ @ddt.data(
+ # The default values
@@ -434,10 +476,10 @@
+ (_ISCSI_PAT_BOTH, False, constants.STORPOOL, _ISCSI_IQN_OTHER, True),
+ )
+ @ddt.unpack
-+ def test_wants_iscsi(self, iscsi_export_to, use_iscsi, storage_protocol,
-+ hostname, expected):
++ def test_wants_iscsi(self, storpool_iscsi_export_to, use_iscsi,
++ storage_protocol, hostname, expected):
+ """Check the "should this export use iSCSI?" detection."""
-+ self.cfg.iscsi_export_to = iscsi_export_to
++ self.cfg.storpool_iscsi_export_to = storpool_iscsi_export_to
+ self._setup_test_driver()
+ self.assertEqual(self.driver._use_iscsi, use_iscsi)
+
@@ -460,11 +502,12 @@
+ expected if initiator is not None and host is not None
+ else forced)
+
-+ # If iscsi_cinder_volume is set and this is the controller, then yes.
++ # If storpool_iscsi_cinder_volume is set and this is the controller,
++ # then yes.
+ check({"storpool_wants_iscsi": True}, True, True)
+
-+ # If iscsi_cinder_volume is not set or this is not the controller, then
-+ # look at the specified expected value.
++ # If storpool_iscsi_cinder_volume is not set or this is not the
++ # controller, then look at the specified expected value.
+ check({"storpool_wants_iscsi": False}, use_iscsi, expected)
+ check({}, use_iscsi, expected)
+
@@ -548,11 +591,50 @@
+ cfg_final.targets['1'].volume,
+ volumeName(fconst.VOLUME_ID),
+ )
- def test_volume_revert(self):
- vol_id = 'rev1'
- vol_name = volumeName(vol_id)
++
++ @ddt.data(*_ISCSI_TEST_CASES)
++ def test_remove_iscsi_export(self, tcase: IscsiTestCase):
++ cfg_orig = MockIscsiConfig.build(tcase)
++ configs = [cfg_orig]
++ iapi = MockIscsiAPI(configs, self)
++
++ def _target_exists(cfg: MockIscsiConfig, volume: str) -> bool:
++ for name, target in cfg.targets.items():
++ if target.volume == volumeName(volume):
++ return True
++ return False
++
++ def _export_exists(cfg: MockIscsiConfig, volume: str) -> bool:
++ for name, initiator in cfg.initiators.items():
++ for export in initiator.exports:
++ if export.target == targetName(volume):
++ return True
++ return False
++
++ if tcase.exported:
++ self.assertTrue(
++ _target_exists(iapi.iSCSIConfig().iscsi, tcase.volume))
++ self.assertTrue(
++ _export_exists(iapi.iSCSIConfig().iscsi, tcase.volume))
++
++ with mock.patch.object(self.driver._attach, 'api', new=lambda: iapi):
++ self.driver._remove_iscsi_export(
++ {
++ 'id': fconst.VOLUME_ID,
++ 'display_name': fconst.VOLUME_NAME,
++ },
++ {
++ 'host': _ISCSI_IQN_OURS + '.hostname',
++ 'initiator': _ISCSI_IQN_OURS,
++ },
++ )
++
++ self.assertFalse(
++ _target_exists(iapi.iSCSIConfig().iscsi, tcase.volume))
++ self.assertFalse(
++ _export_exists(iapi.iSCSIConfig().iscsi, tcase.volume))
diff --git a/cinder/volume/drivers/storpool.py b/cinder/volume/drivers/storpool.py
-index 0051442ed..cb3beaf0c 100644
+index a8200a7f1..d931200f6 100644
--- a/cinder/volume/drivers/storpool.py
+++ b/cinder/volume/drivers/storpool.py
@@ -15,6 +15,7 @@
@@ -563,47 +645,60 @@
import platform
from oslo_config import cfg
-@@ -43,6 +44,31 @@ if storpool:
+@@ -43,6 +44,32 @@ if storpool:
storpool_opts = [
-+ cfg.BoolOpt('iscsi_cinder_volume',
++ cfg.BoolOpt('storpool_iscsi_cinder_volume',
+ default=False,
+ help='Let the cinder-volume service use iSCSI instead of '
+ 'the StorPool block device driver for accessing '
+ 'StorPool volumes, e.g. when creating a volume from '
+ 'an image or vice versa.'),
-+ cfg.StrOpt('iscsi_export_to',
++ cfg.StrOpt('storpool_iscsi_export_to',
+ default='',
+ help='Whether to export volumes using iSCSI. '
+ 'An empty string (the default) makes the driver export '
+ 'all volumes using the StorPool native network protocol. '
+ 'The value "*" makes the driver export all volumes using '
-+ 'iSCSI. '
-+ 'Any other value leads to an experimental not fully '
-+ 'supported configuration and is interpreted as '
++ 'iSCSI (see the Cinder StorPool driver documentation for '
++ 'how this option and ``storpool_iscsi_cinder_volume`` '
++ 'interact). Any other value leads to an experimental '
++ 'not fully supported configuration and is interpreted as '
+ 'a whitespace-separated list of patterns for IQNs for '
+ 'hosts that need volumes to be exported via iSCSI, e.g. '
+ '"iqn.1991-05.com.microsoft:\\*" for Windows hosts.'),
-+ cfg.BoolOpt('iscsi_learn_initiator_iqns',
++ cfg.BoolOpt('storpool_iscsi_learn_initiator_iqns',
+ default=True,
+ help='Create a StorPool record for a new initiator as soon as '
+ 'Cinder asks for a volume to be exported to it.'),
-+ cfg.StrOpt('iscsi_portal_group',
++ cfg.StrOpt('storpool_iscsi_portal_group',
+ default=None,
+ help='The portal group to export volumes via iSCSI in.'),
cfg.StrOpt('storpool_template',
default=None,
help='The StorPool template for volumes with no type.'),
-@@ -105,6 +131,7 @@ class StorPoolDriver(driver.VolumeDriver):
+@@ -93,9 +120,10 @@ class StorPoolDriver(driver.VolumeDriver):
+ add ignore_errors to the internal _detach_volume() method
+ 1.2.3 - Advertise some more driver capabilities.
+ 2.0.0 - Implement revert_to_snapshot().
++ 2.1.0 - Add iSCSI export support.
+ """
+
+- VERSION = '2.0.0'
++ VERSION = '2.1.0'
+ CI_WIKI_NAME = 'StorPool_distributed_storage_CI'
+
+ def __init__(self, *args, **kwargs):
+@@ -105,6 +133,7 @@ class StorPoolDriver(driver.VolumeDriver):
self._ourId = None
self._ourIdInt = None
self._attach = None
-+ self._use_iscsi = None
++ self._use_iscsi = False
@staticmethod
def get_driver_options():
-@@ -162,10 +189,326 @@ class StorPoolDriver(driver.VolumeDriver):
+@@ -159,10 +188,327 @@ class StorPoolDriver(driver.VolumeDriver):
raise StorPoolConfigurationInvalid(
section=hostname, param='SP_OURID', error=e)
@@ -613,7 +708,8 @@
+ Check the configuration to determine whether this connector is
+ expected to provide iSCSI exports as opposed to native StorPool
+ protocol ones. Match the initiator's IQN against the list of
-+ patterns supplied in the "iscsi_export_to" configuration setting.
++ patterns supplied in the "storpool_iscsi_export_to" configuration
++ setting.
+ """
+ if connector is None:
+ return False
@@ -642,7 +738,7 @@
+ 'iqn': iqn,
+ })
+
-+ export_to = self.configuration.iscsi_export_to
++ export_to = self.configuration.storpool_iscsi_export_to
+ if export_to is None:
+ return False
+
@@ -668,7 +764,7 @@
+ """
+ cfg = self._attach.api().iSCSIConfig()
+
-+ pg_name = self.configuration.iscsi_portal_group
++ pg_name = self.configuration.storpool_iscsi_portal_group
+ pg_found = [
+ pg for pg in cfg.iscsi.portalGroups.values() if pg.name == pg_name
+ ]
@@ -737,8 +833,8 @@
+ raise
+
+ if cfg['initiator'] is None:
-+ if not (self.configuration.iscsi_learn_initiator_iqns or
-+ self.configuration.iscsi_cinder_volume and
++ if not (self.configuration.storpool_iscsi_learn_initiator_iqns or
++ self.configuration.storpool_iscsi_cinder_volume and
+ connector.get('storpool_wants_iscsi')):
+ raise Exception('The "{iqn}" initiator IQN for the "{host}" '
+ 'host is not defined in the StorPool '
@@ -930,7 +1026,7 @@
return {'driver_volume_type': 'storpool',
'data': {
'client_id': self._storpool_client_id(connector),
-@@ -174,6 +517,9 @@ class StorPoolDriver(driver.VolumeDriver):
+@@ -171,6 +517,9 @@ class StorPoolDriver(driver.VolumeDriver):
}}
def terminate_connection(self, volume, connector, **kwargs):
@@ -940,7 +1036,7 @@
pass
def create_snapshot(self, snapshot):
-@@ -275,11 +621,20 @@ class StorPoolDriver(driver.VolumeDriver):
+@@ -272,11 +621,20 @@ class StorPoolDriver(driver.VolumeDriver):
)
def create_export(self, context, volume, connector):
@@ -953,7 +1049,7 @@
pass
+ def _attach_volume(self, context, volume, properties, remote=False):
-+ if self.configuration.iscsi_cinder_volume and not remote:
++ if self.configuration.storpool_iscsi_cinder_volume and not remote:
+ LOG.debug('- adding the "storpool_wants_iscsi" flag')
+ properties['storpool_wants_iscsi'] = True
+
@@ -962,17 +1058,17 @@
def delete_volume(self, volume):
name = self._attach.volumeName(volume['id'])
try:
-@@ -316,6 +671,17 @@ class StorPoolDriver(driver.VolumeDriver):
+@@ -313,6 +671,17 @@ class StorPoolDriver(driver.VolumeDriver):
LOG.error("StorPoolDriver API initialization failed: %s", e)
raise
-+ export_to = self.configuration.iscsi_export_to
++ export_to = self.configuration.storpool_iscsi_export_to
+ export_to_set = export_to is not None and export_to.split()
-+ vol_iscsi = self.configuration.iscsi_cinder_volume
-+ pg_name = self.configuration.iscsi_portal_group
++ vol_iscsi = self.configuration.storpool_iscsi_cinder_volume
++ pg_name = self.configuration.storpool_iscsi_portal_group
+ if (export_to_set or vol_iscsi) and pg_name is None:
-+ msg = _('The "iscsi_portal_group" option is required if '
-+ 'any patterns are listed in "iscsi_export_to"')
++ msg = _('The "storpool_iscsi_portal_group" option is required if '
++ 'any patterns are listed in "storpool_iscsi_export_to"')
+ raise exception.VolumeDriverException(message=msg)
+
+ self._use_iscsi = export_to == "*"
@@ -980,7 +1076,7 @@
def _update_volume_stats(self):
try:
dl = self._attach.api().disksList()
-@@ -341,7 +707,7 @@ class StorPoolDriver(driver.VolumeDriver):
+@@ -338,7 +707,7 @@ class StorPoolDriver(driver.VolumeDriver):
'total_capacity_gb': total / units.Gi,
'free_capacity_gb': free / units.Gi,
'reserved_percentage': 0,
@@ -989,7 +1085,7 @@
'QoS_support': False,
'thick_provisioning_support': False,
'thin_provisioning_support': True,
-@@ -360,7 +726,9 @@ class StorPoolDriver(driver.VolumeDriver):
+@@ -357,7 +726,9 @@ class StorPoolDriver(driver.VolumeDriver):
'volume_backend_name') or 'storpool',
'vendor_name': 'StorPool',
'driver_version': self.VERSION,
@@ -1001,7 +1097,7 @@
'clone_across_pools': True,
'sparse_copy_volume': True,
diff --git a/doc/source/configuration/block-storage/drivers/storpool-volume-driver.rst b/doc/source/configuration/block-storage/drivers/storpool-volume-driver.rst
-index d2c5895a9..1f3d46cce 100644
+index d2c5895a9..936e83675 100644
--- a/doc/source/configuration/block-storage/drivers/storpool-volume-driver.rst
+++ b/doc/source/configuration/block-storage/drivers/storpool-volume-driver.rst
@@ -19,12 +19,15 @@ Prerequisites
@@ -1024,7 +1120,7 @@
* All nodes that need to access the StorPool API (the compute nodes and
the node running the ``cinder-volume`` service) must have the following
-@@ -34,6 +37,29 @@ Prerequisites
+@@ -34,6 +37,34 @@ Prerequisites
* the storpool Python bindings package
* the storpool.spopenstack Python helper package
@@ -1041,20 +1137,25 @@
+using the standard iSCSI protocol that only requires TCP routing and
+connectivity between the storage servers and the StorPool clients.
+The StorPool Cinder driver may be configured to export volumes and
-+snapshots via iSCSI using the ``iscsi_export_to`` and ``iscsi_portal_group``
-+configuration options.
++snapshots via iSCSI using the ``storpool_iscsi_export_to`` and
++``storpool_iscsi_portal_group`` configuration options.
+
+Additionally, even if e.g. the hypervisor nodes running Nova will use
+the StorPool network protocol and run the ``storpool_block`` service
-+(so the ``iscsi_export_to`` option has its default empty string value),
-+the ``iscsi_cinder_volume`` option configures the StorPool Cinder driver
-+so that only the ``cinder-volume`` service will use the iSCSI protocol when
-+attaching volumes and snapshots to transfer data to and from Glance images.
++(so the ``storpool_iscsi_export_to`` option has its default empty string
++value), the ``storpool_iscsi_cinder_volume`` option configures the
++StorPool Cinder driver so that only the ``cinder-volume`` service will
++use the iSCSI protocol when attaching volumes and snapshots to transfer
++data to and from Glance images.
++
++Multiattach support for StorPool is only enabled if iSCSI is used:
++``storpool_iscsi_export_to`` is set to ``*``, that is, when all StorPool
++volumes will be exported via iSCSI to all initiators.
+
Configuring the StorPool volume driver
--------------------------------------
-@@ -55,6 +81,32 @@ volume backend definition) and per volume type:
+@@ -55,6 +86,35 @@ volume backend definition) and per volume type:
with the default placement constraints for the StorPool cluster.
The default value for the chain replication is 3.
@@ -1062,50 +1163,55 @@
+described in the previous section, the following options may be defined in
+the ``cinder.conf`` volume backend definition:
+
-+- ``iscsi_export_to``: if set to the value ``*``, the StorPool Cinder driver
-+ will export volumes and snapshots using the iSCSI protocol instead of
-+ the StorPool network protocol. The ``iscsi_portal_group`` option must also
-+ be specified.
++- ``storpool_iscsi_export_to``: if set to the value ``*``, the StorPool
++ Cinder driver will export volumes and snapshots using the iSCSI
++ protocol instead of the StorPool network protocol. The
++ ``storpool_iscsi_portal_group`` option must also be specified.
+
-+- ``iscsi_portal_group``: if the ``iscsi_export_to`` option is set to
-+ the value ``*`` or the ``iscsi_cinder_volume`` option is turned on,
-+ this option specifies the name of the iSCSI portal group that Cinder
-+ volumes will be exported to.
++- ``storpool_iscsi_portal_group``: if the ``storpool_iscsi_export_to``
++ option is set to the value ``*`` or the
++ ``storpool_iscsi_cinder_volume`` option is turned on, this option
++ specifies the name of the iSCSI portal group that Cinder volumes will
++ be exported to.
+
-+- ``iscsi_cinder_volume``: if enabled, even if the ``iscsi_export_to`` option
-+ has its default empty value, the ``cinder-volume`` service will use iSCSI
-+ to attach the volumes and snapshots for transferring data to and from
-+ Glance images.
++- ``storpool_iscsi_cinder_volume``: if enabled, even if the
++ ``storpool_iscsi_export_to`` option has its default empty value, the
++ ``cinder-volume`` service will use iSCSI to attach the volumes and
++ snapshots for transferring data to and from Glance images if Glance is
++ configured to use the Cinder glance_store.
+
-+- ``iscsi_learn_initiator_iqns``: if enabled, the StorPool Cinder driver will
-+ automatically use the StorPool API to create definitions for new initiators
-+ in the StorPool cluster's configuration. This is the default behavior of
-+ the driver; it may be disabled in the rare case if, e.g. because of site
-+ policy, OpenStack iSCSI initiators (e.g. Nova hypervisors) need to be
-+ explicitly allowed to use the StorPool iSCSI targets.
++- ``storpool_iscsi_learn_initiator_iqns``: if enabled, the StorPool
++ Cinder driver will automatically use the StorPool API to create
++ definitions for new initiators in the StorPool cluster's
++ configuration. This is the default behavior of the driver; it may be
++ disabled in the rare case if, e.g. because of site policy, OpenStack
++ iSCSI initiators (e.g. Nova hypervisors) need to be explicitly allowed
++ to use the StorPool iSCSI targets.
+
Using the StorPool volume driver
--------------------------------
diff --git a/releasenotes/notes/storpool-iscsi-cefcfe590a07c5c7.yaml b/releasenotes/notes/storpool-iscsi-cefcfe590a07c5c7.yaml
new file mode 100644
-index 000000000..edf46d298
+index 000000000..3863e4099
--- /dev/null
+++ b/releasenotes/notes/storpool-iscsi-cefcfe590a07c5c7.yaml
-@@ -0,0 +1,13 @@
-+---
+@@ -0,0 +1,15 @@
+features:
+ - |
-+ StorPool driver: Added support for exporting the StorPool-backed volumes
-+ using the iSCSI protocol, so that the Cinder volume service and/or
-+ the Nova or Glance consumers do not need to have the StorPool block
-+ device third-party service installed. See the StorPool driver section in
-+ the Cinder documentation for more information on the ``iscsi_export_to``,
-+ ``iscsi_portal_group``, ``iscsi_cinder_volume``, and
-+ ``iscsi_learn_initiator_iqns`` options.
-+ Note that multiattach support for StorPool is now only enabled if
-+ ``iscsi_export_to`` is set to ``*`, that is, all StorPool volumes will be
-+ exported via iSCSI to all initiators.
++ StorPool driver: Added support for exporting the StorPool-backed
++ volumes using the iSCSI protocol, so that the Cinder volume service
++ and/or the Nova or Glance consumers do not need to have the StorPool
++ block device third-party service installed. See the StorPool driver
++ section in the Cinder documentation for more information on the
++ ``storpool_iscsi_export_to``, ``storpool_iscsi_portal_group``,
++ ``storpool_iscsi_cinder_volume``, and
++ ``storpool_iscsi_learn_initiator_iqns`` options.
++
++ .. note::
++ Multiattach support for StorPool is now only enabled if
++ ``storpool_iscsi_export_to`` is set to ``*``, that is, when all
++ StorPool volumes will be exported via iSCSI to all initiators.
--
-2.25.1
+2.43.0