diff --git a/cinder/tests/unit/volume/drivers/hpe/test_hpe3par.py b/cinder/tests/unit/volume/drivers/hpe/test_hpe3par.py index 12c724c423f..78475a3f01c 100644 --- a/cinder/tests/unit/volume/drivers/hpe/test_hpe3par.py +++ b/cinder/tests/unit/volume/drivers/hpe/test_hpe3par.py @@ -691,6 +691,11 @@ class HPE3PARBaseDriver(test.TestCase): 'minor': 10, 'revision': 0} + wsapi_version_clone = {'major': 1, + 'build': 40600052, + 'minor': 10, + 'revision': 0} + # Use this to point to latest version of wsapi wsapi_version_latest = wsapi_version_for_compression @@ -2666,13 +2671,19 @@ class TestHPE3PARDriverBase(HPE3PARBaseDriver): self.standard_login + expected) - @ddt.data('volume', 'volume_name_id') - def test_create_cloned_volume(self, volume_attr): + @ddt.data({'volume_attr': 'volume', 'wsapi_version': None}, + {'volume_attr': 'volume_name_id', 'wsapi_version': None}, + {'volume_attr': 'volume', + 'wsapi_version': HPE3PARBaseDriver.wsapi_version_clone}, + {'volume_attr': 'volume_name_id', + 'wsapi_version': HPE3PARBaseDriver.wsapi_version_clone}) + @ddt.unpack + def test_create_cloned_volume(self, volume_attr, wsapi_version): src_vref = getattr(self, volume_attr) vol_name = getattr(self, volume_attr.upper() + '_3PAR_NAME') # setup_mock_client drive with default configuration # and return the mock HTTP 3PAR client - mock_client = self.setup_driver() + mock_client = self.setup_driver(wsapi_version=wsapi_version) mock_client.getVolume.return_value = {'name': mock.ANY} mock_client.copyVolume.return_value = {'taskid': 1} mock_client.getStorageSystemInfo.return_value = { @@ -2690,11 +2701,24 @@ class TestHPE3PARDriverBase(HPE3PARBaseDriver): 'host': volume_utils.append_host(self.FAKE_HOST, HPE3PAR_CPG2), 'source_volid': src_vref.id} - model_update = self.driver.create_cloned_volume(volume, src_vref) + + if not wsapi_version: + # (i) old/default + model_update = self.driver.create_cloned_volume(volume, + src_vref) + else: + # (ii) wsapi having support for comment in cloned volume + common = self.driver._login() + model_update = common.create_cloned_volume(volume, src_vref) + self.assertIsNone(model_update) # snapshot name is random snap_name = mock.ANY optional = mock.ANY + optional_fields = {'snapCPG': 'OpenStackCPGSnap', 'tpvv': True, + 'tdvv': False, 'online': True} + if wsapi_version: + optional_fields['comment'] = mock.ANY expected = [ mock.call.createSnapshot(snap_name, vol_name, optional), @@ -2703,8 +2727,7 @@ class TestHPE3PARDriverBase(HPE3PARBaseDriver): snap_name, 'osv-0DM4qZEVSKON-AAAAAAAAA', HPE3PAR_CPG2, - {'snapCPG': 'OpenStackCPGSnap', 'tpvv': True, - 'tdvv': False, 'online': True})] + optional_fields)] mock_client.assert_has_calls(expected) diff --git a/cinder/volume/drivers/hpe/hpe_3par_common.py b/cinder/volume/drivers/hpe/hpe_3par_common.py index f3dba71f234..6d58af7e3bb 100644 --- a/cinder/volume/drivers/hpe/hpe_3par_common.py +++ b/cinder/volume/drivers/hpe/hpe_3par_common.py @@ -313,11 +313,12 @@ class HPE3PARCommon(object): 4.0.23 - Fixed login/logout while accessing wsapi. Bug #2068795 4.0.24 - Fixed retype volume - thin to deco. Bug #2080927 4.0.25 - Update the calculation of free_capacity + 4.0.26 - Added comment for cloned volumes. Bug #2062524 """ - VERSION = "4.0.25" + VERSION = "4.0.26" stats = {} @@ -2506,7 +2507,7 @@ class HPE3PARCommon(object): hpe_tiramisu=hpe_tiramisu) def _copy_volume(self, src_name, dest_name, cpg, snap_cpg=None, - tpvv=True, tdvv=False, compression=None): + tpvv=True, tdvv=False, compression=None, comment=None): # Virtual volume sets are not supported with the -online option LOG.debug('Creating clone of a volume %(src)s to %(dest)s.', {'src': src_name, 'dest': dest_name}) @@ -2522,6 +2523,9 @@ class HPE3PARCommon(object): self.API_VERSION >= COMPRESSION_API_VERSION): optional['compression'] = compression + if comment: + optional['comment'] = comment + body = self.client.copyVolume(src_name, dest_name, cpg, optional) return body['taskid'] @@ -2646,13 +2650,42 @@ class HPE3PARCommon(object): compression_val = self.get_compression_policy( type_info['hpe3par_keys']) + + LOG.info("array version: %(ver)s", + {'ver': self.API_VERSION}) + comment_line = None + if self.API_VERSION >= 40600000: + # comment can be added + comments = {'volume_id': volume['id'], + 'name': volume['name'], + 'type': 'OpenStack'} + + volume_type = type_info['volume_type'] + type_id = volume.get('volume_type_id', None) + if type_id: + comments['volume_type_name'] = volume_type.get('name') + comments['volume_type_id'] = type_id + if vvs_name: + comments['vvs'] = vvs_name + else: + comments['qos'] = qos + + display_name = volume.get('display_name', None) + if display_name: + comments['display_name'] = display_name + + comment_line = json.dumps(comments) + LOG.debug("comment_line: %(comment)s", + {'comment': comment_line}) + # make the 3PAR copy the contents. # can't delete the original until the copy is done. self._copy_volume(snapshot['name'], vol_name, cpg=cpg, snap_cpg=type_info['snap_cpg'], tpvv=type_info['tpvv'], tdvv=type_info['tdvv'], - compression=compression_val) + compression=compression_val, + comment=comment_line) if qos or vvs_name or flash_cache is not None: try: diff --git a/releasenotes/notes/hpe-3par-comment-for-cloned-volume-ef16dccf7639452b.yaml b/releasenotes/notes/hpe-3par-comment-for-cloned-volume-ef16dccf7639452b.yaml new file mode 100644 index 00000000000..b34c57e9137 --- /dev/null +++ b/releasenotes/notes/hpe-3par-comment-for-cloned-volume-ef16dccf7639452b.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + HPE 3PAR driver `bug #2062524 + `_: + Fixed: Added comment for cloned volumes. +