Update the StorPool CI Cinder patchset

Add the "fix the rename volume unit test API mock" patch.
Put the "improve clone_volume()" patch at the end where it belongs.
Refresh some of the patches.

Change-Id: I33f19ea5bd19ab711a50776535a52ea5824a4891
diff --git a/patches/openstack/cinder/sep-sp-clone-volume.patch b/patches/openstack/cinder/sep-sp-clone-volume.patch
index abe5bc5..cbf209e 100644
--- a/patches/openstack/cinder/sep-sp-clone-volume.patch
+++ b/patches/openstack/cinder/sep-sp-clone-volume.patch
@@ -29,8 +29,6 @@
  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 2e6f56526..65d4ed304 100644
 --- a/cinder/tests/unit/volume/drivers/test_storpool.py
 +++ b/cinder/tests/unit/volume/drivers/test_storpool.py
 @@ -14,6 +14,7 @@
@@ -41,7 +39,7 @@
  import re
  import sys
  from unittest import mock
-@@ -110,13 +111,33 @@ class MockAPI(object):
+@@ -110,13 +111,33 @@
      def snapshotCreate(self, vname, snap):
          snapshots[snap['name']] = dict(volumes[vname])
  
@@ -77,7 +75,7 @@
  
      def volumeDelete(self, name):
          del volumes[name]
-@@ -171,6 +192,23 @@ fakeStorPool.spopenstack.AttachDB = MockAttachDB
+@@ -174,6 +195,23 @@
  fakeStorPool.sptypes.VolumeUpdateDesc = MockVolumeUpdateDesc
  
  
@@ -101,9 +99,9 @@
  @ddt.ddt
  class StorPoolTestCase(test.TestCase):
  
