Replace config 'clean_nodes' with 'automated_clean'

Since we have automated cleaning and manual cleaning, the config
'clean_nodes' is a bit confusing since it only refers to automated
cleaning. It is replaced with 'automated_clean'.

This deprecates the 'clean_nodes' config; the plan is to delete it
in Newton cycle.

Updates to the documentation to explicitly mention automated vs
manual cleaning is done in a separate patch.

This includes a reno-style release note about the upgrade impact.

Change-Id: I5b4fbac1753cb4213eb151b663490f381b751597
Partial-Bug: #1526290
This commit is contained in:
Ruby Loo 2015-11-19 17:38:32 +00:00
parent c9f96d6d79
commit 9220cbd385
5 changed files with 69 additions and 100 deletions

View File

@ -28,7 +28,7 @@ Enabling cleaning
To enable cleaning, ensure your ironic.conf is set as follows: ::
[conductor]
clean_nodes=true
automated_clean=true
This will enable the default set of steps, based on your hardware and ironic
drivers. If you're using an agent_* driver, this includes, by default, erasing

View File

@ -164,20 +164,20 @@
# Options defined in oslo.log
#
# Print debugging output (set logging level to DEBUG instead
# of default INFO level). (boolean value)
# If set to true, the logging level will be set to DEBUG
# instead of the default INFO level. (boolean value)
#debug=false
# If set to false, will disable INFO logging level, making
# WARNING the default. (boolean value)
# If set to false, the logging level will be set to WARNING
# instead of the default INFO level. (boolean value)
#verbose=true
# The name of a logging configuration file. This file is
# appended to any existing logging configuration files. For
# details about logging configuration files, see the Python
# logging module documentation. Note that when logging
# configuration files are used then all logging configuration
# is set in the configuration file and other logging
# configuration files are used all logging configuration is
# defined in the configuration file and other logging
# configuration options are ignored (for example, log_format).
# (string value)
# Deprecated group/name - [DEFAULT]/log_config
@ -191,29 +191,30 @@
# ignored if log_config_append is set. (string value)
#log_format=<None>
# Format string for %%(asctime)s in log records. Default:
# %(default)s . This option is ignored if log_config_append is
# set. (string value)
# Defines the format string for %%(asctime)s in log records.
# Default: %(default)s . This option is ignored if
# log_config_append is set. (string value)
#log_date_format=%Y-%m-%d %H:%M:%S
# (Optional) Name of log file to output to. If no default is
# set, logging will go to stdout. This option is ignored if
# log_config_append is set. (string value)
# (Optional) Name of log file to send logging output to. If no
# default is set, logging will go to stderr as defined by
# use_stderr. This option is ignored if log_config_append is
# set. (string value)
# Deprecated group/name - [DEFAULT]/logfile
#log_file=<None>
# (Optional) The base directory used for relative --log-file
# (Optional) The base directory used for relative log_file
# paths. This option is ignored if log_config_append is set.
# (string value)
# Deprecated group/name - [DEFAULT]/logdir
#log_dir=<None>
# (Optional) Uses logging handler designed to watch file
# system. When log file is moved or removed this handler will
# open a new log file with specified path instantaneously. It
# makes sense only if log-file option is specified and Linux
# platform is used. This option is ignored if
# log_config_append is set. (boolean value)
# Uses logging handler designed to watch file system. When log
# file is moved or removed this handler will open a new log
# file with specified path instantaneously. It makes sense
# only if log_file option is specified and Linux platform is
# used. This option is ignored if log_config_append is set.
# (boolean value)
#watch_log_file=false
# Use syslog for logging. Existing syslog format is DEPRECATED
@ -221,11 +222,11 @@
# ignored if log_config_append is set. (boolean value)
#use_syslog=false
# (Optional) Enables or disables syslog rfc5424 format for
# logging. If enabled, prefixes the MSG part of the syslog
# message with APP-NAME (RFC5424). The format without the APP-
# NAME is deprecated in Kilo, and will be removed in Mitaka,
# along with this option. This option is ignored if
# Enables or disables syslog rfc5424 format for logging. If
# enabled, prefixes the MSG part of the syslog message with
# APP-NAME (RFC5424). The format without the APP-NAME is
# deprecated in Kilo, and will be removed in Mitaka, along
# with this option. This option is ignored if
# log_config_append is set. (boolean value)
#use_syslog_rfc_format=true
@ -241,20 +242,24 @@
# value)
#logging_context_format_string=%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s
# Format string to use for log messages without context.
# (string value)
# Format string to use for log messages when context is
# undefined. (string value)
#logging_default_format_string=%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s
# Data to append to log format when level is DEBUG. (string
# value)
# Additional data to append to log message when logging level
# for the message is DEBUG. (string value)
#logging_debug_format_suffix=%(funcName)s %(pathname)s:%(lineno)d
# Prefix each line of exception output with this format.
# (string value)
#logging_exception_prefix=%(asctime)s.%(msecs)03d %(process)d ERROR %(name)s %(instance)s
# List of logger=LEVEL pairs. This option is ignored if
# log_config_append is set. (list value)
# Defines the format string for %(user_identity)s that is used
# in logging_context_format_string. (string value)
#logging_user_identity_format=%(user)s %(tenant)s %(domain)s %(user_domain)s %(project_domain)s
# List of package logging levels in logger=LEVEL pairs. This
# option is ignored if log_config_append is set. (list value)
#default_log_levels=amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN,taskflow=WARN,keystoneauth=WARN
# Enables or disables publication of error events. (boolean
@ -269,10 +274,6 @@
# message. (string value)
#instance_uuid_format="[instance: %(uuid)s] "
# Format string for user_identity field of the
# logging_context_format_string (string value)
#logging_user_identity_format=%(user)s %(tenant)s %(domain)s %(user_domain)s %(project_domain)s
# Enables or disables fatal status of deprecations. (boolean
# value)
#fatal_deprecations=false
@ -682,11 +683,12 @@
# unlimited. (integer value)
#inspect_timeout=1800
# Cleaning is a configurable set of steps, such as erasing
# disk drives, that are performed on the node to ensure it is
# in a baseline state and ready to be deployed to. This is
# done after instance deletion, and during the transition from
# a "managed" to "available" state. When enabled, the
# Enables or disables automated cleaning. Automated cleaning
# is a configurable set of steps, such as erasing disk drives,
# that are performed on the node to ensure it is in a baseline
# state and ready to be deployed to. This is done after
# instance deletion as well as during the transition from a
# "manageable" to "available" state. When enabled, the
# particular steps performed to clean a node depend on which
# driver that node is managed by; see the individual driver's
# documentation for details. NOTE: The introduction of the
@ -694,7 +696,8 @@
# significantly longer. In an environment where all tenants
# are trusted (eg, because there is only one tenant), this
# option could be safely disabled. (boolean value)
#clean_nodes=true
# Deprecated group/name - [conductor]/clean_nodes
#automated_clean=true
# Timeout (seconds) to wait for a callback from the ramdisk
# doing the cleaning. If the timeout is reached the node will
@ -1397,13 +1400,12 @@
#revocation_cache_time=10
# (Optional) If defined, indicate whether token data should be
# authenticated or authenticated and encrypted. Acceptable
# values are MAC or ENCRYPT. If MAC, token data is
# authenticated (with HMAC) in the cache. If ENCRYPT, token
# data is encrypted and authenticated in the cache. If the
# value is not one of these options or empty, auth_token will
# raise an exception on initialization. (string value)
#memcache_security_strategy=<None>
# authenticated or authenticated and encrypted. If MAC, token
# data is authenticated (with HMAC) in the cache. If ENCRYPT,
# token data is encrypted and authenticated in the cache. If
# the value is not one of these options or empty, auth_token
# will raise an exception on initialization. (string value)
#memcache_security_strategy=None
# (Optional, mandatory if memcache_security_strategy is
# defined) This string is used for key derivation. (string
@ -1470,44 +1472,6 @@
# (list value)
#hash_algorithms=md5
# Prefix to prepend at the beginning of the path. Deprecated,
# use identity_uri. (string value)
#auth_admin_prefix=
# Host providing the admin Identity API endpoint. Deprecated,
# use identity_uri. (string value)
#auth_host=127.0.0.1
# Port of the admin Identity API endpoint. Deprecated, use
# identity_uri. (integer value)
#auth_port=35357
# Protocol of the admin Identity API endpoint (http or https).
# Deprecated, use identity_uri. (string value)
#auth_protocol=https
# Complete admin Identity API endpoint. This should specify
# the unversioned root endpoint e.g. https://localhost:35357/
# (string value)
#identity_uri=<None>
# This option is deprecated and may be removed in a future
# release. Single shared secret with the Keystone
# configuration used for bootstrapping a Keystone
# installation, or otherwise bypassing the normal
# authentication process. This option should not be used, use
# `admin_user` and `admin_password` instead. (string value)
#admin_token=<None>
# Service username. (string value)
#admin_user=<None>
# Service user password. (string value)
#admin_password=<None>
# Service tenant name. (string value)
#admin_tenant_name=admin
# Authentication type to load (type of value is unknown)
# Deprecated group/name - [keystone_authtoken]/auth_plugin
#auth_type=<None>

