virDomainPtr dom = NULL;
char *xmlin;
char *dname;
+ char *uri;
+ char *dconnuri;
char *cookieout = NULL;
int cookieoutlen = 0;
int rv = -1;
xmlin = args->xmlin == NULL ? NULL : *args->xmlin;
dname = args->dname == NULL ? NULL : *args->dname;
+ uri = args->uri == NULL ? NULL : *args->uri;
+ dconnuri = args->dconnuri == NULL ? NULL : *args->dconnuri;
if (virDomainMigratePerform3(dom, xmlin,
args->cookie_in.cookie_in_val,
args->cookie_in.cookie_in_len,
&cookieout, &cookieoutlen,
- args->uri,
+ dconnuri, uri,
args->flags, dname, args->resource) < 0)
goto cleanup;
virDomainPtr dom = NULL;
char *cookieout = NULL;
int cookieoutlen = 0;
+ char *uri;
+ char *dconnuri;
int rv = -1;
if (!conn) {
goto cleanup;
}
+ uri = args->uri == NULL ? NULL : *args->uri;
+ dconnuri = args->dconnuri == NULL ? NULL : *args->dconnuri;
+
if (virDomainMigrateFinish3(conn, args->dname,
args->cookie_in.cookie_in_val,
args->cookie_in.cookie_in_len,
&cookieout, &cookieoutlen,
- args->uri,
+ dconnuri, uri,
args->flags,
args->cancelled,
&dom) < 0)
int cookieinlen,
char **cookieout,
int *cookieoutlen,
+ const char *dconnuri,
const char *uri,
unsigned long flags,
const char *dname,
int cookieinlen,
char **cookieout,
int *cookieoutlen,
+ const char *dconnuri,
const char *uri,
unsigned long flags,
int cancelled,
cookieinlen = cookieoutlen;
cookieout = NULL;
cookieoutlen = 0;
+ /* dconnuri not relevant in non-P2P modes, so left NULL here */
ret = domain->conn->driver->domainMigratePerform3
(domain, NULL, cookiein, cookieinlen,
- &cookieout, &cookieoutlen,
+ &cookieout, &cookieoutlen, NULL,
uri, flags, dname, bandwidth);
/* Perform failed. Make sure Finish doesn't overwrite the error */
dname = dname ? dname : domain->name;
ret = dconn->driver->domainMigrateFinish3
(dconn, dname, cookiein, cookieinlen, &cookieout, &cookieoutlen,
- uri, flags, cancelled, &ddomain);
+ NULL, uri, flags, cancelled, &ddomain);
/* If ret is 0 then 'ddomain' indicates whether the VM is
* running on the dest. If not running, we can restart
const char *xmlin,
unsigned long flags,
const char *dname,
+ const char *dconnuri,
const char *uri,
unsigned long bandwidth)
{
return -1;
}
- tempuri = xmlParseURI(uri);
+ tempuri = xmlParseURI(dconnuri);
if (!tempuri) {
virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
virDispatchError(domain->conn);
0, /* cookieinlen */
NULL, /* cookieoutlen */
NULL, /* cookieoutlen */
+ dconnuri,
uri,
flags,
dname,
_("Unable to change target guest XML during migration"));
return -1;
}
+ if (uri) {
+ virLibConnError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Unable to override peer2peer migration URI"));
+ return -1;
+ }
return domain->conn->driver->domainMigratePerform(domain,
NULL, /* cookie */
0, /* cookielen */
- uri,
+ dconnuri,
flags,
dname,
bandwidth);
if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
VIR_DRV_FEATURE_MIGRATION_V3)) {
VIR_DEBUG("Using migration protocol 3");
+ /* dconn URI not relevant in direct migration, since no
+ * target libvirtd is involved */
return domain->conn->driver->domainMigratePerform3(domain,
xmlin,
NULL, /* cookiein */
0, /* cookieinlen */
NULL, /* cookieoutlen */
NULL, /* cookieoutlen */
+ NULL, /* dconnuri */
uri,
flags,
dname,
VIR_DEBUG("Using peer2peer migration");
if (virDomainMigratePeer2Peer(domain, NULL, flags, dname,
- uri ? uri : dstURI, bandwidth) < 0) {
+ uri ? uri : dstURI, NULL, bandwidth) < 0) {
VIR_FREE(dstURI);
goto error;
}
VIR_DRV_FEATURE_MIGRATION_P2P)) {
VIR_DEBUG("Using peer2peer migration");
if (virDomainMigratePeer2Peer(domain, NULL, flags,
- dname, duri, bandwidth) < 0)
+ dname, duri, NULL, bandwidth) < 0)
goto error;
} else {
/* No peer to peer migration supported */
int cookieinlen,
char **cookieout,
int *cookieoutlen,
+ const char *dconnuri,
const char *uri,
unsigned long flags,
const char *dname,
virConnectPtr conn;
VIR_DOMAIN_DEBUG(domain, "xmlin=%s cookiein=%p, cookieinlen=%d, "
- "cookieout=%p, cookieoutlen=%p, "
+ "cookieout=%p, cookieoutlen=%p, dconnuri=%s, "
"uri=%s, flags=%lu, dname=%s, bandwidth=%lu",
NULLSTR(xmlin), cookiein, cookieinlen,
- cookieout, cookieoutlen,
- uri, flags, NULLSTR(dname), bandwidth);
+ cookieout, cookieoutlen, NULLSTR(dconnuri),
+ NULLSTR(uri), flags, NULLSTR(dname), bandwidth);
virResetLastError();
ret = conn->driver->domainMigratePerform3(domain, xmlin,
cookiein, cookieinlen,
cookieout, cookieoutlen,
- uri,
+ dconnuri, uri,
flags, dname, bandwidth);
if (ret < 0)
goto error;
int cookieinlen,
char **cookieout,
int *cookieoutlen,
+ const char *dconnuri,
const char *uri,
unsigned long flags,
int cancelled,
virDomainPtr *newdom)
{
VIR_DEBUG("dconn=%p, dname=%s, cookiein=%p, cookieinlen=%d, cookieout=%p,"
- "cookieoutlen=%p, uri=%s, flags=%lu, retcode=%d newdom=%p",
+ "cookieoutlen=%p, dconnuri=%s, uri=%s, flags=%lu, retcode=%d newdom=%p",
dconn, NULLSTR(dname), cookiein, cookieinlen, cookieout,
- cookieoutlen, uri, flags, cancelled, newdom);
+ cookieoutlen, NULLSTR(dconnuri), NULLSTR(uri), flags, cancelled, newdom);
virResetLastError();
ret = dconn->driver->domainMigrateFinish3(dconn, dname,
cookiein, cookieinlen,
cookieout, cookieoutlen,
- uri, flags,
+ dconnuri, uri, flags,
cancelled,
newdom);
if (ret < 0)
int cookieinlen,
char **cookieout,
int *cookieoutlen,
- const char *uri,
+ const char *dconnuri, /* libvirtd URI if Peer2Peer, NULL otherwise */
+ const char *uri, /* VM Migration URI */
unsigned long flags,
const char *dname,
unsigned long resource);
int cookieinlen,
char **cookieout,
int *cookieoutlen,
- const char *uri,
+ const char *dconnuri, /* libvirtd URI if Peer2Peer, NULL otherwise */
+ const char *uri, /* VM Migration URI, NULL in tunnelled case */
unsigned long flags,
int cancelled, /* Kill the dst VM */
virDomainPtr *newdom);
struct qemud_driver *driver = dom->conn->privateData;
virDomainObjPtr vm;
int ret = -1;
+ const char *dconnuri = NULL;
virCheckFlags(VIR_MIGRATE_LIVE |
VIR_MIGRATE_PEER2PEER |
goto cleanup;
}
+ if (flags & VIR_MIGRATE_PEER2PEER) {
+ dconnuri = uri;
+ uri = NULL;
+ }
+
/* Do not output cookies in v2 protocol, since the cookie
* length was not sufficiently large, causing failures
* migrating between old & new libvirtd.
* Consume any cookie we were able to decode though
*/
ret = qemuMigrationPerform(driver, dom->conn, vm,
- NULL, uri, cookie, cookielen,
+ NULL, dconnuri, uri, cookie, cookielen,
NULL, NULL, /* No output cookies in v2 */
flags, dname, resource, true);
int cookieinlen,
char **cookieout,
int *cookieoutlen,
+ const char *dconnuri,
const char *uri,
unsigned long flags,
const char *dname,
}
ret = qemuMigrationPerform(driver, dom->conn, vm, xmlin,
- uri, cookiein, cookieinlen,
+ dconnuri, uri, cookiein, cookieinlen,
cookieout, cookieoutlen,
flags, dname, resource, false);
int cookieinlen,
char **cookieout,
int *cookieoutlen,
+ const char *dconnuri ATTRIBUTE_UNUSED,
const char *uri ATTRIBUTE_UNUSED,
unsigned long flags,
int cancelled,
virConnectPtr sconn,
virConnectPtr dconn,
virDomainObjPtr vm,
- const char *uri,
+ const char *dconnuri,
unsigned long flags,
const char *dname,
unsigned long resource)
qemuDomainObjEnterRemoteWithDriver(driver, vm);
ddomain = dconn->driver->domainMigrateFinish2
(dconn, dname, cookie, cookielen,
- uri_out ? uri_out : uri, flags, cancelled);
+ uri_out ? uri_out : dconnuri, flags, cancelled);
qemuDomainObjExitRemoteWithDriver(driver, vm);
cleanup:
virConnectPtr dconn,
virDomainObjPtr vm,
const char *xmlin,
+ const char *dconnuri,
const char *uri,
unsigned long flags,
const char *dname,
qemuDomainObjEnterRemoteWithDriver(driver, vm);
ret = dconn->driver->domainMigratePrepare3
(dconn, cookiein, cookieinlen, &cookieout, &cookieoutlen,
- NULL, &uri_out, flags, dname, resource, dom_xml);
+ uri, &uri_out, flags, dname, resource, dom_xml);
qemuDomainObjExitRemoteWithDriver(driver, vm);
}
VIR_FREE(dom_xml);
* running, but in paused state until the destination can
* confirm migration completion.
*/
- VIR_DEBUG("Perform3 %p uri=%s", sconn, uri_out);
+ VIR_DEBUG("Perform3 %p uri=%s uri_out=%s", sconn, uri, uri_out);
VIR_FREE(cookiein);
cookiein = cookieout;
cookieinlen = cookieoutlen;
qemuDomainObjEnterRemoteWithDriver(driver, vm);
ret = dconn->driver->domainMigrateFinish3
(dconn, dname, cookiein, cookieinlen, &cookieout, &cookieoutlen,
- uri_out ? uri_out : uri, flags, cancelled, &ddomain);
+ dconnuri, uri_out ? uri_out : uri, flags, cancelled, &ddomain);
qemuDomainObjExitRemoteWithDriver(driver, vm);
/* If ret is 0 then 'ddomain' indicates whether the VM is
virConnectPtr sconn,
virDomainObjPtr vm,
const char *xmlin,
+ const char *dconnuri,
const char *uri,
unsigned long flags,
const char *dname,
*/
qemuDomainObjEnterRemoteWithDriver(driver, vm);
- dconn = virConnectOpen(uri);
+ dconn = virConnectOpen(dconnuri);
qemuDomainObjExitRemoteWithDriver(driver, vm);
if (dconn == NULL) {
qemuReportError(VIR_ERR_OPERATION_FAILED,
if (v3)
ret = doPeer2PeerMigrate3(driver, sconn, dconn, vm, xmlin,
- uri, flags, dname, resource);
+ dconnuri, uri, flags, dname, resource);
else
ret = doPeer2PeerMigrate2(driver, sconn, dconn, vm,
- uri, flags, dname, resource);
+ dconnuri, flags, dname, resource);
cleanup:
/* don't call virConnectClose(), because that resets any pending errors */
virConnectPtr conn,
virDomainObjPtr vm,
const char *xmlin,
+ const char *dconnuri,
const char *uri,
const char *cookiein,
int cookieinlen,
}
if (doPeer2PeerMigrate(driver, conn, vm, xmlin,
- uri, flags, dname, resource) < 0)
+ dconnuri, uri, flags, dname, resource) < 0)
/* doPeer2PeerMigrate already set the error, so just get out */
goto endjob;
} else {
+ if (dconnuri) {
+ qemuReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("Unexpected dconnuri parameter with non-peer2peer migration"));
+ goto endjob;
+ }
if (doNativeMigrate(driver, vm, uri, cookiein, cookieinlen,
cookieout, cookieoutlen,
flags, dname, resource) < 0)
virConnectPtr conn,
virDomainObjPtr vm,
const char *xmlin,
+ const char *dconnuri,
const char *uri,
const char *cookiein,
int cookieinlen,
int cookieinlen,
char **cookieout,
int *cookieoutlen,
+ const char *dconnuri,
const char *uri,
unsigned long flags,
const char *dname,
args.xmlin = xmlin == NULL ? NULL : (char **) &xmlin;
args.cookie_in.cookie_in_val = (char *)cookiein;
args.cookie_in.cookie_in_len = cookieinlen;
- args.uri = (char *) uri;
args.flags = flags;
args.dname = dname == NULL ? NULL : (char **) &dname;
+ args.uri = uri == NULL ? NULL : (char **) &uri;
+ args.dconnuri = dconnuri == NULL ? NULL : (char **) &dconnuri;
args.resource = resource;
if (call (dom->conn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_PERFORM3,
int cookieinlen,
char **cookieout,
int *cookieoutlen,
+ const char *dconnuri,
const char *uri,
unsigned long flags,
int cancelled,
args.cookie_in.cookie_in_val = (char *)cookiein;
args.cookie_in.cookie_in_len = cookieinlen;
args.dname = (char *) dname;
- args.uri = (char *) uri;
+ args.uri = uri == NULL ? NULL : (char **) &uri;
+ args.dconnuri = dconnuri == NULL ? NULL : (char **) &dconnuri;
args.flags = flags;
args.cancelled = cancelled;
remote_nonnull_domain dom;
remote_string xmlin;
opaque cookie_in<REMOTE_MIGRATE_COOKIE_MAX>;
- remote_nonnull_string uri;
+ remote_string dconnuri;
+ remote_string uri;
unsigned hyper flags;
remote_string dname;
unsigned hyper resource;
struct remote_domain_migrate_finish3_args {
remote_nonnull_string dname;
opaque cookie_in<REMOTE_MIGRATE_COOKIE_MAX>;
- remote_nonnull_string uri;
+ remote_string dconnuri;
+ remote_string uri;
unsigned hyper flags;
int cancelled;
};
u_int cookie_in_len;
char * cookie_in_val;
} cookie_in;
- remote_nonnull_string uri;
+ remote_string dconnuri;
+ remote_string uri;
uint64_t flags;
remote_string dname;
uint64_t resource;
u_int cookie_in_len;
char * cookie_in_val;
} cookie_in;
- remote_nonnull_string uri;
+ remote_string dconnuri;
+ remote_string uri;
uint64_t flags;
int cancelled;
};