Update the "use storpool's api for attach/detach" patch

Re-implment a required detach-retry logic that was previously handled by
`spopenstack`.

Change-Id: I9f95bd05fe41b86199023e68e55865e16496fb38
diff --git a/patches/openstack/os-brick/attach-globalid.patch b/patches/openstack/os-brick/attach-globalid.patch
index 9e7b7f4..a1f9ef7 100644
--- a/patches/openstack/os-brick/attach-globalid.patch
+++ b/patches/openstack/os-brick/attach-globalid.patch
@@ -1,4 +1,4 @@
-From 4c37d209a5968cfaf280bfb165691aff031b5e44 Mon Sep 17 00:00:00 2001
+From eeea4310317d10a6f730777e1e0b1cb73cb004d4 Mon Sep 17 00:00:00 2001
 From: Biser Milanov <biser.milanov@storpool.com>
 Date: Tue, 23 May 2023 17:55:09 +0300
 Subject: [PATCH] storpool.py: Use StorPool's API for Attach/Detach
@@ -13,15 +13,70 @@
 
 Change-Id: I0fabcde1dc249b9b09f99ee0b7d759432972314a
 ---
- os_brick/initiator/connectors/storpool.py     |  48 ++++--
+ os_brick/initiator/connectors/storpool.py     |  81 ++++++++--
  .../initiator/connectors/test_storpool.py     | 151 +++++++++++-------
- 2 files changed, 132 insertions(+), 67 deletions(-)
+ 2 files changed, 165 insertions(+), 67 deletions(-)
 
 diff --git a/os_brick/initiator/connectors/storpool.py b/os_brick/initiator/connectors/storpool.py
-index e1bd55c..ee4846e 100644
+index e1bd55c..72d2acf 100644
 --- a/os_brick/initiator/connectors/storpool.py
 +++ b/os_brick/initiator/connectors/storpool.py
-@@ -76,16 +76,29 @@ class StorPoolConnector(base.BaseLinuxConnector):
+@@ -26,6 +26,7 @@ from os_brick import utils
+ LOG = logging.getLogger(__name__)
+ 
+ spopenstack = importutils.try_import('storpool.spopenstack')
++spapi = importutils.try_import('storpool.spapi')
+ 
+ 
+ class StorPoolConnector(base.BaseLinuxConnector):
+@@ -37,6 +38,10 @@ class StorPoolConnector(base.BaseLinuxConnector):
+         super(StorPoolConnector, self).__init__(root_helper, driver=driver,
+                                                 *args, **kwargs)
+ 
++        if spapi is None:
++            raise exception.BrickException(
++                'Could not import the StorPool API bindings')
++
+         if spopenstack is not None:
+             try:
+                 self._attach = spopenstack.AttachDB(log=LOG)
+@@ -46,6 +51,35 @@ class StorPoolConnector(base.BaseLinuxConnector):
+         else:
+             self._attach = None
+ 
++    def _detach_retry(self, sp_ourid, volume):
++        """Retries attempt to handle LUKS tests-related failures:"
++          busy: volume ... open at ...
++        """
++        count = 10
++        while True:
++            try:
++                force = count == 0
++                self._attach.api().volumesReassignWait(
++                    {
++                        "reassign": [{
++                            "volume": volume,
++                            "detach": [sp_ourid],
++                            "force": force,
++                        }]
++                    }
++                )
++                break
++            except spapi.ApiError as exc:
++                if (
++                    exc.name in ("busy", "invalidParam")
++                    and "is open at" in exc.desc
++                ):
++                    assert count > 0
++                    time.sleep(0.2)
++                    count -= 1
++                else:
++                    raise
++
+     @staticmethod
+     def get_connector_properties(root_helper, *args, **kwargs):
+         """The StorPool connector properties."""
+@@ -76,16 +110,29 @@ class StorPoolConnector(base.BaseLinuxConnector):
          if mode is None or mode not in ('rw', 'ro'):
              raise exception.BrickException(
                  'Invalid access_mode specified in the connection data.')
@@ -61,7 +116,7 @@
  
      @utils.connect_volume_undo_prepare_result(unlink_after=True)
      def disconnect_volume(self, connection_properties, device_info,
-@@ -124,9 +137,18 @@ class StorPoolConnector(base.BaseLinuxConnector):
+@@ -124,9 +171,17 @@ class StorPoolConnector(base.BaseLinuxConnector):
              raise exception.BrickException(
                  'Invalid StorPool connection data, no volume ID specified.')
          volume = self._attach.volumeName(volume_id)
@@ -74,8 +129,7 @@
 +            raise exception.BrickException(
 +                'SP_OURID missing, cannot disconnect volume %s' % volume)
 +        try:
-+            self._attach.api().volumesReassignWait(
-+                {"reassign": [{"volume": volume, "detach": [sp_ourid]}]})
++            self._detach_retry(sp_ourid, volume)
 +        except Exception as exc:
 +            raise exception.BrickException(
 +                'Communication with the StorPool API '