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 '