summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ironic/conductor/task_manager.py72
-rw-r--r--ironic/drivers/modules/redfish/management.py5
-rw-r--r--ironic/tests/unit/conductor/test_manager.py2
-rw-r--r--ironic/tests/unit/conductor/test_task_manager.py128
-rw-r--r--ironic/tests/unit/drivers/modules/irmc/test_inspect.py17
-rw-r--r--ironic/tests/unit/drivers/modules/redfish/test_management.py37
-rw-r--r--releasenotes/notes/sync-boot-mode-after-changing-redfish-device-f60ef90ba5675215.yaml8
-rw-r--r--releasenotes/notes/taskmanager-lazy-load-32a14526c647c2f0.yaml9
-rw-r--r--test-requirements.txt2
-rw-r--r--zuul.d/ironic-jobs.yaml8
-rw-r--r--zuul.d/project.yaml9
11 files changed, 196 insertions, 101 deletions
diff --git a/ironic/conductor/task_manager.py b/ironic/conductor/task_manager.py
index 83db66fc6..a5731ef6d 100644
--- a/ironic/conductor/task_manager.py
+++ b/ironic/conductor/task_manager.py
@@ -200,6 +200,10 @@ class TaskManager(object):
self.context = context
self._node = None
+ self._ports = None
+ self._portgroups = None
+ self._volume_connectors = None
+ self._volume_targets = None
self.node_id = node_id
self.shared = shared
self._retry = retry
@@ -226,13 +230,6 @@ class TaskManager(object):
self._debug_timer.restart()
self.node = node
- self.ports = objects.Port.list_by_node_id(context, self.node.id)
- self.portgroups = objects.Portgroup.list_by_node_id(context,
- self.node.id)
- self.volume_connectors = objects.VolumeConnector.list_by_node_id(
- context, self.node.id)
- self.volume_targets = objects.VolumeTarget.list_by_node_id(
- context, self.node.id)
if load_driver:
self.driver = driver_factory.build_driver_for_task(self)
else:
@@ -253,6 +250,67 @@ class TaskManager(object):
self.fsm.initialize(start_state=self.node.provision_state,
target_state=self.node.target_provision_state)
+ @property
+ def ports(self):
+ try:
+ if self._ports is None:
+ self._ports = objects.Port.list_by_node_id(self.context,
+ self.node.id)
+ except Exception:
+ with excutils.save_and_reraise_exception():
+ self.release_resources()
+ return self._ports
+
+ @ports.setter
+ def ports(self, ports):
+ self._ports = ports
+
+ @property
+ def portgroups(self):
+ try:
+ if self._portgroups is None:
+ self._portgroups = objects.Portgroup.list_by_node_id(
+ self.context, self.node.id)
+ except Exception:
+ with excutils.save_and_reraise_exception():
+ self.release_resources()
+ return self._portgroups
+
+ @portgroups.setter
+ def portgroups(self, portgroups):
+ self._portgroups = portgroups
+
+ @property
+ def volume_connectors(self):
+ try:
+ if self._volume_connectors is None:
+ self._volume_connectors = \
+ objects.VolumeConnector.list_by_node_id(
+ self.context, self.node.id)
+ except Exception:
+ with excutils.save_and_reraise_exception():
+ self.release_resources()
+ return self._volume_connectors
+
+ @volume_connectors.setter
+ def volume_connectors(self, volume_connectors):
+ self._volume_connectors = volume_connectors
+
+ @property
+ def volume_targets(self):
+ try:
+ if self._volume_targets is None:
+ self._volume_targets = objects.VolumeTarget.list_by_node_id(
+ self.context, self.node.id)
+ except Exception:
+ with excutils.save_and_reraise_exception():
+ self.release_resources()
+ return self._volume_targets
+
+ @volume_targets.setter
+ def volume_targets(self, volume_targets):
+ self._volume_targets = volume_targets
+
def load_driver(self):
if self.driver is None:
self.driver = driver_factory.build_driver_for_task(self)
diff --git a/ironic/drivers/modules/redfish/management.py b/ironic/drivers/modules/redfish/management.py
index d9c418d7a..04e3d96b0 100644
--- a/ironic/drivers/modules/redfish/management.py
+++ b/ironic/drivers/modules/redfish/management.py
@@ -25,6 +25,7 @@ from ironic.common.i18n import _
from ironic.common import utils
from ironic.conductor import task_manager
from ironic.drivers import base
+from ironic.drivers.modules import boot_mode_utils
from ironic.drivers.modules.redfish import utils as redfish_utils
LOG = log.getLogger(__name__)
@@ -215,6 +216,10 @@ class RedfishManagement(base.ManagementInterface):
LOG.error(error_msg)
raise exception.RedfishError(error=error_msg)
+ # Ensure that boot mode is synced with what is set.
+ # Some BMCs reset it to default (BIOS) when changing the boot device.
+ boot_mode_utils.sync_boot_mode(task)
+
def get_boot_device(self, task):
"""Get the current boot device for a node.
diff --git a/ironic/tests/unit/conductor/test_manager.py b/ironic/tests/unit/conductor/test_manager.py
index 2485a63fa..2a2bc6841 100644
--- a/ironic/tests/unit/conductor/test_manager.py
+++ b/ironic/tests/unit/conductor/test_manager.py
@@ -5401,9 +5401,9 @@ class ConsoleTestCase(mgr_utils.ServiceSetUpMixin, db_base.DbTestCase):
console_enabled=True)
self._start_service()
self.service.set_console_mode(self.context, node.uuid, True)
- self._stop_service()
self.assertFalse(mock_sc.called)
self.assertFalse(mock_notify.called)
+ self._stop_service()
@mock.patch.object(fake.FakeConsole, 'stop_console', autospec=True)
@mock.patch.object(notification_utils, 'emit_console_notification')
diff --git a/ironic/tests/unit/conductor/test_task_manager.py b/ironic/tests/unit/conductor/test_task_manager.py
index 1cb61441f..13de0a241 100644
--- a/ironic/tests/unit/conductor/test_task_manager.py
+++ b/ironic/tests/unit/conductor/test_task_manager.py
@@ -112,7 +112,13 @@ class TaskManagerTestCase(db_base.DbTestCase):
get_voltgt_mock.return_value = mock.sentinel.voltgt1
build_driver_mock.return_value = mock.sentinel.driver1
+ # Note(arne_wiebalck): Force loading of lazy-loaded properties.
+ def _eval_all(task):
+ return task.ports, task.portgroups, task.volume_targets, \
+ task.volume_connectors
+
with task_manager.TaskManager(self.context, 'node-id1') as task:
+ _eval_all(task)
reserve_mock.return_value = node2
get_ports_mock.return_value = mock.sentinel.ports2
get_portgroups_mock.return_value = mock.sentinel.portgroups2
@@ -120,6 +126,7 @@ class TaskManagerTestCase(db_base.DbTestCase):
get_voltgt_mock.return_value = mock.sentinel.voltgt2
build_driver_mock.return_value = mock.sentinel.driver2
with task_manager.TaskManager(self.context, 'node-id2') as task2:
+ _eval_all(task2)
self.assertEqual(self.context, task.context)
self.assertEqual(self.node, task.node)
self.assertEqual(mock.sentinel.ports1, task.ports)
@@ -231,16 +238,18 @@ class TaskManagerTestCase(db_base.DbTestCase):
reserve_mock.return_value = self.node
get_ports_mock.side_effect = exception.IronicException('foo')
- self.assertRaises(exception.IronicException,
- task_manager.TaskManager,
- self.context,
- 'fake-node-id')
+ # Note(arne_wiebalck): Force loading of lazy-loaded properties.
+ def _eval_ports(task):
+ return task.ports
+
+ with task_manager.TaskManager(self.context, 'fake-node-id') as task:
+ self.assertRaises(exception.IronicException, _eval_ports, task)
node_get_mock.assert_called_once_with(self.context, 'fake-node-id')
reserve_mock.assert_called_once_with(self.context, self.host,
'fake-node-id')
get_ports_mock.assert_called_once_with(self.context, self.node.id)
- self.assertFalse(build_driver_mock.called)
+ self.assertTrue(build_driver_mock.called)
release_mock.assert_called_once_with(self.context, self.host,
self.node.id)
@@ -251,16 +260,19 @@ class TaskManagerTestCase(db_base.DbTestCase):
reserve_mock.return_value = self.node
get_portgroups_mock.side_effect = exception.IronicException('foo')
- self.assertRaises(exception.IronicException,
- task_manager.TaskManager,
- self.context,
- 'fake-node-id')
+ # Note(arne_wiebalck): Force loading of lazy-loaded properties.
+ def _eval_portgroups(task):
+ return task.portgroups
+
+ with task_manager.TaskManager(self.context, 'fake-node-id') as task:
+ self.assertRaises(exception.IronicException, _eval_portgroups,
+ task)
node_get_mock.assert_called_once_with(self.context, 'fake-node-id')
reserve_mock.assert_called_once_with(self.context, self.host,
'fake-node-id')
get_portgroups_mock.assert_called_once_with(self.context, self.node.id)
- self.assertFalse(build_driver_mock.called)
+ self.assertTrue(build_driver_mock.called)
release_mock.assert_called_once_with(self.context, self.host,
self.node.id)
@@ -271,15 +283,18 @@ class TaskManagerTestCase(db_base.DbTestCase):
reserve_mock.return_value = self.node
get_volconn_mock.side_effect = exception.IronicException('foo')
- self.assertRaises(exception.IronicException,
- task_manager.TaskManager,
- self.context,
- 'fake-node-id')
+ # Note(arne_wiebalck): Force loading of lazy-loaded properties.
+ def _eval_volconn(task):
+ return task.volume_connectors
+
+ with task_manager.TaskManager(self.context, 'fake-node-id') as task:
+ self.assertRaises(exception.IronicException, _eval_volconn,
+ task)
reserve_mock.assert_called_once_with(self.context, self.host,
'fake-node-id')
get_volconn_mock.assert_called_once_with(self.context, self.node.id)
- self.assertFalse(get_voltgt_mock.called)
+ self.assertTrue(build_driver_mock.called)
release_mock.assert_called_once_with(self.context, self.host,
self.node.id)
node_get_mock.assert_called_once_with(self.context, 'fake-node-id')
@@ -291,15 +306,17 @@ class TaskManagerTestCase(db_base.DbTestCase):
reserve_mock.return_value = self.node
get_voltgt_mock.side_effect = exception.IronicException('foo')
- self.assertRaises(exception.IronicException,
- task_manager.TaskManager,
- self.context,
- 'fake-node-id')
+ # Note(arne_wiebalck): Force loading of lazy-loaded properties.
+ def _eval_voltgt(task):
+ return task.volume_targets
+
+ with task_manager.TaskManager(self.context, 'fake-node-id') as task:
+ self.assertRaises(exception.IronicException, _eval_voltgt, task)
reserve_mock.assert_called_once_with(self.context, self.host,
'fake-node-id')
get_voltgt_mock.assert_called_once_with(self.context, self.node.id)
- self.assertFalse(build_driver_mock.called)
+ self.assertTrue(build_driver_mock.called)
release_mock.assert_called_once_with(self.context, self.host,
self.node.id)
node_get_mock.assert_called_once_with(self.context, 'fake-node-id')
@@ -320,8 +337,10 @@ class TaskManagerTestCase(db_base.DbTestCase):
node_get_mock.assert_called_once_with(self.context, 'fake-node-id')
reserve_mock.assert_called_once_with(self.context, self.host,
'fake-node-id')
- get_ports_mock.assert_called_once_with(self.context, self.node.id)
- get_portgroups_mock.assert_called_once_with(self.context, self.node.id)
+ self.assertFalse(get_ports_mock.called)
+ self.assertFalse(get_portgroups_mock.called)
+ self.assertFalse(get_volconn_mock.called)
+ self.assertFalse(get_voltgt_mock.called)
build_driver_mock.assert_called_once_with(mock.ANY)
release_mock.assert_called_once_with(self.context, self.host,
self.node.id)
@@ -381,17 +400,19 @@ class TaskManagerTestCase(db_base.DbTestCase):
node_get_mock.return_value = self.node
get_ports_mock.side_effect = exception.IronicException('foo')
- self.assertRaises(exception.IronicException,
- task_manager.TaskManager,
- self.context,
- 'fake-node-id',
- shared=True)
+ # Note(arne_wiebalck): Force loading of lazy-loaded properties.
+ def _eval_ports(task):
+ return task.ports
+
+ with task_manager.TaskManager(self.context, 'fake-node-id',
+ shared=True) as task:
+ self.assertRaises(exception.IronicException, _eval_ports, task)
self.assertFalse(reserve_mock.called)
self.assertFalse(release_mock.called)
node_get_mock.assert_called_once_with(self.context, 'fake-node-id')
get_ports_mock.assert_called_once_with(self.context, self.node.id)
- self.assertFalse(build_driver_mock.called)
+ self.assertTrue(build_driver_mock.called)
def test_shared_lock_get_portgroups_exception(
self, get_voltgt_mock, get_volconn_mock, get_portgroups_mock,
@@ -400,17 +421,20 @@ class TaskManagerTestCase(db_base.DbTestCase):
node_get_mock.return_value = self.node
get_portgroups_mock.side_effect = exception.IronicException('foo')
- self.assertRaises(exception.IronicException,
- task_manager.TaskManager,
- self.context,
- 'fake-node-id',
- shared=True)
+ # Note(arne_wiebalck): Force loading of lazy-loaded properties.
+ def _eval_portgroups(task):
+ return task.portgroups
+
+ with task_manager.TaskManager(self.context, 'fake-node-id',
+ shared=True) as task:
+ self.assertRaises(exception.IronicException, _eval_portgroups,
+ task)
self.assertFalse(reserve_mock.called)
self.assertFalse(release_mock.called)
node_get_mock.assert_called_once_with(self.context, 'fake-node-id')
get_portgroups_mock.assert_called_once_with(self.context, self.node.id)
- self.assertFalse(build_driver_mock.called)
+ self.assertTrue(build_driver_mock.called)
def test_shared_lock_get_volconn_exception(
self, get_voltgt_mock, get_volconn_mock, get_portgroups_mock,
@@ -419,17 +443,19 @@ class TaskManagerTestCase(db_base.DbTestCase):
node_get_mock.return_value = self.node
get_volconn_mock.side_effect = exception.IronicException('foo')
- self.assertRaises(exception.IronicException,
- task_manager.TaskManager,
- self.context,
- 'fake-node-id',
- shared=True)
+ # Note(arne_wiebalck): Force loading of lazy-loaded properties.
+ def _eval_volconn(task):
+ return task.volume_connectors
+
+ with task_manager.TaskManager(self.context, 'fake-node-id',
+ shared=True) as task:
+ self.assertRaises(exception.IronicException, _eval_volconn, task)
self.assertFalse(reserve_mock.called)
self.assertFalse(release_mock.called)
node_get_mock.assert_called_once_with(self.context, 'fake-node-id')
get_volconn_mock.assert_called_once_with(self.context, self.node.id)
- self.assertFalse(get_voltgt_mock.called)
+ self.assertTrue(build_driver_mock.called)
def test_shared_lock_get_voltgt_exception(
self, get_voltgt_mock, get_volconn_mock, get_portgroups_mock,
@@ -438,17 +464,19 @@ class TaskManagerTestCase(db_base.DbTestCase):
node_get_mock.return_value = self.node
get_voltgt_mock.side_effect = exception.IronicException('foo')
- self.assertRaises(exception.IronicException,
- task_manager.TaskManager,
- self.context,
- 'fake-node-id',
- shared=True)
+ # Note(arne_wiebalck): Force loading of lazy-loaded properties.
+ def _eval_voltgt(task):
+ return task.volume_targets
+
+ with task_manager.TaskManager(self.context, 'fake-node-id',
+ shared=True) as task:
+ self.assertRaises(exception.IronicException, _eval_voltgt, task)
self.assertFalse(reserve_mock.called)
self.assertFalse(release_mock.called)
node_get_mock.assert_called_once_with(self.context, 'fake-node-id')
get_voltgt_mock.assert_called_once_with(self.context, self.node.id)
- self.assertFalse(build_driver_mock.called)
+ self.assertTrue(build_driver_mock.called)
def test_shared_lock_build_driver_exception(
self, get_voltgt_mock, get_volconn_mock, get_portgroups_mock,
@@ -467,10 +495,10 @@ class TaskManagerTestCase(db_base.DbTestCase):
self.assertFalse(reserve_mock.called)
self.assertFalse(release_mock.called)
node_get_mock.assert_called_once_with(self.context, 'fake-node-id')
- get_ports_mock.assert_called_once_with(self.context, self.node.id)
- get_portgroups_mock.assert_called_once_with(self.context, self.node.id)
- get_volconn_mock.assert_called_once_with(self.context, self.node.id)
- get_voltgt_mock.assert_called_once_with(self.context, self.node.id)
+ self.assertFalse(get_ports_mock.called)
+ self.assertFalse(get_portgroups_mock.called)
+ self.assertFalse(get_voltgt_mock.called)
+ self.assertFalse(get_volconn_mock.called)
build_driver_mock.assert_called_once_with(mock.ANY)
def test_upgrade_lock(
diff --git a/ironic/tests/unit/drivers/modules/irmc/test_inspect.py b/ironic/tests/unit/drivers/modules/irmc/test_inspect.py
index b0bd206a3..f4e67ddcd 100644
--- a/ironic/tests/unit/drivers/modules/irmc/test_inspect.py
+++ b/ironic/tests/unit/drivers/modules/irmc/test_inspect.py
@@ -205,24 +205,7 @@ class IRMCInspectTestCase(test_common.BaseIRMCTest):
_inspect_hardware_mock.assert_called_once_with(task.node,
existing_traits)
- # note (naohirot):
- # as of mock 1.2, assert_has_calls has a bug which returns
- # "AssertionError: Calls not found." if mock_calls has class
- # method call such as below:
-
- # AssertionError: Calls not found.
- # Expected: [call.list_by_node_id(
- # <oslo_context.context.RequestContext object at 0x7f1a34f8c0d0>,
- # 1)]
- # Actual: [call.list_by_node_id(
- # <oslo_context.context.RequestContext object at 0x7f1a34f8c0d0>,
- # 1)]
- #
- # workaround, remove class method call from mock_calls list
- del port_mock.mock_calls[0]
port_mock.assert_has_calls([
- # workaround, comment out class method call from expected list
- # mock.call.list_by_node_id(task.context, node_id),
mock.call(task.context, address=inspected_macs[0],
node_id=node_id),
mock.call(task.context, address=inspected_macs[1],
diff --git a/ironic/tests/unit/drivers/modules/redfish/test_management.py b/ironic/tests/unit/drivers/modules/redfish/test_management.py
index 61b4dc007..5bc5aaf41 100644
--- a/ironic/tests/unit/drivers/modules/redfish/test_management.py
+++ b/ironic/tests/unit/drivers/modules/redfish/test_management.py
@@ -90,9 +90,13 @@ class RedfishManagementTestCase(db_base.DbTestCase):
task.driver.management.set_boot_device(task, target)
# Asserts
- fake_system.set_system_boot_options.assert_called_once_with(
- expected, enabled=sushy.BOOT_SOURCE_ENABLED_ONCE)
- mock_get_system.assert_called_once_with(task.node)
+ fake_system.set_system_boot_options.assert_has_calls(
+ [mock.call(expected,
+ enabled=sushy.BOOT_SOURCE_ENABLED_ONCE),
+ mock.call(mode=sushy.BOOT_SOURCE_MODE_BIOS)])
+ mock_get_system.assert_called_with(task.node)
+ self.assertNotIn('redfish_boot_device',
+ task.node.driver_internal_info)
# Reset mocks
fake_system.set_system_boot_options.reset_mock()
@@ -115,9 +119,10 @@ class RedfishManagementTestCase(db_base.DbTestCase):
task.driver.management.set_boot_device(task, target)
# Asserts
- fake_system.set_system_boot_source.assert_called_once_with(
- expected, enabled=sushy.BOOT_SOURCE_ENABLED_ONCE)
- mock_get_system.assert_called_once_with(task.node)
+ fake_system.set_system_boot_source.assert_has_calls([
+ mock.call(expected,
+ enabled=sushy.BOOT_SOURCE_ENABLED_ONCE)])
+ self.assertEqual(3, mock_get_system.call_count)
self.assertNotIn('redfish_boot_device',
task.node.driver_internal_info)
@@ -140,9 +145,11 @@ class RedfishManagementTestCase(db_base.DbTestCase):
task.driver.management.set_boot_device(
task, boot_devices.PXE, persistent=target)
- fake_system.set_system_boot_options.assert_called_once_with(
- sushy.BOOT_SOURCE_TARGET_PXE, enabled=expected)
- mock_get_system.assert_called_once_with(task.node)
+ fake_system.set_system_boot_options.assert_has_calls(
+ [mock.call(sushy.BOOT_SOURCE_TARGET_PXE,
+ enabled=expected),
+ mock.call(mode=sushy.BOOT_SOURCE_MODE_BIOS)])
+ mock_get_system.assert_called_with(task.node)
self.assertNotIn('redfish_boot_device',
task.node.driver_internal_info)
@@ -167,9 +174,10 @@ class RedfishManagementTestCase(db_base.DbTestCase):
task.driver.management.set_boot_device(
task, boot_devices.PXE, persistent=target)
- fake_system.set_system_boot_options.assert_called_once_with(
- sushy.BOOT_SOURCE_TARGET_PXE, enabled=None)
- mock_get_system.assert_called_once_with(task.node)
+ fake_system.set_system_boot_options.assert_has_calls(
+ [mock.call(sushy.BOOT_SOURCE_TARGET_PXE, enabled=None),
+ mock.call(mode=sushy.BOOT_SOURCE_MODE_BIOS)])
+ mock_get_system.assert_called_with(task.node)
# Reset mocks
fake_system.set_system_boot_options.reset_mock()
@@ -234,6 +242,7 @@ class RedfishManagementTestCase(db_base.DbTestCase):
fake_system.set_system_boot_options.side_effect = [
sushy.exceptions.SushyError(),
None,
+ None
]
mock_get_system.return_value = fake_system
with task_manager.acquire(self.context, self.node.uuid,
@@ -244,9 +253,9 @@ class RedfishManagementTestCase(db_base.DbTestCase):
mock.call(sushy.BOOT_SOURCE_TARGET_PXE,
enabled=sushy.BOOT_SOURCE_ENABLED_CONTINUOUS),
mock.call(sushy.BOOT_SOURCE_TARGET_PXE,
- enabled=sushy.BOOT_SOURCE_ENABLED_ONCE),
+ enabled=sushy.BOOT_SOURCE_ENABLED_ONCE)
])
- mock_get_system.assert_called_once_with(task.node)
+ mock_get_system.assert_called_with(task.node)
task.node.refresh()
self.assertEqual(
diff --git a/releasenotes/notes/sync-boot-mode-after-changing-redfish-device-f60ef90ba5675215.yaml b/releasenotes/notes/sync-boot-mode-after-changing-redfish-device-f60ef90ba5675215.yaml
new file mode 100644
index 000000000..629d9527c
--- /dev/null
+++ b/releasenotes/notes/sync-boot-mode-after-changing-redfish-device-f60ef90ba5675215.yaml
@@ -0,0 +1,8 @@
+---
+fixes:
+ - |
+ After changing the boot device via Redfish, check that the boot mode being
+ reported matches what is configured and, if not, set it to the configured
+ value. Some BMCs change the boot mode when the device is
+ set via Redfish, see `story 2008252
+ <https://storyboard.openstack.org/#!/story/2008252>`__ for details.
diff --git a/releasenotes/notes/taskmanager-lazy-load-32a14526c647c2f0.yaml b/releasenotes/notes/taskmanager-lazy-load-32a14526c647c2f0.yaml
new file mode 100644
index 000000000..47aca790b
--- /dev/null
+++ b/releasenotes/notes/taskmanager-lazy-load-32a14526c647c2f0.yaml
@@ -0,0 +1,9 @@
+---
+fixes:
+ - |
+ Introduces lazy-loading of ports, portgroups, volume connections
+ and volume targets in task manager to fix performance issues.
+ For periodic tasks which create a task manager object but don't
+ require the aforementioned data (e.g. power sync), this change
+ should reduce the number of database interactions by around two
+ thirds, speeding up overall execution.
diff --git a/test-requirements.txt b/test-requirements.txt
index ab53cb70f..f520f0150 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -20,4 +20,4 @@ WebTest>=2.0.27 # MIT
bashate>=0.5.1 # Apache-2.0
flake8-import-order>=0.13 # LGPLv3
Pygments>=2.2.0 # BSD
-bandit!=1.6.0,>=1.1.0,<2.0.0 # Apache-2.0
+bandit!=1.6.0,>=1.1.0,<=1.6.2 # Apache-2.0
diff --git a/zuul.d/ironic-jobs.yaml b/zuul.d/ironic-jobs.yaml
index 9302bf6aa..61410deee 100644
--- a/zuul.d/ironic-jobs.yaml
+++ b/zuul.d/ironic-jobs.yaml
@@ -7,7 +7,8 @@
required-projects:
- openstack/ironic
- openstack/ironic-python-agent
- - openstack/ironic-python-agent-builder
+ - name: openstack/ironic-python-agent-builder
+ override-checkout: 2.2.0
- openstack/ironic-tempest-plugin
irrelevant-files:
- ^.*\.rst$
@@ -337,12 +338,15 @@
- job:
name: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode
description: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode
- parent: tempest-multinode-full
+ parent: tempest-multinode-full-base
+ nodeset: openstack-two-node-bionic
pre-run: playbooks/ci-workarounds/pre.yaml
timeout: 10800
required-projects:
- openstack/ironic
- openstack/ironic-python-agent
+ - name: openstack/ironic-python-agent-builder
+ override-checkout: 2.2.0
- openstack/ironic-tempest-plugin
- openstack/networking-generic-switch
irrelevant-files:
diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml
index 946057583..1c5bbf23f 100644
--- a/zuul.d/project.yaml
+++ b/zuul.d/project.yaml
@@ -2,7 +2,6 @@
templates:
- check-requirements
- openstack-cover-jobs
- - openstack-lower-constraints-jobs
- openstack-python-jobs
- openstack-python3-train-jobs
- periodic-stable-jobs
@@ -15,11 +14,6 @@
- ironic-standalone
- ironic-tempest-functional-python2
- ironic-tempest-functional-python3
- - ironic-grenade-dsvm:
- voting: false
- # Temporary disable voting because of end of cycle CI instability.
- - ironic-grenade-dsvm-multinode-multitenant:
- voting: false
- ironic-tempest-ipa-partition-pxe_ipmitool-tinyipa-python3
- ironic-tempest-ipa-partition-redfish-tinyipa
- ironic-tempest-ipa-partition-uefi-pxe_ipmitool-tinyipa
@@ -51,9 +45,6 @@
- ironic-standalone
- ironic-tempest-functional-python2
- ironic-tempest-functional-python3
- # - ironic-grenade-dsvm
- # removing from voting due to end of cycle gate instability.
- # - ironic-grenade-dsvm-multinode-multitenant
- ironic-tempest-ipa-partition-pxe_ipmitool-tinyipa-python3
- ironic-tempest-ipa-partition-redfish-tinyipa
- ironic-tempest-ipa-partition-uefi-pxe_ipmitool-tinyipa