mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-09 06:25:19 +00:00
qemu: monitor: Extract handling of JSON block job error codes
My intention is to split qemuMonitorJSONBlockJob() into simpler separate functions for every block job type. Since the error handling code is the same for all block jobs, this patch extracts the code into a separate function that will later be reused in more places. With the new helper qemuMonitorJSONErrorIsClass we can save a few function calls as we can extract the error object once.
This commit is contained in:
parent
72613b18ac
commit
7db64d6b0a
@ -4247,6 +4247,39 @@ qemuMonitorJSONBlockJobInfo(qemuMonitorPtr mon,
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
qemuMonitorJSONBlockJobError(virJSONValuePtr reply,
|
||||
const char *cmd_name,
|
||||
const char *device)
|
||||
{
|
||||
virJSONValuePtr error;
|
||||
|
||||
if (!(error = virJSONValueObjectGet(reply, "error")))
|
||||
return 0;
|
||||
|
||||
if (qemuMonitorJSONErrorIsClass(error, "DeviceNotActive")) {
|
||||
virReportError(VIR_ERR_OPERATION_INVALID,
|
||||
_("No active operation on device: %s"), device);
|
||||
} else if (qemuMonitorJSONErrorIsClass(error, "DeviceInUse")) {
|
||||
virReportError(VIR_ERR_OPERATION_FAILED,
|
||||
_("Device %s in use"), device);
|
||||
} else if (qemuMonitorJSONErrorIsClass(error, "NotSupported")) {
|
||||
virReportError(VIR_ERR_OPERATION_INVALID,
|
||||
_("Operation is not supported for device: %s"), device);
|
||||
} else if (qemuMonitorJSONErrorIsClass(error, "CommandNotFound")) {
|
||||
virReportError(VIR_ERR_OPERATION_INVALID,
|
||||
_("Command '%s' is not found"), cmd_name);
|
||||
} else {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Unexpected error: (%s) '%s'"),
|
||||
NULLSTR(virJSONValueObjectGetString(error, "class")),
|
||||
NULLSTR(virJSONValueObjectGetString(error, "desc")));
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* speed is in bytes/sec */
|
||||
int
|
||||
qemuMonitorJSONBlockJob(qemuMonitorPtr mon,
|
||||
@ -4317,34 +4350,15 @@ qemuMonitorJSONBlockJob(qemuMonitorPtr mon,
|
||||
if (!cmd)
|
||||
return -1;
|
||||
|
||||
ret = qemuMonitorJSONCommand(mon, cmd, &reply);
|
||||
if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (ret == 0 && virJSONValueObjectHasKey(reply, "error")) {
|
||||
ret = -1;
|
||||
if (qemuMonitorJSONHasError(reply, "DeviceNotActive")) {
|
||||
virReportError(VIR_ERR_OPERATION_INVALID,
|
||||
_("No active operation on device: %s"),
|
||||
device);
|
||||
} else if (qemuMonitorJSONHasError(reply, "DeviceInUse")) {
|
||||
virReportError(VIR_ERR_OPERATION_FAILED,
|
||||
_("Device %s in use"), device);
|
||||
} else if (qemuMonitorJSONHasError(reply, "NotSupported")) {
|
||||
virReportError(VIR_ERR_OPERATION_INVALID,
|
||||
_("Operation is not supported for device: %s"),
|
||||
device);
|
||||
} else if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
|
||||
virReportError(VIR_ERR_OPERATION_INVALID,
|
||||
_("Command '%s' is not found"), cmd_name);
|
||||
} else {
|
||||
virJSONValuePtr error = virJSONValueObjectGet(reply, "error");
|
||||
if (qemuMonitorJSONBlockJobError(reply, cmd_name, device) < 0)
|
||||
goto cleanup;
|
||||
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Unexpected error: (%s) '%s'"),
|
||||
NULLSTR(virJSONValueObjectGetString(error, "class")),
|
||||
NULLSTR(virJSONValueObjectGetString(error, "desc")));
|
||||
}
|
||||
}
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
virJSONValueFree(cmd);
|
||||
virJSONValueFree(reply);
|
||||
return ret;
|
||||
|
Loading…
Reference in New Issue
Block a user