Do not clean up nodes after the deployment has started

If something fails during provisioning, we need to leave the node
intact for debugging. The undeploy command should be used to clean up.

Change-Id: If4bbeceb0307a4df07dbae912db1d7f69c94e3c5
This commit is contained in:
Dmitry Tantsur 2018-05-28 18:38:48 +02:00
parent f3fb73a5a8
commit 23d44e318c
2 changed files with 22 additions and 10 deletions

View File

@ -258,16 +258,6 @@ class Provisioner(object):
with _utils.config_drive_dir(node, ssh_keys) as cd:
self._api.node_action(node, 'active',
configdrive=cd)
LOG.info('Provisioning started on node %s', _utils.log_node(node))
if wait is not None:
LOG.debug('Waiting for node %(node)s to reach state active '
'with timeout %(timeout)s',
{'node': _utils.log_node(node), 'timeout': wait})
self._api.wait_for_node_state(node, 'active', timeout=wait)
# Update the node to return it's latest state
node = self._api.get_node(node)
except Exception:
exc_info = sys.exc_info()
@ -282,10 +272,19 @@ class Provisioner(object):
six.reraise(*exc_info)
LOG.info('Provisioning started on node %s', _utils.log_node(node))
if wait is not None:
LOG.debug('Waiting for node %(node)s to reach state active '
'with timeout %(timeout)s',
{'node': _utils.log_node(node), 'timeout': wait})
self._api.wait_for_node_state(node, 'active', timeout=wait)
LOG.info('Deploy succeeded on node %s', _utils.log_node(node))
self._log_ips(node, created_ports)
# Update the node to return it's latest state
node = self._api.get_node(node)
return Instance(self._api, node)
def _log_ips(self, node, created_ports):

View File

@ -359,6 +359,19 @@ class TestProvisionNode(Base):
self.api.detach_port_from_node.assert_called_once_with(
self.node, self.api.create_port.return_value.id)
def test_wait_failure(self):
self.api.wait_for_node_state.side_effect = RuntimeError('boom')
self.assertRaisesRegex(RuntimeError, 'boom',
self.pr.provision_node, self.node,
'image', [{'network': 'network'}], wait=3600)
self.api.update_node.assert_called_once_with(self.node, self.updates)
self.api.node_action.assert_called_once_with(self.node, 'active',
configdrive=mock.ANY)
self.assertFalse(self.api.release_node.called)
self.assertFalse(self.api.delete_port.called)
self.assertFalse(self.api.detach_port_from_node.called)
def test_missing_image(self):
self.api.get_image_info.side_effect = RuntimeError('Not found')
self.assertRaisesRegex(exceptions.InvalidImage, 'Not found',