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