diff --git a/doc/source/deploy/cleaning.rst b/doc/source/deploy/cleaning.rst index 8b4cf23458..ad61168d60 100644 --- a/doc/source/deploy/cleaning.rst +++ b/doc/source/deploy/cleaning.rst @@ -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 diff --git a/etc/ironic/ironic.conf.sample b/etc/ironic/ironic.conf.sample index e45ffe516e..60f180b66e 100644 --- a/etc/ironic/ironic.conf.sample +++ b/etc/ironic/ironic.conf.sample @@ -683,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 @@ -695,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 diff --git a/ironic/conductor/manager.py b/ironic/conductor/manager.py index 7c03815ab8..77c26dce24 100644 --- a/ironic/conductor/manager.py +++ b/ironic/conductor/manager.py @@ -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() diff --git a/ironic/tests/unit/conductor/test_manager.py b/ironic/tests/unit/conductor/test_manager.py index 0ed5048994..022cdf6fc1 100644 --- a/ironic/tests/unit/conductor/test_manager.py +++ b/ironic/tests/unit/conductor/test_manager.py @@ -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: diff --git a/releasenotes/notes/automated_clean_config-0170c95ae210f953.yaml b/releasenotes/notes/automated_clean_config-0170c95ae210f953.yaml new file mode 100644 index 0000000000..6acfdbfa76 --- /dev/null +++ b/releasenotes/notes/automated_clean_config-0170c95ae210f953.yaml @@ -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.