Secure boot support for iscsi_ilo driver
This patch implements secure boot support for iscsi_ilo driver. Node power off step has been moved from deploy() to first step in prepare() stage. The rational is:- If iLO is in POST state, then it would not accept any RIBCL commands related to boot mode changes. This could lead to deploy failure. Implements: blueprint uefi-secure-boot Change-Id: Ie5813592496665d8fdb48270227be4b06cbf5570
This commit is contained in:
parent
f1e6bce0b2
commit
2f04e74c9a
@ -27,6 +27,7 @@ from ironic.common.glance_service import service_utils
|
|||||||
from ironic.common.i18n import _
|
from ironic.common.i18n import _
|
||||||
from ironic.common.i18n import _LE
|
from ironic.common.i18n import _LE
|
||||||
from ironic.common.i18n import _LI
|
from ironic.common.i18n import _LI
|
||||||
|
from ironic.common.i18n import _LW
|
||||||
from ironic.common import image_service
|
from ironic.common import image_service
|
||||||
from ironic.common import images
|
from ironic.common import images
|
||||||
from ironic.common import keystone
|
from ironic.common import keystone
|
||||||
@ -262,7 +263,12 @@ def _reboot_into(task, iso, ramdisk_options):
|
|||||||
:raises: IloOperationError, if some operation on iLO failed.
|
:raises: IloOperationError, if some operation on iLO failed.
|
||||||
"""
|
"""
|
||||||
ilo_common.setup_vmedia_for_boot(task, iso, ramdisk_options)
|
ilo_common.setup_vmedia_for_boot(task, iso, ramdisk_options)
|
||||||
manager_utils.node_set_boot_device(task, boot_devices.CDROM)
|
|
||||||
|
# In secure boot mode, node will reboot twice internally to
|
||||||
|
# enable/disable secure boot. Any one-time boot settings would
|
||||||
|
# be lost. Hence setting persistent=True.
|
||||||
|
manager_utils.node_set_boot_device(task, boot_devices.CDROM,
|
||||||
|
persistent=True)
|
||||||
manager_utils.node_power_action(task, states.REBOOT)
|
manager_utils.node_power_action(task, states.REBOOT)
|
||||||
|
|
||||||
|
|
||||||
@ -379,18 +385,20 @@ class IloVirtualMediaIscsiDeploy(base.DeployInterface):
|
|||||||
in instance_info for non-Glance image.
|
in instance_info for non-Glance image.
|
||||||
"""
|
"""
|
||||||
iscsi_deploy.validate(task)
|
iscsi_deploy.validate(task)
|
||||||
|
node = task.node
|
||||||
|
|
||||||
d_info = _parse_deploy_info(task.node)
|
d_info = _parse_deploy_info(node)
|
||||||
|
|
||||||
if task.node.driver_internal_info.get('is_whole_disk_image'):
|
if node.driver_internal_info.get('is_whole_disk_image'):
|
||||||
props = []
|
props = []
|
||||||
elif service_utils.is_glance_image(d_info['image_source']):
|
elif service_utils.is_glance_image(d_info['image_source']):
|
||||||
props = ['kernel_id', 'ramdisk_id']
|
props = ['kernel_id', 'ramdisk_id']
|
||||||
else:
|
else:
|
||||||
props = ['kernel', 'ramdisk']
|
props = ['kernel', 'ramdisk']
|
||||||
iscsi_deploy.validate_image_properties(task.context, d_info, props)
|
iscsi_deploy.validate_image_properties(task.context, d_info, props)
|
||||||
driver_utils.validate_boot_mode_capability(task.node)
|
driver_utils.validate_boot_mode_capability(node)
|
||||||
driver_utils.validate_boot_option_capability(task.node)
|
driver_utils.validate_boot_option_capability(node)
|
||||||
|
driver_utils.validate_secure_boot_capability(node)
|
||||||
|
|
||||||
@task_manager.require_exclusive_lock
|
@task_manager.require_exclusive_lock
|
||||||
def deploy(self, task):
|
def deploy(self, task):
|
||||||
@ -409,7 +417,6 @@ class IloVirtualMediaIscsiDeploy(base.DeployInterface):
|
|||||||
:raises: IloOperationError, if some operation on iLO fails.
|
:raises: IloOperationError, if some operation on iLO fails.
|
||||||
"""
|
"""
|
||||||
node = task.node
|
node = task.node
|
||||||
manager_utils.node_power_action(task, states.POWER_OFF)
|
|
||||||
|
|
||||||
iscsi_deploy.cache_instance_image(task.context, node)
|
iscsi_deploy.cache_instance_image(task.context, node)
|
||||||
iscsi_deploy.check_image_size(task)
|
iscsi_deploy.check_image_size(task)
|
||||||
@ -436,6 +443,16 @@ class IloVirtualMediaIscsiDeploy(base.DeployInterface):
|
|||||||
:returns: deploy state DELETED.
|
:returns: deploy state DELETED.
|
||||||
"""
|
"""
|
||||||
manager_utils.node_power_action(task, states.POWER_OFF)
|
manager_utils.node_power_action(task, states.POWER_OFF)
|
||||||
|
try:
|
||||||
|
_update_secure_boot_mode(task, False)
|
||||||
|
# We need to handle IloOperationNotSupported exception so that if
|
||||||
|
# the user has incorrectly specified the Node capability
|
||||||
|
# 'secure_boot' to a node that does not have that capability and
|
||||||
|
# attempted deploy. Handling this exception here, will help the
|
||||||
|
# user to tear down such a Node.
|
||||||
|
except exception.IloOperationNotSupported:
|
||||||
|
LOG.warn(_LW('Secure boot mode is not supported for node %s'),
|
||||||
|
task.node.uuid)
|
||||||
return states.DELETED
|
return states.DELETED
|
||||||
|
|
||||||
def prepare(self, task):
|
def prepare(self, task):
|
||||||
@ -444,7 +461,7 @@ class IloVirtualMediaIscsiDeploy(base.DeployInterface):
|
|||||||
:param task: a TaskManager instance containing the node to act on.
|
:param task: a TaskManager instance containing the node to act on.
|
||||||
:raises: IloOperationError, if some operation on iLO failed.
|
:raises: IloOperationError, if some operation on iLO failed.
|
||||||
"""
|
"""
|
||||||
ilo_common.update_boot_mode(task)
|
_prepare_node_for_deploy(task)
|
||||||
|
|
||||||
def clean_up(self, task):
|
def clean_up(self, task):
|
||||||
"""Clean up the deployment environment for the task's node.
|
"""Clean up the deployment environment for the task's node.
|
||||||
@ -678,8 +695,13 @@ class VendorPassthru(agent_base_vendor.BaseAgentVendor):
|
|||||||
LOG.error(_LE("Cannot get boot ISO for node %s"), node.uuid)
|
LOG.error(_LE("Cannot get boot ISO for node %s"), node.uuid)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# In secure boot mode, node will reboot twice internally to
|
||||||
|
# enable/disable secure boot. Any one-time boot settings would
|
||||||
|
# be lost. Hence setting persistent=True.
|
||||||
ilo_common.setup_vmedia_for_boot(task, boot_iso)
|
ilo_common.setup_vmedia_for_boot(task, boot_iso)
|
||||||
manager_utils.node_set_boot_device(task, boot_devices.CDROM)
|
manager_utils.node_set_boot_device(task,
|
||||||
|
boot_devices.CDROM,
|
||||||
|
persistent=True)
|
||||||
|
|
||||||
i_info = node.instance_info
|
i_info = node.instance_info
|
||||||
if not i_info.get('ilo_boot_iso'):
|
if not i_info.get('ilo_boot_iso'):
|
||||||
@ -729,6 +751,12 @@ class VendorPassthru(agent_base_vendor.BaseAgentVendor):
|
|||||||
else:
|
else:
|
||||||
self._configure_vmedia_boot(task, root_uuid_or_disk_id)
|
self._configure_vmedia_boot(task, root_uuid_or_disk_id)
|
||||||
|
|
||||||
|
# Set boot mode
|
||||||
|
ilo_common.update_boot_mode(task)
|
||||||
|
|
||||||
|
# Need to enable secure boot, if being requested
|
||||||
|
_update_secure_boot_mode(task, True)
|
||||||
|
|
||||||
deploy_utils.notify_deploy_complete(kwargs.get('address'))
|
deploy_utils.notify_deploy_complete(kwargs.get('address'))
|
||||||
|
|
||||||
LOG.info(_LI('Deployment to node %s done'), node.uuid)
|
LOG.info(_LI('Deployment to node %s done'), node.uuid)
|
||||||
@ -776,4 +804,10 @@ class VendorPassthru(agent_base_vendor.BaseAgentVendor):
|
|||||||
task.context.auth_token = keystone.get_admin_auth_token()
|
task.context.auth_token = keystone.get_admin_auth_token()
|
||||||
self._configure_vmedia_boot(task, root_uuid)
|
self._configure_vmedia_boot(task, root_uuid)
|
||||||
|
|
||||||
|
# Set boot mode
|
||||||
|
ilo_common.update_boot_mode(task)
|
||||||
|
|
||||||
|
# Need to enable secure boot, if being requested
|
||||||
|
_update_secure_boot_mode(task, True)
|
||||||
|
|
||||||
self.reboot_and_finish_deploy(task)
|
self.reboot_and_finish_deploy(task)
|
||||||
|
@ -250,7 +250,8 @@ class IloDeployPrivateMethodsTestCase(db_base.DbTestCase):
|
|||||||
ilo_deploy._reboot_into(task, 'iso', opts)
|
ilo_deploy._reboot_into(task, 'iso', opts)
|
||||||
setup_vmedia_mock.assert_called_once_with(task, 'iso', opts)
|
setup_vmedia_mock.assert_called_once_with(task, 'iso', opts)
|
||||||
set_boot_device_mock.assert_called_once_with(task,
|
set_boot_device_mock.assert_called_once_with(task,
|
||||||
boot_devices.CDROM)
|
boot_devices.CDROM,
|
||||||
|
persistent=True)
|
||||||
node_power_action_mock.assert_called_once_with(task, states.REBOOT)
|
node_power_action_mock.assert_called_once_with(task, states.REBOOT)
|
||||||
|
|
||||||
@mock.patch.object(ilo_deploy, '_reboot_into')
|
@mock.patch.object(ilo_deploy, '_reboot_into')
|
||||||
@ -414,12 +415,16 @@ class IloVirtualMediaIscsiDeployTestCase(db_base.DbTestCase):
|
|||||||
self.node = obj_utils.create_test_node(self.context,
|
self.node = obj_utils.create_test_node(self.context,
|
||||||
driver='iscsi_ilo', driver_info=INFO_DICT)
|
driver='iscsi_ilo', driver_info=INFO_DICT)
|
||||||
|
|
||||||
|
@mock.patch.object(driver_utils, 'validate_secure_boot_capability')
|
||||||
@mock.patch.object(driver_utils, 'validate_boot_mode_capability')
|
@mock.patch.object(driver_utils, 'validate_boot_mode_capability')
|
||||||
@mock.patch.object(iscsi_deploy, 'validate_image_properties')
|
@mock.patch.object(iscsi_deploy, 'validate_image_properties')
|
||||||
@mock.patch.object(ilo_deploy, '_parse_deploy_info')
|
@mock.patch.object(ilo_deploy, '_parse_deploy_info')
|
||||||
@mock.patch.object(iscsi_deploy, 'validate')
|
@mock.patch.object(iscsi_deploy, 'validate')
|
||||||
def _test_validate(self, validate_mock, deploy_info_mock,
|
def _test_validate(self, validate_mock,
|
||||||
validate_prop_mock, validate_boot_mode_mock,
|
deploy_info_mock,
|
||||||
|
validate_prop_mock,
|
||||||
|
validate_boot_mode_mock,
|
||||||
|
validate_secure_boot_mock,
|
||||||
props_expected):
|
props_expected):
|
||||||
d_info = {'image_source': 'uuid'}
|
d_info = {'image_source': 'uuid'}
|
||||||
deploy_info_mock.return_value = d_info
|
deploy_info_mock.return_value = d_info
|
||||||
@ -431,6 +436,7 @@ class IloVirtualMediaIscsiDeployTestCase(db_base.DbTestCase):
|
|||||||
validate_prop_mock.assert_called_once_with(task.context,
|
validate_prop_mock.assert_called_once_with(task.context,
|
||||||
d_info, props_expected)
|
d_info, props_expected)
|
||||||
validate_boot_mode_mock.assert_called_once_with(task.node)
|
validate_boot_mode_mock.assert_called_once_with(task.node)
|
||||||
|
validate_secure_boot_mock.assert_called_once_with(task.node)
|
||||||
|
|
||||||
@mock.patch.object(iscsi_deploy, 'validate_image_properties')
|
@mock.patch.object(iscsi_deploy, 'validate_image_properties')
|
||||||
@mock.patch.object(ilo_deploy, '_parse_deploy_info')
|
@mock.patch.object(ilo_deploy, '_parse_deploy_info')
|
||||||
@ -497,12 +503,15 @@ class IloVirtualMediaIscsiDeployTestCase(db_base.DbTestCase):
|
|||||||
@mock.patch.object(deploy_utils, 'get_single_nic_with_vif_port_id')
|
@mock.patch.object(deploy_utils, 'get_single_nic_with_vif_port_id')
|
||||||
@mock.patch.object(agent, 'build_agent_options')
|
@mock.patch.object(agent, 'build_agent_options')
|
||||||
@mock.patch.object(iscsi_deploy, 'build_deploy_ramdisk_options')
|
@mock.patch.object(iscsi_deploy, 'build_deploy_ramdisk_options')
|
||||||
@mock.patch.object(manager_utils, 'node_power_action')
|
|
||||||
@mock.patch.object(iscsi_deploy, 'check_image_size')
|
@mock.patch.object(iscsi_deploy, 'check_image_size')
|
||||||
@mock.patch.object(iscsi_deploy, 'cache_instance_image')
|
@mock.patch.object(iscsi_deploy, 'cache_instance_image')
|
||||||
def test_deploy(self, cache_instance_image_mock, check_image_size_mock,
|
def test_deploy(self,
|
||||||
node_power_action_mock, build_opts_mock,
|
cache_instance_image_mock,
|
||||||
agent_options_mock, get_nic_mock, reboot_into_mock):
|
check_image_size_mock,
|
||||||
|
build_opts_mock,
|
||||||
|
agent_options_mock,
|
||||||
|
get_nic_mock,
|
||||||
|
reboot_into_mock):
|
||||||
deploy_opts = {'a': 'b'}
|
deploy_opts = {'a': 'b'}
|
||||||
agent_options_mock.return_value = {
|
agent_options_mock.return_value = {
|
||||||
'ipa-api-url': 'http://1.2.3.4:6385'}
|
'ipa-api-url': 'http://1.2.3.4:6385'}
|
||||||
@ -514,7 +523,6 @@ class IloVirtualMediaIscsiDeployTestCase(db_base.DbTestCase):
|
|||||||
task.node.driver_info['ilo_deploy_iso'] = 'deploy-iso'
|
task.node.driver_info['ilo_deploy_iso'] = 'deploy-iso'
|
||||||
returned_state = task.driver.deploy.deploy(task)
|
returned_state = task.driver.deploy.deploy(task)
|
||||||
|
|
||||||
node_power_action_mock.assert_any_call(task, states.POWER_OFF)
|
|
||||||
cache_instance_image_mock.assert_called_once_with(task.context,
|
cache_instance_image_mock.assert_called_once_with(task.context,
|
||||||
task.node)
|
task.node)
|
||||||
check_image_size_mock.assert_called_once_with(task)
|
check_image_size_mock.assert_called_once_with(task)
|
||||||
@ -527,13 +535,37 @@ class IloVirtualMediaIscsiDeployTestCase(db_base.DbTestCase):
|
|||||||
|
|
||||||
self.assertEqual(states.DEPLOYWAIT, returned_state)
|
self.assertEqual(states.DEPLOYWAIT, returned_state)
|
||||||
|
|
||||||
|
@mock.patch.object(ilo_deploy, '_update_secure_boot_mode')
|
||||||
@mock.patch.object(manager_utils, 'node_power_action')
|
@mock.patch.object(manager_utils, 'node_power_action')
|
||||||
def test_tear_down(self, node_power_action_mock):
|
def test_tear_down(self,
|
||||||
|
node_power_action_mock,
|
||||||
|
update_secure_boot_mode_mock):
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
with task_manager.acquire(self.context, self.node.uuid,
|
||||||
shared=False) as task:
|
shared=False) as task:
|
||||||
returned_state = task.driver.deploy.tear_down(task)
|
returned_state = task.driver.deploy.tear_down(task)
|
||||||
node_power_action_mock.assert_called_once_with(task,
|
node_power_action_mock.assert_called_once_with(task,
|
||||||
states.POWER_OFF)
|
states.POWER_OFF)
|
||||||
|
update_secure_boot_mode_mock.assert_called_once_with(task, False)
|
||||||
|
self.assertEqual(states.DELETED, returned_state)
|
||||||
|
|
||||||
|
@mock.patch.object(ilo_deploy.LOG, 'warn')
|
||||||
|
@mock.patch.object(ilo_deploy, 'exception')
|
||||||
|
@mock.patch.object(ilo_deploy, '_update_secure_boot_mode')
|
||||||
|
@mock.patch.object(manager_utils, 'node_power_action')
|
||||||
|
def test_tear_down_handle_exception(self,
|
||||||
|
node_power_action_mock,
|
||||||
|
update_secure_boot_mode_mock,
|
||||||
|
exception_mock,
|
||||||
|
mock_log):
|
||||||
|
with task_manager.acquire(self.context, self.node.uuid,
|
||||||
|
shared=False) as task:
|
||||||
|
exception_mock.IloOperationNotSupported = Exception
|
||||||
|
update_secure_boot_mode_mock.side_effect = Exception
|
||||||
|
returned_state = task.driver.deploy.tear_down(task)
|
||||||
|
node_power_action_mock.assert_called_once_with(task,
|
||||||
|
states.POWER_OFF)
|
||||||
|
update_secure_boot_mode_mock.assert_called_once_with(task, False)
|
||||||
|
self.assertTrue(mock_log.called)
|
||||||
self.assertEqual(states.DELETED, returned_state)
|
self.assertEqual(states.DELETED, returned_state)
|
||||||
|
|
||||||
@mock.patch.object(ilo_deploy, '_clean_up_boot_iso_for_instance')
|
@mock.patch.object(ilo_deploy, '_clean_up_boot_iso_for_instance')
|
||||||
@ -545,13 +577,12 @@ class IloVirtualMediaIscsiDeployTestCase(db_base.DbTestCase):
|
|||||||
destroy_images_mock.assert_called_once_with(task.node.uuid)
|
destroy_images_mock.assert_called_once_with(task.node.uuid)
|
||||||
clean_up_boot_mock.assert_called_once_with(task.node)
|
clean_up_boot_mock.assert_called_once_with(task.node)
|
||||||
|
|
||||||
@mock.patch.object(ilo_common, 'update_boot_mode')
|
@mock.patch.object(ilo_deploy, '_prepare_node_for_deploy')
|
||||||
def test_prepare(self,
|
def test_prepare(self, func_prepare_node_for_deploy):
|
||||||
update_boot_mode_mock):
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
with task_manager.acquire(self.context, self.node.uuid,
|
||||||
shared=False) as task:
|
shared=False) as task:
|
||||||
task.driver.deploy.prepare(task)
|
task.driver.deploy.prepare(task)
|
||||||
update_boot_mode_mock.assert_called_once_with(task)
|
func_prepare_node_for_deploy.assert_called_once_with(task)
|
||||||
|
|
||||||
|
|
||||||
class IloVirtualMediaAgentDeployTestCase(db_base.DbTestCase):
|
class IloVirtualMediaAgentDeployTestCase(db_base.DbTestCase):
|
||||||
@ -686,14 +717,19 @@ class VendorPassthruTestCase(db_base.DbTestCase):
|
|||||||
self.assertFalse(get_deploy_info_mock.called)
|
self.assertFalse(get_deploy_info_mock.called)
|
||||||
|
|
||||||
@mock.patch.object(deploy_utils, 'notify_deploy_complete')
|
@mock.patch.object(deploy_utils, 'notify_deploy_complete')
|
||||||
@mock.patch.object(manager_utils, 'node_set_boot_device')
|
@mock.patch.object(ilo_deploy, '_update_secure_boot_mode')
|
||||||
|
@mock.patch.object(ilo_common, 'update_boot_mode')
|
||||||
@mock.patch.object(ilo_common, 'setup_vmedia_for_boot')
|
@mock.patch.object(ilo_common, 'setup_vmedia_for_boot')
|
||||||
@mock.patch.object(ilo_deploy, '_get_boot_iso')
|
@mock.patch.object(ilo_deploy, '_get_boot_iso')
|
||||||
@mock.patch.object(iscsi_deploy, 'continue_deploy')
|
@mock.patch.object(iscsi_deploy, 'continue_deploy')
|
||||||
@mock.patch.object(ilo_common, 'cleanup_vmedia_boot')
|
@mock.patch.object(ilo_common, 'cleanup_vmedia_boot')
|
||||||
def test_pass_deploy_info_resume(self, cleanup_vmedia_boot_mock,
|
def test_pass_deploy_info_resume(self,
|
||||||
continue_deploy_mock, get_boot_iso_mock,
|
cleanup_vmedia_boot_mock,
|
||||||
setup_vmedia_mock, set_boot_device_mock,
|
continue_deploy_mock,
|
||||||
|
get_boot_iso_mock,
|
||||||
|
setup_vmedia_mock,
|
||||||
|
func_update_boot_mode,
|
||||||
|
func_update_secure_boot_mode,
|
||||||
notify_deploy_complete_mock):
|
notify_deploy_complete_mock):
|
||||||
kwargs = {'method': 'pass_deploy_info', 'address': '123456'}
|
kwargs = {'method': 'pass_deploy_info', 'address': '123456'}
|
||||||
continue_deploy_mock.return_value = {}
|
continue_deploy_mock.return_value = {}
|
||||||
@ -711,13 +747,16 @@ class VendorPassthruTestCase(db_base.DbTestCase):
|
|||||||
continue_deploy_mock.assert_called_once_with(task, **kwargs)
|
continue_deploy_mock.assert_called_once_with(task, **kwargs)
|
||||||
self.assertFalse(get_boot_iso_mock.called)
|
self.assertFalse(get_boot_iso_mock.called)
|
||||||
self.assertFalse(setup_vmedia_mock.called)
|
self.assertFalse(setup_vmedia_mock.called)
|
||||||
self.assertFalse(set_boot_device_mock.called)
|
self.assertFalse(func_update_boot_mode.called)
|
||||||
|
self.assertFalse(func_update_secure_boot_mode.called)
|
||||||
self.assertEqual(states.DEPLOYING, task.node.provision_state)
|
self.assertEqual(states.DEPLOYING, task.node.provision_state)
|
||||||
self.assertEqual(states.ACTIVE,
|
self.assertEqual(states.ACTIVE,
|
||||||
task.node.target_provision_state)
|
task.node.target_provision_state)
|
||||||
self.assertFalse(notify_deploy_complete_mock.called)
|
self.assertFalse(notify_deploy_complete_mock.called)
|
||||||
|
|
||||||
@mock.patch.object(deploy_utils, 'notify_deploy_complete')
|
@mock.patch.object(deploy_utils, 'notify_deploy_complete')
|
||||||
|
@mock.patch.object(ilo_deploy, '_update_secure_boot_mode')
|
||||||
|
@mock.patch.object(ilo_common, 'update_boot_mode')
|
||||||
@mock.patch.object(manager_utils, 'node_set_boot_device')
|
@mock.patch.object(manager_utils, 'node_set_boot_device')
|
||||||
@mock.patch.object(ilo_common, 'setup_vmedia_for_boot')
|
@mock.patch.object(ilo_common, 'setup_vmedia_for_boot')
|
||||||
@mock.patch.object(ilo_deploy, '_get_boot_iso')
|
@mock.patch.object(ilo_deploy, '_get_boot_iso')
|
||||||
@ -726,6 +765,8 @@ class VendorPassthruTestCase(db_base.DbTestCase):
|
|||||||
def test_pass_deploy_info_good(self, cleanup_vmedia_boot_mock,
|
def test_pass_deploy_info_good(self, cleanup_vmedia_boot_mock,
|
||||||
continue_deploy_mock, get_boot_iso_mock,
|
continue_deploy_mock, get_boot_iso_mock,
|
||||||
setup_vmedia_mock, set_boot_device_mock,
|
setup_vmedia_mock, set_boot_device_mock,
|
||||||
|
func_update_boot_mode,
|
||||||
|
func_update_secure_boot_mode,
|
||||||
notify_deploy_complete_mock):
|
notify_deploy_complete_mock):
|
||||||
kwargs = {'method': 'pass_deploy_info', 'address': '123456'}
|
kwargs = {'method': 'pass_deploy_info', 'address': '123456'}
|
||||||
continue_deploy_mock.return_value = {'root uuid': 'root-uuid'}
|
continue_deploy_mock.return_value = {'root uuid': 'root-uuid'}
|
||||||
@ -745,12 +786,14 @@ class VendorPassthruTestCase(db_base.DbTestCase):
|
|||||||
self.assertEqual(states.ACTIVE, task.node.provision_state)
|
self.assertEqual(states.ACTIVE, task.node.provision_state)
|
||||||
self.assertEqual(states.NOSTATE, task.node.target_provision_state)
|
self.assertEqual(states.NOSTATE, task.node.target_provision_state)
|
||||||
set_boot_device_mock.assert_called_once_with(task,
|
set_boot_device_mock.assert_called_once_with(task,
|
||||||
boot_devices.CDROM)
|
boot_devices.CDROM,
|
||||||
|
persistent=True)
|
||||||
|
func_update_boot_mode.assert_called_once_with(task)
|
||||||
|
func_update_secure_boot_mode.assert_called_once_with(task, True)
|
||||||
|
|
||||||
self.assertEqual('boot-iso',
|
self.assertEqual('boot-iso',
|
||||||
task.node.instance_info['ilo_boot_iso'])
|
task.node.instance_info['ilo_boot_iso'])
|
||||||
self.assertEqual(states.ACTIVE, task.node.provision_state)
|
notify_deploy_complete_mock.assert_called_once_with('123456')
|
||||||
self.assertEqual(states.NOSTATE, task.node.target_provision_state)
|
|
||||||
notify_deploy_complete_mock.assert_called_once_with('123456')
|
|
||||||
|
|
||||||
@mock.patch.object(ilo_common, 'cleanup_vmedia_boot')
|
@mock.patch.object(ilo_common, 'cleanup_vmedia_boot')
|
||||||
def test_pass_deploy_info_bad(self, cleanup_vmedia_boot_mock):
|
def test_pass_deploy_info_bad(self, cleanup_vmedia_boot_mock):
|
||||||
@ -816,10 +859,14 @@ class VendorPassthruTestCase(db_base.DbTestCase):
|
|||||||
|
|
||||||
@mock.patch.object(deploy_utils, 'notify_deploy_complete')
|
@mock.patch.object(deploy_utils, 'notify_deploy_complete')
|
||||||
@mock.patch.object(manager_utils, 'node_set_boot_device')
|
@mock.patch.object(manager_utils, 'node_set_boot_device')
|
||||||
|
@mock.patch.object(ilo_deploy, '_update_secure_boot_mode')
|
||||||
|
@mock.patch.object(ilo_common, 'update_boot_mode')
|
||||||
@mock.patch.object(iscsi_deploy, 'continue_deploy')
|
@mock.patch.object(iscsi_deploy, 'continue_deploy')
|
||||||
@mock.patch.object(ilo_common, 'cleanup_vmedia_boot')
|
@mock.patch.object(ilo_common, 'cleanup_vmedia_boot')
|
||||||
def _test_pass_deploy_info_localboot(self, cleanup_vmedia_boot_mock,
|
def _test_pass_deploy_info_localboot(self, cleanup_vmedia_boot_mock,
|
||||||
continue_deploy_mock,
|
continue_deploy_mock,
|
||||||
|
func_update_boot_mode,
|
||||||
|
func_update_secure_boot_mode,
|
||||||
set_boot_device_mock,
|
set_boot_device_mock,
|
||||||
notify_deploy_complete_mock):
|
notify_deploy_complete_mock):
|
||||||
|
|
||||||
@ -839,6 +886,8 @@ class VendorPassthruTestCase(db_base.DbTestCase):
|
|||||||
set_boot_device_mock.assert_called_once_with(task,
|
set_boot_device_mock.assert_called_once_with(task,
|
||||||
boot_devices.DISK,
|
boot_devices.DISK,
|
||||||
persistent=True)
|
persistent=True)
|
||||||
|
func_update_boot_mode.assert_called_once_with(task)
|
||||||
|
func_update_secure_boot_mode.assert_called_once_with(task, True)
|
||||||
notify_deploy_complete_mock.assert_called_once_with('123456')
|
notify_deploy_complete_mock.assert_called_once_with('123456')
|
||||||
self.assertEqual(states.ACTIVE, task.node.provision_state)
|
self.assertEqual(states.ACTIVE, task.node.provision_state)
|
||||||
self.assertEqual(states.NOSTATE, task.node.target_provision_state)
|
self.assertEqual(states.NOSTATE, task.node.target_provision_state)
|
||||||
@ -853,6 +902,8 @@ class VendorPassthruTestCase(db_base.DbTestCase):
|
|||||||
self.node.save()
|
self.node.save()
|
||||||
self._test_pass_deploy_info_localboot()
|
self._test_pass_deploy_info_localboot()
|
||||||
|
|
||||||
|
@mock.patch.object(ilo_deploy, '_update_secure_boot_mode')
|
||||||
|
@mock.patch.object(ilo_common, 'update_boot_mode')
|
||||||
@mock.patch.object(keystone, 'get_admin_auth_token')
|
@mock.patch.object(keystone, 'get_admin_auth_token')
|
||||||
@mock.patch.object(agent_base_vendor.BaseAgentVendor,
|
@mock.patch.object(agent_base_vendor.BaseAgentVendor,
|
||||||
'reboot_and_finish_deploy')
|
'reboot_and_finish_deploy')
|
||||||
@ -863,7 +914,9 @@ class VendorPassthruTestCase(db_base.DbTestCase):
|
|||||||
do_agent_iscsi_deploy_mock,
|
do_agent_iscsi_deploy_mock,
|
||||||
configure_vmedia_boot_mock,
|
configure_vmedia_boot_mock,
|
||||||
reboot_and_finish_deploy_mock,
|
reboot_and_finish_deploy_mock,
|
||||||
keystone_mock):
|
keystone_mock,
|
||||||
|
boot_mode_cap_mock,
|
||||||
|
update_secure_boot_mock):
|
||||||
self.node.provision_state = states.DEPLOYWAIT
|
self.node.provision_state = states.DEPLOYWAIT
|
||||||
self.node.target_provision_state = states.DEPLOYING
|
self.node.target_provision_state = states.DEPLOYING
|
||||||
self.node.save()
|
self.node.save()
|
||||||
@ -878,10 +931,14 @@ class VendorPassthruTestCase(db_base.DbTestCase):
|
|||||||
mock.ANY)
|
mock.ANY)
|
||||||
configure_vmedia_boot_mock.assert_called_once_with(
|
configure_vmedia_boot_mock.assert_called_once_with(
|
||||||
task, 'some-root-uuid')
|
task, 'some-root-uuid')
|
||||||
|
boot_mode_cap_mock.assert_called_once_with(task)
|
||||||
|
update_secure_boot_mock.assert_called_once_with(task, True)
|
||||||
reboot_and_finish_deploy_mock.assert_called_once_with(task)
|
reboot_and_finish_deploy_mock.assert_called_once_with(task)
|
||||||
# Ensure that admin token is populated in task
|
# Ensure that admin token is populated in task
|
||||||
self.assertEqual('admin-token', task.context.auth_token)
|
self.assertEqual('admin-token', task.context.auth_token)
|
||||||
|
|
||||||
|
@mock.patch.object(ilo_deploy, '_update_secure_boot_mode')
|
||||||
|
@mock.patch.object(ilo_common, 'update_boot_mode')
|
||||||
@mock.patch.object(agent_base_vendor.BaseAgentVendor,
|
@mock.patch.object(agent_base_vendor.BaseAgentVendor,
|
||||||
'reboot_and_finish_deploy')
|
'reboot_and_finish_deploy')
|
||||||
@mock.patch.object(agent_base_vendor.BaseAgentVendor,
|
@mock.patch.object(agent_base_vendor.BaseAgentVendor,
|
||||||
@ -891,7 +948,9 @@ class VendorPassthruTestCase(db_base.DbTestCase):
|
|||||||
def test_continue_deploy_localboot(self, cleanup_vmedia_boot_mock,
|
def test_continue_deploy_localboot(self, cleanup_vmedia_boot_mock,
|
||||||
do_agent_iscsi_deploy_mock,
|
do_agent_iscsi_deploy_mock,
|
||||||
configure_local_boot_mock,
|
configure_local_boot_mock,
|
||||||
reboot_and_finish_deploy_mock):
|
reboot_and_finish_deploy_mock,
|
||||||
|
boot_mode_cap_mock,
|
||||||
|
update_secure_boot_mock):
|
||||||
self.node.provision_state = states.DEPLOYWAIT
|
self.node.provision_state = states.DEPLOYWAIT
|
||||||
self.node.target_provision_state = states.DEPLOYING
|
self.node.target_provision_state = states.DEPLOYING
|
||||||
self.node.instance_info = {
|
self.node.instance_info = {
|
||||||
@ -908,8 +967,12 @@ class VendorPassthruTestCase(db_base.DbTestCase):
|
|||||||
configure_local_boot_mock.assert_called_once_with(
|
configure_local_boot_mock.assert_called_once_with(
|
||||||
task, root_uuid='some-root-uuid',
|
task, root_uuid='some-root-uuid',
|
||||||
efi_system_part_uuid=None)
|
efi_system_part_uuid=None)
|
||||||
|
boot_mode_cap_mock.assert_called_once_with(task)
|
||||||
|
update_secure_boot_mock.assert_called_once_with(task, True)
|
||||||
reboot_and_finish_deploy_mock.assert_called_once_with(task)
|
reboot_and_finish_deploy_mock.assert_called_once_with(task)
|
||||||
|
|
||||||
|
@mock.patch.object(ilo_deploy, '_update_secure_boot_mode')
|
||||||
|
@mock.patch.object(ilo_common, 'update_boot_mode')
|
||||||
@mock.patch.object(agent_base_vendor.BaseAgentVendor,
|
@mock.patch.object(agent_base_vendor.BaseAgentVendor,
|
||||||
'reboot_and_finish_deploy')
|
'reboot_and_finish_deploy')
|
||||||
@mock.patch.object(agent_base_vendor.BaseAgentVendor,
|
@mock.patch.object(agent_base_vendor.BaseAgentVendor,
|
||||||
@ -919,7 +982,9 @@ class VendorPassthruTestCase(db_base.DbTestCase):
|
|||||||
def test_continue_deploy_localboot_uefi(self, cleanup_vmedia_boot_mock,
|
def test_continue_deploy_localboot_uefi(self, cleanup_vmedia_boot_mock,
|
||||||
do_agent_iscsi_deploy_mock,
|
do_agent_iscsi_deploy_mock,
|
||||||
configure_local_boot_mock,
|
configure_local_boot_mock,
|
||||||
reboot_and_finish_deploy_mock):
|
reboot_and_finish_deploy_mock,
|
||||||
|
boot_mode_cap_mock,
|
||||||
|
update_secure_boot_mock):
|
||||||
self.node.provision_state = states.DEPLOYWAIT
|
self.node.provision_state = states.DEPLOYWAIT
|
||||||
self.node.target_provision_state = states.DEPLOYING
|
self.node.target_provision_state = states.DEPLOYING
|
||||||
self.node.instance_info = {
|
self.node.instance_info = {
|
||||||
@ -937,6 +1002,8 @@ class VendorPassthruTestCase(db_base.DbTestCase):
|
|||||||
configure_local_boot_mock.assert_called_once_with(
|
configure_local_boot_mock.assert_called_once_with(
|
||||||
task, root_uuid='some-root-uuid',
|
task, root_uuid='some-root-uuid',
|
||||||
efi_system_part_uuid='efi-system-part-uuid')
|
efi_system_part_uuid='efi-system-part-uuid')
|
||||||
|
boot_mode_cap_mock.assert_called_once_with(task)
|
||||||
|
update_secure_boot_mock.assert_called_once_with(task, True)
|
||||||
reboot_and_finish_deploy_mock.assert_called_once_with(task)
|
reboot_and_finish_deploy_mock.assert_called_once_with(task)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user