wsp-10323 Convert the VSP provider into one utilizing PowerShell. Step 3
This commit is contained in:
parent
5b09a543f8
commit
6a1efab8d5
8 changed files with 281 additions and 174 deletions
|
@ -36,5 +36,6 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
{
|
{
|
||||||
public bool NumLockEnabled { get; set; }
|
public bool NumLockEnabled { get; set; }
|
||||||
public string[] StartupOrder { get; set; }
|
public string[] StartupOrder { get; set; }
|
||||||
|
public bool BootFromCD { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -39,5 +39,6 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
public int ControllerLocation { get; set; }
|
public int ControllerLocation { get; set; }
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
|
public string Path { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,109 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
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 BiosHelper
|
||||||
|
{
|
||||||
|
public static BiosInfo GetVMBios(PowerShellManager powerShell, string name, int generation)
|
||||||
|
{
|
||||||
|
BiosInfo info = new BiosInfo();
|
||||||
|
|
||||||
|
// for Win2012R2+ and Win8.1+
|
||||||
|
if (generation == 2)
|
||||||
|
{
|
||||||
|
Command cmd = new Command("Get-VMFirmware");
|
||||||
|
|
||||||
|
cmd.Parameters.Add("VMName", name);
|
||||||
|
|
||||||
|
Collection<PSObject> result = powerShell.Execute(cmd, false);
|
||||||
|
if (result != null && result.Count > 0)
|
||||||
|
{
|
||||||
|
info.NumLockEnabled = true;
|
||||||
|
|
||||||
|
List<string> startupOrders = new List<string>();
|
||||||
|
info.BootFromCD = false;
|
||||||
|
|
||||||
|
foreach (dynamic item in (IEnumerable)result[0].GetProperty("BootOrder"))
|
||||||
|
{
|
||||||
|
string bootType = item.BootType.ToString();
|
||||||
|
|
||||||
|
// bootFromCD
|
||||||
|
if (!startupOrders.Any() && bootType == "Drive")
|
||||||
|
{
|
||||||
|
var device = item.Device;
|
||||||
|
info.BootFromCD = device.GetType().Name == "DvdDrive";
|
||||||
|
}
|
||||||
|
|
||||||
|
// startupOrders
|
||||||
|
startupOrders.Add(bootType);
|
||||||
|
}
|
||||||
|
|
||||||
|
info.StartupOrder = startupOrders.ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// for others win and linux
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Command cmd = new Command("Get-VMBios");
|
||||||
|
|
||||||
|
cmd.Parameters.Add("VMName", name);
|
||||||
|
|
||||||
|
Collection<PSObject> result = powerShell.Execute(cmd, false);
|
||||||
|
if (result != null && result.Count > 0)
|
||||||
|
{
|
||||||
|
info.NumLockEnabled = Convert.ToBoolean(result[0].GetProperty("NumLockEnabled"));
|
||||||
|
|
||||||
|
List<string> startupOrders = new List<string>();
|
||||||
|
|
||||||
|
foreach (var item in (IEnumerable)result[0].GetProperty("StartupOrder"))
|
||||||
|
startupOrders.Add(item.ToString());
|
||||||
|
|
||||||
|
info.StartupOrder = startupOrders.ToArray();
|
||||||
|
info.BootFromCD = false;
|
||||||
|
if (info.StartupOrder != null && info.StartupOrder.Length > 0)
|
||||||
|
info.BootFromCD = info.StartupOrder[0] == "CD";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void UpdateBios(PowerShellManager powerShell, VirtualMachine vm, bool bootFromCD, bool numLockEnabled)
|
||||||
|
{
|
||||||
|
// for Win2012R2+ and Win8.1+
|
||||||
|
if (vm.Generation == 2)
|
||||||
|
{
|
||||||
|
Command cmd = new Command("Set-VMFirmware");
|
||||||
|
|
||||||
|
cmd.Parameters.Add("VMName", vm.Name);
|
||||||
|
if (bootFromCD)
|
||||||
|
cmd.Parameters.Add("FirstBootDevice", DvdDriveHelper.GetPS(powerShell, vm.Name));
|
||||||
|
else
|
||||||
|
cmd.Parameters.Add("FirstBootDevice", VirtualMachineHelper.GetVirtualHardDisksPS(powerShell, vm.Name).FirstOrDefault());
|
||||||
|
|
||||||
|
powerShell.Execute(cmd, false);
|
||||||
|
}
|
||||||
|
// for others win and linux
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Command cmd = new Command("Set-VMBios");
|
||||||
|
|
||||||
|
cmd.Parameters.Add("VMName", vm.Name);
|
||||||
|
var bootOrder = bootFromCD
|
||||||
|
? new[] { "CD", "IDE", "LegacyNetworkAdapter", "Floppy" }
|
||||||
|
: new[] { "IDE", "CD", "LegacyNetworkAdapter", "Floppy" };
|
||||||
|
cmd.Parameters.Add("StartupOrder", bootOrder);
|
||||||
|
|
||||||
|
powerShell.Execute(cmd, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -13,8 +13,25 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
{
|
{
|
||||||
public static DvdDriveInfo Get(PowerShellManager powerShell, string vmName)
|
public static DvdDriveInfo Get(PowerShellManager powerShell, string vmName)
|
||||||
{
|
{
|
||||||
DvdDriveInfo info = new DvdDriveInfo();
|
DvdDriveInfo info = null;
|
||||||
|
|
||||||
|
PSObject result = GetPS(powerShell, vmName);
|
||||||
|
|
||||||
|
if (result != null)
|
||||||
|
{
|
||||||
|
info = new DvdDriveInfo();
|
||||||
|
info.Id = result.GetString("Id");
|
||||||
|
info.Name = result.GetString("Name");
|
||||||
|
info.ControllerType = result.GetEnum<ControllerType>("ControllerType");
|
||||||
|
info.ControllerNumber = result.GetInt("ControllerNumber");
|
||||||
|
info.ControllerLocation = result.GetInt("ControllerLocation");
|
||||||
|
info.Path = result.GetString("Path");
|
||||||
|
}
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PSObject GetPS(PowerShellManager powerShell, string vmName)
|
||||||
|
{
|
||||||
Command cmd = new Command("Get-VMDvdDrive");
|
Command cmd = new Command("Get-VMDvdDrive");
|
||||||
|
|
||||||
cmd.Parameters.Add("VMName", vmName);
|
cmd.Parameters.Add("VMName", vmName);
|
||||||
|
@ -23,13 +40,10 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
|
|
||||||
if (result != null && result.Count > 0)
|
if (result != null && result.Count > 0)
|
||||||
{
|
{
|
||||||
info.Id = result[0].GetString("Id");
|
return result[0];
|
||||||
info.Name = result[0].GetString("Name");
|
|
||||||
info.ControllerType = result[0].GetEnum<ControllerType>("ControllerType");
|
|
||||||
info.ControllerNumber = result[0].GetInt("ControllerNumber");
|
|
||||||
info.ControllerLocation = result[0].GetInt("ControllerLocation");
|
|
||||||
}
|
}
|
||||||
return info;
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Set(PowerShellManager powerShell, string vmName, string path)
|
public static void Set(PowerShellManager powerShell, string vmName, string path)
|
||||||
|
@ -56,13 +70,9 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
|
|
||||||
public static void Add(PowerShellManager powerShell, string vmName)
|
public static void Add(PowerShellManager powerShell, string vmName)
|
||||||
{
|
{
|
||||||
var dvd = Get(powerShell, vmName);
|
|
||||||
|
|
||||||
Command cmd = new Command("Add-VMDvdDrive");
|
Command cmd = new Command("Add-VMDvdDrive");
|
||||||
|
|
||||||
cmd.Parameters.Add("VMName", vmName);
|
cmd.Parameters.Add("VMName", vmName);
|
||||||
cmd.Parameters.Add("ControllerNumber", dvd.ControllerNumber);
|
|
||||||
cmd.Parameters.Add("ControllerLocation", dvd.ControllerLocation);
|
|
||||||
|
|
||||||
powerShell.Execute(cmd, false);
|
powerShell.Execute(cmd, false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,18 +49,17 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
return adapters.FirstOrDefault(a => a.MacAddress == macAddress);
|
return adapters.FirstOrDefault(a => a.MacAddress == macAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Update(PowerShellManager powerShell, VirtualMachine vm, string switchId, string portName, string macAddress, string adapterName, bool legacyAdapter)
|
public static void Update(PowerShellManager powerShell, VirtualMachine vm)
|
||||||
{
|
{
|
||||||
// External NIC
|
// External NIC
|
||||||
if (!vm.ExternalNetworkEnabled && !String.IsNullOrEmpty(vm.ExternalNicMacAddress))
|
if (!vm.ExternalNetworkEnabled && !String.IsNullOrEmpty(vm.ExternalNicMacAddress))
|
||||||
{
|
{
|
||||||
// delete adapter
|
|
||||||
Delete(powerShell, vm.Name, vm.ExternalNicMacAddress);
|
Delete(powerShell, vm.Name, vm.ExternalNicMacAddress);
|
||||||
vm.ExternalNicMacAddress = null; // reset MAC
|
vm.ExternalNicMacAddress = null; // reset MAC
|
||||||
}
|
}
|
||||||
else if (vm.ExternalNetworkEnabled && !String.IsNullOrEmpty(vm.ExternalNicMacAddress))
|
else if (vm.ExternalNetworkEnabled && !String.IsNullOrEmpty(vm.ExternalNicMacAddress)
|
||||||
|
&& Get(powerShell,vm.Name,vm.ExternalNicMacAddress) == null)
|
||||||
{
|
{
|
||||||
// add external adapter
|
|
||||||
Add(powerShell, vm.Name, vm.ExternalSwitchId, vm.ExternalNicMacAddress, EXTERNAL_NETWORK_ADAPTER_NAME, vm.LegacyNetworkAdapter);
|
Add(powerShell, vm.Name, vm.ExternalSwitchId, vm.ExternalNicMacAddress, EXTERNAL_NETWORK_ADAPTER_NAME, vm.LegacyNetworkAdapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,35 +69,41 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
Delete(powerShell, vm.Name, vm.PrivateNicMacAddress);
|
Delete(powerShell, vm.Name, vm.PrivateNicMacAddress);
|
||||||
vm.PrivateNicMacAddress = null; // reset MAC
|
vm.PrivateNicMacAddress = null; // reset MAC
|
||||||
}
|
}
|
||||||
else if (vm.PrivateNetworkEnabled && !String.IsNullOrEmpty(vm.PrivateNicMacAddress))
|
else if (vm.PrivateNetworkEnabled && !String.IsNullOrEmpty(vm.PrivateNicMacAddress)
|
||||||
|
&& Get(powerShell, vm.Name, vm.PrivateNicMacAddress) == null)
|
||||||
{
|
{
|
||||||
Add(powerShell, vm.Name, vm.ExternalSwitchId, vm.ExternalNicMacAddress, PRIVATE_NETWORK_ADAPTER_NAME, vm.LegacyNetworkAdapter);
|
Add(powerShell, vm.Name, vm.PrivateSwitchId, vm.PrivateNicMacAddress, PRIVATE_NETWORK_ADAPTER_NAME, vm.LegacyNetworkAdapter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Add(PowerShellManager powerShell, string vmName, string switchId, string macAddress, string adapterName, bool legacyAdapter)
|
public static void Add(PowerShellManager powerShell, string vmName, string switchId, string macAddress, string adapterName, bool legacyAdapter)
|
||||||
{
|
{
|
||||||
//var dvd = Get(powerShell, vmName);
|
Command cmd = new Command("Add-VMNetworkAdapter");
|
||||||
|
|
||||||
//Command cmd = new Command("Add-VMDvdDrive");
|
cmd.Parameters.Add("VMName", vmName);
|
||||||
|
cmd.Parameters.Add("Name", adapterName);
|
||||||
|
cmd.Parameters.Add("SwitchName", switchId);
|
||||||
|
|
||||||
//cmd.Parameters.Add("VMName", vmName);
|
if (String.IsNullOrEmpty(macAddress))
|
||||||
//cmd.Parameters.Add("ControllerNumber", dvd.ControllerNumber);
|
cmd.Parameters.Add("DynamicMacAddress");
|
||||||
//cmd.Parameters.Add("ControllerLocation", dvd.ControllerLocation);
|
else
|
||||||
|
cmd.Parameters.Add("StaticMacAddress", macAddress);
|
||||||
|
|
||||||
//powerShell.Execute(cmd, false);
|
powerShell.Execute(cmd, false);
|
||||||
}
|
}
|
||||||
public static void Delete(PowerShellManager powerShell, string vmName, string macAddress)
|
public static void Delete(PowerShellManager powerShell, string vmName, string macAddress)
|
||||||
{
|
{
|
||||||
//var dvd = Get(powerShell, vmName);
|
var networkAdapter = Get(powerShell, vmName, macAddress);
|
||||||
|
|
||||||
//Command cmd = new Command("Add-VMDvdDrive");
|
if (networkAdapter == null)
|
||||||
|
return;
|
||||||
|
|
||||||
//cmd.Parameters.Add("VMName", vmName);
|
Command cmd = new Command("Remove-VMNetworkAdapter");
|
||||||
//cmd.Parameters.Add("ControllerNumber", dvd.ControllerNumber);
|
|
||||||
//cmd.Parameters.Add("ControllerLocation", dvd.ControllerLocation);
|
|
||||||
|
|
||||||
//powerShell.Execute(cmd, false);
|
cmd.Parameters.Add("VMName", vmName);
|
||||||
|
cmd.Parameters.Add("Name", networkAdapter.Name);
|
||||||
|
|
||||||
|
powerShell.Execute(cmd, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,47 +71,22 @@ 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"));
|
info.Startup = Convert.ToInt64(result[0].GetProperty("Startup")) / Size1M;
|
||||||
info.Minimum = Convert.ToInt64(result[0].GetProperty("Minimum"));
|
info.Minimum = Convert.ToInt64(result[0].GetProperty("Minimum")) / Size1M;
|
||||||
info.Maximum = Convert.ToInt64(result[0].GetProperty("Maximum"));
|
info.Maximum = Convert.ToInt64(result[0].GetProperty("Maximum")) / 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 BiosInfo GetVMBios(PowerShellManager powerShell, string name)
|
|
||||||
{
|
|
||||||
BiosInfo info = new BiosInfo();
|
|
||||||
|
|
||||||
Command cmd = new Command("Get-VMBios");
|
|
||||||
|
|
||||||
cmd.Parameters.Add("VMName", name);
|
|
||||||
|
|
||||||
Collection<PSObject> result = powerShell.Execute(cmd, false);
|
|
||||||
if (result != null && result.Count > 0)
|
|
||||||
{
|
|
||||||
info.NumLockEnabled = Convert.ToBoolean(result[0].GetProperty("NumLockEnabled"));
|
|
||||||
|
|
||||||
List<string> startupOrders = new List<string>();
|
|
||||||
|
|
||||||
foreach (var item in (IEnumerable)result[0].GetProperty("StartupOrder"))
|
|
||||||
startupOrders.Add(item.ToString());
|
|
||||||
|
|
||||||
info.StartupOrder = startupOrders.ToArray();
|
|
||||||
}
|
|
||||||
return info;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static VirtualHardDiskInfo[] GetVirtualHardDisks(PowerShellManager powerShell, string name)
|
public static VirtualHardDiskInfo[] GetVirtualHardDisks(PowerShellManager powerShell, string name)
|
||||||
{
|
{
|
||||||
|
|
||||||
List<VirtualHardDiskInfo> disks = new List<VirtualHardDiskInfo>();
|
List<VirtualHardDiskInfo> disks = new List<VirtualHardDiskInfo>();
|
||||||
|
|
||||||
Command cmd = new Command("Get-VMHardDiskDrive");
|
Collection<PSObject> result = GetVirtualHardDisksPS(powerShell, name);
|
||||||
cmd.Parameters.Add("VMName", name);
|
|
||||||
|
|
||||||
Collection<PSObject> result = powerShell.Execute(cmd, false);
|
|
||||||
if (result != null && result.Count > 0)
|
if (result != null && result.Count > 0)
|
||||||
{
|
{
|
||||||
foreach (PSObject d in result)
|
foreach (PSObject d in result)
|
||||||
|
@ -135,6 +110,14 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
return disks.ToArray();
|
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)
|
public static void GetVirtualHardDiskDetail(PowerShellManager powerShell, string path, ref VirtualHardDiskInfo disk)
|
||||||
{
|
{
|
||||||
if (!string.IsNullOrEmpty(path))
|
if (!string.IsNullOrEmpty(path))
|
||||||
|
@ -155,21 +138,6 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static void UpdateBios(PowerShellManager powerShell, VirtualMachine vm, bool bootFromCD, bool numLockEnabled)
|
|
||||||
{
|
|
||||||
Command cmd = new Command("Set-VMBios");
|
|
||||||
|
|
||||||
cmd.Parameters.Add("VMName", vm.Name);
|
|
||||||
cmd.Parameters.Add(numLockEnabled ? "EnableNumLock" : "DisableNumLock");
|
|
||||||
var bootOrder = bootFromCD
|
|
||||||
? new[] { "CD", "IDE", "LegacyNetworkAdapter", "Floppy" }
|
|
||||||
: new[] { "IDE", "CD", "LegacyNetworkAdapter", "Floppy" };
|
|
||||||
cmd.Parameters.Add("StartupOrder", bootOrder);
|
|
||||||
|
|
||||||
powerShell.Execute(cmd, false);
|
|
||||||
}
|
|
||||||
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");
|
||||||
|
@ -187,7 +155,7 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
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);
|
cmd.Parameters.Add("StartupBytes", ramMB * Size1M);
|
||||||
|
|
||||||
powerShell.Execute(cmd, false);
|
powerShell.Execute(cmd, false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,6 +71,9 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
private const string KVP_RAM_SUMMARY_KEY = "VM-RAM-Summary";
|
private const string KVP_RAM_SUMMARY_KEY = "VM-RAM-Summary";
|
||||||
private const string KVP_HDD_SUMMARY_KEY = "VM-HDD-Summary";
|
private const string KVP_HDD_SUMMARY_KEY = "VM-HDD-Summary";
|
||||||
|
|
||||||
|
private const Int64 Size1G = 0x40000000;
|
||||||
|
private const Int64 Size1M = 0x100000;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Provider Settings
|
#region Provider Settings
|
||||||
|
@ -166,10 +169,11 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
vm.Name = result[0].GetProperty("Name").ToString();
|
vm.Name = result[0].GetProperty("Name").ToString();
|
||||||
vm.State = result[0].GetEnum<VirtualMachineState>("State");
|
vm.State = result[0].GetEnum<VirtualMachineState>("State");
|
||||||
vm.CpuUsage = ConvertNullableToInt32(result[0].GetProperty("CpuUsage"));
|
vm.CpuUsage = ConvertNullableToInt32(result[0].GetProperty("CpuUsage"));
|
||||||
vm.RamUsage = ConvertNullableToInt64(result[0].GetProperty("MemoryAssigned"));
|
vm.RamUsage = ConvertNullableToInt64(result[0].GetProperty("MemoryAssigned")) / Size1M;
|
||||||
vm.Uptime = Convert.ToInt64(result[0].GetProperty<TimeSpan>("UpTime").TotalMilliseconds);
|
vm.Uptime = Convert.ToInt64(result[0].GetProperty<TimeSpan>("UpTime").TotalMilliseconds);
|
||||||
vm.Status = result[0].GetProperty("Status").ToString();
|
vm.Status = result[0].GetProperty("Status").ToString();
|
||||||
vm.ReplicationState = result[0].GetProperty("ReplicationState").ToString();
|
vm.ReplicationState = result[0].GetProperty("ReplicationState").ToString();
|
||||||
|
vm.Generation = result[0].GetInt("Generation");
|
||||||
|
|
||||||
vm.Heartbeat = VirtualMachineHelper.GetVMHeartBeatStatus(PowerShell, vm.Name);
|
vm.Heartbeat = VirtualMachineHelper.GetVMHeartBeatStatus(PowerShell, vm.Name);
|
||||||
|
|
||||||
|
@ -183,12 +187,9 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
vm.RamSize = memoryInfo.Startup;
|
vm.RamSize = memoryInfo.Startup;
|
||||||
|
|
||||||
// BIOS
|
// BIOS
|
||||||
BiosInfo biosInfo = VirtualMachineHelper.GetVMBios(PowerShell, vm.Name);
|
BiosInfo biosInfo = BiosHelper.GetVMBios(PowerShell, vm.Name, vm.Generation);
|
||||||
vm.NumLockEnabled = biosInfo.NumLockEnabled;
|
vm.NumLockEnabled = biosInfo.NumLockEnabled;
|
||||||
|
vm.BootFromCD = biosInfo.BootFromCD;
|
||||||
vm.BootFromCD = false;
|
|
||||||
if ((biosInfo.StartupOrder != null) && (biosInfo.StartupOrder.Length > 0))
|
|
||||||
vm.BootFromCD = (biosInfo.StartupOrder[0] == "CD");
|
|
||||||
|
|
||||||
// DVD drive
|
// DVD drive
|
||||||
var dvdInfo = DvdDriveHelper.Get(PowerShell, vm.Name);
|
var dvdInfo = DvdDriveHelper.Get(PowerShell, vm.Name);
|
||||||
|
@ -430,17 +431,15 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
HostedSolutionLog.LogStart("UpdateVirtualMachine");
|
HostedSolutionLog.LogStart("UpdateVirtualMachine");
|
||||||
HostedSolutionLog.DebugInfo("Virtual Machine: {0}", vm.VirtualMachineId);
|
HostedSolutionLog.DebugInfo("Virtual Machine: {0}", vm.VirtualMachineId);
|
||||||
|
|
||||||
Runspace runSpace = null;
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var realVm = GetVirtualMachine(vm.VirtualMachineId);
|
var realVm = GetVirtualMachineEx(vm.VirtualMachineId);
|
||||||
|
|
||||||
VirtualMachineHelper.UpdateBios(PowerShell, realVm, vm.BootFromCD, vm.NumLockEnabled);
|
DvdDriveHelper.Update(PowerShell, realVm, vm.DvdDriveInstalled); // Dvd should be before bios because bios sets boot order
|
||||||
|
BiosHelper.UpdateBios(PowerShell, realVm, vm.BootFromCD, vm.NumLockEnabled);
|
||||||
VirtualMachineHelper.UpdateProcessors(PowerShell, realVm, vm.CpuCores, CpuLimitSettings, CpuReserveSettings, CpuWeightSettings);
|
VirtualMachineHelper.UpdateProcessors(PowerShell, realVm, vm.CpuCores, CpuLimitSettings, CpuReserveSettings, CpuWeightSettings);
|
||||||
VirtualMachineHelper.UpdateMemory(PowerShell, realVm, vm.RamSize);
|
VirtualMachineHelper.UpdateMemory(PowerShell, realVm, vm.RamSize);
|
||||||
DvdDriveHelper.Update(PowerShell, realVm, vm.DvdDriveInstalled);
|
NetworkAdapterHelper.Update(PowerShell, vm);
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
@ -989,69 +988,68 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
#region DVD operations
|
#region DVD operations
|
||||||
public string GetInsertedDVD(string vmId)
|
public string GetInsertedDVD(string vmId)
|
||||||
{
|
{
|
||||||
// find CD/DVD disk
|
HostedSolutionLog.LogStart("GetInsertedDVD");
|
||||||
ManagementObject objDvd = wmi.GetWmiObject(
|
HostedSolutionLog.DebugInfo("Virtual Machine: {0}", vmId);
|
||||||
"Msvm_ResourceAllocationSettingData", "ResourceSubType = 'Microsoft Virtual CD/DVD Disk'"
|
|
||||||
+ " and InstanceID Like 'Microsoft:{0}%'", vmId);
|
|
||||||
|
|
||||||
if (objDvd == null)
|
DvdDriveInfo dvdInfo;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var vm = GetVirtualMachineEx(vmId);
|
||||||
|
dvdInfo = DvdDriveHelper.Get(PowerShell, vm.Name);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
HostedSolutionLog.LogError("GetInsertedDVD", ex);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dvdInfo == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
string[] path = (string[])objDvd["Connection"];
|
HostedSolutionLog.LogEnd("GetInsertedDVD");
|
||||||
if (path != null && path.Length > 0)
|
return dvdInfo.Path;
|
||||||
return path[0];
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public JobResult InsertDVD(string vmId, string isoPath)
|
public JobResult InsertDVD(string vmId, string isoPath)
|
||||||
{
|
{
|
||||||
isoPath = FileUtils.EvaluateSystemVariables(isoPath);
|
HostedSolutionLog.LogStart("InsertDVD");
|
||||||
|
HostedSolutionLog.DebugInfo("Virtual Machine: {0}", vmId);
|
||||||
|
HostedSolutionLog.DebugInfo("Path: {0}", isoPath);
|
||||||
|
|
||||||
// find DVD drive
|
try
|
||||||
ManagementObject objDvdDrive = wmi.GetWmiObject(
|
{
|
||||||
"Msvm_ResourceAllocationSettingData", "ResourceSubType = 'Microsoft Synthetic DVD Drive'"
|
var vm = GetVirtualMachineEx(vmId);
|
||||||
+ " and InstanceID Like 'Microsoft:{0}%'", vmId);
|
DvdDriveHelper.Set(PowerShell, vm.Name, isoPath);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
HostedSolutionLog.LogError("InsertDVD", ex);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
// create CD/DVD disk
|
HostedSolutionLog.LogEnd("InsertDVD");
|
||||||
ManagementObject objDefaultDVD = wmi.GetWmiObject(
|
return CreateSuccessJobResult();
|
||||||
"Msvm_ResourceAllocationSettingData", "ResourceSubType = 'Microsoft Virtual CD/DVD Disk'"
|
|
||||||
+ " and InstanceID like '%Default'");
|
|
||||||
ManagementObject objDvd = (ManagementObject)objDefaultDVD.Clone();
|
|
||||||
objDvd["Parent"] = objDvdDrive.Path;
|
|
||||||
objDvd["Connection"] = new string[] { isoPath };
|
|
||||||
|
|
||||||
// get VM service
|
|
||||||
ManagementObject objVmsvc = GetVirtualSystemManagementService();
|
|
||||||
|
|
||||||
// get method
|
|
||||||
ManagementBaseObject inParams = objVmsvc.GetMethodParameters("AddVirtualSystemResources");
|
|
||||||
inParams["TargetSystem"] = GetVirtualMachineObject(vmId);
|
|
||||||
inParams["ResourceSettingData"] = new string[] { objDvd.GetText(TextFormat.CimDtd20) };
|
|
||||||
|
|
||||||
// execute method
|
|
||||||
ManagementBaseObject outParams = objVmsvc.InvokeMethod("AddVirtualSystemResources", inParams, null);
|
|
||||||
return CreateJobResultFromWmiMethodResults(outParams);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public JobResult EjectDVD(string vmId)
|
public JobResult EjectDVD(string vmId)
|
||||||
{
|
{
|
||||||
// find CD/DVD disk
|
HostedSolutionLog.LogStart("InsertDVD");
|
||||||
ManagementObject objDvd = wmi.GetWmiObject(
|
HostedSolutionLog.DebugInfo("Virtual Machine: {0}", vmId);
|
||||||
"Msvm_ResourceAllocationSettingData", "ResourceSubType = 'Microsoft Virtual CD/DVD Disk'"
|
|
||||||
+ " and InstanceID Like 'Microsoft:{0}%'", vmId);
|
|
||||||
|
|
||||||
// get VM service
|
try
|
||||||
ManagementObject objVmsvc = GetVirtualSystemManagementService();
|
{
|
||||||
|
var vm = GetVirtualMachineEx(vmId);
|
||||||
|
DvdDriveHelper.Set(PowerShell, vm.Name, null);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
HostedSolutionLog.LogError("InsertDVD", ex);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
// get method
|
HostedSolutionLog.LogEnd("InsertDVD");
|
||||||
ManagementBaseObject inParams = objVmsvc.GetMethodParameters("RemoveVirtualSystemResources");
|
return CreateSuccessJobResult();
|
||||||
inParams["TargetSystem"] = GetVirtualMachineObject(vmId);
|
|
||||||
inParams["ResourceSettingData"] = new object[] { objDvd.Path.Path };
|
|
||||||
|
|
||||||
// execute method
|
|
||||||
ManagementBaseObject outParams = objVmsvc.InvokeMethod("RemoveVirtualSystemResources", inParams, null);
|
|
||||||
return CreateJobResultFromWmiMethodResults(outParams);
|
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -1071,7 +1069,6 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
HostedSolutionLog.LogStart("GetSwitches");
|
HostedSolutionLog.LogStart("GetSwitches");
|
||||||
HostedSolutionLog.DebugInfo("ComputerName: {0}", computerName);
|
HostedSolutionLog.DebugInfo("ComputerName: {0}", computerName);
|
||||||
|
|
||||||
Runspace runSpace = null;
|
|
||||||
List<VirtualSwitch> switches = new List<VirtualSwitch>();
|
List<VirtualSwitch> switches = new List<VirtualSwitch>();
|
||||||
|
|
||||||
try
|
try
|
||||||
|
@ -1100,53 +1097,67 @@ namespace WebsitePanel.Providers.Virtualization
|
||||||
|
|
||||||
HostedSolutionLog.LogEnd("GetSwitches");
|
HostedSolutionLog.LogEnd("GetSwitches");
|
||||||
return switches;
|
return switches;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool SwitchExists(string switchId)
|
public bool SwitchExists(string switchId)
|
||||||
{
|
{
|
||||||
ManagementObject objSwitch = wmi.GetWmiObject("msvm_VirtualSwitch", "Name = '{0}'", switchId);
|
return GetSwitches().Any(s => s.Name == switchId);
|
||||||
return (objSwitch != null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public VirtualSwitch CreateSwitch(string name)
|
public VirtualSwitch CreateSwitch(string name)
|
||||||
{
|
{
|
||||||
// generate ID for new virtual switch
|
// Create private switch
|
||||||
string id = Guid.NewGuid().ToString();
|
|
||||||
|
|
||||||
// get switch management object
|
HostedSolutionLog.LogStart("CreateSwitch");
|
||||||
ManagementObject objNetworkSvc = GetVirtualSwitchManagementService();
|
HostedSolutionLog.DebugInfo("Name: {0}", name);
|
||||||
|
|
||||||
ManagementBaseObject inParams = objNetworkSvc.GetMethodParameters("CreateSwitch");
|
VirtualSwitch virtualSwitch = null;
|
||||||
inParams["Name"] = id;
|
|
||||||
inParams["FriendlyName"] = name;
|
|
||||||
inParams["NumLearnableAddresses"] = SWITCH_PORTS_NUMBER;
|
|
||||||
|
|
||||||
// invoke method
|
try
|
||||||
ManagementBaseObject outParams = objNetworkSvc.InvokeMethod("CreateSwitch", inParams, null);
|
{
|
||||||
|
Command cmd = new Command("New-VMSwitch");
|
||||||
|
|
||||||
// process output parameters
|
cmd.Parameters.Add("SwitchType", "Private");
|
||||||
ManagementObject objSwitch = wmi.GetWmiObjectByPath((string)outParams["CreatedVirtualSwitch"]);
|
cmd.Parameters.Add("Name", name);
|
||||||
return CreateSwitchFromWmiObject(objSwitch);
|
|
||||||
|
Collection<PSObject> result = PowerShell.Execute(cmd, false);
|
||||||
|
if (result != null && result.Count > 0)
|
||||||
|
{
|
||||||
|
virtualSwitch = new VirtualSwitch();
|
||||||
|
virtualSwitch.SwitchId = result[0].GetString("Name");
|
||||||
|
virtualSwitch.Name = result[0].GetString("Name");
|
||||||
|
virtualSwitch.SwitchType = result[0].GetString("SwitchType");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
HostedSolutionLog.LogError("CreateSwitch", ex);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
HostedSolutionLog.LogEnd("CreateSwitch");
|
||||||
|
return virtualSwitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReturnCode DeleteSwitch(string switchId)
|
public ReturnCode DeleteSwitch(string switchId)
|
||||||
{
|
{
|
||||||
// find requested switch
|
HostedSolutionLog.LogStart("DeleteSwitch");
|
||||||
ManagementObject objSwitch = wmi.GetWmiObject("msvm_VirtualSwitch", "Name = '{0}'", switchId);
|
HostedSolutionLog.DebugInfo("switchId: {0}", switchId);
|
||||||
|
|
||||||
if (objSwitch == null)
|
try
|
||||||
throw new Exception("Virtual switch with the specified ID was not found.");
|
{
|
||||||
|
Command cmd = new Command("Remove-VMSwitch");
|
||||||
|
cmd.Parameters.Add("Name", switchId);
|
||||||
|
PowerShell.Execute(cmd, false);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
HostedSolutionLog.LogError("DeleteSwitch", ex);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
// get switch management object
|
HostedSolutionLog.LogEnd("DeleteSwitch");
|
||||||
ManagementObject objNetworkSvc = GetVirtualSwitchManagementService();
|
return ReturnCode.OK;
|
||||||
|
|
||||||
// get method params
|
|
||||||
ManagementBaseObject inParams = objNetworkSvc.GetMethodParameters("DeleteSwitch");
|
|
||||||
inParams["VirtualSwitch"] = objSwitch.Path.Path;
|
|
||||||
|
|
||||||
ManagementBaseObject outParams = (ManagementBaseObject)objNetworkSvc.InvokeMethod("DeleteSwitch", inParams, null);
|
|
||||||
return (ReturnCode)Convert.ToInt32(outParams["ReturnValue"]);
|
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -2102,6 +2113,17 @@ exit", Convert.ToInt32(objDisk["Index"])));
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Private Methods
|
#region Private Methods
|
||||||
|
|
||||||
|
internal int ConvertNullableToInt32(object value)
|
||||||
|
{
|
||||||
|
return value == null ? 0 : Convert.ToInt32(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal long ConvertNullableToInt64(object value)
|
||||||
|
{
|
||||||
|
return value == null ? 0 : Convert.ToInt64(value);
|
||||||
|
}
|
||||||
|
|
||||||
protected JobResult CreateSuccessJobResult()
|
protected JobResult CreateSuccessJobResult()
|
||||||
{
|
{
|
||||||
JobResult result = new JobResult();
|
JobResult result = new JobResult();
|
||||||
|
@ -2540,15 +2562,5 @@ exit", Convert.ToInt32(objDisk["Index"])));
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
internal int ConvertNullableToInt32(object value)
|
|
||||||
{
|
|
||||||
return value == null ? 0 : Convert.ToInt32(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal long ConvertNullableToInt64(object value)
|
|
||||||
{
|
|
||||||
return value == null ? 0 : Convert.ToInt64(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
<Link>VersionInfo.cs</Link>
|
<Link>VersionInfo.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Extensions\PSObjectExtension.cs" />
|
<Compile Include="Extensions\PSObjectExtension.cs" />
|
||||||
|
<Compile Include="Helpers\BiosHelper.cs" />
|
||||||
<Compile Include="Helpers\NetworkAdapterHelper.cs" />
|
<Compile Include="Helpers\NetworkAdapterHelper.cs" />
|
||||||
<Compile Include="Helpers\DvdDriveHelper.cs" />
|
<Compile Include="Helpers\DvdDriveHelper.cs" />
|
||||||
<Compile Include="PowerShellManager.cs" />
|
<Compile Include="PowerShellManager.cs" />
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue