Merge "NVMe-oF: Support nvme cli v2"
This commit is contained in:
commit
7ad6acdff5
|
@ -926,8 +926,12 @@ class NVMeOFConnector(base.BaseLinuxConnector):
|
||||||
# c-vol running on same node with different lock paths) or
|
# c-vol running on same node with different lock paths) or
|
||||||
# an admin is touching things manually. Not passing these
|
# an admin is touching things manually. Not passing these
|
||||||
# exit codes in check_exit_code parameter to _execute so we
|
# exit codes in check_exit_code parameter to _execute so we
|
||||||
# can log it.
|
# can log it. nvme cli v2 returns 1, so we parse the
|
||||||
if exc.exit_code not in (70, errno.EALREADY):
|
# message. Some nvme cli versions return errors in stdout,
|
||||||
|
# so we look in stderr and stdout.
|
||||||
|
if not (exc.exit_code in (70, errno.EALREADY) or
|
||||||
|
(exc.exit_code == 1 and
|
||||||
|
'already connected' in exc.stderr + exc.stdout)):
|
||||||
LOG.error('Could not connect to %s: exit_code: %s, '
|
LOG.error('Could not connect to %s: exit_code: %s, '
|
||||||
'stdout: "%s", stderr: "%s",', portal,
|
'stdout: "%s", stderr: "%s",', portal,
|
||||||
exc.exit_code, exc.stdout, exc.stderr)
|
exc.exit_code, exc.stdout, exc.stderr)
|
||||||
|
|
|
@ -1505,7 +1505,11 @@ class NVMeOFConnectorTestCase(test_connector.ConnectorTestCase):
|
||||||
'-n', target.nqn, '-Q', '128', '-l', '-1'])
|
'-n', target.nqn, '-Q', '128', '-l', '-1'])
|
||||||
for portal in target.portals])
|
for portal in target.portals])
|
||||||
|
|
||||||
@ddt.data(70, errno.EALREADY)
|
@ddt.data((70, '', ''),
|
||||||
|
(errno.EALREADY, '', ''),
|
||||||
|
(1, '', 'already connected'),
|
||||||
|
(1, 'already connected', ''))
|
||||||
|
@ddt.unpack
|
||||||
@mock.patch.object(nvmeof.LOG, 'warning')
|
@mock.patch.object(nvmeof.LOG, 'warning')
|
||||||
@mock.patch.object(nvmeof.Target, 'find_device')
|
@mock.patch.object(nvmeof.Target, 'find_device')
|
||||||
@mock.patch.object(nvmeof.Target, 'set_portals_controllers')
|
@mock.patch.object(nvmeof.Target, 'set_portals_controllers')
|
||||||
|
@ -1513,14 +1517,14 @@ class NVMeOFConnectorTestCase(test_connector.ConnectorTestCase):
|
||||||
@mock.patch.object(nvmeof.NVMeOFConnector, 'rescan')
|
@mock.patch.object(nvmeof.NVMeOFConnector, 'rescan')
|
||||||
@mock.patch.object(nvmeof.Portal, 'state', new_callable=mock.PropertyMock)
|
@mock.patch.object(nvmeof.Portal, 'state', new_callable=mock.PropertyMock)
|
||||||
def test__connect_target_race(
|
def test__connect_target_race(
|
||||||
self, exit_code, mock_state, mock_rescan, mock_cli,
|
self, exit_code, stdout, stderr, mock_state, mock_rescan, mock_cli,
|
||||||
mock_set_ctrls, mock_find_dev, mock_log):
|
mock_set_ctrls, mock_find_dev, mock_log):
|
||||||
"""Treat race condition with sysadmin as success."""
|
"""Treat race condition with sysadmin as success."""
|
||||||
mock_state.side_effect = ['connecting', 'connecting', None, 'live']
|
mock_state.side_effect = ['connecting', 'connecting', None, 'live']
|
||||||
dev_path = '/dev/nvme0n1'
|
dev_path = '/dev/nvme0n1'
|
||||||
mock_find_dev.return_value = dev_path
|
mock_find_dev.return_value = dev_path
|
||||||
mock_cli.side_effect = putils.ProcessExecutionError(
|
mock_cli.side_effect = putils.ProcessExecutionError(
|
||||||
exit_code=exit_code)
|
exit_code=exit_code, stdout=stdout, stderr=stderr)
|
||||||
|
|
||||||
target = self.conn_props.targets[0]
|
target = self.conn_props.targets[0]
|
||||||
|
|
||||||
|
@ -1539,7 +1543,11 @@ class NVMeOFConnectorTestCase(test_connector.ConnectorTestCase):
|
||||||
portal.transport, '-n', target.nqn, '-Q', '128', '-l', '-1'])
|
portal.transport, '-n', target.nqn, '-Q', '128', '-l', '-1'])
|
||||||
self.assertEqual(1, mock_log.call_count)
|
self.assertEqual(1, mock_log.call_count)
|
||||||
|
|
||||||
@ddt.data(70, errno.EALREADY)
|
@ddt.data((70, '', ''),
|
||||||
|
(errno.EALREADY, '', ''),
|
||||||
|
(1, '', 'already connected'),
|
||||||
|
(1, 'already connected', ''))
|
||||||
|
@ddt.unpack
|
||||||
@mock.patch.object(nvmeof.LOG, 'warning')
|
@mock.patch.object(nvmeof.LOG, 'warning')
|
||||||
@mock.patch('time.sleep')
|
@mock.patch('time.sleep')
|
||||||
@mock.patch('time.time', side_effect=[0, 0.1, 0.6])
|
@mock.patch('time.time', side_effect=[0, 0.1, 0.6])
|
||||||
|
@ -1553,12 +1561,12 @@ class NVMeOFConnectorTestCase(test_connector.ConnectorTestCase):
|
||||||
@mock.patch.object(nvmeof.NVMeOFConnector, 'rescan')
|
@mock.patch.object(nvmeof.NVMeOFConnector, 'rescan')
|
||||||
@mock.patch.object(nvmeof.Portal, 'state', new_callable=mock.PropertyMock)
|
@mock.patch.object(nvmeof.Portal, 'state', new_callable=mock.PropertyMock)
|
||||||
def test__connect_target_race_connecting(
|
def test__connect_target_race_connecting(
|
||||||
self, exit_code, mock_state, mock_rescan, mock_cli, mock_set_ctrls,
|
self, exit_code, stdout, stderr, mock_state, mock_rescan, mock_cli,
|
||||||
mock_find_dev, mock_is_live, mock_delay, mock_time, mock_sleep,
|
mock_set_ctrls, mock_find_dev, mock_is_live, mock_delay, mock_time,
|
||||||
mock_log):
|
mock_sleep, mock_log):
|
||||||
"""Test connect target when portal is reconnecting after race."""
|
"""Test connect target when portal is reconnecting after race."""
|
||||||
mock_cli.side_effect = putils.ProcessExecutionError(
|
mock_cli.side_effect = putils.ProcessExecutionError(
|
||||||
exit_code=exit_code)
|
exit_code=exit_code, stdout=stdout, stderr=stderr)
|
||||||
mock_state.side_effect = ['connecting', 'connecting', None,
|
mock_state.side_effect = ['connecting', 'connecting', None,
|
||||||
'connecting']
|
'connecting']
|
||||||
mock_is_live.side_effect = [False, False, False, False, True]
|
mock_is_live.side_effect = [False, False, False, False, True]
|
||||||
|
@ -1581,7 +1589,11 @@ class NVMeOFConnectorTestCase(test_connector.ConnectorTestCase):
|
||||||
portal.transport, '-n', target.nqn, '-Q', '128', '-l', '-1'])
|
portal.transport, '-n', target.nqn, '-Q', '128', '-l', '-1'])
|
||||||
self.assertEqual(1, mock_log.call_count)
|
self.assertEqual(1, mock_log.call_count)
|
||||||
|
|
||||||
@ddt.data(70, errno.EALREADY)
|
@ddt.data((70, '', ''),
|
||||||
|
(errno.EALREADY, '', ''),
|
||||||
|
(1, '', 'already connected'),
|
||||||
|
(1, 'already connected', ''))
|
||||||
|
@ddt.unpack
|
||||||
@mock.patch.object(nvmeof.LOG, 'warning')
|
@mock.patch.object(nvmeof.LOG, 'warning')
|
||||||
@mock.patch.object(nvmeof.LOG, 'error')
|
@mock.patch.object(nvmeof.LOG, 'error')
|
||||||
@mock.patch('time.sleep')
|
@mock.patch('time.sleep')
|
||||||
|
@ -1596,12 +1608,12 @@ class NVMeOFConnectorTestCase(test_connector.ConnectorTestCase):
|
||||||
@mock.patch.object(nvmeof.NVMeOFConnector, 'rescan')
|
@mock.patch.object(nvmeof.NVMeOFConnector, 'rescan')
|
||||||
@mock.patch.object(nvmeof.Portal, 'state', new_callable=mock.PropertyMock)
|
@mock.patch.object(nvmeof.Portal, 'state', new_callable=mock.PropertyMock)
|
||||||
def test__connect_target_race_unknown(
|
def test__connect_target_race_unknown(
|
||||||
self, exit_code, mock_state, mock_rescan, mock_cli, mock_set_ctrls,
|
self, exit_code, stdout, stderr, mock_state, mock_rescan, mock_cli,
|
||||||
mock_find_dev, mock_is_live, mock_delay, mock_time, mock_sleep,
|
mock_set_ctrls, mock_find_dev, mock_is_live, mock_delay, mock_time,
|
||||||
mock_log_err, mock_log_warn):
|
mock_sleep, mock_log_err, mock_log_warn):
|
||||||
"""Test connect target when portal is unknown after race."""
|
"""Test connect target when portal is unknown after race."""
|
||||||
mock_cli.side_effect = putils.ProcessExecutionError(
|
mock_cli.side_effect = putils.ProcessExecutionError(
|
||||||
exit_code=exit_code)
|
exit_code=exit_code, stdout=stdout, stderr=stderr)
|
||||||
mock_state.side_effect = ['connecting', 'connecting', None,
|
mock_state.side_effect = ['connecting', 'connecting', None,
|
||||||
'unknown']
|
'unknown']
|
||||||
mock_is_live.side_effect = [False, False, False, True]
|
mock_is_live.side_effect = [False, False, False, True]
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
fixes:
|
||||||
|
- |
|
||||||
|
NVMe-oF connector `bug #1961222
|
||||||
|
<https://bugs.launchpad.net/os-brick/+bug/1961222>`_: Fixed
|
||||||
|
support of newer NVMe CLI v2.
|
Loading…
Reference in New Issue