Remove check for UEFI + Whole disk images
This patch is removing a conditional preventing whole disk images from being deployed in UEFI mode without local boot. This conditional is an inconsistency because whole disk images being deployed in non-UEFI mode don't need to explicitly set the boot_option from "local", also, in Ironic when deploying a whole disk image we already assume local boot by default. Change-Id: I678e3547397eac3199d8ff670fe281e20b2cd2c0 Closes-Bug: #1627022
This commit is contained in:
parent
469e4cae31
commit
e63cd0834b
@ -32,7 +32,6 @@ from ironic.drivers.modules import deploy_utils
|
|||||||
from ironic.drivers.modules.ilo import boot as ilo_boot
|
from ironic.drivers.modules.ilo import boot as ilo_boot
|
||||||
from ironic.drivers.modules.ilo import common as ilo_common
|
from ironic.drivers.modules.ilo import common as ilo_common
|
||||||
from ironic.drivers.modules import iscsi_deploy
|
from ironic.drivers.modules import iscsi_deploy
|
||||||
from ironic.drivers.modules import pxe
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -366,16 +365,6 @@ class IloPXEDeploy(IloIscsiDeployMixin, iscsi_deploy.ISCSIDeploy):
|
|||||||
if task.node.provision_state == states.DEPLOYING:
|
if task.node.provision_state == states.DEPLOYING:
|
||||||
_prepare_node_for_deploy(task)
|
_prepare_node_for_deploy(task)
|
||||||
|
|
||||||
# Check if 'boot_option' is compatible with 'boot_mode' and image.
|
|
||||||
# Whole disk image deploy is not supported in UEFI boot mode if
|
|
||||||
# 'boot_option' is not 'local'.
|
|
||||||
# If boot_mode is not set in the node properties/capabilities then
|
|
||||||
# PXEDeploy.validate() would pass.
|
|
||||||
# Boot mode gets updated in prepare stage. It is possible that the
|
|
||||||
# deploy boot mode is 'uefi' after call to update_boot_mode().
|
|
||||||
# Hence a re-check is required here.
|
|
||||||
pxe.validate_boot_option_for_uefi(task.node)
|
|
||||||
|
|
||||||
super(IloPXEDeploy, self).prepare(task)
|
super(IloPXEDeploy, self).prepare(task)
|
||||||
|
|
||||||
@METRICS.timer('IloPXEDeploy.deploy')
|
@METRICS.timer('IloPXEDeploy.deploy')
|
||||||
|
@ -26,7 +26,7 @@ from ironic.common import boot_devices
|
|||||||
from ironic.common import dhcp_factory
|
from ironic.common import dhcp_factory
|
||||||
from ironic.common import exception
|
from ironic.common import exception
|
||||||
from ironic.common.glance_service import service_utils
|
from ironic.common.glance_service import service_utils
|
||||||
from ironic.common.i18n import _, _LE, _LW
|
from ironic.common.i18n import _, _LW
|
||||||
from ironic.common import image_service as service
|
from ironic.common import image_service as service
|
||||||
from ironic.common import images
|
from ironic.common import images
|
||||||
from ironic.common import pxe_utils
|
from ironic.common import pxe_utils
|
||||||
@ -215,30 +215,6 @@ def _build_pxe_config_options(task, pxe_info):
|
|||||||
return pxe_options
|
return pxe_options
|
||||||
|
|
||||||
|
|
||||||
@METRICS.timer('validate_boot_option_for_uefi')
|
|
||||||
def validate_boot_option_for_uefi(node):
|
|
||||||
"""In uefi boot mode, validate if the boot option is compatible.
|
|
||||||
|
|
||||||
This method raises exception if whole disk image being deployed
|
|
||||||
in UEFI boot mode without 'boot_option' being set to 'local'.
|
|
||||||
|
|
||||||
:param node: a single Node.
|
|
||||||
:raises: InvalidParameterValue
|
|
||||||
"""
|
|
||||||
boot_mode = deploy_utils.get_boot_mode_for_deploy(node)
|
|
||||||
boot_option = deploy_utils.get_boot_option(node)
|
|
||||||
if (boot_mode == 'uefi' and
|
|
||||||
node.driver_internal_info.get('is_whole_disk_image') and
|
|
||||||
boot_option != 'local'):
|
|
||||||
LOG.error(_LE("Whole disk image with netboot is not supported in UEFI "
|
|
||||||
"boot mode."))
|
|
||||||
raise exception.InvalidParameterValue(_(
|
|
||||||
"Conflict: Whole disk image being used for deploy, but "
|
|
||||||
"cannot be used with node %(node_uuid)s configured to use "
|
|
||||||
"UEFI boot with netboot option") %
|
|
||||||
{'node_uuid': node.uuid})
|
|
||||||
|
|
||||||
|
|
||||||
@METRICS.timer('validate_boot_option_for_trusted_boot')
|
@METRICS.timer('validate_boot_option_for_trusted_boot')
|
||||||
def validate_boot_parameters_for_trusted_boot(node):
|
def validate_boot_parameters_for_trusted_boot(node):
|
||||||
"""Check if boot parameters are valid for trusted boot."""
|
"""Check if boot parameters are valid for trusted boot."""
|
||||||
@ -333,9 +309,6 @@ class PXEBoot(base.BootInterface):
|
|||||||
_("Node %s does not have any port associated with it.")
|
_("Node %s does not have any port associated with it.")
|
||||||
% node.uuid)
|
% node.uuid)
|
||||||
|
|
||||||
# Get the boot_mode capability value.
|
|
||||||
boot_mode = deploy_utils.get_boot_mode_for_deploy(node)
|
|
||||||
|
|
||||||
if CONF.pxe.ipxe_enabled:
|
if CONF.pxe.ipxe_enabled:
|
||||||
if (not CONF.deploy.http_url or
|
if (not CONF.deploy.http_url or
|
||||||
not CONF.deploy.http_root):
|
not CONF.deploy.http_root):
|
||||||
@ -343,9 +316,6 @@ class PXEBoot(base.BootInterface):
|
|||||||
"iPXE boot is enabled but no HTTP URL or HTTP "
|
"iPXE boot is enabled but no HTTP URL or HTTP "
|
||||||
"root was specified."))
|
"root was specified."))
|
||||||
|
|
||||||
if boot_mode == 'uefi':
|
|
||||||
validate_boot_option_for_uefi(node)
|
|
||||||
|
|
||||||
# Check the trusted_boot capabilities value.
|
# Check the trusted_boot capabilities value.
|
||||||
deploy_utils.validate_capabilities(node)
|
deploy_utils.validate_capabilities(node)
|
||||||
if deploy_utils.is_trusted_boot_requested(node):
|
if deploy_utils.is_trusted_boot_requested(node):
|
||||||
|
@ -25,6 +25,7 @@ from ironic.common import image_service
|
|||||||
from ironic.common import states
|
from ironic.common import states
|
||||||
from ironic.conductor import task_manager
|
from ironic.conductor import task_manager
|
||||||
from ironic.conductor import utils as manager_utils
|
from ironic.conductor import utils as manager_utils
|
||||||
|
from ironic.conf import CONF
|
||||||
from ironic.drivers.modules import agent
|
from ironic.drivers.modules import agent
|
||||||
from ironic.drivers.modules import deploy_utils
|
from ironic.drivers.modules import deploy_utils
|
||||||
from ironic.drivers.modules.ilo import common as ilo_common
|
from ironic.drivers.modules.ilo import common as ilo_common
|
||||||
@ -686,19 +687,18 @@ class IloPXEDeployTestCase(db_base.DbTestCase):
|
|||||||
autospec=True)
|
autospec=True)
|
||||||
@mock.patch.object(ilo_deploy, '_prepare_node_for_deploy', spec_set=True,
|
@mock.patch.object(ilo_deploy, '_prepare_node_for_deploy', spec_set=True,
|
||||||
autospec=True)
|
autospec=True)
|
||||||
def test_prepare_uefi_whole_disk_image_fail(self,
|
def test_prepare_whole_disk_image_uefi(self, prepare_node_for_deploy_mock,
|
||||||
prepare_node_for_deploy_mock,
|
pxe_prepare_mock):
|
||||||
pxe_prepare_mock):
|
CONF.set_override('default_boot_option', 'netboot', 'deploy')
|
||||||
self.node.provision_state = states.DEPLOYING
|
self.node.provision_state = states.DEPLOYING
|
||||||
self.node.save()
|
self.node.save()
|
||||||
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.node.properties['capabilities'] = 'boot_mode:uefi'
|
task.node.properties['capabilities'] = 'boot_mode:uefi'
|
||||||
task.node.driver_internal_info['is_whole_disk_image'] = True
|
task.node.driver_internal_info['is_whole_disk_image'] = True
|
||||||
self.assertRaises(exception.InvalidParameterValue,
|
task.driver.deploy.prepare(task)
|
||||||
task.driver.deploy.prepare, task)
|
|
||||||
prepare_node_for_deploy_mock.assert_called_once_with(task)
|
prepare_node_for_deploy_mock.assert_called_once_with(task)
|
||||||
self.assertFalse(pxe_prepare_mock.called)
|
pxe_prepare_mock.assert_called_once_with(mock.ANY, task)
|
||||||
|
|
||||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'deploy', spec_set=True,
|
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'deploy', spec_set=True,
|
||||||
autospec=True)
|
autospec=True)
|
||||||
|
@ -450,48 +450,6 @@ class PXEPrivateMethodsTestCase(db_base.DbTestCase):
|
|||||||
list(fake_pxe_info.values()),
|
list(fake_pxe_info.values()),
|
||||||
True)
|
True)
|
||||||
|
|
||||||
@mock.patch.object(pxe.LOG, 'error', autospec=True)
|
|
||||||
def test_validate_boot_option_for_uefi_exc(self, mock_log):
|
|
||||||
properties = {'capabilities': 'boot_mode:uefi'}
|
|
||||||
instance_info = {"boot_option": "netboot"}
|
|
||||||
self.node.properties = properties
|
|
||||||
self.node.instance_info['capabilities'] = instance_info
|
|
||||||
self.node.driver_internal_info['is_whole_disk_image'] = True
|
|
||||||
self.assertRaises(exception.InvalidParameterValue,
|
|
||||||
pxe.validate_boot_option_for_uefi,
|
|
||||||
self.node)
|
|
||||||
self.assertTrue(mock_log.called)
|
|
||||||
|
|
||||||
@mock.patch.object(pxe.LOG, 'error', autospec=True)
|
|
||||||
def test_validate_boot_option_for_uefi_noexc_one(self, mock_log):
|
|
||||||
properties = {'capabilities': 'boot_mode:uefi'}
|
|
||||||
instance_info = {"boot_option": "local"}
|
|
||||||
self.node.properties = properties
|
|
||||||
self.node.instance_info['capabilities'] = instance_info
|
|
||||||
self.node.driver_internal_info['is_whole_disk_image'] = True
|
|
||||||
pxe.validate_boot_option_for_uefi(self.node)
|
|
||||||
self.assertFalse(mock_log.called)
|
|
||||||
|
|
||||||
@mock.patch.object(pxe.LOG, 'error', autospec=True)
|
|
||||||
def test_validate_boot_option_for_uefi_noexc_two(self, mock_log):
|
|
||||||
properties = {'capabilities': 'boot_mode:bios'}
|
|
||||||
instance_info = {"boot_option": "local"}
|
|
||||||
self.node.properties = properties
|
|
||||||
self.node.instance_info['capabilities'] = instance_info
|
|
||||||
self.node.driver_internal_info['is_whole_disk_image'] = True
|
|
||||||
pxe.validate_boot_option_for_uefi(self.node)
|
|
||||||
self.assertFalse(mock_log.called)
|
|
||||||
|
|
||||||
@mock.patch.object(pxe.LOG, 'error', autospec=True)
|
|
||||||
def test_validate_boot_option_for_uefi_noexc_three(self, mock_log):
|
|
||||||
properties = {'capabilities': 'boot_mode:uefi'}
|
|
||||||
instance_info = {"boot_option": "local"}
|
|
||||||
self.node.properties = properties
|
|
||||||
self.node.instance_info['capabilities'] = instance_info
|
|
||||||
self.node.driver_internal_info['is_whole_disk_image'] = False
|
|
||||||
pxe.validate_boot_option_for_uefi(self.node)
|
|
||||||
self.assertFalse(mock_log.called)
|
|
||||||
|
|
||||||
@mock.patch.object(pxe.LOG, 'error', autospec=True)
|
@mock.patch.object(pxe.LOG, 'error', autospec=True)
|
||||||
def test_validate_boot_parameters_for_trusted_boot_one(self, mock_log):
|
def test_validate_boot_parameters_for_trusted_boot_one(self, mock_log):
|
||||||
properties = {'capabilities': 'boot_mode:uefi'}
|
properties = {'capabilities': 'boot_mode:uefi'}
|
||||||
@ -636,17 +594,6 @@ class PXEBootTestCase(db_base.DbTestCase):
|
|||||||
self.assertRaises(exception.MissingParameterValue,
|
self.assertRaises(exception.MissingParameterValue,
|
||||||
task.driver.boot.validate, task)
|
task.driver.boot.validate, task)
|
||||||
|
|
||||||
def test_validate_fail_invalid_config_uefi_whole_disk_image(self):
|
|
||||||
properties = {'capabilities': 'boot_mode:uefi,boot_option:netboot'}
|
|
||||||
instance_info = {"boot_option": "netboot"}
|
|
||||||
with task_manager.acquire(self.context, self.node.uuid,
|
|
||||||
shared=True) as task:
|
|
||||||
task.node.properties = properties
|
|
||||||
task.node.instance_info['capabilities'] = instance_info
|
|
||||||
task.node.driver_internal_info['is_whole_disk_image'] = True
|
|
||||||
self.assertRaises(exception.InvalidParameterValue,
|
|
||||||
task.driver.boot.validate, task)
|
|
||||||
|
|
||||||
def test_validate_fail_no_port(self):
|
def test_validate_fail_no_port(self):
|
||||||
new_node = obj_utils.create_test_node(
|
new_node = obj_utils.create_test_node(
|
||||||
self.context,
|
self.context,
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
fixes:
|
||||||
|
- Remove a check that was preventing whole disk images to be deployed
|
||||||
|
in UEFI mode without explicitly setting the boot_option capability to
|
||||||
|
"local". For whole disk images Ironic already assumes booting from
|
||||||
|
the hard-drive by default.
|
Loading…
x
Reference in New Issue
Block a user