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

View File

@@ -164,20 +164,20 @@
# Options defined in oslo.log # Options defined in oslo.log
# #
# Print debugging output (set logging level to DEBUG instead # If set to true, the logging level will be set to DEBUG
# of default INFO level). (boolean value) # instead of the default INFO level. (boolean value)
#debug=false #debug=false
# If set to false, will disable INFO logging level, making # If set to false, the logging level will be set to WARNING
# WARNING the default. (boolean value) # instead of the default INFO level. (boolean value)
#verbose=true #verbose=true
# The name of a logging configuration file. This file is # The name of a logging configuration file. This file is
# appended to any existing logging configuration files. For # appended to any existing logging configuration files. For
# details about logging configuration files, see the Python # details about logging configuration files, see the Python
# logging module documentation. Note that when logging # logging module documentation. Note that when logging
# configuration files are used then all logging configuration # configuration files are used all logging configuration is
# is set in the configuration file and other logging # defined in the configuration file and other logging
# configuration options are ignored (for example, log_format). # configuration options are ignored (for example, log_format).
# (string value) # (string value)
# Deprecated group/name - [DEFAULT]/log_config # Deprecated group/name - [DEFAULT]/log_config
@@ -191,29 +191,30 @@
# ignored if log_config_append is set. (string value) # ignored if log_config_append is set. (string value)
#log_format=<None> #log_format=<None>
# Format string for %%(asctime)s in log records. Default: # Defines the format string for %%(asctime)s in log records.
# %(default)s . This option is ignored if log_config_append is # Default: %(default)s . This option is ignored if
# set. (string value) # log_config_append is set. (string value)
#log_date_format=%Y-%m-%d %H:%M:%S #log_date_format=%Y-%m-%d %H:%M:%S
# (Optional) Name of log file to output to. If no default is # (Optional) Name of log file to send logging output to. If no
# set, logging will go to stdout. This option is ignored if # default is set, logging will go to stderr as defined by
# log_config_append is set. (string value) # use_stderr. This option is ignored if log_config_append is
# set. (string value)
# Deprecated group/name - [DEFAULT]/logfile # Deprecated group/name - [DEFAULT]/logfile
#log_file=<None> #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. # paths. This option is ignored if log_config_append is set.
# (string value) # (string value)
# Deprecated group/name - [DEFAULT]/logdir # Deprecated group/name - [DEFAULT]/logdir
#log_dir=<None> #log_dir=<None>
# (Optional) Uses logging handler designed to watch file # Uses logging handler designed to watch file system. When log
# system. When log file is moved or removed this handler will # file is moved or removed this handler will open a new log
# open a new log file with specified path instantaneously. It # file with specified path instantaneously. It makes sense
# makes sense only if log-file option is specified and Linux # only if log_file option is specified and Linux platform is
# platform is used. This option is ignored if # used. This option is ignored if log_config_append is set.
# log_config_append is set. (boolean value) # (boolean value)
#watch_log_file=false #watch_log_file=false
# Use syslog for logging. Existing syslog format is DEPRECATED # Use syslog for logging. Existing syslog format is DEPRECATED
@@ -221,11 +222,11 @@
# ignored if log_config_append is set. (boolean value) # ignored if log_config_append is set. (boolean value)
#use_syslog=false #use_syslog=false
# (Optional) Enables or disables syslog rfc5424 format for # Enables or disables syslog rfc5424 format for logging. If
# logging. If enabled, prefixes the MSG part of the syslog # enabled, prefixes the MSG part of the syslog message with
# message with APP-NAME (RFC5424). The format without the APP- # APP-NAME (RFC5424). The format without the APP-NAME is
# NAME is deprecated in Kilo, and will be removed in Mitaka, # deprecated in Kilo, and will be removed in Mitaka, along
# along with this option. This option is ignored if # with this option. This option is ignored if
# log_config_append is set. (boolean value) # log_config_append is set. (boolean value)
#use_syslog_rfc_format=true #use_syslog_rfc_format=true
@@ -241,20 +242,24 @@
# value) # 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 #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. # Format string to use for log messages when context is
# (string value) # undefined. (string value)
#logging_default_format_string=%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s #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 # Additional data to append to log message when logging level
# value) # for the message is DEBUG. (string value)
#logging_debug_format_suffix=%(funcName)s %(pathname)s:%(lineno)d #logging_debug_format_suffix=%(funcName)s %(pathname)s:%(lineno)d
# Prefix each line of exception output with this format. # Prefix each line of exception output with this format.
# (string value) # (string value)
#logging_exception_prefix=%(asctime)s.%(msecs)03d %(process)d ERROR %(name)s %(instance)s #logging_exception_prefix=%(asctime)s.%(msecs)03d %(process)d ERROR %(name)s %(instance)s
# List of logger=LEVEL pairs. This option is ignored if # Defines the format string for %(user_identity)s that is used
# log_config_append is set. (list value) # 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 #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 # Enables or disables publication of error events. (boolean
@@ -269,10 +274,6 @@
# message. (string value) # message. (string value)
#instance_uuid_format="[instance: %(uuid)s] " #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 # Enables or disables fatal status of deprecations. (boolean
# value) # value)
#fatal_deprecations=false #fatal_deprecations=false
@@ -682,11 +683,12 @@
# unlimited. (integer value) # unlimited. (integer value)
#inspect_timeout=1800 #inspect_timeout=1800
# Cleaning is a configurable set of steps, such as erasing # Enables or disables automated cleaning. Automated cleaning
# disk drives, that are performed on the node to ensure it is # is a configurable set of steps, such as erasing disk drives,
# in a baseline state and ready to be deployed to. This is # that are performed on the node to ensure it is in a baseline
# done after instance deletion, and during the transition from # state and ready to be deployed to. This is done after
# a "managed" to "available" state. When enabled, the # 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 # particular steps performed to clean a node depend on which
# driver that node is managed by; see the individual driver's # driver that node is managed by; see the individual driver's
# documentation for details. NOTE: The introduction of the # documentation for details. NOTE: The introduction of the
@@ -694,7 +696,8 @@
# significantly longer. In an environment where all tenants # significantly longer. In an environment where all tenants
# are trusted (eg, because there is only one tenant), this # are trusted (eg, because there is only one tenant), this
# option could be safely disabled. (boolean value) # 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 # Timeout (seconds) to wait for a callback from the ramdisk
# doing the cleaning. If the timeout is reached the node will # doing the cleaning. If the timeout is reached the node will
@@ -1397,13 +1400,12 @@
#revocation_cache_time=10 #revocation_cache_time=10
# (Optional) If defined, indicate whether token data should be # (Optional) If defined, indicate whether token data should be
# authenticated or authenticated and encrypted. Acceptable # authenticated or authenticated and encrypted. If MAC, token
# values are MAC or ENCRYPT. If MAC, token data is # data is authenticated (with HMAC) in the cache. If ENCRYPT,
# authenticated (with HMAC) in the cache. If ENCRYPT, token # token data is encrypted and authenticated in the cache. If
# data is encrypted and authenticated in the cache. If the # the value is not one of these options or empty, auth_token
# value is not one of these options or empty, auth_token will # will raise an exception on initialization. (string value)
# raise an exception on initialization. (string value) #memcache_security_strategy=None
#memcache_security_strategy=<None>
# (Optional, mandatory if memcache_security_strategy is # (Optional, mandatory if memcache_security_strategy is
# defined) This string is used for key derivation. (string # defined) This string is used for key derivation. (string
@@ -1470,44 +1472,6 @@
# (list value) # (list value)
#hash_algorithms=md5 #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) # Authentication type to load (type of value is unknown)
# Deprecated group/name - [keystone_authtoken]/auth_plugin # Deprecated group/name - [keystone_authtoken]/auth_plugin
#auth_type=<None> #auth_type=<None>

View File

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

View File

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