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:
parent
6e2783700e
commit
829e95b3f9
|
@ -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.
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
|
@ -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
|
||||
===============
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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',
|
||||
|
|
Loading…
Reference in New Issue