Merge "Use driver_internal_info methods for driver utils"

This commit is contained in:
Zuul 2022-01-10 17:33:07 +00:00 committed by Gerrit Code Review
commit a346ee4d7f
4 changed files with 72 additions and 87 deletions

View File

@ -21,7 +21,6 @@ import collections
from ironic_lib import metrics_utils from ironic_lib import metrics_utils
from oslo_log import log from oslo_log import log
from oslo_utils import strutils from oslo_utils import strutils
from oslo_utils import timeutils
import tenacity import tenacity
from ironic.common import boot_devices from ironic.common import boot_devices
@ -209,15 +208,15 @@ def _post_step_reboot(task, step_type):
return return
# Signify that we've rebooted # Signify that we've rebooted
driver_internal_info = task.node.driver_internal_info if step_type == 'clean':
field = ('cleaning_reboot' if step_type == 'clean' task.node.set_driver_internal_info('cleaning_reboot', True)
else 'deployment_reboot') else:
driver_internal_info[field] = True task.node.set_driver_internal_info('deployment_reboot', True)
if not driver_internal_info.get('agent_secret_token_pregenerated', False): if not task.node.driver_internal_info.get(
'agent_secret_token_pregenerated', False):
# Wipes out the existing recorded token because the machine will # Wipes out the existing recorded token because the machine will
# need to re-establish the token. # need to re-establish the token.
driver_internal_info.pop('agent_secret_token', None) task.node.del_driver_internal_info('agent_secret_token')
task.node.driver_internal_info = driver_internal_info
task.node.save() task.node.save()
@ -591,22 +590,17 @@ class HeartbeatMixin(object):
node = task.node node = task.node
LOG.debug('Heartbeat from node %s in state %s (target state %s)', LOG.debug('Heartbeat from node %s in state %s (target state %s)',
node.uuid, node.provision_state, node.target_provision_state) node.uuid, node.provision_state, node.target_provision_state)
driver_internal_info = node.driver_internal_info node.set_driver_internal_info('agent_url', callback_url)
driver_internal_info['agent_url'] = callback_url node.set_driver_internal_info('agent_version', agent_version)
driver_internal_info['agent_version'] = agent_version # Record the last heartbeat event time
# Record the last heartbeat event time in UTC, so we can make node.timestamp_driver_internal_info('agent_last_heartbeat')
# decisions about it later. Can be decoded to datetime object with:
# datetime.datetime.strptime(var, "%Y-%m-%d %H:%M:%S.%f")
driver_internal_info['agent_last_heartbeat'] = str(
timeutils.utcnow().isoformat())
if agent_verify_ca: if agent_verify_ca:
driver_internal_info['agent_verify_ca'] = agent_verify_ca node.set_driver_internal_info('agent_verify_ca', agent_verify_ca)
if agent_status: if agent_status:
driver_internal_info['agent_status'] = agent_status node.set_driver_internal_info('agent_status', agent_status)
if agent_status_message: if agent_status_message:
driver_internal_info['agent_status_message'] = \ node.set_driver_internal_info('agent_status_message',
agent_status_message agent_status_message)
node.driver_internal_info = driver_internal_info
node.save() node.save()
if node.provision_state in _HEARTBEAT_RECORD_ONLY: if node.provision_state in _HEARTBEAT_RECORD_ONLY:
@ -840,13 +834,12 @@ class AgentBaseMixin(object):
steps[step['interface']].append(step) steps[step['interface']].append(step)
# Save hardware manager version, steps, and date # Save hardware manager version, steps, and date
info = node.driver_internal_info node.set_driver_internal_info('hardware_manager_version',
info['hardware_manager_version'] = agent_result[ agent_result['hardware_manager_version'])
'hardware_manager_version'] node.set_driver_internal_info('agent_cached_%s_steps' % step_type,
info['agent_cached_%s_steps' % step_type] = dict(steps) dict(steps))
info['agent_cached_%s_steps_refreshed' % step_type] = str( node.timestamp_driver_internal_info(
timeutils.utcnow()) 'agent_cached_%s_steps_refreshed' % step_type)
node.driver_internal_info = info
node.save() node.save()
LOG.debug('Refreshed agent %(type)s step cache for node %(node)s: ' LOG.debug('Refreshed agent %(type)s step cache for node %(node)s: '
'%(steps)s', {'node': node.uuid, 'steps': steps, '%(steps)s', {'node': node.uuid, 'steps': steps,
@ -896,9 +889,7 @@ class AgentBaseMixin(object):
'continuing from current step %(step)s.', 'continuing from current step %(step)s.',
{'node': node.uuid, 'step': node.clean_step}) {'node': node.uuid, 'step': node.clean_step})
driver_internal_info = node.driver_internal_info node.set_driver_internal_info('skip_current_clean_step', False)
driver_internal_info['skip_current_clean_step'] = False
node.driver_internal_info = driver_internal_info
node.save() node.save()
else: else:
# Restart the process, agent must have rebooted to new version # Restart the process, agent must have rebooted to new version

View File

@ -110,10 +110,8 @@ def sync_boot_mode(task):
# the new boot mode may be set in 'driver_internal_info/deploy_boot_mode' # the new boot mode may be set in 'driver_internal_info/deploy_boot_mode'
if not ironic_boot_mode and not bm_boot_mode: if not ironic_boot_mode and not bm_boot_mode:
driver_internal_info = node.driver_internal_info
default_boot_mode = CONF.deploy.default_boot_mode default_boot_mode = CONF.deploy.default_boot_mode
driver_internal_info['deploy_boot_mode'] = default_boot_mode node.set_driver_internal_info('deploy_boot_mode', default_boot_mode)
node.driver_internal_info = driver_internal_info
node.save() node.save()
LOG.debug("Ironic node %(uuid)s boot mode will be set to default " LOG.debug("Ironic node %(uuid)s boot mode will be set to default "
@ -123,9 +121,7 @@ def sync_boot_mode(task):
_set_boot_mode_on_bm(task, default_boot_mode) _set_boot_mode_on_bm(task, default_boot_mode)
elif not ironic_boot_mode and bm_boot_mode: elif not ironic_boot_mode and bm_boot_mode:
driver_internal_info = node.driver_internal_info node.set_driver_internal_info('deploy_boot_mode', bm_boot_mode)
driver_internal_info['deploy_boot_mode'] = bm_boot_mode
node.driver_internal_info = driver_internal_info
node.save() node.save()
LOG.debug("Ironic node %(uuid)s boot mode is set to boot mode " LOG.debug("Ironic node %(uuid)s boot mode is set to boot mode "

View File

@ -306,30 +306,36 @@ def agent_add_clean_params(task):
:param task: a TaskManager instance. :param task: a TaskManager instance.
""" """
info = task.node.driver_internal_info
random_iterations = CONF.deploy.shred_random_overwrite_iterations random_iterations = CONF.deploy.shred_random_overwrite_iterations
info['agent_erase_devices_iterations'] = random_iterations node = task.node
node.set_driver_internal_info('agent_erase_devices_iterations',
random_iterations)
zeroize = CONF.deploy.shred_final_overwrite_with_zeros zeroize = CONF.deploy.shred_final_overwrite_with_zeros
info['agent_erase_devices_zeroize'] = zeroize node.set_driver_internal_info('agent_erase_devices_zeroize', zeroize)
erase_fallback = CONF.deploy.continue_if_disk_secure_erase_fails erase_fallback = CONF.deploy.continue_if_disk_secure_erase_fails
info['agent_continue_if_secure_erase_failed'] = erase_fallback node.set_driver_internal_info('agent_continue_if_secure_erase_failed',
erase_fallback)
# NOTE(janders) ``agent_continue_if_ata_erase_failed`` is deprecated and # NOTE(janders) ``agent_continue_if_ata_erase_failed`` is deprecated and
# will be removed in the "Y" cycle. The replacement option # will be removed in the "Y" cycle. The replacement option
# ``agent_continue_if_secure_erase_failed`` is used to control shred # ``agent_continue_if_secure_erase_failed`` is used to control shred
# fallback for both ATA Secure Erase and NVMe Secure Erase. # fallback for both ATA Secure Erase and NVMe Secure Erase.
# The ``agent_continue_if_ata_erase_failed`` line can # The ``agent_continue_if_ata_erase_failed`` line can
# be deleted along with this comment when support for it is fully removed. # be deleted along with this comment when support for it is fully removed.
info['agent_continue_if_ata_erase_failed'] = erase_fallback node.set_driver_internal_info('agent_continue_if_ata_erase_failed',
erase_fallback)
nvme_secure_erase = CONF.deploy.enable_nvme_secure_erase nvme_secure_erase = CONF.deploy.enable_nvme_secure_erase
info['agent_enable_nvme_secure_erase'] = nvme_secure_erase node.set_driver_internal_info('agent_enable_nvme_secure_erase',
nvme_secure_erase)
secure_erase = CONF.deploy.enable_ata_secure_erase secure_erase = CONF.deploy.enable_ata_secure_erase
info['agent_enable_ata_secure_erase'] = secure_erase node.set_driver_internal_info('agent_enable_ata_secure_erase',
info['disk_erasure_concurrency'] = CONF.deploy.disk_erasure_concurrency secure_erase)
info['agent_erase_skip_read_only'] = CONF.deploy.erase_skip_read_only node.set_driver_internal_info('disk_erasure_concurrency',
CONF.deploy.disk_erasure_concurrency)
node.set_driver_internal_info('agent_erase_skip_read_only',
CONF.deploy.erase_skip_read_only)
task.node.driver_internal_info = info node.save()
task.node.save()
def try_set_boot_device(task, device, persistent=True): def try_set_boot_device(task, device, persistent=True):
@ -922,13 +928,12 @@ def _check_disk_layout_unchanged(node, i_info):
""" """
# If a node has been deployed to, this is the instance information # If a node has been deployed to, this is the instance information
# used for that deployment. # used for that deployment.
driver_internal_info = node.driver_internal_info if 'instance' not in node.driver_internal_info:
if 'instance' not in driver_internal_info:
return return
error_msg = '' error_msg = ''
for param in DISK_LAYOUT_PARAMS: for param in DISK_LAYOUT_PARAMS:
param_value = int(driver_internal_info['instance'][param]) param_value = int(node.driver_internal_info['instance'][param])
if param_value != int(i_info[param]): if param_value != int(i_info[param]):
error_msg += (_(' Deployed value of %(param)s was %(param_value)s ' error_msg += (_(' Deployed value of %(param)s was %(param_value)s '
'but requested value is %(request_value)s.') % 'but requested value is %(request_value)s.') %
@ -1271,19 +1276,17 @@ def populate_storage_driver_internal_info(task):
boot_capability = ("%s_volume_boot" % vol_type) boot_capability = ("%s_volume_boot" % vol_type)
deploy_capability = ("%s_volume_deploy" % vol_type) deploy_capability = ("%s_volume_deploy" % vol_type)
vol_uuid = boot_volume['uuid'] vol_uuid = boot_volume['uuid']
driver_internal_info = node.driver_internal_info
if check_interface_capability(task.driver.boot, boot_capability): if check_interface_capability(task.driver.boot, boot_capability):
driver_internal_info['boot_from_volume'] = vol_uuid node.set_driver_internal_info('boot_from_volume', vol_uuid)
# NOTE(TheJulia): This would be a convenient place to check # NOTE(TheJulia): This would be a convenient place to check
# if we need to know about deploying the volume. # if we need to know about deploying the volume.
if (check_interface_capability(task.driver.deploy, deploy_capability) if (check_interface_capability(task.driver.deploy, deploy_capability)
and task.driver.storage.should_write_image(task)): and task.driver.storage.should_write_image(task)):
driver_internal_info['boot_from_volume_deploy'] = vol_uuid node.set_driver_internal_info('boot_from_volume_deploy', vol_uuid)
# NOTE(TheJulia): This is also a useful place to include a # NOTE(TheJulia): This is also a useful place to include a
# root device hint since we should/might/be able to obtain # root device hint since we should/might/be able to obtain
# and supply that information to IPA if it needs to write # and supply that information to IPA if it needs to write
# the image to the volume. # the image to the volume.
node.driver_internal_info = driver_internal_info
node.save() node.save()
@ -1305,10 +1308,8 @@ def tear_down_storage_configuration(task):
{'target': volume.uuid, 'node': task.node.uuid}) {'target': volume.uuid, 'node': task.node.uuid})
node = task.node node = task.node
driver_internal_info = node.driver_internal_info node.del_driver_internal_info('boot_from_volume')
driver_internal_info.pop('boot_from_volume', None) node.del_driver_internal_info('boot_from_volume_deploy')
driver_internal_info.pop('boot_from_volume_deploy', None)
node.driver_internal_info = driver_internal_info
node.save() node.save()
@ -1346,7 +1347,7 @@ def get_async_step_return_state(node):
return states.CLEANWAIT if node.clean_step else states.DEPLOYWAIT return states.CLEANWAIT if node.clean_step else states.DEPLOYWAIT
def _check_agent_token_prior_to_agent_reboot(driver_internal_info): def _check_agent_token_prior_to_agent_reboot(node):
"""Removes the agent token if it was not pregenerated. """Removes the agent token if it was not pregenerated.
Removal of the agent token in cases where it is not pregenerated Removal of the agent token in cases where it is not pregenerated
@ -1357,11 +1358,11 @@ def _check_agent_token_prior_to_agent_reboot(driver_internal_info):
already included in the payload and must be generated again already included in the payload and must be generated again
upon lookup. upon lookup.
:param driver_internal_info: The driver_interal_info dict object :param node: The Node object.
from a Node object.
""" """
if not driver_internal_info.get('agent_secret_token_pregenerated', False): if not node.driver_internal_info.get('agent_secret_token_pregenerated',
driver_internal_info.pop('agent_secret_token', None) False):
node.del_driver_internal_info('agent_secret_token')
def set_async_step_flags(node, reboot=None, skip_current_step=None, def set_async_step_flags(node, reboot=None, skip_current_step=None,
@ -1383,25 +1384,25 @@ def set_async_step_flags(node, reboot=None, skip_current_step=None,
corresponding polling flag is not set in the node's corresponding polling flag is not set in the node's
driver_internal_info. driver_internal_info.
""" """
info = node.driver_internal_info if node.clean_step:
cleaning = {'reboot': 'cleaning_reboot', reboot_field = 'cleaning_reboot'
'skip': 'skip_current_clean_step', skip_field = 'skip_current_clean_step'
'polling': 'cleaning_polling'} polling_field = 'cleaning_polling'
deployment = {'reboot': 'deployment_reboot', else:
'skip': 'skip_current_deploy_step', reboot_field = 'deployment_reboot'
'polling': 'deployment_polling'} skip_field = 'skip_current_deploy_step'
fields = cleaning if node.clean_step else deployment polling_field = 'deployment_polling'
if reboot is not None: if reboot is not None:
info[fields['reboot']] = reboot node.set_driver_internal_info(reboot_field, reboot)
if reboot: if reboot:
# If rebooting, we must ensure that we check and remove # If rebooting, we must ensure that we check and remove
# an agent token if necessary. # an agent token if necessary.
_check_agent_token_prior_to_agent_reboot(info) _check_agent_token_prior_to_agent_reboot(node)
if skip_current_step is not None: if skip_current_step is not None:
info[fields['skip']] = skip_current_step node.set_driver_internal_info(skip_field, skip_current_step)
if polling is not None: if polling is not None:
info[fields['polling']] = polling node.set_driver_internal_info(polling_field, polling)
node.driver_internal_info = info
node.save() node.save()

View File

@ -194,13 +194,12 @@ def ensure_next_boot_device(task, driver_info):
""" """
ifbd = driver_info.get('force_boot_device', False) ifbd = driver_info.get('force_boot_device', False)
if strutils.bool_from_string(ifbd): if strutils.bool_from_string(ifbd):
driver_internal_info = task.node.driver_internal_info info = task.node.driver_internal_info
if driver_internal_info.get('is_next_boot_persistent') is False: if info.get('is_next_boot_persistent') is False:
driver_internal_info.pop('is_next_boot_persistent', None) task.node.del_driver_internal_info('is_next_boot_persistent')
task.node.driver_internal_info = driver_internal_info
task.node.save() task.node.save()
else: else:
boot_device = driver_internal_info.get('persistent_boot_device') boot_device = info.get('persistent_boot_device')
if boot_device: if boot_device:
utils.node_set_boot_device(task, boot_device) utils.node_set_boot_device(task, boot_device)
@ -218,14 +217,12 @@ def force_persistent_boot(task, device, persistent):
""" """
node = task.node node = task.node
driver_internal_info = node.driver_internal_info
if persistent: if persistent:
driver_internal_info.pop('is_next_boot_persistent', None) node.del_driver_internal_info('is_next_boot_persistent')
driver_internal_info['persistent_boot_device'] = device node.set_driver_internal_info('persistent_boot_device', device)
else: else:
driver_internal_info['is_next_boot_persistent'] = False node.set_driver_internal_info('is_next_boot_persistent', False)
node.driver_internal_info = driver_internal_info
node.save() node.save()