bug fix: return fault_info correctly

return fault_info (code, message, detail included) to user
when server status is error.

Change-Id: I57d8711d15e8014da29622e25b595bedff6c65f8
This commit is contained in:
ZhongLuyao 2017-04-13 03:27:36 +00:00 committed by Zhong Luyao
parent 6e2783700e
commit 829e95b3f9
7 changed files with 71 additions and 7 deletions

View File

@ -401,6 +401,14 @@ server_description:
in: body
required: false
type: string
server_fault:
description: |
A fault object. Only displayed in the failed response.
Default keys are ``code``, ``message``, and ``detail``
(response code, message, and detail respectively).
in: body
required: false
type: object
server_name:
description: |
The server name.

View File

@ -0,0 +1,39 @@
{
"availability_zone": null,
"created_at": "2016-10-17T04:12:41+00:00",
"description": "this is a test server",
"image_uuid": "ac3b2291-b9ef-45f6-8eeb-21ac568a64a5",
"server_type_uuid": "28708dff-283c-449e-9bfa-a48c93480c86",
"name": "test_server",
"network_info": {
"12cffc4a-b845-409e-b589-7c84be4b10d9": {
"fixed_ips": [
{
"ip_address": "172.24.4.4",
"subnet_id": "a9d47430-f90b-4513-af5f-6315af54de7d"
},
{
"ip_address": "2001:db8::a",
"subnet_id": "5e7b3e2d-f36f-4e30-874c-16c2d126fe53"
}
],
"mac_address": "52:54:00:6c:c4:17",
"network": "ade2b658-929b-439f-9528-c47057960942"
}
},
"power_state": "power on",
"project_id": "c18e8a1a870d4c08a0b51ced6e0b6459",
"status": "error",
"fault_info": {
"code": 500,
"message": "fault message",
"detail": "fault detail"
},
"launched_at" : null,
"updated_at": "2016-10-17T04:12:44+00:00",
"user_id": "cdbf77d47f1d4d04ad9b7ff62b672467",
"uuid": "f978ef48-d4af-4dad-beec-e6174309bc71",
"extra": {
"My Server Name" : "Apache1"
}
}

View File

@ -245,6 +245,7 @@ Response
- uuid: server_uuid
- status: server_status
- power_state: server_power_state
- fault_info: server_fault
- project_id: project_id_body
- user_id: user_id_body
- updated_at: updated_at
@ -257,6 +258,11 @@ Response
.. literalinclude:: samples/servers/server-detail-resp.json
:language: javascript
**Example Server Details With Fault: JSON response**
.. literalinclude:: samples/servers/server-detail-resp-when-error.json
:language: javascript
Update Server
===============

View File

@ -406,6 +406,9 @@ class Server(base.APIBase):
extra = {wtypes.text: types.jsontype}
"""The meta data of the server"""
fault_info = {wtypes.text: types.jsontype}
"""The fault info of the server"""
def __init__(self, **kwargs):
super(Server, self).__init__(**kwargs)
self.fields = []
@ -419,6 +422,12 @@ class Server(base.APIBase):
else:
network_info = {}
setattr(self, 'network_info', network_info)
if field == 'fault':
if kwargs.get('status', None) == 'error':
fault_info = kwargs.get(field, None)
if fault_info is not None:
fault_info = fault_info.return_dict()
setattr(self, 'fault_info', fault_info)
# Skip fields we do not expose.
if not hasattr(self, field):
continue

View File

@ -48,6 +48,7 @@ class Server(base.MoganObject, object_base.VersionedObjectDictCompat):
'availability_zone': object_fields.StringField(nullable=True),
'image_uuid': object_fields.UUIDField(nullable=True),
'nics': object_fields.ObjectField('ServerNics', nullable=True),
'fault': object_fields.ObjectField('ServerFault', nullable=True),
'node_uuid': object_fields.UUIDField(nullable=True),
'launched_at': object_fields.DateTimeField(nullable=True),
'extra': object_fields.FlexibleDictField(nullable=True),
@ -100,9 +101,7 @@ class Server(base.MoganObject, object_base.VersionedObjectDictCompat):
"""Converts a list of database entities to a list of formal objects."""
servers = []
for obj in db_objects:
expected_attrs = ['nics']
if obj["status"] == "error":
expected_attrs.append("fault")
expected_attrs = ['nics', 'fault']
servers.append(Server._from_db_object(cls(context), obj,
expected_attrs))
return servers
@ -131,10 +130,8 @@ class Server(base.MoganObject, object_base.VersionedObjectDictCompat):
@classmethod
def get(cls, context, uuid):
"""Find a server and return a Server object."""
expected_attrs = ['nics']
expected_attrs = ['nics', 'fault']
db_server = cls.dbapi.server_get(context, uuid)
if db_server["status"] == "error":
expected_attrs.append("fault")
server = Server._from_db_object(cls(context), db_server,
expected_attrs)
return server

View File

@ -40,6 +40,11 @@ class ServerFault(base.MoganObject, object_base.VersionedObjectDictCompat):
'detail': object_fields.StringField(nullable=True),
}
def return_dict(self):
return dict((k, getattr(self, k))
for k in ['code', 'message', 'detail']
if hasattr(self, k))
@staticmethod
def _from_db_object(context, fault, db_fault):
for key in fault.fields:

View File

@ -382,7 +382,7 @@ class _TestObject(object):
# version bump. It is md5 hash of object fields and remotable methods.
# The fingerprint values should only be changed if there is a version bump.
expected_object_fingerprints = {
'Server': '1.0-5754f46d83e55a0284fcd1188ba601a2',
'Server': '1.0-f3ef6866ef8072b063014a2c49060c6d',
'ComputeNode': '1.0-36221253681d9acb88efe2a9113071c7',
'ComputeNodeList': '1.0-33a2e1bb91ad4082f9f63429b77c1244',
'ComputePort': '1.0-ca4c1817ad7324286813f2cfcdcf802e',