Adds support to the qemu driver for the VIR_DOMAIN_START_PERSISTENT flag --- Figured this would be better to "define" the domain before starting it, rather than starting and then defining but I can change as people prefer. --- src/qemu/qemu_driver.c | 45 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 76b2800..0a3bbc2 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1448,14 +1448,17 @@ static virDomainPtr qemuDomainCreate(virConnectPtr conn, const char *xml, virDomainDefPtr def = NULL; virDomainObjPtr vm = NULL; virDomainPtr dom = NULL; - virDomainEventPtr event = NULL; - virDomainEventPtr event2 = NULL; + virDomainEventPtr event_define = NULL; + virDomainEventPtr event_start = NULL; + virDomainEventPtr event_pause = NULL; unsigned int start_flags = VIR_QEMU_PROCESS_START_COLD; virQEMUCapsPtr qemuCaps = NULL; virCapsPtr caps = NULL; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_START_PAUSED | - VIR_DOMAIN_START_AUTODESTROY, NULL); + VIR_DOMAIN_START_AUTODESTROY | + VIR_DOMAIN_START_PERSISTENT, NULL); if (flags & VIR_DOMAIN_START_PAUSED) start_flags |= VIR_QEMU_PROCESS_START_PAUSED; @@ -1491,6 +1494,24 @@ static virDomainPtr qemuDomainCreate(virConnectPtr conn, const char *xml, def = NULL; + /* Attempt to make the domain persistent before we start it */ + if (flags & VIR_DOMAIN_START_PERSISTENT) { + vm->persistent = 1; + + cfg = virQEMUDriverGetConfig(driver); + + if (virDomainSaveConfig(cfg->configDir, vm->newDef) < 0) { + VIR_INFO("Deleting domain '%s'", vm->def->name); + qemuDomainRemoveInactive(driver, vm); + vm = NULL; + goto cleanup; + } + + event_define = virDomainEventNewFromObj(vm, + VIR_DOMAIN_EVENT_DEFINED, + VIR_DOMAIN_EVENT_DEFINED_ADDED); + } + if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) goto cleanup; /* XXXX free the 'vm' we created ? */ @@ -1504,21 +1525,22 @@ static virDomainPtr qemuDomainCreate(virConnectPtr conn, const char *xml, goto cleanup; } - event = virDomainEventNewFromObj(vm, + event_start = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_STARTED, VIR_DOMAIN_EVENT_STARTED_BOOTED); - if (event && (flags & VIR_DOMAIN_START_PAUSED)) { + if (event_start && (flags & VIR_DOMAIN_START_PAUSED)) { /* There are two classes of event-watching clients - those * that only care about on/off (and must see a started event * no matter what, but don't care about suspend events), and * those that also care about running/paused. To satisfy both * client types, we have to send two events. */ - event2 = virDomainEventNewFromObj(vm, + event_pause = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_SUSPENDED, VIR_DOMAIN_EVENT_SUSPENDED_PAUSED); } virDomainAuditStart(vm, "booted", true); + VIR_INFO("Creating domain '%s'", vm->def->name); dom = virGetDomain(conn, vm->def->name, vm->def->uuid); if (dom) dom->id = vm->def->id; @@ -1530,13 +1552,16 @@ cleanup: virDomainDefFree(def); if (vm) virObjectUnlock(vm); - if (event) { - qemuDomainEventQueue(driver, event); - if (event2) - qemuDomainEventQueue(driver, event2); + if (event_define) + qemuDomainEventQueue(driver, event_define); + if (event_start) { + qemuDomainEventQueue(driver, event_start); + if (event_pause) + qemuDomainEventQueue(driver, event_pause); } virObjectUnref(caps); virObjectUnref(qemuCaps); + virObjectUnref(cfg); return dom; } -- 1.7.12.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list