Fix timeout when compute server was soft-deleted

When set 'reclaim_instance_interval' larger than 0, share server
was deleted cause that the server exists until
reclaim_instance_interval. This patch checks status 'soft_deleted'
of instance to avoid the timeout.

Change-Id: Ib481c1699b19ee8c37473081f1aec780ed384e9d
Closes-Bug: #1844596
This commit is contained in:
ericxiett 2019-09-21 15:40:28 +08:00
parent 09f5813078
commit 6b1a5e0119
2 changed files with 24 additions and 2 deletions

View File

@ -414,7 +414,11 @@ class ServiceInstanceManager(object):
t = time.time()
while time.time() - t < self.max_time_to_build_instance:
try:
self.compute_api.server_get(context, server_id)
inst = self.compute_api.server_get(context, server_id)
if inst.get("status").lower() == "soft_deleted":
LOG.debug("Service instance '%s' was soft-deleted "
"successfully.", server_id)
break
except exception.InstanceNotFound:
LOG.debug("Service instance '%s' was deleted "
"successfully.", server_id)

View File

@ -821,8 +821,10 @@ class ServiceInstanceManagerTestCase(test.TestCase):
def fake_sleep(time):
self.fake_time += 1
server_details = {'instance_id': 'fake_inst_id', 'status': 'ACTIVE'}
self.mock_object(self._manager.compute_api, 'server_delete')
self.mock_object(self._manager.compute_api, 'server_get')
self.mock_object(self._manager.compute_api, 'server_get',
mock.Mock(return_value=server_details))
self.mock_object(service_instance, 'time')
self.mock_object(
service_instance.time, 'time', mock.Mock(side_effect=fake_time))
@ -844,6 +846,22 @@ class ServiceInstanceManagerTestCase(test.TestCase):
[mock.call(self._manager.admin_context,
self.instance_id) for i in range(3)])
def test_delete_server_soft_deleted(self):
server_details = {'instance_id': 'fake_inst_id',
'status': 'SOFT_DELETED'}
self.mock_object(self._manager.compute_api, 'server_delete')
self.mock_object(self._manager.compute_api, 'server_get',
mock.Mock(return_value=server_details))
self._manager._delete_server(
self._manager.admin_context, self.instance_id)
self._manager.compute_api.server_delete.assert_called_once_with(
self._manager.admin_context, self.instance_id)
self._manager.compute_api.server_get.assert_has_calls([
mock.call(self._manager.admin_context, self.instance_id),
mock.call(self._manager.admin_context, self.instance_id)])
def test_delete_service_instance(self):
fake_server_details = dict(
router_id='foo', subnet_id='bar', instance_id='quuz')