nvmeof connector utilize replica_count

nvmeof connector methods handling volumes with volume_replicas should
utilize replica_count parameter in connection_information to
determine method of device exposure to host

Closes-Bug: #1938870
Change-Id: I629b80b208295c0e6bc9f18ad8e6905759e6593e
This commit is contained in:
Zohar Mamedov 2021-09-29 11:04:38 +00:00 committed by Lior Friedman
parent 5614196e53
commit 49114867f9
3 changed files with 25 additions and 11 deletions

View File

@ -65,11 +65,12 @@ class NVMeOFConnector(base.BaseLinuxConnector):
volume_replicas = connection_properties.get('volume_replicas')
if not volume_replicas: # compatibility
return []
replica_count = connection_properties.get('replica_count')
try:
if volume_replicas and len(volume_replicas) > 1:
if volume_replicas and replica_count > 1:
return ['/dev/md/' + connection_properties.get('alias')]
if volume_replicas and len(volume_replicas) == 1:
if volume_replicas and replica_count == 1:
return [NVMeOFConnector.get_nvme_device_path(
self, volume_replicas[0]['target_nqn'],
volume_replicas[0]['vol_uuid'])]
@ -445,6 +446,7 @@ class NVMeOFConnector(base.BaseLinuxConnector):
"""
volume_replicas = connection_properties.get('volume_replicas')
replica_count = connection_properties.get('replica_count')
volume_alias = connection_properties.get('alias')
if volume_replicas:
@ -463,9 +465,9 @@ class NVMeOFConnector(base.BaseLinuxConnector):
raise exception.VolumeDeviceNotFound(
device=volume_replicas)
if len(volume_replicas) > 1:
if replica_count > 1:
device_path = self._handle_replicated_volume(
host_device_paths, volume_alias, len(volume_replicas))
host_device_paths, volume_alias, replica_count)
else:
device_path = self._handle_single_replica(
host_device_paths, volume_alias)
@ -485,14 +487,15 @@ class NVMeOFConnector(base.BaseLinuxConnector):
force=False, ignore_errors=False):
device_path = None
volume_replicas = connection_properties.get('volume_replicas')
replica_count = connection_properties.get('replica_count')
if device_info and device_info.get('path'):
device_path = device_info['path']
elif connection_properties.get('device_path'):
device_path = connection_properties['device_path']
elif volume_replicas and len(volume_replicas) > 1:
elif volume_replicas and replica_count > 1:
device_path = '/dev/md/' + connection_properties['alias']
if volume_replicas and len(volume_replicas) > 1:
if volume_replicas and replica_count > 1:
NVMeOFConnector.end_raid(self, device_path)
else:
if self._get_fs_type(device_path) == 'linux_raid_member':
@ -500,8 +503,9 @@ class NVMeOFConnector(base.BaseLinuxConnector):
def _extend_volume_replicated(self, connection_properties):
volume_replicas = connection_properties.get('volume_replicas')
replica_count = connection_properties.get('replica_count')
if volume_replicas and len(volume_replicas) > 1:
if volume_replicas and replica_count > 1:
device_path = '/dev/md/' + connection_properties['alias']
NVMeOFConnector.run_mdadm(
self, ['mdadm', '--grow', '--size', 'max', device_path])

View File

@ -45,7 +45,8 @@ volume_replicas = [{'target_nqn': 'fakenqn1', 'vol_uuid': 'fakeuuid1',
connection_properties = {
'alias': 'fakealias',
'vol_uuid': 'fakevoluuid',
'volume_replicas': volume_replicas
'volume_replicas': volume_replicas,
'replica_count': 3
}
fake_portal = ('fake', 'portal', 'tcp')
@ -177,7 +178,8 @@ class NVMeOFConnectorTestCase(test_connector.ConnectorTestCase):
mock_get_device_path.return_value = '/dev/nvme1n1'
connection_properties = {
'alias': 'fakealias',
'volume_replicas': [volume_replicas[0]]
'volume_replicas': [volume_replicas[0]],
'replica_count': 1
}
self.assertEqual(self.connector.get_volume_paths(
connection_properties),
@ -257,7 +259,8 @@ class NVMeOFConnectorTestCase(test_connector.ConnectorTestCase):
connection_properties1 = {
'target_nqn': 'fakenqn',
'vol_uuid': 'fakeuuid',
'volume_replicas': [volume_replicas[0]]
'volume_replicas': [volume_replicas[0]],
'replica_count': 1
}
mock_connect_target_volume.return_value = '/dev/nvme0n1'
self.assertEqual(
@ -401,6 +404,7 @@ class NVMeOFConnectorTestCase(test_connector.ConnectorTestCase):
connection_properties = {
'vol_uuid': 'fakeuuid',
'volume_replicas': volume_replicas,
'replica_count': 3,
'device_path': '/dev/md/md1'
}
self.connector.disconnect_volume(connection_properties, None)
@ -431,7 +435,8 @@ class NVMeOFConnectorTestCase(test_connector.ConnectorTestCase):
connection_properties = {
'target_nqn': 'fakenqn',
'vol_uuid': 'fakeuuid',
'volume_replicas': [volume_replicas[0]]
'volume_replicas': [volume_replicas[0]],
'replica_count': 1
}
mock_device_path.return_value = '/dev/nvme0n1'
mock_device_size.return_value = 100

View File

@ -0,0 +1,5 @@
---
fixes:
- |
`Bug #1938870 <https://bugs.launchpad.net/cinder/+bug/1938870>`_: Fixed
KumoScale Driver replicated volume missing portals attaches without raid.