Heidi Eckhart wrote:
Kaitlin Rupert wrote:
> @@ -424,25 +448,39 @@ static CMPIStatus migrate_vs(struct migr
> goto out;
> }
>
> - CU_DEBUG("Migrating %s -> %s", job->domain, uri);
> -
> - ddom = virDomainMigrate(dom, dconn, VIR_MIGRATE_LIVE, NULL,
> NULL, 0);
> - if (ddom == NULL) {
> - CU_DEBUG("Migration failed");
> - cu_statusf(_BROKER, &s,
> - CMPI_RC_ERR_FAILED,
> - "Migration Failed");
> - goto out;
> - }
> + switch(job->type) {
> + case CIM_MIGRATE_OTHER:
> + /* FIXME - Handle offline migration here */
> + CU_DEBUG("Preparing for offline migration");
> + break;
> + case CIM_MIGRATE_LIVE:
> + CU_DEBUG("Preparing for live migration");
> + s = handle_migrate(dconn, dom, uri, VIR_MIGRATE_LIVE,
> job);
>
Is the type CIM_MIGRATE_LIVE or VIR_MIGRATE_LIVE ?
The CIM_MIGRATE_LIVE corresponds to the value defined in the mof, which
is 2. However, the value of VIR_MIGRATE_LIVE is defined by libvirt.
So when someone specifies a migration type of 2 (CIM_MIGRATE_LIVE) in
the MigrationSettingData, we'll need to use VIR_MIGRATE_LIVE when we
call virDomainMigrate().
> + break;
> + case CIM_MIGRATE_RESUME:
> + case CIM_MIGRATE_RESTART:
> + CU_DEBUG("Preparing for static migration");
> + s = handle_migrate(dconn, dom, uri, 0, job);
>
The type should be CIM_MIGRATE_RESTART
For static migration, libvirt uses a value of 0. There's two type values
here.. the value set for the MigrationType attribute of
MigrationSettingData and the value libvirt uses to differentiate between
static and live migration.
But it looks like the way I have it coded is confusing. Would the
following make more sense:
static CMPIStatus handle_migrate(virConnectPtr dconn,
virDomainPtr dom,
char *uri,
int type,
struct migration_job *job)
{
CMPIStatus s = {CMPI_RC_OK, NULL};
virDomainPtr ddom = NULL;
CU_DEBUG("Migrating %s -> %s", job->domain, uri);
if (type == CIM_MIGRATE_LIVE)
ddom = virDomainMigrate(dom, dconn, VIR_MIGRATE_LIVE,
NULL, NULL, 0);
else if (type == CIM_MIGRATE_RESUME) || (type ==
CIM_MIGRATE_RESTART)
ddom = virDomainMigrate(dom, dconn, 0, NULL, NULL, 0);
else
//Print error here and return
if (ddom == NULL) {
CU_DEBUG("Migration failed");
cu_statusf(_BROKER, &s,
CMPI_RC_ERR_FAILED,
"Migration Failed");
}
virDomainFree(ddom);
return s;
}
And then in migrate_vs() have:
switch(job->type) {
case CIM_MIGRATE_OTHER:
/* FIXME - Handle offline migration here */
CU_DEBUG("Preparing for offline migration");
break;
case CIM_MIGRATE_LIVE:
case CIM_MIGRATE_RESUME:
case CIM_MIGRATE_RESTART:
s = handle_migrate(dconn, dom, uri, job->type, job);
break;
default:
CU_DEBUG("Unsupported migration type (%d)", job->type);
cu_statusf(_BROKER, &s,
CMPI_RC_ERR_FAILED,
"Unsupported migration type (%d)", job->type);
goto out;
}
It is a little more redundant this way, but it might help with readability.
> + break;
> + default: + CU_DEBUG("Unsupported migration
> type (%d)", job->type);
> + cu_statusf(_BROKER, &s,
> + CMPI_RC_ERR_FAILED,
> + "Unsupported migration type (%d)",
> job->type);
> + goto out;
> + }
> +
> + if (s.rc != CMPI_RC_OK)
> + goto out;
>
>
--
Kaitlin Rupert
IBM Linux Technology Center
kaitlin(a)linux.vnet.ibm.com