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:
parent
f3fb73a5a8
commit
23d44e318c
|
@ -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):
|
||||
|
|
|
@ -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',
|
||||
|
|
Loading…
Reference in New Issue