summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ironic/api/controllers/v1/node.py5
-rw-r--r--ironic/common/pxe_utils.py7
-rw-r--r--ironic/drivers/modules/deploy_utils.py34
-rw-r--r--ironic/drivers/modules/ilo/common.py6
-rw-r--r--ironic/drivers/modules/ilo/deploy.py29
-rw-r--r--ironic/drivers/modules/iscsi_deploy.py2
-rw-r--r--ironic/drivers/modules/pxe.py12
-rw-r--r--ironic/drivers/utils.py52
-rw-r--r--ironic/tests/api/v1/test_nodes.py17
-rw-r--r--ironic/tests/db/test_conductor.py14
-rw-r--r--ironic/tests/db/test_nodes.py10
-rw-r--r--ironic/tests/drivers/ilo/test_deploy.py78
-rw-r--r--ironic/tests/drivers/test_deploy_utils.py21
-rw-r--r--ironic/tests/drivers/test_utils.py35
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)