qemu-ga: switch to the new error format on the wire
IMPORTANT: this BREAKS qemu-ga compatibility for the error response.
Instead of returning something like:
{ "error": { "class": "InvalidParameterValue",
             "data": {"name": "mode", "expected": "halt|powerdown|reboot" } } }
qemu-ga now returns:
 { "error": { "class": "GenericError",
              "desc": "Parameter 'mode' expects halt|powerdown|reboot" } }
Notice that this is also a bug fix, as qemu-ga wasn't returning the
human message.
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
			
			
This commit is contained in:
		
							parent
							
								
									de253f1491
								
							
						
					
					
						commit
						93b91c59db
					
				@ -211,6 +211,7 @@ common-obj-$(CONFIG_SMARTCARD_NSS) += $(libcacard-y)
 | 
				
			|||||||
# qapi
 | 
					# qapi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
qapi-obj-y = qapi/
 | 
					qapi-obj-y = qapi/
 | 
				
			||||||
 | 
					qapi-obj-y += qapi-types.o qapi-visit.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
common-obj-y += qmp-marshal.o qapi-visit.o qapi-types.o
 | 
					common-obj-y += qmp-marshal.o qapi-visit.o qapi-types.o
 | 
				
			||||||
common-obj-y += qmp.o hmp.o
 | 
					common-obj-y += qmp.o hmp.o
 | 
				
			||||||
 | 
				
			|||||||
@ -49,6 +49,7 @@ void qmp_disable_command(const char *name);
 | 
				
			|||||||
void qmp_enable_command(const char *name);
 | 
					void qmp_enable_command(const char *name);
 | 
				
			||||||
bool qmp_command_is_enabled(const char *name);
 | 
					bool qmp_command_is_enabled(const char *name);
 | 
				
			||||||
char **qmp_get_command_list(void);
 | 
					char **qmp_get_command_list(void);
 | 
				
			||||||
 | 
					QObject *qmp_build_error_object(Error *errp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -14,6 +14,7 @@
 | 
				
			|||||||
#include "qemu-objects.h"
 | 
					#include "qemu-objects.h"
 | 
				
			||||||
#include "qapi/qmp-core.h"
 | 
					#include "qapi/qmp-core.h"
 | 
				
			||||||
#include "json-parser.h"
 | 
					#include "json-parser.h"
 | 
				
			||||||
 | 
					#include "qapi-types.h"
 | 
				
			||||||
#include "error.h"
 | 
					#include "error.h"
 | 
				
			||||||
#include "error_int.h"
 | 
					#include "error_int.h"
 | 
				
			||||||
#include "qerror.h"
 | 
					#include "qerror.h"
 | 
				
			||||||
@ -109,6 +110,13 @@ static QObject *do_qmp_dispatch(QObject *request, Error **errp)
 | 
				
			|||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QObject *qmp_build_error_object(Error *errp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return qobject_from_jsonf("{ 'class': %s, 'desc': %s }",
 | 
				
			||||||
 | 
					                              ErrorClass_lookup[error_get_class(errp)],
 | 
				
			||||||
 | 
					                              error_get_pretty(errp));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QObject *qmp_dispatch(QObject *request)
 | 
					QObject *qmp_dispatch(QObject *request)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    Error *err = NULL;
 | 
					    Error *err = NULL;
 | 
				
			||||||
@ -119,7 +127,7 @@ QObject *qmp_dispatch(QObject *request)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    rsp = qdict_new();
 | 
					    rsp = qdict_new();
 | 
				
			||||||
    if (err) {
 | 
					    if (err) {
 | 
				
			||||||
        qdict_put_obj(rsp, "error", error_get_qobject(err));
 | 
					        qdict_put_obj(rsp, "error", qmp_build_error_object(err));
 | 
				
			||||||
        error_free(err);
 | 
					        error_free(err);
 | 
				
			||||||
    } else if (ret) {
 | 
					    } else if (ret) {
 | 
				
			||||||
        qdict_put_obj(rsp, "return", ret);
 | 
					        qdict_put_obj(rsp, "return", ret);
 | 
				
			||||||
 | 
				
			|||||||
@ -515,7 +515,7 @@ static void process_event(JSONMessageParser *parser, QList *tokens)
 | 
				
			|||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            g_warning("failed to parse event: %s", error_get_pretty(err));
 | 
					            g_warning("failed to parse event: %s", error_get_pretty(err));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        qdict_put_obj(qdict, "error", error_get_qobject(err));
 | 
					        qdict_put_obj(qdict, "error", qmp_build_error_object(err));
 | 
				
			||||||
        error_free(err);
 | 
					        error_free(err);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        qdict = qobject_to_qdict(obj);
 | 
					        qdict = qobject_to_qdict(obj);
 | 
				
			||||||
@ -532,7 +532,7 @@ static void process_event(JSONMessageParser *parser, QList *tokens)
 | 
				
			|||||||
            qdict = qdict_new();
 | 
					            qdict = qdict_new();
 | 
				
			||||||
            g_warning("unrecognized payload format");
 | 
					            g_warning("unrecognized payload format");
 | 
				
			||||||
            error_set(&err, QERR_UNSUPPORTED);
 | 
					            error_set(&err, QERR_UNSUPPORTED);
 | 
				
			||||||
            qdict_put_obj(qdict, "error", error_get_qobject(err));
 | 
					            qdict_put_obj(qdict, "error", qmp_build_error_object(err));
 | 
				
			||||||
            error_free(err);
 | 
					            error_free(err);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ret = send_response(s, QOBJECT(qdict));
 | 
					        ret = send_response(s, QOBJECT(qdict));
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user