VIR_MIGRATE_PARAM_DEST_NAME, VIR_TYPED_PARAM_STRING, \
NULL
+static char *
+vzDomainMigrateBeginStep(virDomainObjPtr dom,
+ vzDriverPtr driver,
+ virTypedParameterPtr params,
+ int nparams,
+ char **cookieout,
+ int *cookieoutlen)
+{
+ /* we can't do this check via VZ_MIGRATION_PARAMETERS as on preparation
+ * step domain xml will be passed via this parameter and it is a common
+ * style to use single allowed parameter list definition in all steps */
+ if (virTypedParamsGet(params, nparams, VIR_MIGRATE_PARAM_DEST_XML)) {
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+ _("Changing destination XML is not supported"));
+ return NULL;
+ }
+
+ /* session uuid, domain uuid and domain name are for backward compat */
+ if (vzBakeCookie(driver, dom, cookieout, cookieoutlen,
+ VZ_MIGRATION_COOKIE_SESSION_UUID
+ | VZ_MIGRATION_COOKIE_DOMAIN_UUID
+ | VZ_MIGRATION_COOKIE_DOMAIN_NAME) < 0)
+ return NULL;
+
+ return virDomainDefFormat(dom->def, driver->caps,
+ VIR_DOMAIN_XML_MIGRATABLE);
+}
+
static char *
vzDomainMigrateBegin3Params(virDomainPtr domain,
virTypedParameterPtr params,
if (virTypedParamsValidate(params, nparams, VZ_MIGRATION_PARAMETERS) < 0)
goto cleanup;
- /* we can't do this check via VZ_MIGRATION_PARAMETERS as on preparation
- * step domain xml will be passed via this parameter and it is a common
- * style to use single allowed parameter list definition in all steps */
- if (virTypedParamsGet(params, nparams, VIR_MIGRATE_PARAM_DEST_XML)) {
- virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
- _("Changing destination XML is not supported"));
- goto cleanup;
- }
-
if (!(dom = vzDomObjFromDomain(domain)))
goto cleanup;
- /* session uuid, domain uuid and domain name are for backward compat */
- if (vzBakeCookie(privconn->driver, dom, cookieout, cookieoutlen,
- VZ_MIGRATION_COOKIE_SESSION_UUID
- | VZ_MIGRATION_COOKIE_DOMAIN_UUID
- | VZ_MIGRATION_COOKIE_DOMAIN_NAME) < 0)
- goto cleanup;
-
- xml = virDomainDefFormat(dom->def, privconn->driver->caps,
- VIR_DOMAIN_XML_MIGRATABLE);
+ xml = vzDomainMigrateBeginStep(dom, privconn->driver, params, nparams,
+ cookieout, cookieoutlen);
cleanup:
}
static int
-vzDomainMigratePerformStep(virDomainPtr domain,
+vzDomainMigratePerformStep(virDomainObjPtr dom,
+ vzDriverPtr driver,
virTypedParameterPtr params,
int nparams,
const char *cookiein,
unsigned int flags)
{
int ret = -1;
- virDomainObjPtr dom = NULL;
- vzDomObjPtr privdom;
+ vzDomObjPtr privdom = dom->privateData;
virURIPtr vzuri = NULL;
- vzConnPtr privconn = domain->conn->privateData;
const char *miguri = NULL;
const char *dname = NULL;
vzMigrationCookiePtr mig = NULL;
bool job = false;
- virCheckFlags(VZ_MIGRATION_FLAGS, -1);
-
- if (virTypedParamsValidate(params, nparams, VZ_MIGRATION_PARAMETERS) < 0)
- goto cleanup;
-
if (virTypedParamsGetString(params, nparams,
VIR_MIGRATE_PARAM_URI, &miguri) < 0 ||
virTypedParamsGetString(params, nparams,
VZ_MIGRATION_COOKIE_SESSION_UUID)))
goto cleanup;
- if (!(dom = vzDomObjFromDomainRef(domain)))
- goto cleanup;
-
if (vzDomainObjBeginJob(dom) < 0)
goto cleanup;
job = true;
- privdom = dom->privateData;
privdom->job.hasProgress = true;
if (vzEnsureDomainExists(dom) < 0)
if (prlsdkMigrate(dom, vzuri, mig->session_uuid, dname, flags) < 0)
goto cleanup;
- virDomainObjListRemove(privconn->driver->domains, dom);
+ virDomainObjListRemove(driver->domains, dom);
virObjectLock(dom);
ret = 0;
cleanup:
if (job)
vzDomainObjEndJob(dom);
- virDomainObjEndAPI(&dom);
virURIFree(vzuri);
vzMigrationCookieFree(mig);
}
static int
-vzDomainMigratePerformP2P(virDomainPtr domain,
+vzDomainMigratePerformP2P(virDomainObjPtr dom,
+ vzDriverPtr driver,
const char *dconnuri,
virTypedParameterPtr orig_params,
int nparams,
if (!(dconn = virConnectOpen(dconnuri)))
goto done;
- if (!(dom_xml = vzDomainMigrateBegin3Params(domain, params, nparams,
- &cookieout, &cookieoutlen,
- flags)))
+ if (!(dom_xml = vzDomainMigrateBeginStep(dom, driver, params, nparams,
+ &cookieout, &cookieoutlen)))
goto done;
cookiein = cookieout;
cookieinlen = cookieoutlen;
cookieout = NULL;
cookieoutlen = 0;
- if (dconn->driver->domainMigratePrepare3Params
+ virObjectUnlock(dom);
+ ret = dconn->driver->domainMigratePrepare3Params
(dconn, params, nparams, cookiein, cookieinlen,
- &cookieout, &cookieoutlen, &uri, flags) < 0)
+ &cookieout, &cookieoutlen, &uri, flags);
+ virObjectLock(dom);
+ if (ret < 0)
goto done;
+ ret = -1;
/* preparation step was successful, thus on any error we must perform
* finish step to finalize migration on target
cookieinlen = cookieoutlen;
cookieout = NULL;
cookieoutlen = 0;
- if (vzDomainMigratePerformStep(domain, params, nparams, cookiein,
+ if (vzDomainMigratePerformStep(dom, driver, params, nparams, cookiein,
cookieinlen, flags) < 0) {
orig_err = virSaveLastError();
goto finish;
VIR_MIGRATE_PARAM_DEST_NAME, NULL) <= 0 &&
virTypedParamsReplaceString(¶ms, &nparams,
VIR_MIGRATE_PARAM_DEST_NAME,
- domain->name) < 0)
+ dom->def->name) < 0)
goto done;
+ virObjectUnlock(dom);
ddomain = dconn->driver->domainMigrateFinish3Params(dconn, params, nparams,
NULL, 0, NULL, NULL,
flags, cancelled);
+ virObjectLock(dom);
if (ddomain)
ret = 0;
virObjectUnref(ddomain);
int *cookieoutlen ATTRIBUTE_UNUSED,
unsigned int flags)
{
+ int ret;
+ virDomainObjPtr dom;
+ vzConnPtr privconn = domain->conn->privateData;
+
virCheckFlags(VZ_MIGRATION_FLAGS, -1);
if (virTypedParamsValidate(params, nparams, VZ_MIGRATION_PARAMETERS) < 0)
return -1;
+ if (!(dom = vzDomObjFromDomainRef(domain)))
+ return -1;
+
if (flags & VIR_MIGRATE_PEER2PEER)
- return vzDomainMigratePerformP2P(domain, dconnuri, params, nparams, flags);
+ ret = vzDomainMigratePerformP2P(dom, privconn->driver, dconnuri,
+ params, nparams, flags);
else
- return vzDomainMigratePerformStep(domain, params, nparams,
- cookiein, cookieinlen, flags);
+ ret = vzDomainMigratePerformStep(dom, privconn->driver, params, nparams,
+ cookiein, cookieinlen, flags);
+ virDomainObjEndAPI(&dom);
+
+ return ret;
}
static virDomainPtr