diff options
-rw-r--r-- | ironic/conductor/task_manager.py | 72 | ||||
-rw-r--r-- | ironic/drivers/modules/redfish/management.py | 5 | ||||
-rw-r--r-- | ironic/tests/unit/conductor/test_manager.py | 2 | ||||
-rw-r--r-- | ironic/tests/unit/conductor/test_task_manager.py | 128 | ||||
-rw-r--r-- | ironic/tests/unit/drivers/modules/irmc/test_inspect.py | 17 | ||||
-rw-r--r-- | ironic/tests/unit/drivers/modules/redfish/test_management.py | 37 | ||||
-rw-r--r-- | releasenotes/notes/sync-boot-mode-after-changing-redfish-device-f60ef90ba5675215.yaml | 8 | ||||
-rw-r--r-- | releasenotes/notes/taskmanager-lazy-load-32a14526c647c2f0.yaml | 9 | ||||
-rw-r--r-- | test-requirements.txt | 2 | ||||
-rw-r--r-- | zuul.d/ironic-jobs.yaml | 8 | ||||
-rw-r--r-- | zuul.d/project.yaml | 9 |
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 |