struct qemud_driver *driver = dom->conn->privateData;
virDomainObjPtr vm;
virDomainEventPtr event = NULL;
- char *safe_uri;
- char cmd[HOST_NAME_MAX+50];
- char *info = NULL;
int ret = -1;
int paused = 0;
int status;
+ xmlURIPtr uribits = NULL;
unsigned long long transferred, remaining, total;
qemuDriverLock(driver);
goto cleanup;
/* Issue the migrate command. */
- safe_uri = qemudEscapeMonitorArg (uri);
- if (!safe_uri) {
- virReportOOMError (dom->conn);
- goto cleanup;
+ if (STRPREFIX(uri, "tcp:") && !STRPREFIX(uri, "tcp://")) {
+ char *tmpuri;
+ if (virAsprintf(&tmpuri, "tcp://%s", uri + strlen("tcp:")) < 0) {
+ virReportOOMError(dom->conn);
+ goto cleanup;
+ }
+ uribits = xmlParseURI(tmpuri);
+ VIR_FREE(tmpuri);
+ } else {
+ uribits = xmlParseURI(uri);
}
- snprintf (cmd, sizeof cmd, "migrate \"%s\"", safe_uri);
- VIR_FREE (safe_uri);
-
- if (qemudMonitorCommand (vm, cmd, &info) < 0) {
- qemudReportError (dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
- "%s", _("migrate operation failed"));
+ if (!uribits) {
+ qemudReportError(dom->conn, dom, NULL, VIR_ERR_INTERNAL_ERROR,
+ _("cannot parse URI %s"), uri);
goto cleanup;
}
- DEBUG ("%s: migrate reply: %s", vm->def->name, info);
-
- /* Now check for "fail" in the output string */
- if (strstr(info, "fail") != NULL) {
- qemudReportError (dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
- _("migrate failed: %s"), info);
+ if (qemuMonitorMigrateToHost(vm, uribits->server, uribits->port) < 0)
goto cleanup;
- }
/* it is also possible that the migrate didn't fail initially, but
* rather failed later on. Check the output of "info migrate"
*/
- VIR_FREE(info);
-
if (qemuMonitorGetMigrationStatus(vm, &status,
&transferred,
&remaining,
VIR_DOMAIN_EVENT_RESUMED_MIGRATED);
}
- VIR_FREE(info);
+ if (uribits)
+ xmlFreeURI(uribits);
if (vm)
virDomainObjUnlock(vm);
if (event)
VIR_FREE(reply);
return ret;
}
+
+
+static int qemuMonitorMigrate(const virDomainObjPtr vm,
+ const char *dest)
+{
+ char *cmd = NULL;
+ char *info = NULL;
+ int ret = -1;
+
+ if (virAsprintf(&cmd, "migrate %s", dest) < 0) {
+ virReportOOMError(NULL);
+ return -1;
+ }
+
+ if (qemudMonitorCommand(vm, cmd, &info) < 0) {
+ qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+ _("unable to start migration to %s"), dest);
+ goto cleanup;
+ }
+
+ DEBUG ("%s: migrate reply: %s", vm->def->name, info);
+
+ /* Now check for "fail" in the output string */
+ if (strstr(info, "fail") != NULL) {
+ qemudReportError (NULL, NULL, NULL, VIR_ERR_OPERATION_FAILED,
+ _("migration to '%s' failed: %s"), dest, info);
+ goto cleanup;
+ }
+
+
+ ret = 0;
+
+cleanup:
+ VIR_FREE(info);
+ VIR_FREE(cmd);
+ return ret;
+}
+
+int qemuMonitorMigrateToHost(const virDomainObjPtr vm,
+ const char *hostname,
+ int port)
+{
+ char *uri;
+ int ret;
+
+ if (virAsprintf(&uri, "tcp:%s:%d", hostname, port) < 0) {
+ virReportOOMError(NULL);
+ return -1;
+ }
+
+ ret = qemuMonitorMigrate(vm, uri);
+
+ VIR_FREE(uri);
+
+ return ret;
+}