]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Emit the guest agent lifecycle event
authorPeter Krempa <pkrempa@redhat.com>
Wed, 19 Nov 2014 09:31:21 +0000 (10:31 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 24 Nov 2014 14:50:59 +0000 (15:50 +0100)
Add code to emit the event on change of the channel state and reconnect
to the qemu process.

src/qemu/qemu_driver.c
src/qemu/qemu_process.c

index 5936d6ff9e47725845936705ef95272c5a2603b1..70c781a0454574410c7407d7d7029e4d3bdbc4df 100644 (file)
@@ -4342,6 +4342,7 @@ processSerialChangedEvent(virQEMUDriverPtr driver,
 {
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
     virDomainChrDeviceState newstate;
+    virObjectEventPtr event = NULL;
     virDomainDeviceDef dev;
 
     if (connected)
@@ -4369,6 +4370,11 @@ processSerialChangedEvent(virQEMUDriverPtr driver,
         dev.data.chr->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO)
         goto endjob;
 
+    if (STREQ_NULLABLE(dev.data.chr->target.name, "org.qemu.guest_agent.0") &&
+        (event = virDomainEventAgentLifecycleNewFromObj(vm, newstate,
+                                                        VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_CHANNEL)))
+        qemuDomainEventQueue(driver, event);
+
     dev.data.chr->state = newstate;
 
     if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0)
index c40ca04f01e89a6418c2e9de99a1fe21f3486bbb..c3ee40b5579eae6caabc238110a5b28703b9da94 100644 (file)
@@ -2069,13 +2069,20 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm,
 
 
 static int
-qemuProcessRefreshChannelVirtioState(virDomainObjPtr vm,
-                                     virHashTablePtr info)
+qemuProcessRefreshChannelVirtioState(virQEMUDriverPtr driver,
+                                     virDomainObjPtr vm,
+                                     virHashTablePtr info,
+                                     int booted)
 {
     size_t i;
+    int agentReason = VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_CHANNEL;
     qemuMonitorChardevInfoPtr entry;
+    virObjectEventPtr event = NULL;
     char id[32];
 
+    if (booted)
+        agentReason = VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_DOMAIN_STARTED;
+
     for (i = 0; i < vm->def->nchannels; i++) {
         virDomainChrDefPtr chr = vm->def->channels[i];
         if (chr->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO) {
@@ -2092,6 +2099,12 @@ qemuProcessRefreshChannelVirtioState(virDomainObjPtr vm,
                 !entry->state)
                 continue;
 
+            if (entry->state != VIR_DOMAIN_CHR_DEVICE_STATE_DEFAULT &&
+                STREQ_NULLABLE(chr->target.name, "org.qemu.guest_agent.0") &&
+                (event = virDomainEventAgentLifecycleNewFromObj(vm, entry->state,
+                                                                agentReason)))
+                qemuDomainEventQueue(driver, event);
+
             chr->state = entry->state;
         }
     }
@@ -2115,7 +2128,7 @@ qemuProcessReconnectRefreshChannelVirtioState(virQEMUDriverPtr driver,
     if (ret < 0)
         goto cleanup;
 
-    ret = qemuProcessRefreshChannelVirtioState(vm, info);
+    ret = qemuProcessRefreshChannelVirtioState(driver, vm, info, false);
 
  cleanup:
     virHashFree(info);
@@ -2171,7 +2184,8 @@ qemuProcessWaitForMonitor(virQEMUDriverPtr driver,
                                                         info)) < 0)
             goto cleanup;
 
-        if ((ret = qemuProcessRefreshChannelVirtioState(vm, info)) < 0)
+        if ((ret = qemuProcessRefreshChannelVirtioState(driver, vm, info,
+                                                        true)) < 0)
             goto cleanup;
     }