# HG changeset patch
# User Kaitlin Rupert <karupert(a)us.ibm.com>
# Date 1204070582 28800
# Node ID 4310ed87a132963947ad866eccca7d9697ef8fcf
# Parent 09153317203d6a60ede32daf5f2ce5765b6d9953
Add offline migration support.
Signed-off-by: Kaitlin Rupert <karupert(a)us.ibm.com>
diff -r 09153317203d -r 4310ed87a132 src/Virt_VSMigrationService.c
--- a/src/Virt_VSMigrationService.c Mon Feb 25 16:36:25 2008 -0800
+++ b/src/Virt_VSMigrationService.c Tue Feb 26 16:03:02 2008 -0800
@@ -410,6 +410,69 @@ static CMPIStatus handle_migrate(virConn
return s;
}
+static CMPIStatus prepare_offline_migrate(virDomainPtr dom,
+ char **xml)
+{
+ CMPIStatus s = {CMPI_RC_OK, NULL};
+ virDomainInfo info;
+ int ret;
+
+ ret = virDomainGetInfo(dom, &info);
+ if (ret != 0) {
+ cu_statusf(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ "Unabled to get info for domain.");
+ goto out;
+ }
+
+ if ((const int)info.state != VIR_DOMAIN_SHUTOFF) {
+ cu_statusf(_BROKER, &s,
+ CMPI_RC_ERR_INVALID_PARAMETER,
+ "Domain must be shutoff for offline migration.");
+ goto out;
+ }
+
+ *xml = virDomainGetXMLDesc(dom, 0);
+ if (*xml == NULL) {
+ cu_statusf(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ "Unable to retrieve domain XML.");
+ goto out;
+ }
+
+ out:
+ return s;
+}
+
+static CMPIStatus handle_offline_migrate(virConnectPtr dconn,
+ virDomainPtr dom,
+ char *uri,
+ char *xml,
+ struct migration_job *job)
+{
+ CMPIStatus s = {CMPI_RC_OK, NULL};
+ virDomainPtr new_dom;
+
+ if (domain_exists(dconn, job->domain)) {
+ CU_DEBUG("This domain already exists on the target system.");
+ cu_statusf(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ "This domain already exists on the target system");
+ goto out;
+ }
+
+ new_dom = virDomainDefineXML(dconn, xml);
+ if (new_dom == NULL) {
+ CU_DEBUG("Failed to define domain from XML");
+ cu_statusf(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ "Failed to create domain");
+ }
+
+ out:
+ return s;
+}
+
static CMPIStatus migrate_vs(struct migration_job *job)
{
CMPIStatus s;
@@ -417,6 +480,7 @@ static CMPIStatus migrate_vs(struct migr
virConnectPtr dconn = NULL;
virDomainPtr dom = NULL;
char *uri = NULL;
+ char *xml = NULL;
uri = dest_uri(job->ref_cn, job->host);
if (uri == NULL) {
@@ -439,6 +503,12 @@ static CMPIStatus migrate_vs(struct migr
goto out;
}
+ if (job->type == CIM_MIGRATE_OTHER) {
+ s = prepare_offline_migrate(dom, &xml);
+ if (s.rc != CMPI_RC_OK)
+ goto out;
+ }
+
dconn = virConnectOpen(uri);
if (dconn == NULL) {
CU_DEBUG("Failed to connect to remote host (%s)", uri);
@@ -450,8 +520,8 @@ static CMPIStatus migrate_vs(struct migr
switch(job->type) {
case CIM_MIGRATE_OTHER:
- /* FIXME - Handle offline migration here */
CU_DEBUG("Preparing for offline migration");
+ s = handle_offline_migrate(dconn, dom, uri, xml, job);
break;
case CIM_MIGRATE_LIVE:
CU_DEBUG("Preparing for live migration");
@@ -480,6 +550,7 @@ static CMPIStatus migrate_vs(struct migr
out:
free(uri);
+ free(xml);
virDomainFree(dom);
virConnectClose(conn);
virConnectClose(dconn);