View File

@ -151,14 +151,18 @@ conductor_opts = [
default=1800,
help=_('Timeout (seconds) for waiting for node inspection. '
'0 - unlimited.')),
cfg.BoolOpt('clean_nodes',
# TODO(rloo): Remove support for deprecated name 'clean_nodes' in Newton
# cycle.
cfg.BoolOpt('automated_clean',
default=True,
help=_('Cleaning is a configurable set of steps, such as '
'erasing disk drives, that are performed on the node '
'to ensure it is in a baseline state and ready to be '
'deployed to. '
'This is done after instance deletion, and during '
'the transition from a "managed" to "available" '
deprecated_name='clean_nodes',
help=_('Enables or disables automated cleaning. Automated '
'cleaning is a configurable set of steps, '
'such as erasing disk drives, that are performed on '
'the node to ensure it is in a baseline state and '
'ready to be deployed to. This is '
'done after instance deletion as well as during '
'the transition from a "manageable" to "available" '
'state. When enabled, the particular steps '
'performed to clean a node depend on which driver '
'that node is managed by; see the individual '
@ -859,7 +863,7 @@ class ConductorManager(base_manager.BaseConductorManager):
LOG.debug('Starting %(type)s cleaning for node %(node)s',
{'type': clean_type, 'node': node.uuid})
if not manual_clean and not CONF.conductor.clean_nodes:
if not manual_clean and not CONF.conductor.automated_clean:
# Skip cleaning, move to AVAILABLE.
node.clean_step = None
node.save()

View File

@ -1360,7 +1360,7 @@ class DoNodeCleanTestCase(mgr_utils.ServiceSetUpMixin,
tests_db_base.DbTestCase):
def setUp(self):
super(DoNodeCleanTestCase, self).setUp()
self.config(clean_nodes=True, group='conductor')
self.config(automated_clean=True, group='conductor')
self.power_update = {
'step': 'update_firmware', 'priority': 10, 'interface': 'power'}
self.deploy_update = {
@ -1627,7 +1627,6 @@ class DoNodeCleanTestCase(mgr_utils.ServiceSetUpMixin,
@mock.patch('ironic.drivers.modules.fake.FakePower.validate')
def __do_node_clean_validate_fail(self, mock_validate, clean_steps=None):
# InvalidParameterValue should be cause node to go to CLEANFAIL
self.config(clean_nodes=True, group='conductor')
mock_validate.side_effect = exception.InvalidParameterValue('error')
tgt_prov_state = states.MANAGEABLE if clean_steps else states.AVAILABLE
node = obj_utils.create_test_node(
@ -1650,7 +1649,7 @@ class DoNodeCleanTestCase(mgr_utils.ServiceSetUpMixin,
@mock.patch('ironic.drivers.modules.fake.FakePower.validate')
def test__do_node_clean_automated_disabled(self, mock_validate):
self.config(clean_nodes=False, group='conductor')
self.config(automated_clean=False, group='conductor')
node = obj_utils.create_test_node(
self.context, driver='fake',
provision_state=states.CLEANING,
@ -1675,7 +1674,6 @@ class DoNodeCleanTestCase(mgr_utils.ServiceSetUpMixin,
def __do_node_clean_prepare_clean_fail(self, mock_prep, clean_steps=None):
# Exception from task.driver.deploy.prepare_cleaning should cause node
# to go to CLEANFAIL
self.config(clean_nodes=True, group='conductor')
mock_prep.side_effect = exception.InvalidParameterValue('error')
tgt_prov_state = states.MANAGEABLE if clean_steps else states.AVAILABLE
node = obj_utils.create_test_node(
@ -1698,7 +1696,6 @@ class DoNodeCleanTestCase(mgr_utils.ServiceSetUpMixin,
@mock.patch('ironic.drivers.modules.fake.FakeDeploy.prepare_cleaning')
def __do_node_clean_prepare_clean_wait(self, mock_prep, clean_steps=None):
self.config(clean_nodes=True, group='conductor')
mock_prep.return_value = states.CLEANWAIT
tgt_prov_state = states.MANAGEABLE if clean_steps else states.AVAILABLE
node = obj_utils.create_test_node(
@ -1722,7 +1719,6 @@ class DoNodeCleanTestCase(mgr_utils.ServiceSetUpMixin,
@mock.patch.object(conductor_utils, 'set_node_cleaning_steps')
def __do_node_clean_steps_fail(self, mock_steps, clean_steps=None,
invalid_exc=True):
self.config(clean_nodes=True, group='conductor')
if invalid_exc:
mock_steps.side_effect = exception.InvalidParameterValue('invalid')
else:

View File

@ -0,0 +1,5 @@
---
deprecations:
- The [conductor]/clean_nodes config is deprecated and will be removed in the
Newton cycle. It has been replaced by the [conductor]/automated_clean
config.