static virDomainPtr
virDomainMigrateVersion3(virDomainPtr domain,
virConnectPtr dconn,
+ const char *xmlin,
unsigned long flags,
const char *dname,
const char *uri,
VIR_DEBUG("Begin3 %p", domain->conn);
dom_xml = domain->conn->driver->domainMigrateBegin3
- (domain, &cookieout, &cookieoutlen, flags, dname,
- bandwidth);
+ (domain, xmlin, &cookieout, &cookieoutlen,
+ flags, dname, bandwidth);
if (!dom_xml)
goto done;
cookieout = NULL;
cookieoutlen = 0;
ret = domain->conn->driver->domainMigratePerform3
- (domain, cookiein, cookieinlen, &cookieout, &cookieoutlen,
+ (domain, NULL, cookiein, cookieinlen,
+ &cookieout, &cookieoutlen,
uri, flags, dname, bandwidth);
/* Perform failed. Make sure Finish doesn't overwrite the error */
*/
static int
virDomainMigratePeer2Peer (virDomainPtr domain,
+ const char *xmlin,
unsigned long flags,
const char *dname,
const char *uri,
VIR_DRV_FEATURE_MIGRATION_V3)) {
VIR_DEBUG("Using migration protocol 3");
return domain->conn->driver->domainMigratePerform3(domain,
+ xmlin,
NULL, /* cookiein */
0, /* cookieinlen */
NULL, /* cookieoutlen */
bandwidth);
} else {
VIR_DEBUG("Using migration protocol 2");
+ if (xmlin) {
+ virLibConnError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Unable to change target guest XML during migration"));
+ return -1;
+ }
return domain->conn->driver->domainMigratePerform(domain,
NULL, /* cookie */
0, /* cookielen */
*/
static int
virDomainMigrateDirect (virDomainPtr domain,
+ const char *xmlin,
unsigned long flags,
const char *dname,
const char *uri,
VIR_DRV_FEATURE_MIGRATION_V3)) {
VIR_DEBUG("Using migration protocol 3");
return domain->conn->driver->domainMigratePerform3(domain,
+ xmlin,
NULL, /* cookiein */
0, /* cookieinlen */
NULL, /* cookieoutlen */
bandwidth);
} else {
VIR_DEBUG("Using migration protocol 2");
+ if (xmlin) {
+ virLibConnError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Unable to change target guest XML during migration"));
+ return -1;
+ }
return domain->conn->driver->domainMigratePerform(domain,
NULL, /* cookie */
0, /* cookielen */
}
VIR_DEBUG("Using peer2peer migration");
- if (virDomainMigratePeer2Peer(domain, flags, dname, uri ? uri : dstURI, bandwidth) < 0) {
+ if (virDomainMigratePeer2Peer(domain, NULL, flags, dname,
+ uri ? uri : dstURI, bandwidth) < 0) {
VIR_FREE(dstURI);
goto error;
}
VIR_DRV_SUPPORTS_FEATURE(dconn->driver, dconn,
VIR_DRV_FEATURE_MIGRATION_V3)) {
VIR_DEBUG("Using migration protocol 3");
- ddomain = virDomainMigrateVersion3(domain, dconn, flags, dname, uri, bandwidth);
+ ddomain = virDomainMigrateVersion3(domain, dconn, NULL, flags, dname, uri, bandwidth);
} else if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
VIR_DRV_FEATURE_MIGRATION_V2) &&
VIR_DRV_SUPPORTS_FEATURE(dconn->driver, dconn,
if (VIR_DRV_SUPPORTS_FEATURE (domain->conn->driver, domain->conn,
VIR_DRV_FEATURE_MIGRATION_P2P)) {
VIR_DEBUG("Using peer2peer migration");
- if (virDomainMigratePeer2Peer (domain, flags, dname, duri, bandwidth) < 0)
+ if (virDomainMigratePeer2Peer(domain, NULL, flags,
+ dname, duri, bandwidth) < 0)
goto error;
} else {
/* No peer to peer migration supported */
if (VIR_DRV_SUPPORTS_FEATURE (domain->conn->driver, domain->conn,
VIR_DRV_FEATURE_MIGRATION_DIRECT)) {
VIR_DEBUG("Using direct migration");
- if (virDomainMigrateDirect (domain, flags, dname, duri, bandwidth) < 0)
+ if (virDomainMigrateDirect(domain, NULL, flags,
+ dname, duri, bandwidth) < 0)
goto error;
} else {
/* Cannot do a migration with only the perform step */
*/
char *
virDomainMigrateBegin3(virDomainPtr domain,
+ const char *xmlin,
char **cookieout,
int *cookieoutlen,
unsigned long flags,
{
virConnectPtr conn;
- VIR_DOMAIN_DEBUG(domain, "cookieout=%p, cookieoutlen=%p, "
+ VIR_DOMAIN_DEBUG(domain, "xmlin=%s cookieout=%p, cookieoutlen=%p, "
"flags=%lu, dname=%s, bandwidth=%lu",
- cookieout, cookieoutlen, flags,
+ NULLSTR(xmlin), cookieout, cookieoutlen, flags,
NULLSTR(dname), bandwidth);
virResetLastError();
if (conn->driver->domainMigrateBegin3) {
char *xml;
- xml = conn->driver->domainMigrateBegin3(domain,
+ xml = conn->driver->domainMigrateBegin3(domain, xmlin,
cookieout, cookieoutlen,
flags, dname, bandwidth);
VIR_DEBUG("xml %s", NULLSTR(xml));
*/
int
virDomainMigratePerform3(virDomainPtr domain,
+ const char *xmlin,
const char *cookiein,
int cookieinlen,
char **cookieout,
{
virConnectPtr conn;
- VIR_DOMAIN_DEBUG(domain, "cookiein=%p, cookieinlen=%d, cookieout=%p, cookieoutlen=%p,"
+ VIR_DOMAIN_DEBUG(domain, "xmlin=%s cookiein=%p, cookieinlen=%d, "
+ "cookieout=%p, cookieoutlen=%p, "
"uri=%s, flags=%lu, dname=%s, bandwidth=%lu",
- cookiein, cookieinlen, cookieout, cookieoutlen,
+ NULLSTR(xmlin), cookiein, cookieinlen,
+ cookieout, cookieoutlen,
uri, flags, NULLSTR(dname), bandwidth);
virResetLastError();
if (conn->driver->domainMigratePerform3) {
int ret;
- ret = conn->driver->domainMigratePerform3(domain,
+ ret = conn->driver->domainMigratePerform3(domain, xmlin,
cookiein, cookieinlen,
cookieout, cookieoutlen,
uri,
* Consume any cookie we were able to decode though
*/
ret = qemuMigrationPerform(driver, dom->conn, vm,
- uri, cookie, cookielen,
+ NULL, uri, cookie, cookielen,
NULL, NULL, /* No output cookies in v2 */
flags, dname, resource, true);
static char *
qemuDomainMigrateBegin3(virDomainPtr domain,
+ const char *xmlin,
char **cookieout,
int *cookieoutlen,
unsigned long flags,
goto cleanup;
}
- xml = qemuMigrationBegin(driver, vm,
+ xml = qemuMigrationBegin(driver, vm, xmlin,
cookieout, cookieoutlen);
cleanup:
static int
qemuDomainMigratePerform3(virDomainPtr dom,
+ const char *xmlin,
const char *cookiein,
int cookieinlen,
char **cookieout,
goto cleanup;
}
- ret = qemuMigrationPerform(driver, dom->conn, vm,
+ ret = qemuMigrationPerform(driver, dom->conn, vm, xmlin,
uri, cookiein, cookieinlen,
cookieout, cookieoutlen,
flags, dname, resource, false);
char *qemuMigrationBegin(struct qemud_driver *driver,
virDomainObjPtr vm,
+ const char *xmlin,
char **cookieout,
int *cookieoutlen)
{
char *rv = NULL;
qemuMigrationCookiePtr mig = NULL;
+ if (xmlin) {
+ qemuReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("Passing XML for the target VM is not yet supported"));
+ goto cleanup;
+ }
+
if (!virDomainObjIsActive(vm)) {
qemuReportError(VIR_ERR_OPERATION_INVALID,
"%s", _("domain is not running"));
virConnectPtr sconn,
virConnectPtr dconn,
virDomainObjPtr vm,
+ const char *xmlin,
const char *uri,
unsigned long flags,
const char *dname,
virStreamPtr st = NULL;
VIR_DEBUG("Begin3 %p", sconn);
- dom_xml = qemuMigrationBegin(driver, vm,
+ dom_xml = qemuMigrationBegin(driver, vm, xmlin,
&cookieout, &cookieoutlen);
if (!dom_xml)
goto cleanup;
static int doPeer2PeerMigrate(struct qemud_driver *driver,
virConnectPtr sconn,
virDomainObjPtr vm,
+ const char *xmlin,
const char *uri,
unsigned long flags,
const char *dname,
}
if (v3)
- ret = doPeer2PeerMigrate3(driver, sconn, dconn, vm,
+ ret = doPeer2PeerMigrate3(driver, sconn, dconn, vm, xmlin,
uri, flags, dname, resource);
else
ret = doPeer2PeerMigrate2(driver, sconn, dconn, vm,
int qemuMigrationPerform(struct qemud_driver *driver,
virConnectPtr conn,
virDomainObjPtr vm,
+ const char *xmlin,
const char *uri,
const char *cookiein,
int cookieinlen,
goto endjob;
}
- if (doPeer2PeerMigrate(driver, conn, vm, uri, flags, dname, resource) < 0)
+ if (doPeer2PeerMigrate(driver, conn, vm, xmlin,
+ uri, flags, dname, resource) < 0)
/* doPeer2PeerMigrate already set the error, so just get out */
goto endjob;
} else {