-@@ -260,6 +298,11 @@ class StorPoolTestCase(test.TestCase):
+@@ -265,6 +303,11 @@
          self.assertListEqual(sorted([volumeName(n) for n in names]),
-                              sorted(volumes.keys()))
+                              sorted(data['name'] for data in volumes.values()))
  
 +    def assertSnapshotNames(self, specs):
 +        self.assertListEqual(
@@ -113,7 +111,7 @@
      @mock_volume_types
      def test_create_delete_volume(self):
          self.assertVolumeNames([])
-@@ -272,7 +315,7 @@ class StorPoolTestCase(test.TestCase):
+@@ -277,7 +320,7 @@
          self.assertVolumeNames(('1',))
          v = volumes[volumeName('1')]
          self.assertEqual(1 * units.Gi, v['size'])
@@ -122,7 +120,7 @@
          self.assertEqual(3, v['replication'])
  
          caught = False
-@@ -292,7 +335,7 @@ class StorPoolTestCase(test.TestCase):
+@@ -297,7 +340,7 @@
          self.assertVolumeNames(('1',))
          v = volumes[volumeName('1')]
          self.assertEqual(2 * units.Gi, v['size'])
@@ -131,7 +129,7 @@
          self.assertEqual(3, v['replication'])
  
          self.driver.create_volume({'id': '2', 'name': 'v2', 'size': 3,
-@@ -300,7 +343,7 @@ class StorPoolTestCase(test.TestCase):
+@@ -305,7 +348,7 @@
          self.assertVolumeNames(('1', '2'))
          v = volumes[volumeName('2')]
          self.assertEqual(3 * units.Gi, v['size'])
@@ -140,7 +138,7 @@
          self.assertEqual(3, v['replication'])
  
          self.driver.create_volume({'id': '3', 'name': 'v2', 'size': 4,
-@@ -322,7 +365,7 @@ class StorPoolTestCase(test.TestCase):
+@@ -327,7 +370,7 @@
          # Make sure the dictionary is not corrupted somehow...
          v = volumes[volumeName('1')]
          self.assertEqual(2 * units.Gi, v['size'])
@@ -149,7 +147,7 @@
          self.assertEqual(3, v['replication'])
  
          for vid in ('1', '2', '3', '4'):
-@@ -386,16 +429,17 @@ class StorPoolTestCase(test.TestCase):
+@@ -395,16 +438,17 @@
          self.driver.extend_volume({'id': '1'}, 2)
          self.assertEqual(2 * units.Gi, volumes[volumeName('1')]['size'])
  
@@ -175,7 +173,7 @@
  
          self.driver.delete_volume({'id': 1})
          self.driver.delete_volume({'id': 2})
-@@ -403,6 +447,78 @@ class StorPoolTestCase(test.TestCase):
+@@ -412,6 +456,78 @@
          self.assertDictEqual({}, volumes)
          self.assertDictEqual({}, snapshots)
  
@@ -254,7 +252,7 @@
      @mock_volume_types
      def test_config_replication(self):
          self.assertVolumeNames([])
-@@ -422,7 +538,7 @@ class StorPoolTestCase(test.TestCase):
+@@ -431,7 +547,7 @@
          self.assertVolumeNames(('cfgrepl1',))
          v = volumes[volumeName('cfgrepl1')]
          self.assertEqual(3, v['replication'])
@@ -263,7 +261,7 @@
          self.driver.delete_volume({'id': 'cfgrepl1'})
  
          self.driver.configuration.storpool_replication = 2
-@@ -436,7 +552,7 @@ class StorPoolTestCase(test.TestCase):
+@@ -445,7 +561,7 @@
          self.assertVolumeNames(('cfgrepl2',))
          v = volumes[volumeName('cfgrepl2')]
          self.assertEqual(2, v['replication'])
@@ -272,7 +270,7 @@
          self.driver.delete_volume({'id': 'cfgrepl2'})
  
          self.driver.create_volume({'id': 'cfgrepl3', 'name': 'v1', 'size': 1,
-@@ -468,7 +584,7 @@ class StorPoolTestCase(test.TestCase):
+@@ -477,7 +593,7 @@
          self.assertVolumeNames(('cfgtempl1',))
          v = volumes[volumeName('cfgtempl1')]
          self.assertEqual(3, v['replication'])
@@ -281,11 +279,9 @@
          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 cdaf0043d..418e5750f 100644
 --- a/cinder/volume/drivers/storpool.py
 +++ b/cinder/volume/drivers/storpool.py
-@@ -19,11 +19,13 @@ import platform
+@@ -19,11 +19,13 @@
  
  from oslo_config import cfg
  from oslo_log import log as logging
@@ -299,7 +295,7 @@
  from cinder import exception
  from cinder.i18n import _
  from cinder import interface
-@@ -197,30 +199,80 @@ class StorPoolDriver(driver.VolumeDriver):
+@@ -197,30 +199,80 @@
  
      def create_cloned_volume(self, volume, src_vref):
          refname = self._attach.volumeName(src_vref['id'])
@@ -358,11 +354,7 @@
 +                    snapname,
 +                    {'template': template},
 +                )
-             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)
 +
 +            try:
@@ -379,7 +371,11 @@
 +                    snapname,
 +                    {'tags': {'transient': '1.0'}},
 +                )
-+            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)
 +        except Exception:
 +            with excutils.save_and_reraise_exception():
@@ -396,11 +392,9 @@
  
      def create_export(self, context, volume, connector):
          pass
-diff --git a/driver-requirements.txt b/driver-requirements.txt
-index 0240e7e78..5b992df2e 100644
 --- a/driver-requirements.txt
 +++ b/driver-requirements.txt
-@@ -40,7 +40,7 @@ infi.dtypes.wwn # PSF
+@@ -41,7 +41,7 @@
  infi.dtypes.iqn # PSF
  
  # Storpool
@@ -409,9 +403,6 @@
  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 @@
@@ -421,6 +412,3 @@
 +    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.35.1
-
diff --git a/patches/openstack/cinder/sep-sp-fix-test-rename.patch b/patches/openstack/cinder/sep-sp-fix-test-rename.patch
new file mode 100644
index 0000000..742699f
--- /dev/null
+++ b/patches/openstack/cinder/sep-sp-fix-test-rename.patch
@@ -0,0 +1,29 @@
+StorPool: fix the "rename volume" unit test emulation
+
+Also update the "name" field of the actual data structure in
+the fake list of volumes.
+
+Change-Id: Iee9e3feea1af4f3d0acdf05ea1b540ecf59e755b
+--- a/cinder/tests/unit/volume/drivers/test_storpool.py
++++ b/cinder/tests/unit/volume/drivers/test_storpool.py
+@@ -135,7 +135,10 @@
+             volumes[name]['size'] = data['size']
+ 
+         if 'rename' in data and data['rename'] != name:
+-            volumes[data['rename']] = volumes[name]
++            new_name = data['rename']
++            volumes[new_name] = volumes[name]
++            if volumes[new_name]['name'] == name:
++                volumes[new_name]['name'] = new_name
+             del volumes[name]
+ 
+ 
+@@ -259,6 +262,8 @@
+     def assertVolumeNames(self, names):
+         self.assertListEqual(sorted([volumeName(n) for n in names]),
+                              sorted(volumes.keys()))
++        self.assertListEqual(sorted([volumeName(n) for n in names]),
++                             sorted(data['name'] for data in volumes.values()))
+ 
+     @mock_volume_types
+     def test_create_delete_volume(self):
diff --git a/patches/openstack/cinder/sep-sp-retype-vol.patch b/patches/openstack/cinder/sep-sp-retype-vol.patch
index 9f40140..70be672 100644
--- a/patches/openstack/cinder/sep-sp-retype-vol.patch
+++ b/patches/openstack/cinder/sep-sp-retype-vol.patch
@@ -10,7 +10,7 @@
 
 --- a/cinder/volume/drivers/storpool.py
 +++ b/cinder/volume/drivers/storpool.py
-@@ -405,10 +405,12 @@
+@@ -353,10 +353,12 @@
                              update['template'] = templ
                          else:
                              update['replication'] = repl
@@ -27,7 +27,7 @@
  
          if update:
              name = self._attach.volumeName(volume['id'])
-@@ -433,21 +435,46 @@
+@@ -381,21 +383,46 @@
                        'created as part of the migration from '
                        '"%(oid)s".', {'tid': temp_id, 'oid': orig_id})
              return {'_name_id': new_volume['_name_id'] or new_volume['id']}
@@ -43,21 +43,21 @@
 -            return {'_name_id': new_volume['_name_id'] or new_volume['id']}
 -        else:
 +            int_name = temp_name + '--temp--mig'
-+            LOG.debug('Trying to swap the volume names, intermediate "%(int)s"',
++            LOG.debug('Trying to swap volume names, intermediate "%(int)s"',
 +                      {'int': int_name})
              try:
 +                LOG.debug('- rename "%(orig)s" to "%(int)s"',
-+                    {'orig': orig_name, 'int': int_name})
++                          {'orig': orig_name, 'int': int_name})
 +                self._attach.api().volumeUpdate(orig_name,
 +                                                {'rename': int_name})
 +
 +                LOG.debug('- rename "%(temp)s" to "%(orig)s"',
-+                    {'temp': temp_name, 'orig': orig_name})
++                          {'temp': temp_name, 'orig': orig_name})
                  self._attach.api().volumeUpdate(temp_name,
                                                  {'rename': orig_name})
 +
 +                LOG.debug('- rename "%(int)s" to "%(temp)s"',
-+                    {'int': int_name, 'temp': temp_name})
++                          {'int': int_name, 'temp': temp_name})
 +                self._attach.api().volumeUpdate(int_name,
 +                                                {'rename': temp_name})
                  return {'_name_id': None}
