}
+void
+qemuDomainEventEmitJobCompleted(virQEMUDriverPtr driver,
+ virDomainObjPtr vm)
+{
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+ virObjectEventPtr event;
+ virTypedParameterPtr params = NULL;
+ int nparams = 0;
+ int type;
+
+ if (!priv->job.completed)
+ return;
+
+ if (qemuDomainJobInfoToParams(priv->job.completed, &type,
+ ¶ms, &nparams) < 0) {
+ VIR_WARN("Could not get stats for completed job; domain %s",
+ vm->def->name);
+ }
+
+ event = virDomainEventJobCompletedNewFromObj(vm, params, nparams);
+ qemuDomainEventQueue(driver, event);
+}
+
+
static int
qemuDomainObjInitJob(qemuDomainObjPrivatePtr priv)
{
void qemuDomainEventQueue(virQEMUDriverPtr driver,
virObjectEventPtr event);
+void qemuDomainEventEmitJobCompleted(virQEMUDriverPtr driver,
+ virDomainObjPtr vm);
int qemuDomainObjBeginJob(virQEMUDriverPtr driver,
virDomainObjPtr obj,
int retcode)
{
qemuMigrationCookiePtr mig;
- virObjectEventPtr event = NULL;
+ virObjectEventPtr event;
int rv = -1;
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
qemuDomainObjPrivatePtr priv = vm->privateData;
event = virDomainEventLifecycleNewFromObj(vm,
VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_MIGRATED);
+ qemuDomainEventQueue(driver, event);
+ qemuDomainEventEmitJobCompleted(driver, vm);
} else {
virErrorPtr orig_err = virSaveLastError();
event = virDomainEventLifecycleNewFromObj(vm,
VIR_DOMAIN_EVENT_RESUMED,
VIR_DOMAIN_EVENT_RESUMED_MIGRATED);
+ qemuDomainEventQueue(driver, event);
}
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
rv = 0;
cleanup:
- qemuDomainEventQueue(driver, event);
virObjectUnref(cfg);
return rv;
}
if (cmd && virCommandWait(cmd, NULL) < 0)
goto cleanup;
+ qemuDomainEventEmitJobCompleted(driver, vm);
ret = 0;
cleanup: