Merge "NetApp ONTAP: Fix create FlexVol pool replica"

This commit is contained in:
Zuul 2023-09-01 01:03:50 +00:00 committed by Gerrit Code Review
commit 639b114309
9 changed files with 44 additions and 18 deletions

View File

@ -904,7 +904,7 @@ VOLUME_INFO_SSC = {
'name': VOLUME_NAMES[0], 'name': VOLUME_NAMES[0],
'vserver': VOLUME_VSERVER_NAME, 'vserver': VOLUME_VSERVER_NAME,
'junction-path': '/%s' % VOLUME_NAMES[0], 'junction-path': '/%s' % VOLUME_NAMES[0],
'aggregate': VOLUME_AGGREGATE_NAMES[0], 'aggregate': [VOLUME_AGGREGATE_NAMES[0]],
'space-guarantee-enabled': True, 'space-guarantee-enabled': True,
'language': 'c.utf_8', 'language': 'c.utf_8',
'percentage-snapshot-reserve': '5', 'percentage-snapshot-reserve': '5',

View File

@ -4095,7 +4095,7 @@ class NetAppCmodeClientTestCase(test.TestCase):
return_value=fake_client.VOLUME_DEDUPE_INFO_SSC) return_value=fake_client.VOLUME_DEDUPE_INFO_SSC)
expected_prov_opts = { expected_prov_opts = {
'aggregate': 'fake_aggr1', 'aggregate': ['fake_aggr1'],
'compression_enabled': False, 'compression_enabled': False,
'dedupe_enabled': True, 'dedupe_enabled': True,
'language': 'c.utf_8', 'language': 'c.utf_8',

View File

@ -2515,7 +2515,7 @@ class NetAppRestCmodeClientTestCase(test.TestCase):
return_value=fake_client.VOLUME_DEDUPE_INFO_SSC) return_value=fake_client.VOLUME_DEDUPE_INFO_SSC)
expected_prov_opts = { expected_prov_opts = {
'aggregate': 'fake_aggr1', 'aggregate': ['fake_aggr1'],
'compression_enabled': False, 'compression_enabled': False,
'dedupe_enabled': True, 'dedupe_enabled': True,
'language': 'c.utf_8', 'language': 'c.utf_8',

View File

@ -134,6 +134,19 @@ SSC_AGGREGATE_INFO = {
}, },
} }
PROVISIONING_OPTS_FLEXGROUP = {
'aggregate': ['fake_aggregate'],
'thin_provisioned': True,
'snapshot_policy': None,
'language': 'en_US',
'dedupe_enabled': True,
'compression_enabled': True,
'snapshot_reserve': '12',
'volume_type': 'rw',
'size': 20,
'is_flexgroup': True,
}
PROVISIONING_OPTS = { PROVISIONING_OPTS = {
'aggregate': ['fake_aggregate'], 'aggregate': ['fake_aggregate'],
'thin_provisioned': True, 'thin_provisioned': True,

View File

@ -671,7 +671,7 @@ class NetAppCDOTDataMotionMixinTestCase(test.TestCase):
is_flexgroup): is_flexgroup):
self.mock_object( self.mock_object(
self.mock_src_client, 'get_provisioning_options_from_flexvol', self.mock_src_client, 'get_provisioning_options_from_flexvol',
return_value={'size': size, 'aggregate': 'aggr01', return_value={'size': size, 'aggregate': ['aggr1'],
'is_flexgroup': is_flexgroup}) 'is_flexgroup': is_flexgroup})
self.mock_object(self.dm_mixin, '_get_replication_aggregate_map', self.mock_object(self.dm_mixin, '_get_replication_aggregate_map',
return_value=aggr_map) return_value=aggr_map)
@ -702,11 +702,11 @@ class NetAppCDOTDataMotionMixinTestCase(test.TestCase):
new=test_utils.ZeroIntervalWithTimeoutLoopingCall) new=test_utils.ZeroIntervalWithTimeoutLoopingCall)
def test_create_destination_flexgroup_online_timeout(self, volume_state): def test_create_destination_flexgroup_online_timeout(self, volume_state):
aggr_map = { aggr_map = {
fakes.PROVISIONING_OPTS['aggregate'][0]: 'aggr01', fakes.PROVISIONING_OPTS_FLEXGROUP['aggregate'][0]: 'aggr01',
'aggr20': 'aggr02', 'aggr20': 'aggr02',
} }
provisioning_opts = copy.deepcopy(fakes.PROVISIONING_OPTS) provisioning_opts = copy.deepcopy(fakes.PROVISIONING_OPTS_FLEXGROUP)
expected_prov_opts = copy.deepcopy(fakes.PROVISIONING_OPTS) expected_prov_opts = copy.deepcopy(fakes.PROVISIONING_OPTS_FLEXGROUP)
expected_prov_opts.pop('volume_type', None) expected_prov_opts.pop('volume_type', None)
expected_prov_opts.pop('size', None) expected_prov_opts.pop('size', None)
expected_prov_opts.pop('aggregate', None) expected_prov_opts.pop('aggregate', None)
@ -745,7 +745,7 @@ class NetAppCDOTDataMotionMixinTestCase(test.TestCase):
mock_create_volume_async.assert_called_once_with( mock_create_volume_async.assert_called_once_with(
self.dest_flexvol_name, self.dest_flexvol_name,
['aggr01'], ['aggr01'],
fakes.PROVISIONING_OPTS['size'], fakes.PROVISIONING_OPTS_FLEXGROUP['size'],
volume_type='dp', **expected_prov_opts) volume_type='dp', **expected_prov_opts)
mock_volume_state.assert_called_with( mock_volume_state.assert_called_with(
name=self.dest_flexvol_name) name=self.dest_flexvol_name)
@ -754,19 +754,16 @@ class NetAppCDOTDataMotionMixinTestCase(test.TestCase):
@ddt.data('flexvol', 'flexgroup') @ddt.data('flexvol', 'flexgroup')
def test_create_destination_flexvol(self, volume_style): def test_create_destination_flexvol(self, volume_style):
provisioning_opts = copy.deepcopy(fakes.PROVISIONING_OPTS)
aggr_map = { aggr_map = {
fakes.PROVISIONING_OPTS['aggregate'][0]: 'aggr01', provisioning_opts['aggregate'][0]: 'aggr01',
'aggr20': 'aggr02', 'aggr20': 'aggr02',
} }
provisioning_opts = copy.deepcopy(fakes.PROVISIONING_OPTS) expected_prov_opts = copy.deepcopy(provisioning_opts)
expected_prov_opts = copy.deepcopy(fakes.PROVISIONING_OPTS)
expected_prov_opts.pop('volume_type', None) expected_prov_opts.pop('volume_type', None)
expected_prov_opts.pop('size', None) expected_prov_opts.pop('size', None)
expected_prov_opts.pop('aggregate', None) expected_prov_opts.pop('aggregate', None)
expected_prov_opts.pop('is_flexgroup', None) expected_prov_opts.pop('is_flexgroup', None)
mock_get_provisioning_opts_call = self.mock_object(
self.mock_src_client, 'get_provisioning_options_from_flexvol',
return_value=provisioning_opts)
mock_is_flexvol_encrypted = self.mock_object( mock_is_flexvol_encrypted = self.mock_object(
self.mock_src_client, 'is_flexvol_encrypted', self.mock_src_client, 'is_flexvol_encrypted',
return_value=False) return_value=False)
@ -782,6 +779,11 @@ class NetAppCDOTDataMotionMixinTestCase(test.TestCase):
pool_is_flexgroup = False pool_is_flexgroup = False
if volume_style == 'flexgroup': if volume_style == 'flexgroup':
pool_is_flexgroup = True pool_is_flexgroup = True
provisioning_opts = copy.deepcopy(
fakes.PROVISIONING_OPTS_FLEXGROUP)
self.mock_object(self.dm_mixin,
'_get_replication_volume_online_timeout',
return_value=2)
mock_create_volume_async = self.mock_object(self.mock_dest_client, mock_create_volume_async = self.mock_object(self.mock_dest_client,
'create_volume_async') 'create_volume_async')
mock_dedupe_enabled = self.mock_object( mock_dedupe_enabled = self.mock_object(
@ -792,6 +794,10 @@ class NetAppCDOTDataMotionMixinTestCase(test.TestCase):
mock_create_flexvol = self.mock_object(self.mock_dest_client, mock_create_flexvol = self.mock_object(self.mock_dest_client,
'create_flexvol') 'create_flexvol')
mock_get_provisioning_opts_call = self.mock_object(
self.mock_src_client, 'get_provisioning_options_from_flexvol',
return_value=provisioning_opts)
retval = self.dm_mixin.create_destination_flexvol( retval = self.dm_mixin.create_destination_flexvol(
self.src_backend, self.dest_backend, self.src_backend, self.dest_backend,
self.src_flexvol_name, self.dest_flexvol_name, self.src_flexvol_name, self.dest_flexvol_name,
@ -809,7 +815,7 @@ class NetAppCDOTDataMotionMixinTestCase(test.TestCase):
mock_create_volume_async.assert_called_once_with( mock_create_volume_async.assert_called_once_with(
self.dest_flexvol_name, self.dest_flexvol_name,
['aggr01'], ['aggr01'],
fakes.PROVISIONING_OPTS['size'], fakes.PROVISIONING_OPTS_FLEXGROUP['size'],
volume_type='dp', **expected_prov_opts) volume_type='dp', **expected_prov_opts)
mock_volume_state.assert_called_once_with( mock_volume_state.assert_called_once_with(
name=self.dest_flexvol_name) name=self.dest_flexvol_name)

View File

@ -1518,8 +1518,9 @@ class Client(client_base.Client):
volume_id_attributes = volume_attributes.get_child_by_name( volume_id_attributes = volume_attributes.get_child_by_name(
'volume-id-attributes') or netapp_api.NaElement('none') 'volume-id-attributes') or netapp_api.NaElement('none')
aggr = volume_id_attributes.get_child_content( aggr_name = volume_id_attributes.get_child_content(
'containing-aggregate-name') 'containing-aggregate-name')
aggr = [aggr_name] if aggr_name else None
if not aggr: if not aggr:
aggr_list_attr = volume_id_attributes.get_child_by_name( aggr_list_attr = volume_id_attributes.get_child_by_name(
'aggr-list') or netapp_api.NaElement('none') 'aggr-list') or netapp_api.NaElement('none')

View File

@ -450,7 +450,7 @@ class RestClient(object):
aggregate = None aggregate = None
if unique_volume['style'] == 'flexvol': if unique_volume['style'] == 'flexvol':
# flexvol has only 1 aggregate # flexvol has only 1 aggregate
aggregate = unique_volume['aggregates'][0]['name'] aggregate = [unique_volume['aggregates'][0]['name']]
else: else:
aggregate = [aggr["name"] aggregate = [aggr["name"]
for aggr in unique_volume.get('aggregates', [])] for aggr in unique_volume.get('aggregates', [])]

View File

@ -140,7 +140,7 @@ class CapabilitiesLibrary(object):
'netapp_thin_provisioned': six.text_type(not netapp_thick).lower(), 'netapp_thin_provisioned': six.text_type(not netapp_thick).lower(),
'thick_provisioning_support': thick, 'thick_provisioning_support': thick,
'thin_provisioning_support': not thick, 'thin_provisioning_support': not thick,
'netapp_aggregate': volume_info.get('aggregate'), 'netapp_aggregate': volume_info.get('aggregate')[0],
'netapp_is_flexgroup': six.text_type(is_flexgroup).lower(), 'netapp_is_flexgroup': six.text_type(is_flexgroup).lower(),
} }

View File

@ -0,0 +1,6 @@
---
fixes:
- |
NetApp ONTAP driver `Bug #1927784
<https://bugs.launchpad.net/cinder/+bug/1927784>`_:
Fixed the replication setup with FlexVol pools.