@@ -80,3 +80,34 @@
 +                      '%(err)s',
 +                      {'tname': temp_name, 'oname': orig_name, 'err': e})
 +            return {'_name_id': new_volume['_name_id'] or new_volume['id']}
+--- a/cinder/tests/unit/volume/drivers/test_storpool.py
++++ b/cinder/tests/unit/volume/drivers/test_storpool.py
+@@ -358,18 +358,22 @@
+                                                  'available')
+         self.assertDictEqual({'_name_id': '1'}, res)
+ 
+-        # Failure: a volume with the original volume's name already exists
+-        res = self.driver.update_migrated_volume(None, {'id': '1'},
+-                                                 {'id': '2', '_name_id': '1'},
+-                                                 'available')
+-        self.assertDictEqual({'_name_id': '1'}, res)
+-
+         # Success: rename the migrated volume to match the original
+         res = self.driver.update_migrated_volume(None, {'id': '3'},
+                                                  {'id': '2', '_name_id': '3'},
+                                                  'available')
+         self.assertDictEqual({'_name_id': None}, res)
+         six.assertCountEqual(self,
++                             [volumeName('1'), volumeName('3')],
++                             volumes.keys())
++        self.assertVolumeNames(('1', '3',))
++
++        # Success: swap volume names with an existing volume
++        res = self.driver.update_migrated_volume(None, {'id': '1'},
++                                                 {'id': '3', '_name_id': '1'},
++                                                 'available')
++        self.assertDictEqual({'_name_id': None}, res)
++        six.assertCountEqual(self,
+                              [volumeName('1'), volumeName('3')],
+                              volumes.keys())
+         self.assertVolumeNames(('1', '3',))
diff --git a/patches/series b/patches/series
index 0de460b..51ca846 100644
--- a/patches/series
+++ b/patches/series
@@ -4,7 +4,8 @@
 openstack/cinder/sep-sp-leave-it-to-brick.patch
 openstack/cinder/sep-sp-rm-backup.patch
 openstack/cinder/sep-sp-rm-copy-volimg.patch
-openstack/cinder/sep-sp-clone-volume.patch
+openstack/cinder/sep-sp-fix-test-rename.patch
 openstack/cinder/sep-sp-retype-vol.patch
+openstack/cinder/sep-sp-clone-volume.patch
 openstack/cinderlib/storpool-test-20190910.patch
 openstack/devstack/eatmydata.patch