Skip to content

Commit

Permalink
Ensure deleted instances' status is always DELETED
Browse files Browse the repository at this point in the history
Currently when deleting failed instances that were never assigned a
host, their vm_state is left in 'error' instead of 'deleted'. This is a
problem when invoking the Index Instances REST API with a Changes-Since
query parameter since that API returns both deleted and non-deleted
instances, but currently the failed deleted instances are incorrectly
marked as status:ERROR instead of status:DELETED.

This patch modifies the server ViewBuilder to ensure the status is
correctly set.

Change-Id: I614714676bab4986564b236d74f2c0d77400e48c
Closes-bug: #1243301
(cherry picked from commit 38018d3)
  • Loading branch information
Luis A. Garcia committed Feb 3, 2014
1 parent 4f947f5 commit cefa81a
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 1 deletion.
5 changes: 4 additions & 1 deletion nova/api/openstack/compute/views/servers.py
Expand Up @@ -47,7 +47,7 @@ class ViewBuilder(common.ViewBuilder):
)

_fault_statuses = (
"ERROR",
"ERROR", "DELETED"
)

def __init__(self):
Expand Down Expand Up @@ -147,6 +147,9 @@ def _get_metadata(instance):

@staticmethod
def _get_vm_state(instance):
# If the instance is deleted the vm and task states don't really matter
if instance.get("deleted"):
return "DELETED"
return common.status_from_state(instance.get("vm_state"),
instance.get("task_state"))

Expand Down
18 changes: 18 additions & 0 deletions nova/tests/api/openstack/compute/plugins/v3/test_servers.py
Expand Up @@ -2999,6 +2999,24 @@ def test_build_server_detail_with_fault(self):
output = self.view_builder.show(self.request, self.instance)
self.assertThat(output, matchers.DictMatches(expected_server))

def test_build_server_detail_with_fault_that_has_been_deleted(self):
self.instance['deleted'] = 1
self.instance['vm_state'] = vm_states.ERROR
fault = fake_instance.fake_fault_obj(self.uuid, code=500,
message="No valid host was found")
self.instance['fault'] = fault

expected_fault = {"code": 500,
"created": "2010-10-10T12:00:00Z",
"message": "No valid host was found"}

self.request.context = context.RequestContext('fake', 'fake')
output = self.view_builder.show(self.request, self.instance)
# Regardless of vm_state deleted servers sholud be DELETED
self.assertEqual("DELETED", output['server']['status'])
self.assertThat(output['server']['fault'],
matchers.DictMatches(expected_fault))

def test_build_server_detail_with_fault_no_details_not_admin(self):
self.instance['vm_state'] = vm_states.ERROR
self.instance['fault'] = fake_instance.fake_fault_obj(
Expand Down
21 changes: 21 additions & 0 deletions nova/tests/api/openstack/compute/test_servers.py
Expand Up @@ -3863,6 +3863,27 @@ def test_build_server_detail_with_fault(self):
self.assertThat(output,
matchers.DictMatches(self.expected_detailed_server))

def test_build_server_detail_with_fault_that_has_been_deleted(self):
self.instance['deleted'] = 1
self.instance['vm_state'] = vm_states.ERROR
fault = fake_instance.fake_fault_obj(self.uuid, code=500,
message="No valid host was found")
self.instance['fault'] = fault

# Regardless of the vm_state deleted servers sholud have DELETED status
self.expected_detailed_server["server"]["status"] = "DELETED"
self.expected_detailed_server["server"]["fault"] = {
"code": 500,
"created": "2010-10-10T12:00:00Z",
"message": "No valid host was found",
}
del self.expected_detailed_server["server"]["progress"]

self.request.context = context.RequestContext('fake', 'fake')
output = self.view_builder.show(self.request, self.instance)
self.assertThat(output,
matchers.DictMatches(self.expected_detailed_server))

def test_build_server_detail_with_fault_no_details_not_admin(self):
self.instance['vm_state'] = vm_states.ERROR
self.instance['fault'] = fake_instance.fake_fault_obj(
Expand Down

0 comments on commit cefa81a

Please sign in to comment.