// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft. All rights reserved.
namespace Microsoft.Samples.HyperV.Migration
{
using System;
using System.Collections.Generic;
using System.Management;
using Microsoft.Samples.HyperV.Common;
class MigrationCommon
{
//
// Compatibility Vectors definitions
//
public enum VMCompatibility
{
Equal = 0,
Superset = 1,
Subset = 2,
Disjoint = 3,
GreaterThan = 4,
GreaterThanOrEqual = 5,
LessThan = 6,
LessThanOrEqual = 7,
Multiple = 8,
Divisible = 9
}
public enum VectorID
{
ProcessorFeatures = 1,
ProcessorXSave = 2,
CacheLineFlushSize = 3
}
//
///////////////////////////////////////////////////////////////////////
// Common values and methods for all migration types.
///////////////////////////////////////////////////////////////////////
///
/// Defines the migration types.
///
public enum MigrationType
{
VirtualSystem = 32768,
Storage = 32769,
Staged = 32770,
VirtualSystemAndStorage = 32771
};
///
/// Defines migration transport types.
///
public enum TransportType
{
TCP = 5,
SMB = 32768
};
///
/// Gets the virtual system migration service.
///
/// The scope to use when connecting to WMI.
/// The virtual system migration service.
public
ManagementObject
GetVirtualMachineMigrationService(
ManagementScope scope)
{
using (ManagementClass migrationServiceClass = new ManagementClass("Msvm_VirtualSystemMigrationService"))
{
migrationServiceClass.Scope = scope;
ManagementObject migrationService =
WmiUtilities.GetFirstObjectFromCollection(migrationServiceClass.GetInstances());
return migrationService;
}
}
///
/// Returns the instance of
/// Msvm_VirtualSystemMigrationServiceSettingData
/// associated with the service.
///
/// Migration service instance.
///
/// Instance of Msvm_VirtualSystemMigrationServiceSettingData.
///
public
ManagementObject
GetMigrationServiceSettings(
ManagementObject service
)
{
ManagementObject serviceSetting = null;
using (ManagementObjectCollection settingCollection =
service.GetRelated("Msvm_VirtualSystemMigrationServiceSettingData"))
{
foreach (ManagementObject mgmtObj in settingCollection)
{
serviceSetting = mgmtObj;
break;
}
}
return serviceSetting;
}
///
/// Retuns the migration setting data object to be used for
/// migration.
///
/// The namespace to be used.
/// Migration setting data object.
public
ManagementObject
GetMigrationSettingData(
ManagementScope scope
)
{
ManagementObject migrationSettingData = null;
ManagementPath settingPath =
new ManagementPath("Msvm_VirtualSystemMigrationSettingData");
using (ManagementClass migrationSettingDataClass = new ManagementClass(scope, settingPath, null))
{
migrationSettingData = migrationSettingDataClass.CreateInstance();
}
return migrationSettingData;
}
///
/// Performs the migration.
///
/// The namespace to be used.
/// The virtual machine name.
/// Migration destination host.
/// Embedded instance of
/// Msvm_VirtualSystemMigrationSettingData.
/// Embedded instance of
/// Msvm_VirtualSystemSettingData.
/// Array of embedded instances of
/// Msvm_ResourceAllocationSettingData.
public
void
Migrate(
ManagementScope scope,
string vmName,
string destinationHost,
string migrationSetting,
string vssd,
string[] rasds
)
{
using (ManagementObject service = GetVirtualMachineMigrationService(scope))
using (ManagementBaseObject inParams = service.GetMethodParameters("MigrateVirtualSystemToHost"))
using (ManagementObject vm = WmiUtilities.GetVirtualMachine(vmName, scope))
{
inParams["ComputerSystem"] = vm.Path.Path;
inParams["DestinationHost"] = destinationHost;
inParams["MigrationSettingData"] = migrationSetting;
inParams["NewSystemSettingData"] = vssd;
inParams["NewResourceSettingData"] = rasds;
using (ManagementBaseObject outParams =
service.InvokeMethod("MigrateVirtualSystemToHost", inParams, null))
{
WmiUtilities.ValidateOutput(outParams, scope);
}
}
}
///
/// Performs migratability check.
///
/// The namespace to be used.
/// The virtual machine name.
/// Migration destination host.
/// Embedded instance of
/// Msvm_VirtualSystemMigrationSettingData.
/// Embedded instance of
/// Msvm_VirtualSystemSettingData.
/// Array of embedded instances of
/// Msvm_ResourceAllocationSettingData.
/// true is the VM is migratable; otherwise, false.
public
bool
CheckMigratability(
ManagementScope scope,
string vmName,
string destinationHost,
string migrationSetting,
string vssd,
string[] rasds
)
{
using (ManagementObject service = GetVirtualMachineMigrationService(scope))
using (ManagementBaseObject inParams =
service.GetMethodParameters("MigrateVirtualSystemToHost"))
using (ManagementObject vm = WmiUtilities.GetVirtualMachine(vmName, scope))
{
inParams["ComputerSystem"] = vm.Path.Path;
inParams["DestinationHost"] = destinationHost;
inParams["MigrationSettingData"] = migrationSetting;
inParams["NewSystemSettingData"] = vssd;
inParams["NewResourceSettingData"] = rasds;
using (ManagementBaseObject outParams =
service.InvokeMethod("CheckVirtualSystemIsMigratable", inParams, null))
{
return WmiUtilities.ValidateOutput(outParams, scope, false, true);
}
}
}
///
/// Returns an array of IP addresses on which the migration destination
/// host is listening for incoming VM migration requests.
///
///
/// Migration destination host name.
///
/// Listening IP addresses.
public
string[]
GetMigrationDestinationListenAddresses(
string destinationHost
)
{
string[] ipAddresses = null;
ManagementScope scope = new ManagementScope(
@"\\" + destinationHost + @"\root\virtualization\v2", null);
using (ManagementObject service = GetVirtualMachineMigrationService(scope))
using (ManagementObject serviceSetting = GetMigrationServiceSettings(service))
{
if (!((bool)serviceSetting["EnableVirtualSystemMigration"]))
{
throw new Exception("Destination host does not " +
"allow VM migration");
}
ipAddresses =
(string[])service["MigrationServiceListenerIPAddressList"];
if (ipAddresses == null)
{
throw new Exception("Destination host does not have " +
"networks set for VM migration");
}
}
return ipAddresses;
}
}
}