Merge "Use driver_internal_info methods for driver utils"
This commit is contained in:
commit
a346ee4d7f
|
@ -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
|
||||||
|
|
|
@ -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 "
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue