*
* Consume any cookie we were able to decode though
*/
- ret = qemuMigrationPerform(driver, dom->conn, vm,
+ ret = qemuMigrationPerform(driver, dom->conn, vm, NULL,
NULL, dconnuri, uri, NULL, NULL, 0, NULL, 0,
compression, cookie, cookielen,
NULL, NULL, /* No output cookies in v2 */
goto cleanup;
}
- ret = qemuMigrationPerform(driver, dom->conn, vm, xmlin,
+ ret = qemuMigrationPerform(driver, dom->conn, vm, xmlin, NULL,
dconnuri, uri, NULL, NULL, 0, NULL, 0,
compression,
cookiein, cookieinlen,
virQEMUDriverPtr driver = dom->conn->privateData;
virDomainObjPtr vm;
const char *dom_xml = NULL;
+ const char *persist_xml = NULL;
const char *dname = NULL;
const char *uri = NULL;
const char *graphicsuri = NULL;
&listenAddress) < 0 ||
virTypedParamsGetInt(params, nparams,
VIR_MIGRATE_PARAM_DISKS_PORT,
- &nbdPort) < 0)
+ &nbdPort) < 0 ||
+ virTypedParamsGetString(params, nparams,
+ VIR_MIGRATE_PARAM_PERSIST_XML,
+ &persist_xml) < 0)
goto cleanup;
nmigrate_disks = virTypedParamsGetStringList(params, nparams,
goto cleanup;
}
- ret = qemuMigrationPerform(driver, dom->conn, vm, dom_xml,
+ ret = qemuMigrationPerform(driver, dom->conn, vm, dom_xml, persist_xml,
dconnuri, uri, graphicsuri, listenAddress,
nmigrate_disks, migrate_disks, nbdPort,
compression,
static int
qemuMigrationRun(virQEMUDriverPtr driver,
virDomainObjPtr vm,
+ const char *persist_xml,
const char *cookiein,
int cookieinlen,
char **cookieout,
bool events = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_EVENT);
bool inPostCopy = false;
unsigned int waitFlags;
+ virDomainDefPtr persistDef = NULL;
int rc;
VIR_DEBUG("driver=%p, vm=%p, cookiein=%s, cookieinlen=%d, "
if (events)
priv->signalIOError = abort_on_error;
+ if (flags & VIR_MIGRATE_PERSIST_DEST) {
+ if (persist_xml) {
+ persistDef = qemuMigrationPrepareDef(driver, persist_xml,
+ NULL, NULL);
+ if (!persistDef)
+ goto cleanup;
+ } else {
+ persistDef = vm->newDef;
+ }
+ }
+
mig = qemuMigrationEatCookie(driver, vm, cookiein, cookieinlen,
cookieFlags | QEMU_MIGRATION_COOKIE_GRAPHICS);
if (!mig)
QEMU_MIGRATION_COOKIE_STATS;
if (ret == 0 &&
- (((flags & VIR_MIGRATE_PERSIST_DEST &&
- qemuMigrationCookieAddPersistent(mig, vm->newDef) < 0)) ||
- qemuMigrationBakeCookie(mig, driver, vm, cookieout,
- cookieoutlen, cookieFlags) < 0)) {
+ (qemuMigrationCookieAddPersistent(mig, persistDef) < 0 ||
+ qemuMigrationBakeCookie(mig, driver, vm, cookieout,
+ cookieoutlen, cookieFlags) < 0)) {
VIR_WARN("Unable to encode migration cookie");
}
+ if (persistDef != vm->newDef)
+ virDomainDefFree(persistDef);
qemuMigrationCookieFree(mig);
if (events)
*/
static int doNativeMigrate(virQEMUDriverPtr driver,
virDomainObjPtr vm,
+ const char *persist_xml,
const char *uri,
const char *cookiein,
int cookieinlen,
spec.dest.host.port = uribits->port;
spec.fwdType = MIGRATION_FWD_DIRECT;
- ret = qemuMigrationRun(driver, vm, cookiein, cookieinlen, cookieout,
+ ret = qemuMigrationRun(driver, vm, persist_xml, cookiein, cookieinlen, cookieout,
cookieoutlen, flags, resource, &spec, dconn,
graphicsuri, nmigrate_disks, migrate_disks,
compression);
static int doTunnelMigrate(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virStreamPtr st,
+ const char *persist_xml,
const char *cookiein,
int cookieinlen,
char **cookieout,
goto cleanup;
}
- ret = qemuMigrationRun(driver, vm, cookiein, cookieinlen, cookieout,
- cookieoutlen, flags, resource, &spec, dconn,
- graphicsuri, nmigrate_disks, migrate_disks,
+ ret = qemuMigrationRun(driver, vm, persist_xml, cookiein, cookieinlen,
+ cookieout, cookieoutlen, flags, resource, &spec,
+ dconn, graphicsuri, nmigrate_disks, migrate_disks,
compression);
cleanup:
VIR_DEBUG("Perform %p", sconn);
qemuMigrationJobSetPhase(driver, vm, QEMU_MIGRATION_PHASE_PERFORM2);
if (flags & VIR_MIGRATE_TUNNELLED)
- ret = doTunnelMigrate(driver, vm, st,
+ ret = doTunnelMigrate(driver, vm, st, NULL,
NULL, 0, NULL, NULL,
flags, resource, dconn,
NULL, 0, NULL, compression);
else
- ret = doNativeMigrate(driver, vm, uri_out,
+ ret = doNativeMigrate(driver, vm, NULL, uri_out,
cookie, cookielen,
NULL, NULL, /* No out cookie with v2 migration */
flags, resource, dconn, NULL, 0, NULL, compression);
const char *dconnuri,
virDomainObjPtr vm,
const char *xmlin,
+ const char *persist_xml,
const char *dname,
const char *uri,
const char *graphicsuri,
cookieout = NULL;
cookieoutlen = 0;
if (flags & VIR_MIGRATE_TUNNELLED) {
- ret = doTunnelMigrate(driver, vm, st,
+ ret = doTunnelMigrate(driver, vm, st, persist_xml,
cookiein, cookieinlen,
&cookieout, &cookieoutlen,
flags, bandwidth, dconn, graphicsuri,
nmigrate_disks, migrate_disks, compression);
} else {
- ret = doNativeMigrate(driver, vm, uri,
+ ret = doNativeMigrate(driver, vm, persist_xml, uri,
cookiein, cookieinlen,
&cookieout, &cookieoutlen,
flags, bandwidth, dconn, graphicsuri,
virConnectPtr sconn,
virDomainObjPtr vm,
const char *xmlin,
+ const char *persist_xml,
const char *dconnuri,
const char *uri,
const char *graphicsuri,
if (*v3proto) {
ret = doPeer2PeerMigrate3(driver, sconn, dconn, dconnuri, vm, xmlin,
- dname, uri, graphicsuri, listenAddress,
- nmigrate_disks, migrate_disks, nbdPort,
- compression, resource, useParams, flags);
+ persist_xml, dname, uri, graphicsuri,
+ listenAddress, nmigrate_disks, migrate_disks,
+ nbdPort, compression, resource, useParams,
+ flags);
} else {
ret = doPeer2PeerMigrate2(driver, sconn, dconn, vm,
dconnuri, flags, dname, resource);
virConnectPtr conn,
virDomainObjPtr vm,
const char *xmlin,
+ const char *persist_xml,
const char *dconnuri,
const char *uri,
const char *graphicsuri,
qemuMigrationStoreDomainState(vm);
if ((flags & (VIR_MIGRATE_TUNNELLED | VIR_MIGRATE_PEER2PEER))) {
- ret = doPeer2PeerMigrate(driver, conn, vm, xmlin,
+ ret = doPeer2PeerMigrate(driver, conn, vm, xmlin, persist_xml,
dconnuri, uri, graphicsuri, listenAddress,
nmigrate_disks, migrate_disks, nbdPort,
compression, flags, dname, resource, &v3proto);
} else {
qemuMigrationJobSetPhase(driver, vm, QEMU_MIGRATION_PHASE_PERFORM2);
- ret = doNativeMigrate(driver, vm, uri, cookiein, cookieinlen,
+ ret = doNativeMigrate(driver, vm, persist_xml, uri, cookiein, cookieinlen,
cookieout, cookieoutlen,
flags, resource, NULL, NULL, 0, NULL,
compression);
qemuMigrationPerformPhase(virQEMUDriverPtr driver,
virConnectPtr conn,
virDomainObjPtr vm,
+ const char *persist_xml,
const char *uri,
const char *graphicsuri,
size_t nmigrate_disks,
virCloseCallbacksUnset(driver->closeCallbacks, vm,
qemuMigrationCleanup);
- ret = doNativeMigrate(driver, vm, uri, cookiein, cookieinlen,
+ ret = doNativeMigrate(driver, vm, persist_xml, uri, cookiein, cookieinlen,
cookieout, cookieoutlen,
flags, resource, NULL, graphicsuri,
nmigrate_disks, migrate_disks, compression);
virConnectPtr conn,
virDomainObjPtr vm,
const char *xmlin,
+ const char *persist_xml,
const char *dconnuri,
const char *uri,
const char *graphicsuri,
return -1;
}
- return qemuMigrationPerformJob(driver, conn, vm, xmlin, dconnuri, uri,
+ return qemuMigrationPerformJob(driver, conn, vm, xmlin, persist_xml, dconnuri, uri,
graphicsuri, listenAddress,
nmigrate_disks, migrate_disks, nbdPort,
compression, cookiein, cookieinlen,
}
if (v3proto) {
- return qemuMigrationPerformPhase(driver, conn, vm, uri,
+ return qemuMigrationPerformPhase(driver, conn, vm, persist_xml, uri,
graphicsuri,
nmigrate_disks, migrate_disks,
compression, cookiein, cookieinlen,
cookieout, cookieoutlen,
flags, resource);
} else {
- return qemuMigrationPerformJob(driver, conn, vm, xmlin, NULL,
+ return qemuMigrationPerformJob(driver, conn, vm, xmlin, persist_xml, NULL,
uri, graphicsuri, listenAddress,
nmigrate_disks, migrate_disks, nbdPort,
compression, cookiein, cookieinlen,