Oof, the patches must be in `git am` format...

...said my own tools...

Change-Id: I08067b1fca16424bc390190c9ee59d8aa461cc99
diff --git a/patches/openstack/cinder/sep-sp-clone-volume.patch b/patches/openstack/cinder/sep-sp-clone-volume.patch
index cbf209e..2c25551 100644
--- a/patches/openstack/cinder/sep-sp-clone-volume.patch
+++ b/patches/openstack/cinder/sep-sp-clone-volume.patch
@@ -1,7 +1,7 @@
-From 9565e7e32bee1e613f1e09a8989e1bad7f90fa08 Mon Sep 17 00:00:00 2001
+From 110d748871ed078eff42bd370bcdfb643614e6f5 Mon Sep 17 00:00:00 2001
 From: Peter Penchev <openstack-dev@storpool.com>
 Date: Wed, 20 Apr 2022 15:47:39 +0300
-Subject: [PATCH 7/7] StorPool: create_cloned_volume() improvements
+Subject: [PATCH 3/3] StorPool: create_cloned_volume() improvements
 
 If the source and destination volumes are in the same StorPool template
 (as defined by either the volume type or the global config setting),
@@ -29,6 +29,8 @@
  4 files changed, 208 insertions(+), 34 deletions(-)
  create mode 100644 releasenotes/notes/storpool-clone-better-dca90f40c9273de9.yaml
 
+diff --git a/cinder/tests/unit/volume/drivers/test_storpool.py b/cinder/tests/unit/volume/drivers/test_storpool.py
+index 24715fa29..95a1ffffd 100644
 --- a/cinder/tests/unit/volume/drivers/test_storpool.py
 +++ b/cinder/tests/unit/volume/drivers/test_storpool.py
 @@ -14,6 +14,7 @@
@@ -39,7 +41,7 @@
  import re
  import sys
  from unittest import mock
-@@ -110,13 +111,33 @@
+@@ -110,13 +111,33 @@ class MockAPI(object):
      def snapshotCreate(self, vname, snap):
          snapshots[snap['name']] = dict(volumes[vname])
  
@@ -75,7 +77,7 @@
  
      def volumeDelete(self, name):
          del volumes[name]
-@@ -174,6 +195,23 @@
+@@ -174,6 +195,23 @@ fakeStorPool.spopenstack.AttachDB = MockAttachDB
  fakeStorPool.sptypes.VolumeUpdateDesc = MockVolumeUpdateDesc
  
  
@@ -99,7 +101,7 @@
  @ddt.ddt
  class StorPoolTestCase(test.TestCase):
  
-@@ -265,6 +303,11 @@
+@@ -265,6 +303,11 @@ class StorPoolTestCase(test.TestCase):
          self.assertListEqual(sorted([volumeName(n) for n in names]),
                               sorted(data['name'] for data in volumes.values()))
  
@@ -111,7 +113,7 @@
      @mock_volume_types
      def test_create_delete_volume(self):
          self.assertVolumeNames([])
-@@ -277,7 +320,7 @@
+@@ -277,7 +320,7 @@ class StorPoolTestCase(test.TestCase):
          self.assertVolumeNames(('1',))
          v = volumes[volumeName('1')]
          self.assertEqual(1 * units.Gi, v['size'])
@@ -120,7 +122,7 @@
          self.assertEqual(3, v['replication'])
  
          caught = False
-@@ -297,7 +340,7 @@
+@@ -297,7 +340,7 @@ class StorPoolTestCase(test.TestCase):
          self.assertVolumeNames(('1',))
          v = volumes[volumeName('1')]
          self.assertEqual(2 * units.Gi, v['size'])
