Merge "Add check for server existence on software deployment delete"

This commit is contained in:
Jenkins 2016-05-15 22:47:14 +00:00 committed by Gerrit Code Review
commit e0dfb1a40a
2 changed files with 68 additions and 9 deletions

View File

@ -298,6 +298,16 @@ class SoftwareDeployment(signal_responder.SignalResponder):
LOG.info(message)
raise exception.Error(message)
def _server_exists(self, sd):
"""Returns whether or not the deployment's server exists."""
nova_client = self.client_plugin('nova')
try:
nova_client.get_server(sd['server_id'])
return True
except exception.EntityNotFound:
return False
def empty_config(self):
return ''
@ -467,7 +477,7 @@ class SoftwareDeployment(signal_responder.SignalResponder):
self.rpc_client().ignore_error_named(ex, 'NotFound')
def check_delete_complete(self, sd=None):
if not sd or self._check_complete():
if not sd or not self._server_exists(sd) or self._check_complete():
self._delete_resource()
return True

View File

@ -637,13 +637,14 @@ class SoftwareDeploymentTest(common.HeatTestCase):
self.mock_software_config()
derived_sc = self.mock_derived_software_config()
sd = self.mock_deployment()
mock_sd = self.mock_deployment()
mock_sd['server_id'] = 'b509edfb-1448-4b57-8cb1-2e31acccbb8a'
self.deployment.resource_id = 'c8a19429-7fde-47ea-a42f-40045488226c'
self.rpc_client.show_software_deployment.return_value = sd
self.rpc_client.update_software_deployment.return_value = sd
self.assertEqual(sd, self.deployment.handle_delete())
self.rpc_client.show_software_deployment.return_value = mock_sd
self.rpc_client.update_software_deployment.return_value = mock_sd
self.assertEqual(mock_sd, self.deployment.handle_delete())
self.assertEqual({
'deployment_id': 'c8a19429-7fde-47ea-a42f-40045488226c',
'action': 'DELETE',
@ -652,11 +653,34 @@ class SoftwareDeploymentTest(common.HeatTestCase):
'status_reason': 'Deploy data available'},
self.rpc_client.update_software_deployment.call_args[1])
sd['status'] = self.deployment.IN_PROGRESS
self.assertFalse(self.deployment.check_delete_complete(sd))
mock_sd['status'] = self.deployment.IN_PROGRESS
self.assertFalse(self.deployment.check_delete_complete(mock_sd))
sd['status'] = self.deployment.COMPLETE
self.assertTrue(self.deployment.check_delete_complete(sd))
mock_sd['status'] = self.deployment.COMPLETE
self.assertTrue(self.deployment.check_delete_complete(mock_sd))
def test_delete_complete_missing_server(self):
"""Tests deleting a deployment when the server disappears"""
self._create_stack(self.template_delete_suspend_resume)
self.mock_software_config()
mock_sd = self.mock_deployment()
mock_sd['server_id'] = 'b509edfb-1448-4b57-8cb1-2e31acccbb8a'
# Simulate Nova not knowing about the server
mock_get_server = self.patchobject(
nova.NovaClientPlugin, 'get_server',
side_effect=exc.EntityNotFound)
self.deployment.resource_id = 'c8a19429-7fde-47ea-a42f-40045488226c'
self.rpc_client.show_software_deployment.return_value = mock_sd
self.rpc_client.update_software_deployment.return_value = mock_sd
mock_sd['status'] = self.deployment.COMPLETE
self.assertTrue(self.deployment.check_delete_complete(mock_sd))
mock_get_server.assert_called_once_with(mock_sd['server_id'])
def test_handle_delete_notfound(self):
self._create_stack(self.template)
@ -1191,6 +1215,31 @@ class SoftwareDeploymentTest(common.HeatTestCase):
self.deployment._delete_zaqar_signal_queue()
self.assertEqual(2, len(self.deployment.data_delete.mock_calls))
def test_server_exists(self):
# Setup
self._create_stack(self.template_delete_suspend_resume)
mock_sd = {'server_id': 'b509edfb-1448-4b57-8cb1-2e31acccbb8a'}
# For a success case, this doesn't raise an exception
self.patchobject(nova.NovaClientPlugin, 'get_server')
# Test
result = self.deployment._server_exists(mock_sd)
self.assertTrue(result)
def test_server_exists_no_server(self):
# Setup
self._create_stack(self.template_delete_suspend_resume)
mock_sd = {'server_id': 'b509edfb-1448-4b57-8cb1-2e31acccbb8a'}
# For a success case, this doesn't raise an exception
self.patchobject(nova.NovaClientPlugin, 'get_server',
side_effect=exc.EntityNotFound)
# Test
result = self.deployment._server_exists(mock_sd)
self.assertFalse(result)
class SoftwareDeploymentGroupTest(common.HeatTestCase):