Merge "Handle diskless hardware connected to remote iscsi"
This commit is contained in:
commit
5d012b43bd
ironic_python_agent
releasenotes/notes
@ -73,6 +73,27 @@ def _udev_settle():
|
||||
return
|
||||
|
||||
|
||||
def _check_for_iscsi():
|
||||
"""Connect iSCSI shared connected via iBFT or OF.
|
||||
|
||||
iscsistart -f will print the iBFT or OF info.
|
||||
In case such connection exists, we would like to issue
|
||||
iscsistart -b to create a session to the target.
|
||||
- if no connection is detected we simply return.
|
||||
"""
|
||||
try:
|
||||
utils.execute('iscsistart', '-f')
|
||||
except (processutils.ProcessExecutionError, EnvironmentError) as e:
|
||||
LOG.debug("No iscsi connection detected. Skipping iscsi. "
|
||||
"Error: %s", e)
|
||||
return
|
||||
try:
|
||||
utils.execute('iscsistart', '-b')
|
||||
except processutils.ProcessExecutionError as e:
|
||||
LOG.warning("Something went wrong executing 'iscsistart -b' "
|
||||
"Error: %s", e)
|
||||
|
||||
|
||||
def list_all_block_devices(block_type='disk'):
|
||||
"""List all physical block devices
|
||||
|
||||
@ -86,7 +107,6 @@ def list_all_block_devices(block_type='disk'):
|
||||
:param block_type: Type of block device to find
|
||||
:return: A list of BlockDevices
|
||||
"""
|
||||
|
||||
_udev_settle()
|
||||
|
||||
columns = ['KNAME', 'MODEL', 'SIZE', 'ROTA', 'TYPE']
|
||||
@ -425,6 +445,7 @@ class GenericHardwareManager(HardwareManager):
|
||||
|
||||
def evaluate_hardware_support(self):
|
||||
# Do some initialization before we declare ourself ready
|
||||
_check_for_iscsi()
|
||||
self._wait_for_disks()
|
||||
return HardwareSupport.GENERIC
|
||||
|
||||
|
@ -271,9 +271,10 @@ class TestBaseAgent(test_base.BaseTestCase):
|
||||
|
||||
@mock.patch.object(time, 'sleep', autospec=True)
|
||||
@mock.patch('wsgiref.simple_server.make_server', autospec=True)
|
||||
@mock.patch.object(hardware, '_check_for_iscsi', autospec=True)
|
||||
@mock.patch.object(hardware.HardwareManager, 'list_hardware_info')
|
||||
def test_run_with_sleep(self, mocked_list_hardware, wsgi_server_cls,
|
||||
mocked_sleep):
|
||||
def test_run_with_sleep(self, mock_check_for_iscsi, mocked_list_hardware,
|
||||
wsgi_server_cls, mocked_sleep):
|
||||
CONF.set_override('inspection_callback_url', '', enforce_type=True)
|
||||
wsgi_server = wsgi_server_cls.return_value
|
||||
wsgi_server.start.side_effect = KeyboardInterrupt()
|
||||
@ -299,6 +300,7 @@ class TestBaseAgent(test_base.BaseTestCase):
|
||||
|
||||
self.agent.heartbeater.start.assert_called_once_with()
|
||||
mocked_sleep.assert_called_once_with(10)
|
||||
self.assertTrue(mock_check_for_iscsi.called)
|
||||
|
||||
def test_async_command_success(self):
|
||||
result = base.AsyncCommandResult('foo_command', {'fail': False},
|
||||
@ -437,10 +439,11 @@ class TestAdvertiseAddress(test_base.BaseTestCase):
|
||||
self.assertFalse(mock_exec.called)
|
||||
self.assertFalse(mock_gethostbyname.called)
|
||||
|
||||
@mock.patch.object(hardware, '_check_for_iscsi', autospec=True)
|
||||
@mock.patch.object(hardware.GenericHardwareManager, 'get_ipv4_addr',
|
||||
autospec=True)
|
||||
def test_with_network_interface(self, mock_get_ipv4, mock_exec,
|
||||
mock_gethostbyname):
|
||||
def test_with_network_interface(self, mock_get_ipv4, mock_check_for_iscsi,
|
||||
mock_exec, mock_gethostbyname):
|
||||
self.agent.network_interface = 'em1'
|
||||
mock_get_ipv4.return_value = '1.2.3.4'
|
||||
|
||||
@ -450,10 +453,14 @@ class TestAdvertiseAddress(test_base.BaseTestCase):
|
||||
mock_get_ipv4.assert_called_once_with(mock.ANY, 'em1')
|
||||
self.assertFalse(mock_exec.called)
|
||||
self.assertFalse(mock_gethostbyname.called)
|
||||
self.assertTrue(mock_check_for_iscsi.called)
|
||||
|
||||
@mock.patch.object(hardware, '_check_for_iscsi', autospec=True)
|
||||
@mock.patch.object(hardware.GenericHardwareManager, 'get_ipv4_addr',
|
||||
autospec=True)
|
||||
def test_with_network_interface_failed(self, mock_get_ipv4, mock_exec,
|
||||
def test_with_network_interface_failed(self, mock_get_ipv4,
|
||||
mock_check_for_iscsi,
|
||||
mock_exec,
|
||||
mock_gethostbyname):
|
||||
self.agent.network_interface = 'em1'
|
||||
mock_get_ipv4.return_value = None
|
||||
@ -464,6 +471,7 @@ class TestAdvertiseAddress(test_base.BaseTestCase):
|
||||
mock_get_ipv4.assert_called_once_with(mock.ANY, 'em1')
|
||||
self.assertFalse(mock_exec.called)
|
||||
self.assertFalse(mock_gethostbyname.called)
|
||||
self.assertTrue(mock_check_for_iscsi.called)
|
||||
|
||||
def test_route_with_ip(self, mock_exec, mock_gethostbyname):
|
||||
self.agent.api_url = 'http://1.2.1.2:8081/v1'
|
||||
|
@ -1241,9 +1241,11 @@ class TestGenericHardwareManager(test_base.BaseTestCase):
|
||||
|
||||
@mock.patch.object(hardware.GenericHardwareManager, 'list_block_devices',
|
||||
autospec=True)
|
||||
@mock.patch.object(hardware, '_check_for_iscsi', autospec=True)
|
||||
@mock.patch.object(time, 'sleep', autospec=True)
|
||||
@mock.patch.object(utils, 'guess_root_disk', autospec=True)
|
||||
def test_evaluate_hw_waits_for_disks(self, mocked_root_dev, mocked_sleep,
|
||||
mocked_check_for_iscsi,
|
||||
mocked_block_dev):
|
||||
mocked_root_dev.side_effect = [
|
||||
errors.DeviceNotFound('boom'),
|
||||
@ -1252,6 +1254,7 @@ class TestGenericHardwareManager(test_base.BaseTestCase):
|
||||
|
||||
result = self.hardware.evaluate_hardware_support()
|
||||
|
||||
self.assertTrue(mocked_check_for_iscsi.called)
|
||||
self.assertEqual(hardware.HardwareSupport.GENERIC, result)
|
||||
mocked_root_dev.assert_called_with(mocked_block_dev.return_value)
|
||||
self.assertEqual(2, mocked_root_dev.call_count)
|
||||
@ -1335,9 +1338,11 @@ class TestGenericHardwareManager(test_base.BaseTestCase):
|
||||
|
||||
@mock.patch.object(hardware.GenericHardwareManager, 'list_block_devices',
|
||||
autospec=True)
|
||||
@mock.patch.object(hardware, '_check_for_iscsi', autospec=True)
|
||||
@mock.patch.object(time, 'sleep', autospec=True)
|
||||
@mock.patch.object(utils, 'guess_root_disk', autospec=True)
|
||||
def test_evaluate_hw_disks_timeout(self, mocked_root_dev, mocked_sleep,
|
||||
mocked_check_for_iscsi,
|
||||
mocked_block_dev):
|
||||
mocked_root_dev.side_effect = errors.DeviceNotFound('boom')
|
||||
|
||||
@ -1419,6 +1424,18 @@ class TestModuleFunctions(test_base.BaseTestCase):
|
||||
hardware._udev_settle()
|
||||
mocked_execute.assert_called_once_with('udevadm', 'settle')
|
||||
|
||||
def test__check_for_iscsi(self, mocked_execute):
|
||||
hardware._check_for_iscsi()
|
||||
mocked_execute.assert_has_calls([
|
||||
mock.call('iscsistart', '-f'),
|
||||
mock.call('iscsistart', '-b')])
|
||||
|
||||
def test__check_for_iscsi_no_iscsi(self, mocked_execute):
|
||||
mocked_execute.side_effect = processutils.ProcessExecutionError()
|
||||
hardware._check_for_iscsi()
|
||||
mocked_execute.assert_has_calls([
|
||||
mock.call('iscsistart', '-f')])
|
||||
|
||||
|
||||
def create_hdparm_info(supported=False, enabled=False, frozen=False,
|
||||
enhanced_erase=False):
|
||||
|
@ -0,0 +1,3 @@
|
||||
---
|
||||
fixes:
|
||||
- If iscsi connection present, connect an iSCSI target share before detecting disks.
|
Loading…
x
Reference in New Issue
Block a user