]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Send event VIR_DOMAIN_EVENT_[STOPPED|STARTED] during recreation
authorZhenzhong Duan <zhenzhong.duan@intel.com>
Thu, 10 Jul 2025 07:21:21 +0000 (03:21 -0400)
committerDaniel P. Berrangé <berrange@redhat.com>
Fri, 25 Jul 2025 10:36:11 +0000 (11:36 +0100)
For secure guest, FakeReboot kills original QEMU instance and
create new one which is quite different from normal guest.

To reflect this fact, VIR_DOMAIN_EVENT_[STOPPED|STARTED]
are sent to control plane with new introduced reasons
VIR_DOMAIN_EVENT_[STOPPED|STARTED]_RECREATION.

That would let control plane software understand that these
events are from a fake reboot.

Suggested-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
examples/c/misc/event-test.c
include/libvirt/libvirt-domain.h
src/qemu/qemu_process.c
tools/virsh-domain-event.c

index a61dbf4529d1283bfce3c2193c41b22787e65d98..bafa929c471edaa11fbcb6f0badbb6e3a5b64212 100644 (file)
@@ -143,6 +143,9 @@ eventDetailToString(int event,
             case VIR_DOMAIN_EVENT_STARTED_WAKEUP:
                 return "Event wakeup";
 
+            case VIR_DOMAIN_EVENT_STARTED_RECREATION:
+                return "Recreation";
+
             case VIR_DOMAIN_EVENT_STARTED_LAST:
                 break;
             }
@@ -227,6 +230,9 @@ eventDetailToString(int event,
             case VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT:
                 return "Snapshot";
 
+            case VIR_DOMAIN_EVENT_STOPPED_RECREATION:
+                return "Recreation";
+
             case VIR_DOMAIN_EVENT_STOPPED_LAST:
                 break;
             }
index 3d05ffc5aaa983a187570db2b6f78c838476666a..fad58cf4098f17799218f755b63e66ef9748774e 100644 (file)
@@ -5051,6 +5051,7 @@ typedef enum {
     VIR_DOMAIN_EVENT_STARTED_RESTORED = 2, /* Restored from a state file (Since: 0.5.0) */
     VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT = 3, /* Restored from snapshot (Since: 0.8.0) */
     VIR_DOMAIN_EVENT_STARTED_WAKEUP = 4,   /* Started due to wakeup event (Since: 0.9.11) */
+    VIR_DOMAIN_EVENT_STARTED_RECREATION = 5, /* Secure guest recreation (Since: 10.1.0) */
 
 # ifdef VIR_ENUM_SENTINELS
     VIR_DOMAIN_EVENT_STARTED_LAST /* (Since: 0.9.10) */
@@ -5115,6 +5116,7 @@ typedef enum {
     VIR_DOMAIN_EVENT_STOPPED_SAVED = 4,     /* Saved to a state file (Since: 0.5.0) */
     VIR_DOMAIN_EVENT_STOPPED_FAILED = 5,    /* Host emulator/mgmt failed (Since: 0.5.0) */
     VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT = 6, /* offline snapshot loaded (Since: 0.8.0) */
+    VIR_DOMAIN_EVENT_STOPPED_RECREATION = 7,    /* Secure guest recreation (Since: 10.1.0) */
 
 # ifdef VIR_ENUM_SENTINELS
     VIR_DOMAIN_EVENT_STOPPED_LAST /* (Since: 0.9.10) */
index 0938804d6d27b801f04a6d040b18d00e2a773ca2..48427b98639a24d38c0b302d6b96137eb1524d6c 100644 (file)
@@ -455,6 +455,7 @@ qemuProcessFakeRebootViaRecreate(virDomainObj *vm)
 {
     qemuDomainObjPrivate *priv = vm->privateData;
     virQEMUDriver *driver = priv->driver;
+    virObjectEvent *event = NULL;
     int ret = -1;
 
     VIR_DEBUG("Handle secure guest reboot: destroy phase");
@@ -471,6 +472,11 @@ qemuProcessFakeRebootViaRecreate(virDomainObj *vm)
     qemuProcessStop(vm, VIR_DOMAIN_SHUTOFF_DESTROYED, VIR_ASYNC_JOB_NONE, 0);
     virDomainAuditStop(vm, "destroyed");
 
+    event = virDomainEventLifecycleNewFromObj(vm,
+                                              VIR_DOMAIN_EVENT_STOPPED,
+                                              VIR_DOMAIN_EVENT_STOPPED_RECREATION);
+    virObjectEventStateQueue(driver->domainEventState, event);
+
     /* skip remove inactive domain from active list */
     qemuProcessEndStopJob(vm);
 
@@ -491,6 +497,10 @@ qemuProcessFakeRebootViaRecreate(virDomainObj *vm)
     }
 
     virDomainAuditStart(vm, "booted", true);
+    event = virDomainEventLifecycleNewFromObj(vm,
+                                              VIR_DOMAIN_EVENT_STARTED,
+                                              VIR_DOMAIN_EVENT_STARTED_RECREATION);
+    virObjectEventStateQueue(driver->domainEventState, event);
 
     qemuDomainSaveStatus(vm);
     ret = 0;
index de33ed9d74650581e03bfb9b4de519ef95b12463..21dbf6e1d2ef6ddbdaa87cb41ea884b878ddaa0c 100644 (file)
@@ -71,7 +71,8 @@ VIR_ENUM_IMPL(virshDomainEventStarted,
               N_("Migrated"),
               N_("Restored"),
               N_("Snapshot"),
-              N_("Event wakeup"));
+              N_("Event wakeup"),
+              N_("Recreation"));
 
 VIR_ENUM_DECL(virshDomainEventSuspended);
 VIR_ENUM_IMPL(virshDomainEventSuspended,
@@ -104,7 +105,8 @@ VIR_ENUM_IMPL(virshDomainEventStopped,
               N_("Migrated"),
               N_("Saved"),
               N_("Failed"),
-              N_("Snapshot"));
+              N_("Snapshot"),
+              N_("Recreation"));
 
 VIR_ENUM_DECL(virshDomainEventShutdown);
 VIR_ENUM_IMPL(virshDomainEventShutdown,