diff options
-rw-r--r-- | ironic/api/controllers/v1/node.py | 5 | ||||
-rw-r--r-- | ironic/common/pxe_utils.py | 7 | ||||
-rw-r--r-- | ironic/drivers/modules/deploy_utils.py | 34 | ||||
-rw-r--r-- | ironic/drivers/modules/ilo/common.py | 6 | ||||
-rw-r--r-- | ironic/drivers/modules/ilo/deploy.py | 29 | ||||
-rw-r--r-- | ironic/drivers/modules/iscsi_deploy.py | 2 | ||||
-rw-r--r-- | ironic/drivers/modules/pxe.py | 12 | ||||
-rw-r--r-- | ironic/drivers/utils.py | 52 | ||||
-rw-r--r-- | ironic/tests/api/v1/test_nodes.py | 17 | ||||
-rw-r--r-- | ironic/tests/db/test_conductor.py | 14 | ||||
-rw-r--r-- | ironic/tests/db/test_nodes.py | 10 | ||||
-rw-r--r-- | ironic/tests/drivers/ilo/test_deploy.py | 78 | ||||
-rw-r--r-- | ironic/tests/drivers/test_deploy_utils.py | 21 | ||||
-rw-r--r-- | ironic/tests/drivers/test_utils.py | 35 |
14 files changed, 151 insertions, 171 deletions
diff --git a/ironic/api/controllers/v1/node.py b/ironic/api/controllers/v1/node.py index 4712d62d2..ce48e0916 100644 --- a/ironic/api/controllers/v1/node.py +++ b/ironic/api/controllers/v1/node.py @@ -391,6 +391,11 @@ class NodeStatesController(rest.RestController): raise exception.NodeLocked(node=rpc_node.uuid, host=rpc_node.reservation) + if (target in (ir_states.ACTIVE, ir_states.REBUILD) + and rpc_node.maintenance): + raise exception.NodeInMaintenance(op=_('provisioning'), + node=rpc_node.uuid) + m = ir_states.machine.copy() m.initialize(rpc_node.provision_state) if not m.is_valid_event(ir_states.VERBS.get(target, target)): diff --git a/ironic/common/pxe_utils.py b/ironic/common/pxe_utils.py index 8174eccc4..a125da034 100644 --- a/ironic/common/pxe_utils.py +++ b/ironic/common/pxe_utils.py @@ -23,6 +23,7 @@ from ironic.common import dhcp_factory from ironic.common import exception from ironic.common.i18n import _ from ironic.common import utils +from ironic.drivers.modules import deploy_utils from ironic.drivers import utils as driver_utils from ironic.openstack.common import fileutils from ironic.openstack.common import log as logging @@ -191,7 +192,7 @@ def create_pxe_config(task, pxe_options, template=None): pxe_config = _build_pxe_config(pxe_options, template) utils.write_to_file(pxe_config_file_path, pxe_config) - if driver_utils.get_boot_mode_for_deploy(task.node) == 'uefi': + if deploy_utils.get_boot_mode_for_deploy(task.node) == 'uefi': _link_ip_address_pxe_configs(task) else: _link_mac_pxe_configs(task) @@ -205,7 +206,7 @@ def clean_up_pxe_config(task): """ LOG.debug("Cleaning up PXE config for node %s", task.node.uuid) - if driver_utils.get_boot_mode_for_deploy(task.node) == 'uefi': + if deploy_utils.get_boot_mode_for_deploy(task.node) == 'uefi': api = dhcp_factory.DHCPFactory().provider ip_addresses = api.get_ip_addresses(task) if not ip_addresses: @@ -252,7 +253,7 @@ def dhcp_options_for_instance(task): dhcp_opts.append({'opt_name': 'bootfile-name', 'opt_value': ipxe_script_url}) else: - if driver_utils.get_boot_mode_for_deploy(task.node) == 'uefi': + if deploy_utils.get_boot_mode_for_deploy(task.node) == 'uefi': boot_file = CONF.pxe.uefi_pxe_bootfile_name else: boot_file = CONF.pxe.pxe_bootfile_name diff --git a/ironic/drivers/modules/deploy_utils.py b/ironic/drivers/modules/deploy_utils.py index fb8d01064..79fcaecd3 100644 --- a/ironic/drivers/modules/deploy_utils.py +++ b/ironic/drivers/modules/deploy_utils.py @@ -970,7 +970,7 @@ def try_set_boot_device(task, device, persistent=True): manager_utils.node_set_boot_device(task, device, persistent=persistent) except exception.IPMIFailure: - if driver_utils.get_boot_mode_for_deploy(task.node) == 'uefi': + if get_boot_mode_for_deploy(task.node) == 'uefi': LOG.warning(_LW("ipmitool is unable to set boot device while " "the node %s is in UEFI boot mode. Please set " "the boot device manually.") % task.node.uuid) @@ -1041,3 +1041,35 @@ def is_secure_boot_requested(node): sec_boot = capabilities.get('secure_boot', 'false').lower() return sec_boot == 'true' + + +def get_boot_mode_for_deploy(node): + """Returns the boot mode that would be used for deploy. + + This method returns boot mode to used for deploy using following order: + It returns 'uefi' if 'secure_boot' is set to 'true' in + 'instance_info/capabilities' of node. + It returns value of 'boot_mode' in 'properties/capabilities' of node. + It returns boot mode specified in 'instance_info/deploy_boot_mode' of + node. + It would return None if boot mode is present neither in 'capabilities' of + node 'properties' nor in node's 'instance_info'. + + :param node: an ironic node object. + :returns: 'bios', 'uefi' or None + """ + + if is_secure_boot_requested(node): + boot_mode = 'uefi' + LOG.debug('Deploy boot mode is %(boot_mode)s for %(node)s.', + {'boot_mode': boot_mode, 'node': node.uuid}) + return boot_mode + + boot_mode = driver_utils.get_node_capability(node, 'boot_mode') + if boot_mode is None: + instance_info = node.instance_info + boot_mode = instance_info.get('deploy_boot_mode') + + LOG.debug('Deploy boot mode is %(boot_mode)s for %(node)s.', + {'boot_mode': boot_mode, 'node': node.uuid}) + return boot_mode diff --git a/ironic/drivers/modules/ilo/common.py b/ironic/drivers/modules/ilo/common.py index f2281c671..02085ea5d 100644 --- a/ironic/drivers/modules/ilo/common.py +++ b/ironic/drivers/modules/ilo/common.py @@ -30,7 +30,7 @@ from ironic.common.i18n import _LI from ironic.common import images from ironic.common import swift from ironic.common import utils -from ironic.drivers import utils as driver_utils +from ironic.drivers.modules import deploy_utils from ironic.openstack.common import log as logging ilo_client = importutils.try_import('proliantutils.ilo.client') @@ -343,7 +343,7 @@ def update_boot_mode(task): """ node = task.node - boot_mode = driver_utils.get_boot_mode_for_deploy(node) + boot_mode = deploy_utils.get_boot_mode_for_deploy(node) if boot_mode is not None: LOG.debug("Node %(uuid)s boot mode is being set to %(boot_mode)s", @@ -360,7 +360,7 @@ def update_boot_mode(task): boot_mode = 'legacy' if boot_mode != 'UNKNOWN': - boot_mode = BOOT_MODE_ILO_TO_GENERIC[boot_mode.lower()] + boot_mode = BOOT_MODE_ILO_TO_GENERIC[boot_mode.lower()] if boot_mode == 'UNKNOWN': # NOTE(faizan) ILO will return this in remote cases and mostly on diff --git a/ironic/drivers/modules/ilo/deploy.py b/ironic/drivers/modules/ilo/deploy.py index 28bed4d9d..dbd9d7340 100644 --- a/ironic/drivers/modules/ilo/deploy.py +++ b/ironic/drivers/modules/ilo/deploy.py @@ -160,7 +160,7 @@ def _get_boot_iso(task, root_uuid): # Option 3 - Create boot_iso from kernel/ramdisk, upload to Swift # and provide its name. deploy_iso_uuid = deploy_info['ilo_deploy_iso'] - boot_mode = driver_utils.get_boot_mode_for_deploy(task.node) + boot_mode = deploy_utils.get_boot_mode_for_deploy(task.node) boot_iso_object_name = _get_boot_iso_object_name(task.node) kernel_params = CONF.pxe.pxe_append_params container = CONF.ilo.swift_ilo_container @@ -332,13 +332,17 @@ def _prepare_node_for_deploy(task): if _disable_secure_boot(task): change_boot_mode = False - # Set boot_mode capability to uefi for secure boot - if deploy_utils.is_secure_boot_requested(task.node): - LOG.debug('Secure boot deploy requested for node %s', task.node.uuid) - _enable_uefi_capability(task) - if change_boot_mode: ilo_common.update_boot_mode(task) + else: + # Need to update boot mode that would used during deploy, if one is not + # provided. + # Since secure boot was disabled, we are in 'uefi' boot mode. + if deploy_utils.get_boot_mode_for_deploy(task.node) is None: + instance_info = task.node.instance_info + instance_info['deploy_boot_mode'] = 'uefi' + task.node.instance_info = instance_info + task.node.save() def _update_secure_boot_mode(task, mode): @@ -363,15 +367,6 @@ def _update_secure_boot_mode(task, mode): {'mode': mode, 'node': task.node.uuid}) -def _enable_uefi_capability(task): - """Adds capability boot_mode='uefi' into Node property. - - :param task: a TaskManager instance containing the node to act on. - """ - driver_utils.rm_node_capability(task, 'boot_mode') - driver_utils.add_node_capability(task, 'boot_mode', 'uefi') - - class IloVirtualMediaIscsiDeploy(base.DeployInterface): def get_properties(self): @@ -624,6 +619,10 @@ class IloVirtualMediaAgentVendorInterface(agent.AgentVendorInterface): error = self.check_deploy_success(node) if error is None: + # Set boot mode + ilo_common.update_boot_mode(task) + + # Need to enable secure boot, if being requested _update_secure_boot_mode(task, True) super(IloVirtualMediaAgentVendorInterface, diff --git a/ironic/drivers/modules/iscsi_deploy.py b/ironic/drivers/modules/iscsi_deploy.py index 1f3234b74..57df4a7d6 100644 --- a/ironic/drivers/modules/iscsi_deploy.py +++ b/ironic/drivers/modules/iscsi_deploy.py @@ -420,7 +420,7 @@ def _get_boot_mode(node): :param node: A single Node. :returns: A string representing the boot mode type. Defaults to 'bios'. """ - boot_mode = driver_utils.get_boot_mode_for_deploy(node) + boot_mode = deploy_utils.get_boot_mode_for_deploy(node) if boot_mode: return boot_mode.lower() return "bios" diff --git a/ironic/drivers/modules/pxe.py b/ironic/drivers/modules/pxe.py index 9a03f53c5..9ab3fc32c 100644 --- a/ironic/drivers/modules/pxe.py +++ b/ironic/drivers/modules/pxe.py @@ -242,7 +242,7 @@ def validate_boot_option_for_uefi(node): :raises: InvalidParameterValue """ - boot_mode = driver_utils.get_boot_mode_for_deploy(node) + boot_mode = deploy_utils.get_boot_mode_for_deploy(node) boot_option = iscsi_deploy.get_boot_option(node) if (boot_mode == 'uefi' and node.driver_internal_info.get('is_whole_disk_image') and @@ -353,7 +353,7 @@ class PXEDeploy(base.DeployInterface): driver_utils.validate_boot_mode_capability(node) driver_utils.validate_boot_option_capability(node) - boot_mode = driver_utils.get_boot_mode_for_deploy(task.node) + boot_mode = deploy_utils.get_boot_mode_for_deploy(task.node) if CONF.pxe.ipxe_enabled: if not CONF.pxe.http_url or not CONF.pxe.http_root: @@ -447,7 +447,7 @@ class PXEDeploy(base.DeployInterface): pxe_options = _build_pxe_config_options(task.node, pxe_info, task.context) - if driver_utils.get_boot_mode_for_deploy(task.node) == 'uefi': + if deploy_utils.get_boot_mode_for_deploy(task.node) == 'uefi': pxe_config_template = CONF.pxe.uefi_pxe_config_template else: pxe_config_template = CONF.pxe.pxe_config_template @@ -485,7 +485,7 @@ class PXEDeploy(base.DeployInterface): task.node.uuid) deploy_utils.switch_pxe_config( pxe_config_path, root_uuid_or_disk_id, - driver_utils.get_boot_mode_for_deploy(task.node), + deploy_utils.get_boot_mode_for_deploy(task.node), iwdi) def clean_up(self, task): @@ -626,7 +626,7 @@ class VendorPassthru(agent_base_vendor.BaseAgentVendor): return else: pxe_config_path = pxe_utils.get_pxe_config_file_path(node.uuid) - boot_mode = driver_utils.get_boot_mode_for_deploy(node) + boot_mode = deploy_utils.get_boot_mode_for_deploy(node) deploy_utils.switch_pxe_config(pxe_config_path, root_uuid_or_disk_id, boot_mode, is_whole_disk_image) @@ -681,7 +681,7 @@ class VendorPassthru(agent_base_vendor.BaseAgentVendor): root_uuid_or_disk_id = uuid_dict.get( 'root uuid', uuid_dict.get('disk identifier')) pxe_config_path = pxe_utils.get_pxe_config_file_path(node.uuid) - boot_mode = driver_utils.get_boot_mode_for_deploy(node) + boot_mode = deploy_utils.get_boot_mode_for_deploy(node) deploy_utils.switch_pxe_config(pxe_config_path, root_uuid_or_disk_id, boot_mode, is_whole_disk_image) diff --git a/ironic/drivers/utils.py b/ironic/drivers/utils.py index 9c34a49ac..7caa6cabe 100644 --- a/ironic/drivers/utils.py +++ b/ironic/drivers/utils.py @@ -144,33 +144,6 @@ def get_node_capability(node, capability): "Format should be 'key:val'."), node_capability) -def rm_node_capability(task, capability): - """Remove 'capability' from node's 'capabilities' property. - - :param task: Task object. - :param capability: Capability key. - - """ - node = task.node - properties = node.properties - capabilities = properties.get('capabilities') - - if not capabilities: - return - - caps = [] - for cap in capabilities.split(','): - parts = cap.split(':') - if len(parts) == 2 and parts[0] and parts[1]: - if parts[0] == capability: - continue - caps.append(cap) - new_cap_str = ",".join(caps) - properties['capabilities'] = new_cap_str if new_cap_str else None - node.properties = properties - node.save() - - def add_node_capability(task, capability, value): """Add 'capability' to node's 'capabilities' property. @@ -250,28 +223,3 @@ def validate_secure_boot_capability(node): """ validate_capability(node, 'secure_boot', ('true', 'false')) - - -def get_boot_mode_for_deploy(node): - """Returns the boot mode that would be used for deploy. - - This method returns deploy_boot_mode available in node field - boot_mode from 'capabilities' of node 'properties'. - Otherwise returns boot mode specified in node's 'instance_info'. - - :param node: an ironic node object. - :returns: Value of boot mode that would be used for deploy. - Possible values are 'bios', 'uefi'. - It would return None if boot mode is present neither - in 'capabilities' of node 'properties' nor in node's - 'instance_info'. - - """ - boot_mode = get_node_capability(node, 'boot_mode') - if boot_mode is None: - instance_info = node.instance_info - boot_mode = instance_info.get('deploy_boot_mode', None) - - LOG.debug('Deploy boot mode is %(boot_mode)s for %(node)s.', - {'boot_mode': boot_mode, 'node': node.uuid}) - return boot_mode diff --git a/ironic/tests/api/v1/test_nodes.py b/ironic/tests/api/v1/test_nodes.py index c2b510173..dbb95daaf 100644 --- a/ironic/tests/api/v1/test_nodes.py +++ b/ironic/tests/api/v1/test_nodes.py @@ -1813,17 +1813,14 @@ class TestPut(test_api_base.FunctionalTest): True, 'test-topic') def test_provision_node_in_maintenance_fail(self): - with mock.patch.object(rpcapi.ConductorAPI, 'do_node_deploy') as dnd: - self.node.maintenance = True - self.node.save() - dnd.side_effect = exception.NodeInMaintenance(op='provisioning', - node=self.node.uuid) + self.node.maintenance = True + self.node.save() - ret = self.put_json('/nodes/%s/states/provision' % self.node.uuid, - {'target': states.ACTIVE}, - expect_errors=True) - self.assertEqual(400, ret.status_code) - self.assertTrue(ret.json['error_message']) + ret = self.put_json('/nodes/%s/states/provision' % self.node.uuid, + {'target': states.ACTIVE}, + expect_errors=True) + self.assertEqual(400, ret.status_code) + self.assertTrue(ret.json['error_message']) @mock.patch.object(rpcapi.ConductorAPI, 'set_boot_device') def test_set_boot_device(self, mock_sbd): diff --git a/ironic/tests/db/test_conductor.py b/ironic/tests/db/test_conductor.py index d93aad120..1ff182615 100644 --- a/ironic/tests/db/test_conductor.py +++ b/ironic/tests/db/test_conductor.py @@ -64,7 +64,7 @@ class DbConductorTestCase(base.DbTestCase): self.dbapi.unregister_conductor, c.hostname) - @mock.patch.object(timeutils, 'utcnow') + @mock.patch.object(timeutils, 'utcnow', autospec=True) def test_touch_conductor(self, mock_utcnow): test_time = datetime.datetime(2000, 1, 1, 0, 0) mock_utcnow.return_value = test_time @@ -110,7 +110,7 @@ class DbConductorTestCase(base.DbTestCase): self.assertEqual('hostname2', node2.reservation) self.assertIsNone(node3.reservation) - @mock.patch.object(timeutils, 'utcnow') + @mock.patch.object(timeutils, 'utcnow', autospec=True) def test_get_active_driver_dict_one_host_no_driver(self, mock_utcnow): h = 'fake-host' expected = {} @@ -120,7 +120,7 @@ class DbConductorTestCase(base.DbTestCase): result = self.dbapi.get_active_driver_dict() self.assertEqual(expected, result) - @mock.patch.object(timeutils, 'utcnow') + @mock.patch.object(timeutils, 'utcnow', autospec=True) def test_get_active_driver_dict_one_host_one_driver(self, mock_utcnow): h = 'fake-host' d = 'fake-driver' @@ -131,7 +131,7 @@ class DbConductorTestCase(base.DbTestCase): result = self.dbapi.get_active_driver_dict() self.assertEqual(expected, result) - @mock.patch.object(timeutils, 'utcnow') + @mock.patch.object(timeutils, 'utcnow', autospec=True) def test_get_active_driver_dict_one_host_many_drivers(self, mock_utcnow): h = 'fake-host' d1 = 'driver-one' @@ -143,7 +143,7 @@ class DbConductorTestCase(base.DbTestCase): result = self.dbapi.get_active_driver_dict() self.assertEqual(expected, result) - @mock.patch.object(timeutils, 'utcnow') + @mock.patch.object(timeutils, 'utcnow', autospec=True) def test_get_active_driver_dict_many_hosts_one_driver(self, mock_utcnow): h1 = 'host-one' h2 = 'host-two' @@ -156,7 +156,7 @@ class DbConductorTestCase(base.DbTestCase): result = self.dbapi.get_active_driver_dict() self.assertEqual(expected, result) - @mock.patch.object(timeutils, 'utcnow') + @mock.patch.object(timeutils, 'utcnow', autospec=True) def test_get_active_driver_dict_many_hosts_and_drivers(self, mock_utcnow): h1 = 'host-one' h2 = 'host-two' @@ -172,7 +172,7 @@ class DbConductorTestCase(base.DbTestCase): result = self.dbapi.get_active_driver_dict() self.assertEqual(expected, result) - @mock.patch.object(timeutils, 'utcnow') + @mock.patch.object(timeutils, 'utcnow', autospec=True) def test_get_active_driver_dict_with_old_conductor(self, mock_utcnow): past = datetime.datetime(2000, 1, 1, 0, 0) present = past + datetime.timedelta(minutes=2) diff --git a/ironic/tests/db/test_nodes.py b/ironic/tests/db/test_nodes.py index 7e3450345..be44943b4 100644 --- a/ironic/tests/db/test_nodes.py +++ b/ironic/tests/db/test_nodes.py @@ -136,7 +136,7 @@ class DbNodeTestCase(base.DbTestCase): res = self.dbapi.get_node_list(filters={'maintenance': False}) self.assertEqual([node1.id], [r.id for r in res]) - @mock.patch.object(timeutils, 'utcnow') + @mock.patch.object(timeutils, 'utcnow', autospec=True) def test_get_nodeinfo_list_provision(self, mock_utcnow): past = datetime.datetime(2000, 1, 1, 0, 0) next = past + datetime.timedelta(minutes=8) @@ -161,7 +161,7 @@ class DbNodeTestCase(base.DbTestCase): states.DEPLOYWAIT}) self.assertEqual([node2.id], [r[0] for r in res]) - @mock.patch.object(timeutils, 'utcnow') + @mock.patch.object(timeutils, 'utcnow', autospec=True) def test_get_nodeinfo_list_inspection(self, mock_utcnow): past = datetime.datetime(2000, 1, 1, 0, 0) next = past + datetime.timedelta(minutes=8) @@ -354,7 +354,7 @@ class DbNodeTestCase(base.DbTestCase): node2.id, {'instance_uuid': new_i_uuid}) - @mock.patch.object(timeutils, 'utcnow') + @mock.patch.object(timeutils, 'utcnow', autospec=True) def test_update_node_provision(self, mock_utcnow): mocked_time = datetime.datetime(2000, 1, 1, 0, 0) mock_utcnow.return_value = mocked_time @@ -378,7 +378,7 @@ class DbNodeTestCase(base.DbTestCase): self.assertIsNone(res['provision_updated_at']) self.assertIsNone(res['inspection_started_at']) - @mock.patch.object(timeutils, 'utcnow') + @mock.patch.object(timeutils, 'utcnow', autospec=True) def test_update_node_inspection_started_at(self, mock_utcnow): mocked_time = datetime.datetime(2000, 1, 1, 0, 0) mock_utcnow.return_value = mocked_time @@ -390,7 +390,7 @@ class DbNodeTestCase(base.DbTestCase): timeutils.normalize_time(result)) self.assertIsNone(res['inspection_finished_at']) - @mock.patch.object(timeutils, 'utcnow') + @mock.patch.object(timeutils, 'utcnow', autospec=True) def test_update_node_inspection_finished_at(self, mock_utcnow): mocked_time = datetime.datetime(2000, 1, 1, 0, 0) mock_utcnow.return_value = mocked_time diff --git a/ironic/tests/drivers/ilo/test_deploy.py b/ironic/tests/drivers/ilo/test_deploy.py index 8cc70cab4..f44e532b9 100644 --- a/ironic/tests/drivers/ilo/test_deploy.py +++ b/ironic/tests/drivers/ilo/test_deploy.py @@ -124,7 +124,7 @@ class IloDeployPrivateMethodsTestCase(db_base.DbTestCase): boot_iso_expected = 'boot-iso-uuid' self.assertEqual(boot_iso_expected, boot_iso_actual) - @mock.patch.object(driver_utils, 'get_boot_mode_for_deploy') + @mock.patch.object(deploy_utils, 'get_boot_mode_for_deploy') @mock.patch.object(images, 'get_image_properties') @mock.patch.object(ilo_deploy, '_parse_deploy_info') def test__get_boot_iso_uefi_no_glance_image(self, @@ -293,19 +293,6 @@ class IloDeployPrivateMethodsTestCase(db_base.DbTestCase): ilo_deploy._update_secure_boot_mode(task, False) self.assertFalse(func_set_secure_boot_mode.called) - @mock.patch.object(driver_utils, 'add_node_capability') - @mock.patch.object(driver_utils, 'rm_node_capability') - def test__enable_uefi_capability(self, func_rm_node_capability, - func_add_node_capability): - with task_manager.acquire(self.context, self.node.uuid, - shared=False) as task: - ilo_deploy._enable_uefi_capability(task) - func_rm_node_capability.assert_called_once_with(task, - 'boot_mode') - func_add_node_capability.assert_called_once_with(task, - 'boot_mode', - 'uefi') - @mock.patch.object(ilo_common, 'set_secure_boot_mode') @mock.patch.object(ilo_common, 'get_secure_boot_mode') def test__disable_secure_boot_false(self, @@ -349,67 +336,86 @@ class IloDeployPrivateMethodsTestCase(db_base.DbTestCase): self.assertFalse(returned_state) @mock.patch.object(ilo_common, 'update_boot_mode') - @mock.patch.object(deploy_utils, 'is_secure_boot_requested') @mock.patch.object(ilo_deploy, '_disable_secure_boot') @mock.patch.object(manager_utils, 'node_power_action') def test__prepare_node_for_deploy(self, func_node_power_action, func_disable_secure_boot, - func_is_secure_boot_requested, func_update_boot_mode): with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: func_disable_secure_boot.return_value = False - func_is_secure_boot_requested.return_value = False ilo_deploy._prepare_node_for_deploy(task) func_node_power_action.assert_called_once_with(task, states.POWER_OFF) func_disable_secure_boot.assert_called_once_with(task) - func_is_secure_boot_requested.assert_called_once_with(task.node) func_update_boot_mode.assert_called_once_with(task) + bootmode = driver_utils.get_node_capability(task.node, "boot_mode") + self.assertIsNone(bootmode) @mock.patch.object(ilo_common, 'update_boot_mode') - @mock.patch.object(deploy_utils, 'is_secure_boot_requested') @mock.patch.object(ilo_deploy, '_disable_secure_boot') @mock.patch.object(manager_utils, 'node_power_action') def test__prepare_node_for_deploy_sec_boot_on(self, func_node_power_action, func_disable_secure_boot, - func_is_secure_boot_req, func_update_boot_mode): with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: func_disable_secure_boot.return_value = True - func_is_secure_boot_req.return_value = False ilo_deploy._prepare_node_for_deploy(task) func_node_power_action.assert_called_once_with(task, states.POWER_OFF) func_disable_secure_boot.assert_called_once_with(task) - func_is_secure_boot_req.assert_called_once_with(task.node) self.assertFalse(func_update_boot_mode.called) + ret_boot_mode = task.node.instance_info['deploy_boot_mode'] + self.assertEqual('uefi', ret_boot_mode) + bootmode = driver_utils.get_node_capability(task.node, "boot_mode") + self.assertIsNone(bootmode) + + @mock.patch.object(ilo_common, 'update_boot_mode') + @mock.patch.object(ilo_deploy, '_disable_secure_boot') + @mock.patch.object(manager_utils, 'node_power_action') + def test__prepare_node_for_deploy_inst_info(self, + func_node_power_action, + func_disable_secure_boot, + func_update_boot_mode): + instance_info = {'capabilities': '{"secure_boot": "true"}'} + with task_manager.acquire(self.context, self.node.uuid, + shared=False) as task: + func_disable_secure_boot.return_value = False + task.node.instance_info = instance_info + ilo_deploy._prepare_node_for_deploy(task) + func_node_power_action.assert_called_once_with(task, + states.POWER_OFF) + func_disable_secure_boot.assert_called_once_with(task) + func_update_boot_mode.assert_called_once_with(task) + bootmode = driver_utils.get_node_capability(task.node, "boot_mode") + self.assertIsNone(bootmode) + deploy_boot_mode = task.node.instance_info.get('deploy_boot_mode') + self.assertIsNone(deploy_boot_mode) @mock.patch.object(ilo_common, 'update_boot_mode') - @mock.patch.object(ilo_deploy, '_enable_uefi_capability') - @mock.patch.object(deploy_utils, 'is_secure_boot_requested') @mock.patch.object(ilo_deploy, '_disable_secure_boot') @mock.patch.object(manager_utils, 'node_power_action') - def test__prepare_node_for_deploy_sec_boot_req(self, - func_node_power_action, - func_disable_secure_boot, - func_is_secure_boot_req, - func_enable_uefi_cap, - func_update_boot_mode): + def test__prepare_node_for_deploy_sec_boot_on_inst_info(self, + func_node_power_action, + func_disable_secure_boot, + func_update_boot_mode): + instance_info = {'capabilities': '{"secure_boot": "true"}'} with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: func_disable_secure_boot.return_value = True - func_is_secure_boot_req.return_value = True + task.node.instance_info = instance_info ilo_deploy._prepare_node_for_deploy(task) func_node_power_action.assert_called_once_with(task, states.POWER_OFF) func_disable_secure_boot.assert_called_once_with(task) - func_is_secure_boot_req.assert_called_once_with(task.node) - func_enable_uefi_cap.assert_called_once_with(task) self.assertFalse(func_update_boot_mode.called) + bootmode = driver_utils.get_node_capability(task.node, "boot_mode") + self.assertIsNone(bootmode) + deploy_boot_mode = task.node.instance_info.get('deploy_boot_mode') + self.assertIsNone(deploy_boot_mode) class IloVirtualMediaIscsiDeployTestCase(db_base.DbTestCase): @@ -1179,8 +1185,10 @@ class IloVirtualMediaAgentVendorInterfaceTestCase(db_base.DbTestCase): @mock.patch.object(agent.AgentVendorInterface, 'reboot_to_instance') @mock.patch.object(agent.AgentVendorInterface, 'check_deploy_success') + @mock.patch.object(ilo_common, 'update_boot_mode') @mock.patch.object(ilo_deploy, '_update_secure_boot_mode') def test_reboot_to_instance(self, func_update_secure_boot_mode, + func_update_boot_mode, check_deploy_success_mock, agent_reboot_to_instance_mock): kwargs = {'address': '123456'} @@ -1189,14 +1197,17 @@ class IloVirtualMediaAgentVendorInterfaceTestCase(db_base.DbTestCase): shared=False) as task: task.driver.vendor.reboot_to_instance(task, **kwargs) check_deploy_success_mock.called_once_with(task.node) + func_update_boot_mode.assert_called_once_with(task) func_update_secure_boot_mode.assert_called_once_with(task, True) agent_reboot_to_instance_mock.assert_called_once_with(task, **kwargs) @mock.patch.object(agent.AgentVendorInterface, 'reboot_to_instance') @mock.patch.object(agent.AgentVendorInterface, 'check_deploy_success') + @mock.patch.object(ilo_common, 'update_boot_mode') @mock.patch.object(ilo_deploy, '_update_secure_boot_mode') def test_reboot_to_instance_deploy_fail(self, func_update_secure_boot_mode, + func_update_boot_mode, check_deploy_success_mock, agent_reboot_to_instance_mock): kwargs = {'address': '123456'} @@ -1205,6 +1216,7 @@ class IloVirtualMediaAgentVendorInterfaceTestCase(db_base.DbTestCase): shared=False) as task: task.driver.vendor.reboot_to_instance(task, **kwargs) check_deploy_success_mock.called_once_with(task.node) + self.assertFalse(func_update_boot_mode.called) self.assertFalse(func_update_secure_boot_mode.called) agent_reboot_to_instance_mock.assert_called_once_with(task, **kwargs) diff --git a/ironic/tests/drivers/test_deploy_utils.py b/ironic/tests/drivers/test_deploy_utils.py index 033bd89d5..d21afdae7 100644 --- a/ironic/tests/drivers/test_deploy_utils.py +++ b/ironic/tests/drivers/test_deploy_utils.py @@ -1465,6 +1465,27 @@ class ParseInstanceInfoCapabilitiesTestCase(tests_base.TestCase): self.node.instance_info = {'capabilities': {"secure_boot": "invalid"}} self.assertFalse(utils.is_secure_boot_requested(self.node)) + def test_get_boot_mode_for_deploy_using_capabilities(self): + properties = {'capabilities': 'boot_mode:uefi,cap2:value2'} + self.node.properties = properties + + result = utils.get_boot_mode_for_deploy(self.node) + self.assertEqual('uefi', result) + + def test_get_boot_mode_for_deploy_using_instance_info_cap(self): + instance_info = {'capabilities': {'secure_boot': 'True'}} + self.node.instance_info = instance_info + + result = utils.get_boot_mode_for_deploy(self.node) + self.assertEqual('uefi', result) + + def test_get_boot_mode_for_deploy_using_instance_info(self): + instance_info = {'deploy_boot_mode': 'bios'} + self.node.instance_info = instance_info + + result = utils.get_boot_mode_for_deploy(self.node) + self.assertEqual('bios', result) + class TrySetBootDeviceTestCase(db_base.DbTestCase): diff --git a/ironic/tests/drivers/test_utils.py b/ironic/tests/drivers/test_utils.py index 5eb9b5ace..cd14b464f 100644 --- a/ironic/tests/drivers/test_utils.py +++ b/ironic/tests/drivers/test_utils.py @@ -112,27 +112,6 @@ class UtilsTestCase(db_base.DbTestCase): self.assertEqual('a:b,c:d,a:b', task.node.properties['capabilities']) - def test_rm_node_capability(self): - with task_manager.acquire(self.context, self.node.uuid, - shared=False) as task: - task.node.properties['capabilities'] = 'a:b' - driver_utils.rm_node_capability(task, 'a') - self.assertIsNone(task.node.properties['capabilities']) - - def test_rm_node_capability_exists(self): - with task_manager.acquire(self.context, self.node.uuid, - shared=False) as task: - task.node.properties['capabilities'] = 'a:b,c:d,x:y' - self.assertIsNone(driver_utils.rm_node_capability(task, 'c')) - self.assertEqual('a:b,x:y', task.node.properties['capabilities']) - - def test_rm_node_capability_non_existent(self): - with task_manager.acquire(self.context, self.node.uuid, - shared=False) as task: - task.node.properties['capabilities'] = 'a:b' - self.assertIsNone(driver_utils.rm_node_capability(task, 'x')) - self.assertEqual('a:b', task.node.properties['capabilities']) - def test_validate_capability(self): properties = {'capabilities': 'cat:meow,cap2:value2'} self.node.properties = properties @@ -191,17 +170,3 @@ class UtilsTestCase(db_base.DbTestCase): self.assertRaises(exception.InvalidParameterValue, driver_utils.validate_secure_boot_capability, self.node) - - def test_get_boot_mode_for_deploy_using_capabilities(self): - properties = {'capabilities': 'boot_mode:uefi,cap2:value2'} - self.node.properties = properties - - result = driver_utils.get_boot_mode_for_deploy(self.node) - self.assertEqual('uefi', result) - - def test_get_boot_mode_for_deploy_using_instance_info(self): - instance_info = {'deploy_boot_mode': 'uefi'} - self.node.instance_info = instance_info - - result = driver_utils.get_boot_mode_for_deploy(self.node) - self.assertEqual('uefi', result) |