]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: monitor: Implement support for 'JOB_STATUS_CHANGE' event
authorPeter Krempa <pkrempa@redhat.com>
Tue, 4 Dec 2018 16:57:23 +0000 (17:57 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 18 Jul 2019 15:59:33 +0000 (17:59 +0200)
This new event is a superset of the BLOCK_JOB* events and also covers
jobs which don't bind to a VM disk.

In this patch the monitor part is implemented.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c

index 70e864fa6770fa2580b4d63106e484179d2aba19..433fe7e60eb8b72f74516063f268ed1e33e0944c 100644 (file)
@@ -1503,6 +1503,19 @@ qemuMonitorEmitBlockJob(qemuMonitorPtr mon,
 }
 
 
+int
+qemuMonitorEmitJobStatusChange(qemuMonitorPtr mon,
+                               const char *jobname,
+                               qemuMonitorJobStatus status)
+{
+    int ret = -1;
+    VIR_DEBUG("mon=%p", mon);
+
+    QEMU_MONITOR_CALLBACK(mon, ret, jobStatusChange, mon->vm, jobname, status);
+    return ret;
+}
+
+
 int
 qemuMonitorEmitBalloonChange(qemuMonitorPtr mon,
                              unsigned long long actual)
index 3e9bb4a2893f3b0bbd508bcf0f1ae12259d4ed04..fa8f8a6e472422610da8d5c0fcd1b3cf3949c9e7 100644 (file)
@@ -230,6 +230,11 @@ typedef int (*qemuMonitorDomainBlockJobCallback)(qemuMonitorPtr mon,
                                                  int status,
                                                  const char *error,
                                                  void *opaque);
+typedef int (*qemuMonitorDomainJobStatusChangeCallback)(qemuMonitorPtr mon,
+                                                        virDomainObjPtr vm,
+                                                        const char *jobname,
+                                                        int status,
+                                                        void *opaque);
 typedef int (*qemuMonitorDomainTrayChangeCallback)(qemuMonitorPtr mon,
                                                    virDomainObjPtr vm,
                                                    const char *devAlias,
@@ -357,6 +362,7 @@ struct _qemuMonitorCallbacks {
     qemuMonitorDomainIOErrorCallback domainIOError;
     qemuMonitorDomainGraphicsCallback domainGraphics;
     qemuMonitorDomainBlockJobCallback domainBlockJob;
+    qemuMonitorDomainJobStatusChangeCallback jobStatusChange;
     qemuMonitorDomainTrayChangeCallback domainTrayChange;
     qemuMonitorDomainPMWakeupCallback domainPMWakeup;
     qemuMonitorDomainPMSuspendCallback domainPMSuspend;
@@ -467,6 +473,9 @@ int qemuMonitorEmitBlockJob(qemuMonitorPtr mon,
                             int type,
                             int status,
                             const char *error);
+int qemuMonitorEmitJobStatusChange(qemuMonitorPtr mon,
+                                   const char *jobname,
+                                   qemuMonitorJobStatus status);
 int qemuMonitorEmitBalloonChange(qemuMonitorPtr mon,
                                  unsigned long long actual);
 int qemuMonitorEmitPMSuspendDisk(qemuMonitorPtr mon);
index a1cb553109bb6b869708689fb62366838b5e4847..73eb0f77cb6e2076a820f0af255a0694fc835ac6 100644 (file)
@@ -100,6 +100,7 @@ static void qemuMonitorJSONHandlePMSuspend(qemuMonitorPtr mon, virJSONValuePtr d
 static void qemuMonitorJSONHandleBlockJobCompleted(qemuMonitorPtr mon, virJSONValuePtr data);
 static void qemuMonitorJSONHandleBlockJobCanceled(qemuMonitorPtr mon, virJSONValuePtr data);
 static void qemuMonitorJSONHandleBlockJobReady(qemuMonitorPtr mon, virJSONValuePtr data);
+static void qemuMonitorJSONHandleJobStatusChange(qemuMonitorPtr mon, virJSONValuePtr data);
 static void qemuMonitorJSONHandleBalloonChange(qemuMonitorPtr mon, virJSONValuePtr data);
 static void qemuMonitorJSONHandlePMSuspendDisk(qemuMonitorPtr mon, virJSONValuePtr data);
 static void qemuMonitorJSONHandleGuestPanic(qemuMonitorPtr mon, virJSONValuePtr data);
@@ -132,6 +133,7 @@ static qemuEventHandler eventHandlers[] = {
     { "DEVICE_TRAY_MOVED", qemuMonitorJSONHandleTrayChange, },
     { "DUMP_COMPLETED", qemuMonitorJSONHandleDumpCompleted, },
     { "GUEST_PANICKED", qemuMonitorJSONHandleGuestPanic, },
+    { "JOB_STATUS_CHANGE", qemuMonitorJSONHandleJobStatusChange, },
     { "MIGRATION", qemuMonitorJSONHandleMigrationStatus, },
     { "MIGRATION_PASS", qemuMonitorJSONHandleMigrationPass, },
     { "NIC_RX_FILTER_CHANGED", qemuMonitorJSONHandleNicRxFilterChanged, },
@@ -1172,6 +1174,30 @@ qemuMonitorJSONHandleBlockJobImpl(qemuMonitorPtr mon,
     qemuMonitorEmitBlockJob(mon, device, type, event, error);
 }
 
+
+static void
+qemuMonitorJSONHandleJobStatusChange(qemuMonitorPtr mon,
+                                     virJSONValuePtr data)
+{
+    const char *jobname = virJSONValueObjectGetString(data, "id");
+    const char *statusstr = virJSONValueObjectGetString(data, "status");
+    int status;
+
+    if (!jobname) {
+        VIR_WARN("missing job name in JOB_STATUS_CHANGE event");
+        return;
+    }
+
+    if ((status = qemuMonitorJobStatusTypeFromString(statusstr)) < 0) {
+        VIR_WARN("unknown job status '%s' for job '%s' in JOB_STATUS_CHANGE event",
+                 statusstr, jobname);
+        return;
+    }
+
+    qemuMonitorEmitJobStatusChange(mon, jobname, status);
+}
+
+
 static void
 qemuMonitorJSONHandleTrayChange(qemuMonitorPtr mon,
                                 virJSONValuePtr data)