@@ -129,7 +131,7 @@
          self.assertEqual(3, v['replication'])
  
          self.driver.create_volume({'id': '2', 'name': 'v2', 'size': 3,
-@@ -305,7 +348,7 @@
+@@ -305,7 +348,7 @@ class StorPoolTestCase(test.TestCase):
          self.assertVolumeNames(('1', '2'))
          v = volumes[volumeName('2')]
          self.assertEqual(3 * units.Gi, v['size'])
@@ -138,7 +140,7 @@
          self.assertEqual(3, v['replication'])
  
          self.driver.create_volume({'id': '3', 'name': 'v2', 'size': 4,
-@@ -327,7 +370,7 @@
+@@ -327,7 +370,7 @@ class StorPoolTestCase(test.TestCase):
          # Make sure the dictionary is not corrupted somehow...
          v = volumes[volumeName('1')]
          self.assertEqual(2 * units.Gi, v['size'])
@@ -147,7 +149,7 @@
          self.assertEqual(3, v['replication'])
  
          for vid in ('1', '2', '3', '4'):
-@@ -395,16 +438,17 @@
+@@ -395,16 +438,17 @@ class StorPoolTestCase(test.TestCase):
          self.driver.extend_volume({'id': '1'}, 2)
          self.assertEqual(2 * units.Gi, volumes[volumeName('1')]['size'])
  
@@ -173,7 +175,7 @@
  
          self.driver.delete_volume({'id': 1})
          self.driver.delete_volume({'id': 2})
-@@ -412,6 +456,78 @@
+@@ -412,6 +456,78 @@ class StorPoolTestCase(test.TestCase):
          self.assertDictEqual({}, volumes)
          self.assertDictEqual({}, snapshots)
  
@@ -252,7 +254,7 @@
      @mock_volume_types
      def test_config_replication(self):
          self.assertVolumeNames([])
-@@ -431,7 +547,7 @@
+@@ -431,7 +547,7 @@ class StorPoolTestCase(test.TestCase):
          self.assertVolumeNames(('cfgrepl1',))
          v = volumes[volumeName('cfgrepl1')]
          self.assertEqual(3, v['replication'])
@@ -261,7 +263,7 @@
          self.driver.delete_volume({'id': 'cfgrepl1'})
  
          self.driver.configuration.storpool_replication = 2
-@@ -445,7 +561,7 @@
+@@ -445,7 +561,7 @@ class StorPoolTestCase(test.TestCase):
          self.assertVolumeNames(('cfgrepl2',))
          v = volumes[volumeName('cfgrepl2')]
          self.assertEqual(2, v['replication'])
@@ -270,7 +272,7 @@
          self.driver.delete_volume({'id': 'cfgrepl2'})
  
          self.driver.create_volume({'id': 'cfgrepl3', 'name': 'v1', 'size': 1,
-@@ -477,7 +593,7 @@
+@@ -477,7 +593,7 @@ class StorPoolTestCase(test.TestCase):
          self.assertVolumeNames(('cfgtempl1',))
          v = volumes[volumeName('cfgtempl1')]
          self.assertEqual(3, v['replication'])
@@ -279,9 +281,11 @@
          self.driver.delete_volume({'id': 'cfgtempl1'})
  
          self.driver.create_volume({'id': 'cfgtempl2', 'name': 'v1', 'size': 1,
+diff --git a/cinder/volume/drivers/storpool.py b/cinder/volume/drivers/storpool.py
+index cb5680d29..5aa30398e 100644
 --- a/cinder/volume/drivers/storpool.py
 +++ b/cinder/volume/drivers/storpool.py
-@@ -19,11 +19,13 @@
+@@ -19,11 +19,13 @@ import platform
  
  from oslo_config import cfg
  from oslo_log import log as logging
@@ -295,7 +299,7 @@
  from cinder import exception
  from cinder.i18n import _
  from cinder import interface
-@@ -197,30 +199,80 @@
+@@ -197,30 +199,80 @@ class StorPoolDriver(driver.VolumeDriver):
  
      def create_cloned_volume(self, volume, src_vref):
          refname = self._attach.volumeName(src_vref['id'])
@@ -354,7 +358,11 @@
 +                    snapname,
 +                    {'template': template},
 +                )
-+            except spapi.ApiError as e:
+             except spapi.ApiError as e:
+-                # ARGH!
+-                LOG.error("Could not delete the temp snapshot %(name)s: "
+-                          "%(msg)s",
+-                          {'name': snapname, 'msg': e})
 +                raise self._backendException(e)
 +
 +            try:
@@ -371,11 +379,7 @@
 +                    snapname,
 +                    {'tags': {'transient': '1.0'}},
 +                )
-             except spapi.ApiError as e:
--                # ARGH!
--                LOG.error("Could not delete the temp snapshot %(name)s: "
--                          "%(msg)s",
--                          {'name': snapname, 'msg': e})
++            except spapi.ApiError as e:
 +                raise self._backendException(e)
 +        except Exception:
 +            with excutils.save_and_reraise_exception():
@@ -392,9 +396,11 @@
  
      def create_export(self, context, volume, connector):
          pass
+diff --git a/driver-requirements.txt b/driver-requirements.txt
+index f501e9fcd..d55fb86c7 100644
 --- a/driver-requirements.txt
 +++ b/driver-requirements.txt
-@@ -41,7 +41,7 @@
+@@ -41,7 +41,7 @@ infi.dtypes.wwn # PSF
  infi.dtypes.iqn # PSF
  
  # Storpool
@@ -403,6 +409,9 @@
  storpool.spopenstack>=2.2.1 # Apache-2.0
  
  # Datera
+diff --git a/releasenotes/notes/storpool-clone-better-dca90f40c9273de9.yaml b/releasenotes/notes/storpool-clone-better-dca90f40c9273de9.yaml
+new file mode 100644
+index 000000000..180427d9e
 --- /dev/null
 +++ b/releasenotes/notes/storpool-clone-better-dca90f40c9273de9.yaml
 @@ -0,0 +1,6 @@
@@ -412,3 +421,6 @@
 +    StorPool driver: improved the way volumes are clonsed into different
 +    StorPool templates (exposed as Cinder storage pools) if requested,
 +    eliminating some data duplication in the underlying StorPool cluster.
+-- 
+2.39.0
+