Merge "Use standard deploy interfaces for iscsi_ilo and agent_ilo"
This commit is contained in:
commit
ca8ba3c80a
|
@ -23,11 +23,11 @@ from ironic.drivers import base
|
|||
from ironic.drivers.modules import agent
|
||||
from ironic.drivers.modules.ilo import boot
|
||||
from ironic.drivers.modules.ilo import console
|
||||
from ironic.drivers.modules.ilo import deploy
|
||||
from ironic.drivers.modules.ilo import inspect
|
||||
from ironic.drivers.modules.ilo import management
|
||||
from ironic.drivers.modules.ilo import power
|
||||
from ironic.drivers.modules.ilo import vendor
|
||||
from ironic.drivers.modules import iscsi_deploy
|
||||
|
||||
|
||||
class IloVirtualMediaIscsiDriver(base.BaseDriver):
|
||||
|
@ -48,7 +48,7 @@ class IloVirtualMediaIscsiDriver(base.BaseDriver):
|
|||
|
||||
self.power = power.IloPower()
|
||||
self.boot = boot.IloVirtualMediaBoot()
|
||||
self.deploy = deploy.IloVirtualMediaIscsiDeploy()
|
||||
self.deploy = iscsi_deploy.ISCSIDeploy()
|
||||
self.console = console.IloConsoleInterface()
|
||||
self.management = management.IloManagement()
|
||||
self.vendor = vendor.VendorPassthru()
|
||||
|
@ -74,7 +74,7 @@ class IloVirtualMediaAgentDriver(base.BaseDriver):
|
|||
|
||||
self.power = power.IloPower()
|
||||
self.boot = boot.IloVirtualMediaBoot()
|
||||
self.deploy = deploy.IloVirtualMediaAgentDeploy()
|
||||
self.deploy = agent.AgentDeploy()
|
||||
self.console = console.IloConsoleInterface()
|
||||
self.management = management.IloManagement()
|
||||
self.inspect = inspect.IloInspect()
|
||||
|
|
|
@ -248,7 +248,7 @@ def _parse_deploy_info(node):
|
|||
return info
|
||||
|
||||
|
||||
def validate_driver_info(task):
|
||||
def _validate_driver_info(task):
|
||||
"""Validate the prerequisites for virtual media based boot.
|
||||
|
||||
This method validates whether the 'driver_info' property of the
|
||||
|
@ -397,6 +397,7 @@ class IloVirtualMediaBoot(base.BootInterface):
|
|||
"""
|
||||
|
||||
_validate_instance_image_info(task)
|
||||
_validate_driver_info(task)
|
||||
|
||||
@METRICS.timer('IloVirtualMediaBoot.prepare_ramdisk')
|
||||
def prepare_ramdisk(self, task, ramdisk_params):
|
||||
|
@ -427,6 +428,13 @@ class IloVirtualMediaBoot(base.BootInterface):
|
|||
node.provision_state != states.CLEANING):
|
||||
return
|
||||
|
||||
# Powering off the Node before initiating boot for node cleaning.
|
||||
# If node is in system POST, setting boot device fails.
|
||||
manager_utils.node_power_action(task, states.POWER_OFF)
|
||||
|
||||
if task.node.provision_state == states.DEPLOYING:
|
||||
prepare_node_for_deploy(task)
|
||||
|
||||
# Clear ilo_boot_iso if it's a glance image to force recreate
|
||||
# another one again (or use existing one in glance).
|
||||
# This is mainly for rebuild scenario.
|
||||
|
@ -483,6 +491,10 @@ class IloVirtualMediaBoot(base.BootInterface):
|
|||
else:
|
||||
LOG.warning(_LW("The UUID for the root partition could not "
|
||||
"be found for node %s"), node.uuid)
|
||||
# Set boot mode
|
||||
ilo_common.update_boot_mode(task)
|
||||
# Need to enable secure boot, if being requested
|
||||
ilo_common.update_secure_boot_mode(task, True)
|
||||
|
||||
@METRICS.timer('IloVirtualMediaBoot.clean_up_instance')
|
||||
def clean_up_instance(self, task):
|
||||
|
@ -496,6 +508,10 @@ class IloVirtualMediaBoot(base.BootInterface):
|
|||
:raises: IloOperationError, if some operation on iLO failed.
|
||||
"""
|
||||
|
||||
LOG.debug("Cleaning up the instance.")
|
||||
manager_utils.node_power_action(task, states.POWER_OFF)
|
||||
disable_secure_boot_if_supported(task)
|
||||
|
||||
_clean_up_boot_iso_for_instance(task.node)
|
||||
|
||||
driver_internal_info = task.node.driver_internal_info
|
||||
|
@ -518,6 +534,7 @@ class IloVirtualMediaBoot(base.BootInterface):
|
|||
:raises: IloOperationError, if some operation on iLO failed.
|
||||
"""
|
||||
|
||||
LOG.debug("Cleaning up the ironic ramdisk.")
|
||||
ilo_common.cleanup_vmedia_boot(task)
|
||||
|
||||
def _configure_vmedia_boot(self, task, root_uuid):
|
||||
|
|
|
@ -22,7 +22,6 @@ from ironic.common import boot_devices
|
|||
from ironic.common import states
|
||||
from ironic.conductor import task_manager
|
||||
from ironic.conductor import utils as manager_utils
|
||||
from ironic.drivers.modules import agent
|
||||
from ironic.drivers.modules.ilo import boot as ilo_boot
|
||||
from ironic.drivers.modules.ilo import common as ilo_common
|
||||
from ironic.drivers.modules import iscsi_deploy
|
||||
|
@ -46,7 +45,6 @@ class IloIscsiDeployMixin(object):
|
|||
:returns: deploy state DELETED.
|
||||
:raises: IloOperationError, if some operation on iLO failed.
|
||||
"""
|
||||
|
||||
manager_utils.node_power_action(task, states.POWER_OFF)
|
||||
ilo_boot.disable_secure_boot_if_supported(task)
|
||||
return super(IloIscsiDeployMixin, self).tear_down(task)
|
||||
|
@ -80,120 +78,6 @@ class IloIscsiDeployMixin(object):
|
|||
super(IloIscsiDeployMixin, self).continue_deploy(task, **kwargs)
|
||||
|
||||
|
||||
class IloVirtualMediaIscsiDeploy(IloIscsiDeployMixin,
|
||||
iscsi_deploy.ISCSIDeploy):
|
||||
|
||||
@METRICS.timer('IloVirtualMediaIscsiDeploy.validate')
|
||||
def validate(self, task):
|
||||
"""Validate the prerequisites for virtual media based deploy.
|
||||
|
||||
This method validates whether the 'driver_info' property of the
|
||||
supplied node contains the required information for this driver.
|
||||
|
||||
:param task: a TaskManager instance containing the node to act on.
|
||||
:raises: InvalidParameterValue if any parameters are incorrect
|
||||
:raises: MissingParameterValue if some mandatory information
|
||||
is missing on the node
|
||||
"""
|
||||
ilo_boot.validate_driver_info(task)
|
||||
super(IloVirtualMediaIscsiDeploy, self).validate(task)
|
||||
|
||||
@METRICS.timer('IloVirtualMediaIscsiDeploy.prepare')
|
||||
def prepare(self, task):
|
||||
"""Prepare the deployment environment for this task's node.
|
||||
|
||||
:param task: a TaskManager instance containing the node to act on.
|
||||
:raises: IloOperationError, if some operation on iLO failed.
|
||||
"""
|
||||
if task.node.provision_state == states.DEPLOYING:
|
||||
ilo_boot.prepare_node_for_deploy(task)
|
||||
|
||||
super(IloVirtualMediaIscsiDeploy, self).prepare(task)
|
||||
|
||||
|
||||
class IloVirtualMediaAgentDeploy(agent.AgentDeploy):
|
||||
"""Interface for deploy-related actions."""
|
||||
|
||||
def get_properties(self):
|
||||
"""Return the properties of the interface.
|
||||
|
||||
:returns: dictionary of <property name>:<property description> entries.
|
||||
"""
|
||||
return ilo_boot.COMMON_PROPERTIES
|
||||
|
||||
@METRICS.timer('IloVirtualMediaAgentDeploy.validate')
|
||||
def validate(self, task):
|
||||
"""Validate the prerequisites for virtual media based deploy.
|
||||
|
||||
This method validates whether the 'driver_info' property of the
|
||||
supplied node contains the required information for this driver.
|
||||
|
||||
:param task: a TaskManager instance containing the node to act on.
|
||||
:raises: InvalidParameterValue if any parameters are incorrect
|
||||
:raises: MissingParameterValue if some mandatory information
|
||||
is missing on the node
|
||||
"""
|
||||
ilo_boot.validate_driver_info(task)
|
||||
super(IloVirtualMediaAgentDeploy, self).validate(task)
|
||||
|
||||
@METRICS.timer('IloVirtualMediaAgentDeploy.tear_down')
|
||||
@task_manager.require_exclusive_lock
|
||||
def tear_down(self, task):
|
||||
"""Tear down a previous deployment on the task's node.
|
||||
|
||||
:param task: a TaskManager instance.
|
||||
:returns: states.DELETED
|
||||
:raises: IloOperationError, if some operation on iLO failed.
|
||||
"""
|
||||
manager_utils.node_power_action(task, states.POWER_OFF)
|
||||
ilo_boot.disable_secure_boot_if_supported(task)
|
||||
return super(IloVirtualMediaAgentDeploy, self).tear_down(task)
|
||||
|
||||
@METRICS.timer('IloVirtualMediaAgentDeploy.prepare')
|
||||
def prepare(self, task):
|
||||
"""Prepare the deployment environment for this node.
|
||||
|
||||
:param task: a TaskManager instance.
|
||||
:raises: IloOperationError, if some operation on iLO failed.
|
||||
"""
|
||||
if task.node.provision_state == states.DEPLOYING:
|
||||
ilo_boot.prepare_node_for_deploy(task)
|
||||
|
||||
super(IloVirtualMediaAgentDeploy, self).prepare(task)
|
||||
|
||||
@METRICS.timer('IloVirtualMediaAgentDeploy.prepare_cleaning')
|
||||
def prepare_cleaning(self, task):
|
||||
"""Boot into the agent to prepare for cleaning.
|
||||
|
||||
:param task: a TaskManager object containing the node
|
||||
:returns: states.CLEANWAIT to signify an asynchronous prepare.
|
||||
:raises: NodeCleaningFailure, NetworkError if the previous cleaning
|
||||
ports cannot be removed or if new cleaning ports cannot be created
|
||||
:raises: IloOperationError, if some operation on iLO failed.
|
||||
"""
|
||||
# Powering off the Node before initiating boot for node cleaning.
|
||||
# If node is in system POST, setting boot device fails.
|
||||
manager_utils.node_power_action(task, states.POWER_OFF)
|
||||
return super(IloVirtualMediaAgentDeploy, self).prepare_cleaning(task)
|
||||
|
||||
@METRICS.timer('IloVirtualMediaAgentDeploy.reboot_to_instance')
|
||||
def reboot_to_instance(self, task):
|
||||
node = task.node
|
||||
LOG.debug('Preparing to reboot to instance for node %s',
|
||||
node.uuid)
|
||||
|
||||
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
|
||||
ilo_common.update_secure_boot_mode(task, True)
|
||||
|
||||
super(IloVirtualMediaAgentDeploy,
|
||||
self).reboot_to_instance(task)
|
||||
|
||||
|
||||
class IloPXEDeploy(IloIscsiDeployMixin, iscsi_deploy.ISCSIDeploy):
|
||||
|
||||
@METRICS.timer('IloPXEDeploy.prepare')
|
||||
|
|
|
@ -4824,7 +4824,9 @@ class ManagerTestProperties(mgr_utils.ServiceSetUpMixin,
|
|||
'console_port', 'ilo_change_password',
|
||||
'ca_file', 'snmp_auth_user', 'snmp_auth_prot_password',
|
||||
'snmp_auth_priv_password', 'snmp_auth_protocol',
|
||||
'snmp_auth_priv_protocol']
|
||||
'snmp_auth_priv_protocol', 'deploy_forces_oob_reboot',
|
||||
'deploy_kernel', 'deploy_ramdisk', 'image_http_proxy',
|
||||
'image_https_proxy', 'image_no_proxy']
|
||||
self._check_driver_properties("agent_ilo", expected)
|
||||
|
||||
def test_driver_properties_fail(self):
|
||||
|
|
|
@ -429,26 +429,26 @@ class IloBootPrivateMethodsTestCase(db_base.DbTestCase):
|
|||
|
||||
@mock.patch.object(ilo_common, 'parse_driver_info', spec_set=True,
|
||||
autospec=True)
|
||||
def test_validate_driver_info_MissingParam(self, mock_parse_driver_info):
|
||||
def test__validate_driver_info_MissingParam(self, mock_parse_driver_info):
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
self.assertRaisesRegex(exception.MissingParameterValue,
|
||||
"Missing 'ilo_deploy_iso'",
|
||||
ilo_boot.validate_driver_info, task)
|
||||
ilo_boot._validate_driver_info, task)
|
||||
mock_parse_driver_info.assert_called_once_with(task.node)
|
||||
|
||||
@mock.patch.object(service_utils, 'is_glance_image', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(ilo_common, 'parse_driver_info', spec_set=True,
|
||||
autospec=True)
|
||||
def test_validate_driver_info_valid_uuid(self, mock_parse_driver_info,
|
||||
mock_is_glance_image):
|
||||
def test__validate_driver_info_valid_uuid(self, mock_parse_driver_info,
|
||||
mock_is_glance_image):
|
||||
mock_is_glance_image.return_value = True
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
deploy_iso = '8a81759a-f29b-454b-8ab3-161c6ca1882c'
|
||||
task.node.driver_info['ilo_deploy_iso'] = deploy_iso
|
||||
ilo_boot.validate_driver_info(task)
|
||||
ilo_boot._validate_driver_info(task)
|
||||
mock_parse_driver_info.assert_called_once_with(task.node)
|
||||
mock_is_glance_image.assert_called_once_with(deploy_iso)
|
||||
|
||||
|
@ -458,9 +458,9 @@ class IloBootPrivateMethodsTestCase(db_base.DbTestCase):
|
|||
autospec=True)
|
||||
@mock.patch.object(ilo_common, 'parse_driver_info', spec_set=True,
|
||||
autospec=True)
|
||||
def test_validate_driver_info_InvalidParam(self, mock_parse_driver_info,
|
||||
mock_is_glance_image,
|
||||
mock_validate_href):
|
||||
def test__validate_driver_info_InvalidParam(self, mock_parse_driver_info,
|
||||
mock_is_glance_image,
|
||||
mock_validate_href):
|
||||
deploy_iso = 'http://abc.org/image/qcow2'
|
||||
mock_validate_href.side_effect = exception.ImageRefValidationFailed(
|
||||
image_href='http://abc.org/image/qcow2', reason='fail')
|
||||
|
@ -470,7 +470,7 @@ class IloBootPrivateMethodsTestCase(db_base.DbTestCase):
|
|||
task.node.driver_info['ilo_deploy_iso'] = deploy_iso
|
||||
self.assertRaisesRegex(exception.InvalidParameterValue,
|
||||
"Virtual media boot accepts",
|
||||
ilo_boot.validate_driver_info, task)
|
||||
ilo_boot._validate_driver_info, task)
|
||||
mock_parse_driver_info.assert_called_once_with(task.node)
|
||||
mock_validate_href.assert_called_once_with(mock.ANY, deploy_iso)
|
||||
|
||||
|
@ -480,15 +480,15 @@ class IloBootPrivateMethodsTestCase(db_base.DbTestCase):
|
|||
autospec=True)
|
||||
@mock.patch.object(ilo_common, 'parse_driver_info', spec_set=True,
|
||||
autospec=True)
|
||||
def test_validate_driver_info_valid_url(self, mock_parse_driver_info,
|
||||
mock_is_glance_image,
|
||||
mock_validate_href):
|
||||
def test__validate_driver_info_valid_url(self, mock_parse_driver_info,
|
||||
mock_is_glance_image,
|
||||
mock_validate_href):
|
||||
deploy_iso = 'http://abc.org/image/deploy.iso'
|
||||
mock_is_glance_image.return_value = False
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
task.node.driver_info['ilo_deploy_iso'] = deploy_iso
|
||||
ilo_boot.validate_driver_info(task)
|
||||
ilo_boot._validate_driver_info(task)
|
||||
mock_parse_driver_info.assert_called_once_with(task.node)
|
||||
mock_validate_href.assert_called_once_with(mock.ANY, deploy_iso)
|
||||
|
||||
|
@ -676,9 +676,12 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
|
|||
self.node = obj_utils.create_test_node(
|
||||
self.context, driver='iscsi_ilo', driver_info=INFO_DICT)
|
||||
|
||||
@mock.patch.object(ilo_boot, '_validate_driver_info',
|
||||
spec_set=True, autospec=True)
|
||||
@mock.patch.object(ilo_boot, '_validate_instance_image_info',
|
||||
spec_set=True, autospec=True)
|
||||
def test_validate(self, mock_val_instance_image_info):
|
||||
def test_validate(self, mock_val_instance_image_info,
|
||||
mock_val_driver_info):
|
||||
instance_info = self.node.instance_info
|
||||
instance_info['ilo_boot_iso'] = 'deploy-iso'
|
||||
instance_info['image_source'] = '6b2f0c0c-79e8-4db6-842e-43c9764204af'
|
||||
|
@ -690,7 +693,12 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
|
|||
task.node.driver_info['ilo_deploy_iso'] = 'deploy-iso'
|
||||
task.driver.boot.validate(task)
|
||||
mock_val_instance_image_info.assert_called_once_with(task)
|
||||
mock_val_driver_info.assert_called_once_with(task)
|
||||
|
||||
@mock.patch.object(ilo_boot, 'prepare_node_for_deploy',
|
||||
spec_set=True, autospec=True)
|
||||
@mock.patch.object(manager_utils, 'node_power_action',
|
||||
spec_set=True, autospec=True)
|
||||
@mock.patch.object(ilo_common, 'eject_vmedia_devices',
|
||||
spec_set=True, autospec=True)
|
||||
@mock.patch.object(ilo_common, 'setup_vmedia', spec_set=True,
|
||||
|
@ -698,7 +706,9 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
|
|||
@mock.patch.object(deploy_utils, 'get_single_nic_with_vif_port_id',
|
||||
spec_set=True, autospec=True)
|
||||
def _test_prepare_ramdisk(self, get_nic_mock, setup_vmedia_mock,
|
||||
eject_mock, ilo_boot_iso, image_source,
|
||||
eject_mock, node_power_mock,
|
||||
prepare_node_for_deploy_mock,
|
||||
ilo_boot_iso, image_source,
|
||||
ramdisk_params={'a': 'b'}):
|
||||
instance_info = self.node.instance_info
|
||||
instance_info['ilo_boot_iso'] = ilo_boot_iso
|
||||
|
@ -716,6 +726,9 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
|
|||
|
||||
task.driver.boot.prepare_ramdisk(task, ramdisk_params)
|
||||
|
||||
node_power_mock.assert_called_once_with(task, states.POWER_OFF)
|
||||
if task.node.provision_state == states.DEPLOYING:
|
||||
prepare_node_for_deploy_mock.assert_called_once_with(task)
|
||||
eject_mock.assert_called_once_with(task)
|
||||
expected_ramdisk_opts = {'a': 'b', 'BOOTIF': '12:34:56:78:90:ab'}
|
||||
get_nic_mock.assert_called_once_with(task)
|
||||
|
@ -823,12 +836,17 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
|
|||
self.assertFalse(setup_vmedia_mock.called)
|
||||
self.assertFalse(set_boot_device_mock.called)
|
||||
|
||||
@mock.patch.object(ilo_common, 'update_secure_boot_mode', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(manager_utils, 'node_power_action', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(ilo_common, 'cleanup_vmedia_boot', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(ilo_boot, '_clean_up_boot_iso_for_instance',
|
||||
spec_set=True, autospec=True)
|
||||
def test_clean_up_instance(self, cleanup_iso_mock,
|
||||
cleanup_vmedia_mock):
|
||||
cleanup_vmedia_mock, node_power_mock,
|
||||
update_secure_boot_mode_mock):
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
driver_internal_info = task.node.driver_internal_info
|
||||
|
@ -844,6 +862,9 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
|
|||
self.assertNotIn('boot_iso_created_in_web_server',
|
||||
driver_internal_info)
|
||||
self.assertNotIn('root_uuid_or_disk_id', driver_internal_info)
|
||||
node_power_mock.assert_called_once_with(task,
|
||||
states.POWER_OFF)
|
||||
update_secure_boot_mode_mock.assert_called_once_with(task, False)
|
||||
|
||||
@mock.patch.object(ilo_common, 'cleanup_vmedia_boot', spec_set=True,
|
||||
autospec=True)
|
||||
|
@ -853,12 +874,17 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
|
|||
task.driver.boot.clean_up_ramdisk(task)
|
||||
cleanup_vmedia_mock.assert_called_once_with(task)
|
||||
|
||||
@mock.patch.object(ilo_common, 'update_secure_boot_mode', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(ilo_common, 'update_boot_mode', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(manager_utils, 'node_set_boot_device', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(ilo_common, 'cleanup_vmedia_boot', spec_set=True,
|
||||
autospec=True)
|
||||
def _test_prepare_instance_whole_disk_image(
|
||||
self, cleanup_vmedia_boot_mock, set_boot_device_mock):
|
||||
self, cleanup_vmedia_boot_mock, set_boot_device_mock,
|
||||
update_boot_mode_mock, update_secure_boot_mode_mock):
|
||||
self.node.driver_internal_info = {'is_whole_disk_image': True}
|
||||
self.node.save()
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
|
@ -869,6 +895,8 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
|
|||
set_boot_device_mock.assert_called_once_with(task,
|
||||
boot_devices.DISK,
|
||||
persistent=True)
|
||||
update_boot_mode_mock.assert_called_once_with(task)
|
||||
update_secure_boot_mode_mock.assert_called_once_with(task, True)
|
||||
|
||||
def test_prepare_instance_whole_disk_image_local(self):
|
||||
self.node.instance_info = {'capabilities': '{"boot_option": "local"}'}
|
||||
|
@ -878,14 +906,18 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
|
|||
def test_prepare_instance_whole_disk_image(self):
|
||||
self._test_prepare_instance_whole_disk_image()
|
||||
|
||||
@mock.patch.object(ilo_common, 'update_secure_boot_mode', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(ilo_common, 'update_boot_mode', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(ilo_boot.IloVirtualMediaBoot,
|
||||
'_configure_vmedia_boot', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(ilo_common, 'cleanup_vmedia_boot', spec_set=True,
|
||||
autospec=True)
|
||||
def test_prepare_instance_partition_image(
|
||||
self, cleanup_vmedia_boot_mock,
|
||||
configure_vmedia_mock):
|
||||
self, cleanup_vmedia_boot_mock, configure_vmedia_mock,
|
||||
update_boot_mode_mock, update_secure_boot_mode_mock):
|
||||
self.node.driver_internal_info = {'root_uuid_or_disk_id': (
|
||||
"12312642-09d3-467f-8e09-12385826a123")}
|
||||
self.node.save()
|
||||
|
@ -896,3 +928,5 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
|
|||
cleanup_vmedia_boot_mock.assert_called_once_with(task)
|
||||
configure_vmedia_mock.assert_called_once_with(
|
||||
mock.ANY, task, "12312642-09d3-467f-8e09-12385826a123")
|
||||
update_boot_mode_mock.assert_called_once_with(task)
|
||||
update_secure_boot_mode_mock.assert_called_once_with(task, True)
|
||||
|
|
|
@ -23,7 +23,6 @@ from ironic.common import states
|
|||
from ironic.conductor import task_manager
|
||||
from ironic.conductor import utils as manager_utils
|
||||
from ironic.conf import CONF
|
||||
from ironic.drivers.modules import agent
|
||||
from ironic.drivers.modules.ilo import boot as ilo_boot
|
||||
from ironic.drivers.modules.ilo import common as ilo_common
|
||||
from ironic.drivers.modules import iscsi_deploy
|
||||
|
@ -40,321 +39,6 @@ if six.PY3:
|
|||
INFO_DICT = db_utils.get_test_ilo_info()
|
||||
|
||||
|
||||
class IloVirtualMediaIscsiDeployTestCase(db_base.DbTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(IloVirtualMediaIscsiDeployTestCase, self).setUp()
|
||||
mgr_utils.mock_the_extension_manager(driver="iscsi_ilo")
|
||||
self.node = obj_utils.create_test_node(
|
||||
self.context, driver='iscsi_ilo', driver_info=INFO_DICT)
|
||||
|
||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'validate', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(ilo_boot, 'validate_driver_info', spec_set=True,
|
||||
autospec=True)
|
||||
def test_validate(self,
|
||||
mock_validate_driver_info,
|
||||
iscsi_validate):
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
task.driver.deploy.validate(task)
|
||||
mock_validate_driver_info.assert_called_once_with(task)
|
||||
iscsi_validate.assert_called_once_with(mock.ANY, task)
|
||||
|
||||
@mock.patch.object(ilo_common, 'update_secure_boot_mode', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'tear_down', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(manager_utils, 'node_power_action', spec_set=True,
|
||||
autospec=True)
|
||||
def test_tear_down(self,
|
||||
node_power_action_mock,
|
||||
iscsi_tear_down_mock,
|
||||
update_secure_boot_mode_mock):
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
iscsi_tear_down_mock.return_value = states.DELETED
|
||||
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)
|
||||
iscsi_tear_down_mock.assert_called_once_with(mock.ANY, task)
|
||||
self.assertEqual(states.DELETED, returned_state)
|
||||
|
||||
@mock.patch.object(ilo_boot.LOG, 'warning',
|
||||
spec_set=True, autospec=True)
|
||||
@mock.patch.object(ilo_boot, 'exception', spec_set=True, autospec=True)
|
||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'tear_down', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(ilo_common, 'update_secure_boot_mode', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(manager_utils, 'node_power_action', spec_set=True,
|
||||
autospec=True)
|
||||
def test_tear_down_handle_exception(self,
|
||||
node_power_action_mock,
|
||||
update_secure_boot_mode_mock,
|
||||
iscsi_tear_down_mock,
|
||||
exception_mock,
|
||||
mock_log):
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
iscsi_tear_down_mock.return_value = states.DELETED
|
||||
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)
|
||||
iscsi_tear_down_mock.assert_called_once_with(mock.ANY, task)
|
||||
self.assertTrue(mock_log.called)
|
||||
self.assertEqual(states.DELETED, returned_state)
|
||||
|
||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'deploy',
|
||||
spec_set=True, autospec=True)
|
||||
def test_deploy(self, iscsi_deploy_mock):
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
task.driver.deploy.deploy(task)
|
||||
iscsi_deploy_mock.assert_called_once_with(mock.ANY, task)
|
||||
|
||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'prepare',
|
||||
spec_set=True, autospec=True)
|
||||
@mock.patch.object(ilo_boot, 'prepare_node_for_deploy', spec_set=True,
|
||||
autospec=True)
|
||||
def test_prepare(self, func_prepare_node_for_deploy,
|
||||
iscsi_deploy_prepare_mock):
|
||||
self.node.provision_state = states.DEPLOYING
|
||||
self.node.save()
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
task.driver.deploy.prepare(task)
|
||||
func_prepare_node_for_deploy.assert_called_once_with(task)
|
||||
iscsi_deploy_prepare_mock.assert_called_once_with(mock.ANY, task)
|
||||
|
||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'prepare',
|
||||
spec_set=True, autospec=True)
|
||||
@mock.patch.object(ilo_boot, 'prepare_node_for_deploy', spec_set=True,
|
||||
autospec=True)
|
||||
def test_prepare_active_node(self, func_prepare_node_for_deploy,
|
||||
iscsi_deploy_prepare_mock):
|
||||
"""Ensure nodes in running states are not inadvertently changed"""
|
||||
test_states = list(states.STABLE_STATES)
|
||||
test_states.extend([states.CLEANING,
|
||||
states.CLEANWAIT,
|
||||
states.INSPECTING])
|
||||
for state in test_states:
|
||||
self.node.provision_state = state
|
||||
self.node.save()
|
||||
func_prepare_node_for_deploy.reset_mock()
|
||||
iscsi_deploy_prepare_mock.reset_mock()
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
task.driver.deploy.prepare(task)
|
||||
self.assertFalse(func_prepare_node_for_deploy.called)
|
||||
iscsi_deploy_prepare_mock.assert_called_once_with(
|
||||
mock.ANY, task)
|
||||
|
||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'prepare_cleaning',
|
||||
spec_set=True, autospec=True)
|
||||
@mock.patch.object(manager_utils, 'node_power_action', spec_set=True,
|
||||
autospec=True)
|
||||
def test_prepare_cleaning(self, node_power_action_mock,
|
||||
iscsi_prep_clean_mock):
|
||||
iscsi_prep_clean_mock.return_value = states.CLEANWAIT
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
ret = task.driver.deploy.prepare_cleaning(task)
|
||||
self.assertEqual(states.CLEANWAIT, ret)
|
||||
node_power_action_mock.assert_called_once_with(task,
|
||||
states.POWER_OFF)
|
||||
iscsi_prep_clean_mock.assert_called_once_with(mock.ANY, task)
|
||||
|
||||
@mock.patch.object(iscsi_deploy.ISCSIDeploy, 'continue_deploy',
|
||||
spec_set=True, autospec=True)
|
||||
@mock.patch.object(ilo_common, 'update_secure_boot_mode', autospec=True)
|
||||
@mock.patch.object(ilo_common, 'update_boot_mode', autospec=True)
|
||||
def test_continue_deploy(self,
|
||||
func_update_boot_mode,
|
||||
func_update_secure_boot_mode,
|
||||
pxe_vendorpassthru_mock):
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
task.node.provision_state = states.DEPLOYWAIT
|
||||
task.node.target_provision_state = states.ACTIVE
|
||||
task.driver.deploy.continue_deploy(task)
|
||||
func_update_boot_mode.assert_called_once_with(task)
|
||||
func_update_secure_boot_mode.assert_called_once_with(task, True)
|
||||
pxe_vendorpassthru_mock.assert_called_once_with(
|
||||
mock.ANY, task)
|
||||
|
||||
|
||||
class IloVirtualMediaAgentDeployTestCase(db_base.DbTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(IloVirtualMediaAgentDeployTestCase, self).setUp()
|
||||
mgr_utils.mock_the_extension_manager(driver="agent_ilo")
|
||||
self.node = obj_utils.create_test_node(
|
||||
self.context, driver='agent_ilo', driver_info=INFO_DICT)
|
||||
|
||||
@mock.patch.object(agent.AgentDeploy, 'validate', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(ilo_boot, 'validate_driver_info', spec_set=True,
|
||||
autospec=True)
|
||||
def test_validate(self,
|
||||
mock_validate_driver_info,
|
||||
agent_validate):
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
task.driver.deploy.validate(task)
|
||||
mock_validate_driver_info.assert_called_once_with(task)
|
||||
agent_validate.assert_called_once_with(mock.ANY, task)
|
||||
|
||||
@mock.patch.object(agent.AgentDeploy, 'tear_down', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(ilo_common, 'update_secure_boot_mode', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(manager_utils, 'node_power_action', spec_set=True,
|
||||
autospec=True)
|
||||
def test_tear_down(self,
|
||||
node_power_action_mock,
|
||||
update_secure_boot_mode_mock,
|
||||
agent_teardown_mock):
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
agent_teardown_mock.return_value = states.DELETED
|
||||
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.assertEqual(states.DELETED, returned_state)
|
||||
|
||||
@mock.patch.object(agent.AgentDeploy, 'tear_down', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(ilo_boot.LOG, 'warning', spec_set=True, autospec=True)
|
||||
@mock.patch.object(ilo_boot, 'exception', spec_set=True, autospec=True)
|
||||
@mock.patch.object(ilo_common, 'update_secure_boot_mode', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(manager_utils, 'node_power_action', spec_set=True,
|
||||
autospec=True)
|
||||
def test_tear_down_handle_exception(self,
|
||||
node_power_action_mock,
|
||||
update_secure_boot_mode_mock,
|
||||
exception_mock,
|
||||
mock_log,
|
||||
agent_teardown_mock):
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
agent_teardown_mock.return_value = states.DELETED
|
||||
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)
|
||||
agent_teardown_mock.assert_called_once_with(mock.ANY, task)
|
||||
self.assertTrue(mock_log.called)
|
||||
self.assertEqual(states.DELETED, returned_state)
|
||||
|
||||
@mock.patch.object(ilo_boot, 'prepare_node_for_deploy', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(agent.AgentDeploy, 'prepare', spec_set=True,
|
||||
autospec=True)
|
||||
def test_prepare(self,
|
||||
agent_prepare_mock,
|
||||
func_prepare_node_for_deploy):
|
||||
self.node.provision_state = states.DEPLOYING
|
||||
self.node.save()
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
task.driver.deploy.prepare(task)
|
||||
func_prepare_node_for_deploy.assert_called_once_with(task)
|
||||
agent_prepare_mock.assert_called_once_with(mock.ANY, task)
|
||||
|
||||
@mock.patch.object(agent.AgentDeploy, 'prepare', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(ilo_boot, 'prepare_node_for_deploy', spec_set=True,
|
||||
autospec=True)
|
||||
def test_prepare_active_node(self,
|
||||
func_prepare_node_for_deploy,
|
||||
agent_prepare_mock):
|
||||
"""Ensure nodes in running states are not inadvertently changed"""
|
||||
test_states = list(states.STABLE_STATES)
|
||||
test_states.extend([states.CLEANING,
|
||||
states.CLEANWAIT,
|
||||
states.INSPECTING])
|
||||
for state in test_states:
|
||||
self.node.provision_state = state
|
||||
self.node.save()
|
||||
func_prepare_node_for_deploy.reset_mock()
|
||||
agent_prepare_mock.reset_mock()
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
task.driver.deploy.prepare(task)
|
||||
self.assertFalse(func_prepare_node_for_deploy.called)
|
||||
agent_prepare_mock.assert_called_once_with(mock.ANY, task)
|
||||
|
||||
@mock.patch.object(agent.AgentDeploy, 'prepare_cleaning', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(manager_utils, 'node_power_action', spec_set=True,
|
||||
autospec=True)
|
||||
def test_prepare_cleaning(self, node_power_action_mock,
|
||||
agent_prep_clean_mock):
|
||||
agent_prep_clean_mock.return_value = states.CLEANWAIT
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
ret = task.driver.deploy.prepare_cleaning(task)
|
||||
self.assertEqual(states.CLEANWAIT, ret)
|
||||
node_power_action_mock.assert_called_once_with(task,
|
||||
states.POWER_OFF)
|
||||
agent_prep_clean_mock.assert_called_once_with(mock.ANY, task)
|
||||
|
||||
@mock.patch.object(agent.AgentDeploy, 'reboot_to_instance',
|
||||
spec_set=True, autospec=True)
|
||||
@mock.patch.object(agent.AgentDeploy, 'check_deploy_success',
|
||||
spec_set=True, autospec=True)
|
||||
@mock.patch.object(ilo_common, 'update_boot_mode', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(ilo_common, 'update_secure_boot_mode', spec_set=True,
|
||||
autospec=True)
|
||||
def test_reboot_to_instance(self, func_update_secure_boot_mode,
|
||||
func_update_boot_mode,
|
||||
check_deploy_success_mock,
|
||||
agent_reboot_to_instance_mock):
|
||||
check_deploy_success_mock.return_value = None
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
task.driver.deploy.reboot_to_instance(task)
|
||||
check_deploy_success_mock.assert_called_once_with(
|
||||
mock.ANY, 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(
|
||||
mock.ANY, task)
|
||||
|
||||
@mock.patch.object(agent.AgentDeploy, 'reboot_to_instance',
|
||||
spec_set=True, autospec=True)
|
||||
@mock.patch.object(agent.AgentDeploy, 'check_deploy_success',
|
||||
spec_set=True, autospec=True)
|
||||
@mock.patch.object(ilo_common, 'update_boot_mode', spec_set=True,
|
||||
autospec=True)
|
||||
@mock.patch.object(ilo_common, 'update_secure_boot_mode', spec_set=True,
|
||||
autospec=True)
|
||||
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):
|
||||
check_deploy_success_mock.return_value = "Error"
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
task.driver.deploy.reboot_to_instance(task)
|
||||
check_deploy_success_mock.assert_called_once_with(
|
||||
mock.ANY, 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(
|
||||
mock.ANY, task)
|
||||
|
||||
|
||||
class IloPXEDeployTestCase(db_base.DbTestCase):
|
||||
|
||||
def setUp(self):
|
||||
|
|
|
@ -24,11 +24,11 @@ from ironic.drivers import ilo
|
|||
from ironic.drivers.modules import agent
|
||||
from ironic.drivers.modules.ilo import boot
|
||||
from ironic.drivers.modules.ilo import console
|
||||
from ironic.drivers.modules.ilo import deploy
|
||||
from ironic.drivers.modules.ilo import inspect
|
||||
from ironic.drivers.modules.ilo import management
|
||||
from ironic.drivers.modules.ilo import power
|
||||
from ironic.drivers.modules.ilo import vendor
|
||||
from ironic.drivers.modules import iscsi_deploy
|
||||
|
||||
|
||||
@mock.patch.object(ilo.importutils, 'try_import', spec_set=True,
|
||||
|
@ -42,7 +42,7 @@ class IloVirtualMediaIscsiDriversTestCase(testtools.TestCase):
|
|||
|
||||
self.assertIsInstance(driver.power, power.IloPower)
|
||||
self.assertIsInstance(driver.boot, boot.IloVirtualMediaBoot)
|
||||
self.assertIsInstance(driver.deploy, deploy.IloVirtualMediaIscsiDeploy)
|
||||
self.assertIsInstance(driver.deploy, iscsi_deploy.ISCSIDeploy)
|
||||
self.assertIsInstance(driver.console, console.IloConsoleInterface)
|
||||
self.assertIsInstance(driver.management, management.IloManagement)
|
||||
self.assertIsInstance(driver.vendor, vendor.VendorPassthru)
|
||||
|
@ -67,7 +67,7 @@ class IloVirtualMediaAgentDriversTestCase(testtools.TestCase):
|
|||
|
||||
self.assertIsInstance(driver.power, power.IloPower)
|
||||
self.assertIsInstance(driver.boot, boot.IloVirtualMediaBoot)
|
||||
self.assertIsInstance(driver.deploy, deploy.IloVirtualMediaAgentDeploy)
|
||||
self.assertIsInstance(driver.deploy, agent.AgentDeploy)
|
||||
self.assertIsInstance(driver.console, console.IloConsoleInterface)
|
||||
self.assertIsInstance(driver.management, management.IloManagement)
|
||||
self.assertIsInstance(driver.inspect, inspect.IloInspect)
|
||||
|
|
Loading…
Reference in New Issue