Merge
This commit is contained in:
commit
ec898f2392
10 changed files with 272 additions and 269 deletions
|
@ -0,0 +1,15 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace WebsitePanel.Providers.Virtualization
|
||||||
|
{
|
||||||
|
public enum AutomaticStartAction
|
||||||
|
{
|
||||||
|
Undefined = 100,
|
||||||
|
Nothing = 0,
|
||||||
|
StartIfRunning = 1,
|
||||||
|
Start = 2,
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace WebsitePanel.Providers.Virtualization
|
||||||
|
{
|
||||||
|
public enum AutomaticStopAction
|
||||||
|
{
|
||||||
|
Undefined = 100,
|
||||||
|
TurnOff = 0,
|
||||||
|
Save = 1,
|
||||||
|
ShutDown = 2,
|
||||||
|
}
|
||||||
|
}
|
|
@ -288,6 +288,8 @@
|
||||||
<Compile Include="Statistics\StatsServer.cs" />
|
<Compile Include="Statistics\StatsServer.cs" />
|
||||||
<Compile Include="Statistics\StatsSite.cs" />
|
<Compile Include="Statistics\StatsSite.cs" />
|
||||||
<Compile Include="Statistics\StatsUser.cs" />
|
<Compile Include="Statistics\StatsUser.cs" />
|
||||||
|
<Compile Include="Virtualization\AutomaticStopAction.cs" />
|
||||||
|
<Compile Include="Virtualization\AutomaticStartAction.cs" />
|
||||||
<Compile Include="Virtualization\BiosInfo.cs" />
|
<Compile Include="Virtualization\BiosInfo.cs" />
|
||||||
<Compile Include="Virtualization\ChangeJobStateReturnCode.cs" />
|
<Compile Include="Virtualization\ChangeJobStateReturnCode.cs" />
|
||||||
<Compile Include="Virtualization\ConcreteJob.cs">
|
<Compile Include="Virtualization\ConcreteJob.cs">
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace WebsitePanel.Providers.Virtualization
|
||||||
|
{
|
||||||
|
public static class Constants
|
||||||
|
{
|
||||||
|
public const Int64 Size1G = 0x40000000;
|
||||||
|
public const Int64 Size1M = 0x100000;
|
||||||
|
}
|
||||||
|
}
|
|
@ -87,7 +87,7 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
if (bootFromCD)
|
if (bootFromCD)
|
||||||
cmd.Parameters.Add("FirstBootDevice", DvdDriveHelper.GetPS(powerShell, vm.Name));
|
cmd.Parameters.Add("FirstBootDevice", DvdDriveHelper.GetPS(powerShell, vm.Name));
|
||||||
else
|
else
|
||||||
cmd.Parameters.Add("FirstBootDevice", VirtualMachineHelper.GetVirtualHardDisksPS(powerShell, vm.Name).FirstOrDefault());
|
cmd.Parameters.Add("FirstBootDevice", HardDriveHelper.GetPS(powerShell, vm.Name).FirstOrDefault());
|
||||||
|
|
||||||
powerShell.Execute(cmd, false);
|
powerShell.Execute(cmd, false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Management.Automation;
|
||||||
|
using System.Management.Automation.Runspaces;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace WebsitePanel.Providers.Virtualization
|
||||||
|
{
|
||||||
|
public static class HardDriveHelper
|
||||||
|
{
|
||||||
|
public static VirtualHardDiskInfo[] Get(PowerShellManager powerShell, string vmname)
|
||||||
|
{
|
||||||
|
List<VirtualHardDiskInfo> disks = new List<VirtualHardDiskInfo>();
|
||||||
|
|
||||||
|
Collection<PSObject> result = GetPS(powerShell, vmname);
|
||||||
|
|
||||||
|
if (result != null && result.Count > 0)
|
||||||
|
{
|
||||||
|
foreach (PSObject d in result)
|
||||||
|
{
|
||||||
|
VirtualHardDiskInfo disk = new VirtualHardDiskInfo();
|
||||||
|
|
||||||
|
disk.SupportPersistentReservations = Convert.ToBoolean(d.GetProperty("SupportPersistentReservations"));
|
||||||
|
disk.MaximumIOPS = Convert.ToUInt64(d.GetProperty("MaximumIOPS"));
|
||||||
|
disk.MinimumIOPS = Convert.ToUInt64(d.GetProperty("MinimumIOPS"));
|
||||||
|
disk.VHDControllerType = d.GetEnum<ControllerType>("ControllerType");
|
||||||
|
disk.ControllerNumber = Convert.ToInt32(d.GetProperty("ControllerNumber"));
|
||||||
|
disk.ControllerLocation = Convert.ToInt32(d.GetProperty("ControllerLocation"));
|
||||||
|
disk.Path = d.GetProperty("Path").ToString();
|
||||||
|
disk.Name = d.GetProperty("Name").ToString();
|
||||||
|
|
||||||
|
GetVirtualHardDiskDetail(powerShell, disk.Path, ref disk);
|
||||||
|
|
||||||
|
disks.Add(disk);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return disks.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
//public static VirtualHardDiskInfo GetByPath(PowerShellManager powerShell, string vhdPath)
|
||||||
|
//{
|
||||||
|
// VirtualHardDiskInfo info = null;
|
||||||
|
// var vmNames = new List<string>();
|
||||||
|
|
||||||
|
// Command cmd = new Command("Get-VM");
|
||||||
|
|
||||||
|
// Collection<PSObject> result = powerShell.Execute(cmd, false);
|
||||||
|
|
||||||
|
// if (result == null || result.Count == 0)
|
||||||
|
// return null;
|
||||||
|
|
||||||
|
// vmNames = result.Select(r => r.GetString("Name")).ToList();
|
||||||
|
// var drives = vmNames.SelectMany(n => Get(powerShell, n));
|
||||||
|
|
||||||
|
// return drives.FirstOrDefault(d=>d.Path == vhdPath);
|
||||||
|
//}
|
||||||
|
|
||||||
|
public static Collection<PSObject> GetPS(PowerShellManager powerShell, string vmname)
|
||||||
|
{
|
||||||
|
Command cmd = new Command("Get-VMHardDiskDrive");
|
||||||
|
cmd.Parameters.Add("VMName", vmname);
|
||||||
|
|
||||||
|
return powerShell.Execute(cmd, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void GetVirtualHardDiskDetail(PowerShellManager powerShell, string path, ref VirtualHardDiskInfo disk)
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(path))
|
||||||
|
{
|
||||||
|
Command cmd = new Command("Get-VHD");
|
||||||
|
cmd.Parameters.Add("Path", path);
|
||||||
|
Collection<PSObject> result = powerShell.Execute(cmd, false);
|
||||||
|
if (result != null && result.Count > 0)
|
||||||
|
{
|
||||||
|
disk.DiskFormat = result[0].GetEnum<VirtualHardDiskFormat>("VhdFormat");
|
||||||
|
disk.DiskType = result[0].GetEnum<VirtualHardDiskType>("VhdType");
|
||||||
|
disk.ParentPath = result[0].GetProperty<string>("ParentPath");
|
||||||
|
disk.MaxInternalSize = Convert.ToInt64(result[0].GetProperty("Size"));
|
||||||
|
disk.FileSize = Convert.ToInt64(result[0].GetProperty("FileSize"));
|
||||||
|
disk.Attached = disk.InUse = Convert.ToBoolean(result[0].GetProperty("Attached"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,16 +12,8 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
{
|
{
|
||||||
public static class VirtualMachineHelper
|
public static class VirtualMachineHelper
|
||||||
{
|
{
|
||||||
#region Constants
|
|
||||||
|
|
||||||
private const Int64 Size1G = 0x40000000;
|
|
||||||
private const Int64 Size1M = 0x100000;
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
public static OperationalStatus GetVMHeartBeatStatus(PowerShellManager powerShell, string name)
|
public static OperationalStatus GetVMHeartBeatStatus(PowerShellManager powerShell, string name)
|
||||||
{
|
{
|
||||||
|
|
||||||
OperationalStatus status = OperationalStatus.None;
|
OperationalStatus status = OperationalStatus.None;
|
||||||
|
|
||||||
Command cmd = new Command("Get-VMIntegrationService");
|
Command cmd = new Command("Get-VMIntegrationService");
|
||||||
|
@ -40,7 +32,6 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static int GetVMProcessors(PowerShellManager powerShell, string name)
|
public static int GetVMProcessors(PowerShellManager powerShell, string name)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -71,73 +62,15 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
if (result != null && result.Count > 0)
|
if (result != null && result.Count > 0)
|
||||||
{
|
{
|
||||||
info.DynamicMemoryEnabled = Convert.ToBoolean(result[0].GetProperty("DynamicMemoryEnabled"));
|
info.DynamicMemoryEnabled = Convert.ToBoolean(result[0].GetProperty("DynamicMemoryEnabled"));
|
||||||
info.Startup = Convert.ToInt64(result[0].GetProperty("Startup")) / Size1M;
|
info.Startup = Convert.ToInt64(result[0].GetProperty("Startup")) / Constants.Size1M;
|
||||||
info.Minimum = Convert.ToInt64(result[0].GetProperty("Minimum")) / Size1M;
|
info.Minimum = Convert.ToInt64(result[0].GetProperty("Minimum")) / Constants.Size1M;
|
||||||
info.Maximum = Convert.ToInt64(result[0].GetProperty("Maximum")) / Size1M;
|
info.Maximum = Convert.ToInt64(result[0].GetProperty("Maximum")) / Constants.Size1M;
|
||||||
info.Buffer = Convert.ToInt32(result[0].GetProperty("Buffer"));
|
info.Buffer = Convert.ToInt32(result[0].GetProperty("Buffer"));
|
||||||
info.Priority = Convert.ToInt32(result[0].GetProperty("Priority"));
|
info.Priority = Convert.ToInt32(result[0].GetProperty("Priority"));
|
||||||
}
|
}
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static VirtualHardDiskInfo[] GetVirtualHardDisks(PowerShellManager powerShell, string name)
|
|
||||||
{
|
|
||||||
List<VirtualHardDiskInfo> disks = new List<VirtualHardDiskInfo>();
|
|
||||||
|
|
||||||
Collection<PSObject> result = GetVirtualHardDisksPS(powerShell, name);
|
|
||||||
|
|
||||||
if (result != null && result.Count > 0)
|
|
||||||
{
|
|
||||||
foreach (PSObject d in result)
|
|
||||||
{
|
|
||||||
VirtualHardDiskInfo disk = new VirtualHardDiskInfo();
|
|
||||||
|
|
||||||
disk.SupportPersistentReservations = Convert.ToBoolean(d.GetProperty("SupportPersistentReservations"));
|
|
||||||
disk.MaximumIOPS = Convert.ToUInt64(d.GetProperty("MaximumIOPS"));
|
|
||||||
disk.MinimumIOPS = Convert.ToUInt64(d.GetProperty("MinimumIOPS"));
|
|
||||||
disk.VHDControllerType = d.GetEnum<ControllerType>("ControllerType");
|
|
||||||
disk.ControllerNumber = Convert.ToInt32(d.GetProperty("ControllerNumber"));
|
|
||||||
disk.ControllerLocation = Convert.ToInt32(d.GetProperty("ControllerLocation"));
|
|
||||||
disk.Path = d.GetProperty("Path").ToString();
|
|
||||||
disk.Name = d.GetProperty("Name").ToString();
|
|
||||||
|
|
||||||
GetVirtualHardDiskDetail(powerShell, disk.Path, ref disk);
|
|
||||||
|
|
||||||
disks.Add(disk);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return disks.ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Collection<PSObject> GetVirtualHardDisksPS(PowerShellManager powerShell, string name)
|
|
||||||
{
|
|
||||||
Command cmd = new Command("Get-VMHardDiskDrive");
|
|
||||||
cmd.Parameters.Add("VMName", name);
|
|
||||||
|
|
||||||
return powerShell.Execute(cmd, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void GetVirtualHardDiskDetail(PowerShellManager powerShell, string path, ref VirtualHardDiskInfo disk)
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(path))
|
|
||||||
{
|
|
||||||
Command cmd = new Command("Get-VHD");
|
|
||||||
cmd.Parameters.Add("Path", path);
|
|
||||||
Collection<PSObject> result = powerShell.Execute(cmd, false);
|
|
||||||
if (result != null && result.Count > 0)
|
|
||||||
{
|
|
||||||
disk.DiskFormat = result[0].GetEnum<VirtualHardDiskFormat>("VhdFormat");
|
|
||||||
disk.DiskType = result[0].GetEnum<VirtualHardDiskType>("VhdType");
|
|
||||||
disk.ParentPath = result[0].GetProperty<string>("ParentPath");
|
|
||||||
disk.MaxInternalSize = Convert.ToInt64(result[0].GetProperty("Size")) / Size1G;
|
|
||||||
disk.FileSize = Convert.ToInt64(result[0].GetProperty("FileSize")) / Size1G;
|
|
||||||
disk.Attached = Convert.ToBoolean(result[0].GetProperty("Attached"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static void UpdateProcessors(PowerShellManager powerShell, VirtualMachine vm, int cpuCores, int cpuLimitSettings, int cpuReserveSettings, int cpuWeightSettings)
|
public static void UpdateProcessors(PowerShellManager powerShell, VirtualMachine vm, int cpuCores, int cpuLimitSettings, int cpuReserveSettings, int cpuWeightSettings)
|
||||||
{
|
{
|
||||||
Command cmd = new Command("Set-VMProcessor");
|
Command cmd = new Command("Set-VMProcessor");
|
||||||
|
@ -150,12 +83,13 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
|
|
||||||
powerShell.Execute(cmd, false);
|
powerShell.Execute(cmd, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void UpdateMemory(PowerShellManager powerShell, VirtualMachine vm, long ramMB)
|
public static void UpdateMemory(PowerShellManager powerShell, VirtualMachine vm, long ramMB)
|
||||||
{
|
{
|
||||||
Command cmd = new Command("Set-VMMemory");
|
Command cmd = new Command("Set-VMMemory");
|
||||||
|
|
||||||
cmd.Parameters.Add("VMName", vm.Name);
|
cmd.Parameters.Add("VMName", vm.Name);
|
||||||
cmd.Parameters.Add("StartupBytes", ramMB * Size1M);
|
cmd.Parameters.Add("StartupBytes", ramMB * Constants.Size1M);
|
||||||
|
|
||||||
powerShell.Execute(cmd, false);
|
powerShell.Execute(cmd, false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -198,12 +198,12 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
vm.DvdDriveInstalled = dvdInfo != null;
|
vm.DvdDriveInstalled = dvdInfo != null;
|
||||||
|
|
||||||
// HDD
|
// HDD
|
||||||
vm.Disks = VirtualMachineHelper.GetVirtualHardDisks(PowerShell, vm.Name);
|
vm.Disks = HardDriveHelper.Get(PowerShell, vm.Name);
|
||||||
|
|
||||||
if (vm.Disks != null && vm.Disks.GetLength(0) > 0)
|
if (vm.Disks != null && vm.Disks.GetLength(0) > 0)
|
||||||
{
|
{
|
||||||
vm.VirtualHardDrivePath = vm.Disks[0].Path;
|
vm.VirtualHardDrivePath = vm.Disks[0].Path;
|
||||||
vm.HddSize = Convert.ToInt32(vm.Disks[0].FileSize);
|
vm.HddSize = Convert.ToInt32(vm.Disks[0].FileSize / Size1G);
|
||||||
}
|
}
|
||||||
|
|
||||||
// network adapters
|
// network adapters
|
||||||
|
@ -327,104 +327,46 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
vm.OperatingSystemTemplatePath = FileUtils.EvaluateSystemVariables(vm.OperatingSystemTemplatePath);
|
vm.OperatingSystemTemplatePath = FileUtils.EvaluateSystemVariables(vm.OperatingSystemTemplatePath);
|
||||||
vm.VirtualHardDrivePath = FileUtils.EvaluateSystemVariables(vm.VirtualHardDrivePath);
|
vm.VirtualHardDrivePath = FileUtils.EvaluateSystemVariables(vm.VirtualHardDrivePath);
|
||||||
|
|
||||||
string vmID = null;
|
try
|
||||||
|
{
|
||||||
// request management service
|
// Add new VM
|
||||||
ManagementObject objVmsvc = GetVirtualSystemManagementService();
|
Command cmdNew = new Command("New-VM");
|
||||||
|
cmdNew.Parameters.Add("Name", vm.Name);
|
||||||
// display name
|
cmdNew.Parameters.Add("VHDPath", vm.VirtualHardDrivePath);
|
||||||
ManagementObject objGlobalSettings = wmi.GetWmiClass("msvm_VirtualSystemGlobalSettingData").CreateInstance();
|
PowerShell.Execute(cmdNew, false);
|
||||||
objGlobalSettings["ElementName"] = vm.Name;
|
|
||||||
|
|
||||||
// VM folders
|
|
||||||
objGlobalSettings["ExternalDataRoot"] = vm.RootFolderPath;
|
|
||||||
objGlobalSettings["SnapshotDataRoot"] = vm.RootFolderPath;
|
|
||||||
|
|
||||||
wmi.Dump(objGlobalSettings);
|
|
||||||
|
|
||||||
|
// Set VM
|
||||||
|
Command cmdSet = new Command("Set-VM");
|
||||||
|
cmdSet.Parameters.Add("Name", vm.Name);
|
||||||
|
cmdSet.Parameters.Add("SmartPagingFilePath", vm.RootFolderPath);
|
||||||
|
cmdSet.Parameters.Add("SnapshotFileLocation", vm.RootFolderPath);
|
||||||
// startup/shutdown actions
|
// startup/shutdown actions
|
||||||
if (AutomaticStartActionSettings != 100)
|
var autoStartAction = (AutomaticStartAction) AutomaticStartActionSettings;
|
||||||
|
var autoStopAction = (AutomaticStopAction) AutomaticStartActionSettings;
|
||||||
|
if (autoStartAction != AutomaticStartAction.Undefined)
|
||||||
{
|
{
|
||||||
objGlobalSettings["AutomaticStartupAction"] = AutomaticStartActionSettings;
|
cmdSet.Parameters.Add("AutomaticStartAction", autoStartAction.ToString());
|
||||||
objGlobalSettings["AutomaticStartupActionDelay"] = String.Format("000000000000{0:d2}.000000:000", AutomaticStartupDelaySettings);
|
cmdSet.Parameters.Add("AutomaticStartDelay", AutomaticStartupDelaySettings);
|
||||||
|
}
|
||||||
|
if (autoStopAction != AutomaticStopAction.Undefined)
|
||||||
|
cmdSet.Parameters.Add("AutomaticStopAction", autoStopAction.ToString());
|
||||||
|
PowerShell.Execute(cmdSet, false);
|
||||||
|
|
||||||
|
// Get created machine Id
|
||||||
|
var createdMachine = GetVirtualMachines().FirstOrDefault(m => m.Name == vm.Name);
|
||||||
|
if (createdMachine == null)
|
||||||
|
throw new Exception("Can't find created machine");
|
||||||
|
vm.VirtualMachineId = createdMachine.VirtualMachineId;
|
||||||
|
|
||||||
|
// Update common settings
|
||||||
|
UpdateVirtualMachine(vm);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
HostedSolutionLog.LogError("CreateVirtualMachine", ex);
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AutomaticStopActionSettings != 100)
|
|
||||||
objGlobalSettings["AutomaticShutdownAction"] = AutomaticStopActionSettings;
|
|
||||||
|
|
||||||
if (AutomaticRecoveryActionSettings != 100)
|
|
||||||
objGlobalSettings["AutomaticRecoveryAction"] = AutomaticRecoveryActionSettings;
|
|
||||||
|
|
||||||
// create machine
|
|
||||||
ManagementBaseObject inParams = objVmsvc.GetMethodParameters("DefineVirtualSystem");
|
|
||||||
inParams["SystemSettingData"] = objGlobalSettings.GetText(TextFormat.CimDtd20);
|
|
||||||
inParams["ResourceSettingData"] = new string[] { };
|
|
||||||
|
|
||||||
// invoke method
|
|
||||||
ManagementBaseObject outParams = objVmsvc.InvokeMethod("DefineVirtualSystem", inParams, null);
|
|
||||||
ManagementObject objVM = wmi.GetWmiObjectByPath((string)outParams["DefinedSystem"]);
|
|
||||||
|
|
||||||
// job
|
|
||||||
JobResult job = CreateJobResultFromWmiMethodResults(outParams); ;
|
|
||||||
|
|
||||||
// read VM id
|
|
||||||
vmID = (string)objVM["Name"];
|
|
||||||
|
|
||||||
// update general settings
|
|
||||||
//UpdateVirtualMachineGeneralSettings(vmID, objVM,
|
|
||||||
// vm.CpuCores,
|
|
||||||
// vm.RamSize,
|
|
||||||
// vm.BootFromCD,
|
|
||||||
// vm.NumLockEnabled);
|
|
||||||
|
|
||||||
// hard disks
|
|
||||||
// load IDE 0 controller
|
|
||||||
ManagementObject objIDE0 = wmi.GetWmiObject(
|
|
||||||
"Msvm_ResourceAllocationSettingData", "ResourceSubType = 'Microsoft Emulated IDE Controller'"
|
|
||||||
+ " and InstanceID Like 'Microsoft:{0}%' and Address = 0", vmID);
|
|
||||||
|
|
||||||
// load default hard disk drive
|
|
||||||
ManagementObject objDefaultHdd = wmi.GetWmiObject(
|
|
||||||
"Msvm_ResourceAllocationSettingData", "ResourceSubType = 'Microsoft Synthetic Disk Drive'"
|
|
||||||
+ " and InstanceID like '%Default'");
|
|
||||||
ManagementObject objHdd = (ManagementObject)objDefaultHdd.Clone();
|
|
||||||
objHdd["Parent"] = objIDE0.Path;
|
|
||||||
objHdd["Address"] = 0;
|
|
||||||
|
|
||||||
// add HDD to VM resources
|
|
||||||
ManagementObject objAddedHDD = AddVirtualMachineResources(objVM, objHdd);
|
|
||||||
|
|
||||||
// attach VHD
|
|
||||||
string fullVhdPath = vm.VirtualHardDrivePath;
|
|
||||||
ManagementObject objDefaultVHD = wmi.GetWmiObject(
|
|
||||||
"Msvm_ResourceAllocationSettingData", "ResourceSubType = 'Microsoft Virtual Hard Disk'"
|
|
||||||
+ " and InstanceID like '%Default'");
|
|
||||||
ManagementObject objVhd = (ManagementObject)objDefaultVHD.Clone();
|
|
||||||
objVhd["Parent"] = objAddedHDD.Path.Path;
|
|
||||||
objVhd["Connection"] = new string[] { fullVhdPath };
|
|
||||||
|
|
||||||
// add VHD to the system
|
|
||||||
AddVirtualMachineResources(objVM, objVhd);
|
|
||||||
|
|
||||||
// DVD drive
|
|
||||||
if (vm.DvdDriveInstalled)
|
|
||||||
{
|
|
||||||
AddVirtualMachineDvdDrive(vmID, objVM);
|
|
||||||
}
|
|
||||||
|
|
||||||
// add external adapter
|
|
||||||
if (vm.ExternalNetworkEnabled && !String.IsNullOrEmpty(vm.ExternalSwitchId))
|
|
||||||
AddNetworkAdapter(objVM, vm.ExternalSwitchId, vm.Name, vm.ExternalNicMacAddress, EXTERNAL_NETWORK_ADAPTER_NAME, vm.LegacyNetworkAdapter);
|
|
||||||
|
|
||||||
// add private adapter
|
|
||||||
if (vm.PrivateNetworkEnabled && !String.IsNullOrEmpty(vm.PrivateSwitchId))
|
|
||||||
AddNetworkAdapter(objVM, vm.PrivateSwitchId, vm.Name, vm.PrivateNicMacAddress, PRIVATE_NETWORK_ADAPTER_NAME, vm.LegacyNetworkAdapter);
|
|
||||||
|
|
||||||
// add management adapter
|
|
||||||
if (vm.ManagementNetworkEnabled && !String.IsNullOrEmpty(vm.ManagementSwitchId))
|
|
||||||
AddNetworkAdapter(objVM, vm.ManagementSwitchId, vm.Name, vm.ManagementNicMacAddress, MANAGEMENT_NETWORK_ADAPTER_NAME, vm.LegacyNetworkAdapter);
|
|
||||||
|
|
||||||
vm.VirtualMachineId = vmID;
|
|
||||||
return vm;
|
return vm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1483,33 +1425,17 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
#region Storage
|
#region Storage
|
||||||
public VirtualHardDiskInfo GetVirtualHardDiskInfo(string vhdPath)
|
public VirtualHardDiskInfo GetVirtualHardDiskInfo(string vhdPath)
|
||||||
{
|
{
|
||||||
ManagementObject objImgSvc = GetImageManagementService();
|
try
|
||||||
|
|
||||||
// get method params
|
|
||||||
ManagementBaseObject inParams = objImgSvc.GetMethodParameters("GetVirtualHardDiskInfo");
|
|
||||||
inParams["Path"] = FileUtils.EvaluateSystemVariables(vhdPath);
|
|
||||||
|
|
||||||
// execute method
|
|
||||||
ManagementBaseObject outParams = (ManagementBaseObject)objImgSvc.InvokeMethod("GetVirtualHardDiskInfo", inParams, null);
|
|
||||||
ReturnCode result = (ReturnCode)Convert.ToInt32(outParams["ReturnValue"]);
|
|
||||||
if (result == ReturnCode.OK)
|
|
||||||
{
|
{
|
||||||
// create XML
|
VirtualHardDiskInfo hardDiskInfo = new VirtualHardDiskInfo();
|
||||||
string xml = (string)outParams["Info"];
|
HardDriveHelper.GetVirtualHardDiskDetail(PowerShell, vhdPath, ref hardDiskInfo);
|
||||||
XmlDocument doc = new XmlDocument();
|
return hardDiskInfo;
|
||||||
doc.LoadXml(xml);
|
}
|
||||||
|
catch (Exception ex)
|
||||||
// read properties
|
{
|
||||||
VirtualHardDiskInfo vhd = new VirtualHardDiskInfo();
|
HostedSolutionLog.LogError("GetVirtualHardDiskInfo", ex);
|
||||||
vhd.DiskType = (VirtualHardDiskType)Enum.Parse(typeof(VirtualHardDiskType), GetPropertyValue("Type", doc), true);
|
throw;
|
||||||
vhd.FileSize = Int64.Parse(GetPropertyValue("FileSize", doc));
|
|
||||||
vhd.InSavedState = Boolean.Parse(GetPropertyValue("InSavedState", doc));
|
|
||||||
vhd.InUse = Boolean.Parse(GetPropertyValue("InUse", doc));
|
|
||||||
vhd.MaxInternalSize = Int64.Parse(GetPropertyValue("MaxInternalSize", doc));
|
|
||||||
vhd.ParentPath = GetPropertyValue("ParentPath", doc);
|
|
||||||
return vhd;
|
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetPropertyValue(string propertyName, XmlDocument doc)
|
private string GetPropertyValue(string propertyName, XmlDocument doc)
|
||||||
|
@ -1741,9 +1667,6 @@ exit", Convert.ToInt32(objDisk["Index"])));
|
||||||
|
|
||||||
public JobResult ConvertVirtualHardDisk(string sourcePath, string destinationPath, VirtualHardDiskType diskType)
|
public JobResult ConvertVirtualHardDisk(string sourcePath, string destinationPath, VirtualHardDiskType diskType)
|
||||||
{
|
{
|
||||||
sourcePath = FileUtils.EvaluateSystemVariables(sourcePath);
|
|
||||||
destinationPath = FileUtils.EvaluateSystemVariables(destinationPath);
|
|
||||||
|
|
||||||
// check source file
|
// check source file
|
||||||
if (!FileExists(sourcePath))
|
if (!FileExists(sourcePath))
|
||||||
throw new Exception("Source VHD cannot be found: " + sourcePath);
|
throw new Exception("Source VHD cannot be found: " + sourcePath);
|
||||||
|
@ -1753,16 +1676,25 @@ exit", Convert.ToInt32(objDisk["Index"])));
|
||||||
if (!DirectoryExists(destFolder))
|
if (!DirectoryExists(destFolder))
|
||||||
CreateFolder(destFolder);
|
CreateFolder(destFolder);
|
||||||
|
|
||||||
ManagementObject objImgSvc = GetImageManagementService();
|
sourcePath = FileUtils.EvaluateSystemVariables(sourcePath);
|
||||||
|
destinationPath = FileUtils.EvaluateSystemVariables(destinationPath);
|
||||||
|
|
||||||
// get method params
|
try
|
||||||
ManagementBaseObject inParams = objImgSvc.GetMethodParameters("ConvertVirtualHardDisk");
|
{
|
||||||
inParams["SourcePath"] = sourcePath;
|
Command cmd = new Command("Convert-VHD");
|
||||||
inParams["DestinationPath"] = destinationPath;
|
|
||||||
inParams["Type"] = (UInt16)diskType;
|
|
||||||
|
|
||||||
ManagementBaseObject outParams = (ManagementBaseObject)objImgSvc.InvokeMethod("ConvertVirtualHardDisk", inParams, null);
|
cmd.Parameters.Add("Path", sourcePath);
|
||||||
return CreateJobResultFromWmiMethodResults(outParams);
|
cmd.Parameters.Add("DestinationPath", destinationPath);
|
||||||
|
cmd.Parameters.Add("VHDType", diskType.ToString());
|
||||||
|
|
||||||
|
PowerShell.Execute(cmd, false);
|
||||||
|
return JobHelper.CreateSuccessResult(ReturnCode.JobStarted);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
HostedSolutionLog.LogError("ConvertVirtualHardDisk", ex);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DeleteRemoteFile(string path)
|
public void DeleteRemoteFile(string path)
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<Optimize>false</Optimize>
|
<Optimize>false</Optimize>
|
||||||
<OutputPath>..\WebsitePanel.Server\bin\</OutputPath>
|
<OutputPath>..\WebsitePanel.Server\bin\HyperV2012R2\</OutputPath>
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
|
@ -53,8 +53,10 @@
|
||||||
<Compile Include="..\VersionInfo.cs">
|
<Compile Include="..\VersionInfo.cs">
|
||||||
<Link>VersionInfo.cs</Link>
|
<Link>VersionInfo.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Constants.cs" />
|
||||||
<Compile Include="Extensions\PSObjectExtension.cs" />
|
<Compile Include="Extensions\PSObjectExtension.cs" />
|
||||||
<Compile Include="Helpers\BiosHelper.cs" />
|
<Compile Include="Helpers\BiosHelper.cs" />
|
||||||
|
<Compile Include="Helpers\HardDriveHelper.cs" />
|
||||||
<Compile Include="Helpers\NetworkAdapterHelper.cs" />
|
<Compile Include="Helpers\NetworkAdapterHelper.cs" />
|
||||||
<Compile Include="Helpers\DvdDriveHelper.cs" />
|
<Compile Include="Helpers\DvdDriveHelper.cs" />
|
||||||
<Compile Include="Helpers\JobHelper.cs" />
|
<Compile Include="Helpers\JobHelper.cs" />
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<!-- Custom configuration sections -->
|
<!-- Custom configuration sections -->
|
||||||
<configSections>
|
<configSections>
|
||||||
|
@ -162,7 +162,7 @@
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
</assemblyBinding>
|
</assemblyBinding>
|
||||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
<probing privatePath="bin/Crm2011;bin/Crm2013;bin/Exchange2013;bin/Sharepoint2013;bin/Lync2013;bin/Lync2013HP;bin/Dns2012;bin/IceWarp;bin/IIs80"/>
|
<probing privatePath="bin/Crm2011;bin/Crm2013;bin/Exchange2013;bin/Sharepoint2013;bin/Lync2013;bin/Lync2013HP;bin/Dns2012;bin/IceWarp;bin/IIs80;bin/HyperV2012R2" />
|
||||||
</assemblyBinding>
|
</assemblyBinding>
|
||||||
</runtime>
|
</runtime>
|
||||||
</configuration>
|
</configuration>
|
Loading…
Add table
Add a link
Reference in a new issue