// 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; } } }