[libvirt] [PATCH] qemu_agent: Report error class at least

Currently, qemu GA is not providing 'desc' field for errors like we are used to from qemu monitor. Therefore, we fall back to this general 'unknown error' string. However, GA is reporting 'class' which is not perfect, but much more helpful than generic error string. Thus we should fall back to class firstly and if even no class is presented, then we can fall back to that generic string. Before this patch: virsh # dompmsuspend --target mem f16 error: Domain f16 could not be suspended error: internal error unable to execute QEMU command 'guest-suspend-ram': unknown QEMU command error After this patch: virsh # dompmsuspend --target mem f16 error: Domain f16 could not be suspended error: internal error unable to execute QEMU command 'guest-suspend-ram': CommandNotFound --- src/qemu/qemu_agent.c | 14 ++++++-------- 1 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index b759b7f..decfd0e 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -1035,19 +1035,17 @@ static const char * qemuAgentStringifyError(virJSONValuePtr error) { const char *klass = virJSONValueObjectGetString(error, "class"); - const char *detail = NULL; + const char *detail = virJSONValueObjectGetString(error, "desc"); /* The QMP 'desc' field is usually sufficient for our generic - * error reporting needs. + * error reporting needs. However, older agents did not provide + * any 'desc'. Reporting 'class' is not perfect but better + * than bare 'unknown error'. */ - if (klass) - detail = virJSONValueObjectGetString(error, "desc"); - - - if (!detail) + if (!detail && !klass) detail = "unknown QEMU command error"; - return detail; + return detail ? detail : klass; } static const char * -- 1.7.8.5

On Thu, Apr 12, 2012 at 02:06:21PM +0200, Michal Privoznik wrote:
Currently, qemu GA is not providing 'desc' field for errors like we are used to from qemu monitor. Therefore, we fall back to this general 'unknown error' string. However, GA is reporting 'class' which is not perfect, but much more helpful than generic error string. Thus we should fall back to class firstly and if even no class is presented, then we can fall back to that generic string.
Before this patch: virsh # dompmsuspend --target mem f16 error: Domain f16 could not be suspended error: internal error unable to execute QEMU command 'guest-suspend-ram': unknown QEMU command error
After this patch: virsh # dompmsuspend --target mem f16 error: Domain f16 could not be suspended error: internal error unable to execute QEMU command 'guest-suspend-ram': CommandNotFound --- src/qemu/qemu_agent.c | 14 ++++++-------- 1 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index b759b7f..decfd0e 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -1035,19 +1035,17 @@ static const char * qemuAgentStringifyError(virJSONValuePtr error) { const char *klass = virJSONValueObjectGetString(error, "class"); - const char *detail = NULL; + const char *detail = virJSONValueObjectGetString(error, "desc");
/* The QMP 'desc' field is usually sufficient for our generic - * error reporting needs. + * error reporting needs. However, older agents did not provide + * any 'desc'. Reporting 'class' is not perfect but better + * than bare 'unknown error'. */ - if (klass) - detail = virJSONValueObjectGetString(error, "desc"); - - - if (!detail) + if (!detail && !klass) detail = "unknown QEMU command error";
- return detail; + return detail ? detail : klass; }
You can get a list of all 'class' names that QEMU currently supports from qerror.h. As we do for VIR_ERR_XXXXX constants, you should create a mapping from QEMU class names, to error message strings. Even better, share this mapping between the agent & json monitor code so we can improve error messages in both cases. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On 12.04.2012 14:14, Daniel P. Berrange wrote:
On Thu, Apr 12, 2012 at 02:06:21PM +0200, Michal Privoznik wrote:
Currently, qemu GA is not providing 'desc' field for errors like we are used to from qemu monitor. Therefore, we fall back to this general 'unknown error' string. However, GA is reporting 'class' which is not perfect, but much more helpful than generic error string. Thus we should fall back to class firstly and if even no class is presented, then we can fall back to that generic string.
Before this patch: virsh # dompmsuspend --target mem f16 error: Domain f16 could not be suspended error: internal error unable to execute QEMU command 'guest-suspend-ram': unknown QEMU command error
After this patch: virsh # dompmsuspend --target mem f16 error: Domain f16 could not be suspended error: internal error unable to execute QEMU command 'guest-suspend-ram': CommandNotFound --- src/qemu/qemu_agent.c | 14 ++++++-------- 1 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index b759b7f..decfd0e 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -1035,19 +1035,17 @@ static const char * qemuAgentStringifyError(virJSONValuePtr error) { const char *klass = virJSONValueObjectGetString(error, "class"); - const char *detail = NULL; + const char *detail = virJSONValueObjectGetString(error, "desc");
/* The QMP 'desc' field is usually sufficient for our generic - * error reporting needs. + * error reporting needs. However, older agents did not provide + * any 'desc'. Reporting 'class' is not perfect but better + * than bare 'unknown error'. */ - if (klass) - detail = virJSONValueObjectGetString(error, "desc"); - - - if (!detail) + if (!detail && !klass) detail = "unknown QEMU command error";
- return detail; + return detail ? detail : klass; }
You can get a list of all 'class' names that QEMU currently supports from qerror.h. As we do for VIR_ERR_XXXXX constants, you should create a mapping from QEMU class names, to error message strings.
Even better, share this mapping between the agent & json monitor code so we can improve error messages in both cases.
Regards, Daniel
I don't think this should be shared; as written in commit message, in case of json monitor we get 'desc' which fulfills translation from 'class' to error message. Moreover, the 'desc' field already contains correct values, e.g.: #define QERR_UNKNOWN_BLOCK_FORMAT_FEATURE \ "{ 'class': 'UnknownBlockFormatFeature', 'data': { 'device': %s, 'format': %s, 'feature': %s } }" {"execute":"unknown command"} {"error": {"class": "CommandNotFound", "desc": "The command unknown command has not been found", "data": {"name": "unknown command"}}} However, things change rapidly with GA: {"execute":"unknown command"} {"error": {"class": "CommandNotFound", "data": {"name": "unknown command"}}} Therefore I see point in having translation table just for GA. In fact, such table doesn't need to cover all error codes from qerror.h only those used by GA: ~/work/qemu.git $ grep -r -o -e QERR_[A-Z_]* qga/ qapi* | cut -d':' -f 2 | sort | uniq QERR_BUFFER_OVERRUN QERR_COMMAND_DISABLED QERR_COMMAND_NOT_FOUND QERR_FD_NOT_FOUND QERR_INVALID_PARAMETER QERR_INVALID_PARAMETER_TYPE QERR_INVALID_PARAMETER_VALUE QERR_OPEN_FILE_FAILED QERR_QGA_COMMAND_FAILED QERR_QGA_LOGGING_DISABLED QERR_QMP_BAD_INPUT_OBJECT QERR_QMP_BAD_INPUT_OBJECT_MEMBER QERR_QMP_EXTRA_MEMBER QERR_UNDEFINED_ERROR QERR_UNSUPPORTED Michal
participants (2)
-
Daniel P. Berrange
-
Michal Privoznik