diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/BiosInfo.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/BiosInfo.cs index f7fd4a59..796876fc 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/BiosInfo.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/BiosInfo.cs @@ -36,5 +36,6 @@ namespace WebsitePanel.Providers.Virtualization { public bool NumLockEnabled { get; set; } public string[] StartupOrder { get; set; } + public bool BootFromCD { get; set; } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/DvdDriveInfo.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/DvdDriveInfo.cs index df548b0b..34a1100d 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/DvdDriveInfo.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/DvdDriveInfo.cs @@ -39,5 +39,6 @@ namespace WebsitePanel.Providers.Virtualization public int ControllerLocation { get; set; } public string Name { get; set; } public string Id { get; set; } + public string Path { get; set; } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/BiosHelper.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/BiosHelper.cs new file mode 100644 index 00000000..25fcfe3b --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/BiosHelper.cs @@ -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 result = powerShell.Execute(cmd, false); + if (result != null && result.Count > 0) + { + info.NumLockEnabled = true; + + List startupOrders = new List(); + 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 result = powerShell.Execute(cmd, false); + if (result != null && result.Count > 0) + { + info.NumLockEnabled = Convert.ToBoolean(result[0].GetProperty("NumLockEnabled")); + + List startupOrders = new List(); + + 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); + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/DvdDriveHelper.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/DvdDriveHelper.cs index 871e8fa3..012232ee 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/DvdDriveHelper.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/DvdDriveHelper.cs @@ -13,8 +13,25 @@ namespace WebsitePanel.Providers.Virtualization { 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"); + 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"); cmd.Parameters.Add("VMName", vmName); @@ -23,13 +40,10 @@ namespace WebsitePanel.Providers.Virtualization if (result != null && result.Count > 0) { - info.Id = result[0].GetString("Id"); - info.Name = result[0].GetString("Name"); - info.ControllerType = result[0].GetEnum("ControllerType"); - info.ControllerNumber = result[0].GetInt("ControllerNumber"); - info.ControllerLocation = result[0].GetInt("ControllerLocation"); + return result[0]; } - return info; + + return null; } 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) { - var dvd = Get(powerShell, vmName); - Command cmd = new Command("Add-VMDvdDrive"); cmd.Parameters.Add("VMName", vmName); - cmd.Parameters.Add("ControllerNumber", dvd.ControllerNumber); - cmd.Parameters.Add("ControllerLocation", dvd.ControllerLocation); powerShell.Execute(cmd, false); } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/NetworkAdapterHelper.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/NetworkAdapterHelper.cs index c00ff956..bd6f9b37 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/NetworkAdapterHelper.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/NetworkAdapterHelper.cs @@ -49,18 +49,17 @@ namespace WebsitePanel.Providers.Virtualization 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 if (!vm.ExternalNetworkEnabled && !String.IsNullOrEmpty(vm.ExternalNicMacAddress)) { - // delete adapter Delete(powerShell, vm.Name, vm.ExternalNicMacAddress); 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); } @@ -70,35 +69,41 @@ namespace WebsitePanel.Providers.Virtualization Delete(powerShell, vm.Name, vm.PrivateNicMacAddress); 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) { - //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); - //cmd.Parameters.Add("ControllerNumber", dvd.ControllerNumber); - //cmd.Parameters.Add("ControllerLocation", dvd.ControllerLocation); + if (String.IsNullOrEmpty(macAddress)) + cmd.Parameters.Add("DynamicMacAddress"); + else + cmd.Parameters.Add("StaticMacAddress", macAddress); - //powerShell.Execute(cmd, false); + powerShell.Execute(cmd, false); } 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); - //cmd.Parameters.Add("ControllerNumber", dvd.ControllerNumber); - //cmd.Parameters.Add("ControllerLocation", dvd.ControllerLocation); + Command cmd = new Command("Remove-VMNetworkAdapter"); - //powerShell.Execute(cmd, false); + cmd.Parameters.Add("VMName", vmName); + cmd.Parameters.Add("Name", networkAdapter.Name); + + powerShell.Execute(cmd, false); } } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/VirtualMachineHelper.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/VirtualMachineHelper.cs index 66958337..0d24c149 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/VirtualMachineHelper.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/VirtualMachineHelper.cs @@ -71,47 +71,22 @@ namespace WebsitePanel.Providers.Virtualization if (result != null && result.Count > 0) { info.DynamicMemoryEnabled = Convert.ToBoolean(result[0].GetProperty("DynamicMemoryEnabled")); - info.Startup = Convert.ToInt64(result[0].GetProperty("Startup")); - info.Minimum = Convert.ToInt64(result[0].GetProperty("Minimum")); - info.Maximum = Convert.ToInt64(result[0].GetProperty("Maximum")); + info.Startup = Convert.ToInt64(result[0].GetProperty("Startup")) / Size1M; + info.Minimum = Convert.ToInt64(result[0].GetProperty("Minimum")) / Size1M; + info.Maximum = Convert.ToInt64(result[0].GetProperty("Maximum")) / Size1M; info.Buffer = Convert.ToInt32(result[0].GetProperty("Buffer")); info.Priority = Convert.ToInt32(result[0].GetProperty("Priority")); } 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 result = powerShell.Execute(cmd, false); - if (result != null && result.Count > 0) - { - info.NumLockEnabled = Convert.ToBoolean(result[0].GetProperty("NumLockEnabled")); - - List startupOrders = new List(); - - 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) { - List disks = new List(); - Command cmd = new Command("Get-VMHardDiskDrive"); - cmd.Parameters.Add("VMName", name); + Collection result = GetVirtualHardDisksPS(powerShell, name); - Collection result = powerShell.Execute(cmd, false); if (result != null && result.Count > 0) { foreach (PSObject d in result) @@ -135,6 +110,14 @@ namespace WebsitePanel.Providers.Virtualization return disks.ToArray(); } + public static Collection 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)) @@ -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) { Command cmd = new Command("Set-VMProcessor"); @@ -187,7 +155,7 @@ namespace WebsitePanel.Providers.Virtualization Command cmd = new Command("Set-VMMemory"); cmd.Parameters.Add("VMName", vm.Name); - cmd.Parameters.Add("StartupBytes", ramMB); + cmd.Parameters.Add("StartupBytes", ramMB * Size1M); powerShell.Execute(cmd, false); } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/HyperV2012R2.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/HyperV2012R2.cs index 2247adf7..e14db44b 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/HyperV2012R2.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/HyperV2012R2.cs @@ -71,6 +71,9 @@ namespace WebsitePanel.Providers.Virtualization private const string KVP_RAM_SUMMARY_KEY = "VM-RAM-Summary"; private const string KVP_HDD_SUMMARY_KEY = "VM-HDD-Summary"; + private const Int64 Size1G = 0x40000000; + private const Int64 Size1M = 0x100000; + #endregion #region Provider Settings @@ -166,10 +169,11 @@ namespace WebsitePanel.Providers.Virtualization vm.Name = result[0].GetProperty("Name").ToString(); vm.State = result[0].GetEnum("State"); 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("UpTime").TotalMilliseconds); vm.Status = result[0].GetProperty("Status").ToString(); vm.ReplicationState = result[0].GetProperty("ReplicationState").ToString(); + vm.Generation = result[0].GetInt("Generation"); vm.Heartbeat = VirtualMachineHelper.GetVMHeartBeatStatus(PowerShell, vm.Name); @@ -183,12 +187,9 @@ namespace WebsitePanel.Providers.Virtualization vm.RamSize = memoryInfo.Startup; // BIOS - BiosInfo biosInfo = VirtualMachineHelper.GetVMBios(PowerShell, vm.Name); + BiosInfo biosInfo = BiosHelper.GetVMBios(PowerShell, vm.Name, vm.Generation); vm.NumLockEnabled = biosInfo.NumLockEnabled; - - vm.BootFromCD = false; - if ((biosInfo.StartupOrder != null) && (biosInfo.StartupOrder.Length > 0)) - vm.BootFromCD = (biosInfo.StartupOrder[0] == "CD"); + vm.BootFromCD = biosInfo.BootFromCD; // DVD drive var dvdInfo = DvdDriveHelper.Get(PowerShell, vm.Name); @@ -430,17 +431,15 @@ namespace WebsitePanel.Providers.Virtualization HostedSolutionLog.LogStart("UpdateVirtualMachine"); HostedSolutionLog.DebugInfo("Virtual Machine: {0}", vm.VirtualMachineId); - Runspace runSpace = null; - 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.UpdateMemory(PowerShell, realVm, vm.RamSize); - DvdDriveHelper.Update(PowerShell, realVm, vm.DvdDriveInstalled); - + NetworkAdapterHelper.Update(PowerShell, vm); } catch (Exception ex) { @@ -989,69 +988,68 @@ namespace WebsitePanel.Providers.Virtualization #region DVD operations public string GetInsertedDVD(string vmId) { - // find CD/DVD disk - ManagementObject objDvd = wmi.GetWmiObject( - "Msvm_ResourceAllocationSettingData", "ResourceSubType = 'Microsoft Virtual CD/DVD Disk'" - + " and InstanceID Like 'Microsoft:{0}%'", vmId); + HostedSolutionLog.LogStart("GetInsertedDVD"); + HostedSolutionLog.DebugInfo("Virtual Machine: {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; - string[] path = (string[])objDvd["Connection"]; - if (path != null && path.Length > 0) - return path[0]; - - return null; + HostedSolutionLog.LogEnd("GetInsertedDVD"); + return dvdInfo.Path; } 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 - ManagementObject objDvdDrive = wmi.GetWmiObject( - "Msvm_ResourceAllocationSettingData", "ResourceSubType = 'Microsoft Synthetic DVD Drive'" - + " and InstanceID Like 'Microsoft:{0}%'", vmId); + try + { + var vm = GetVirtualMachineEx(vmId); + DvdDriveHelper.Set(PowerShell, vm.Name, isoPath); + } + catch (Exception ex) + { + HostedSolutionLog.LogError("InsertDVD", ex); + throw; + } - // create CD/DVD disk - ManagementObject objDefaultDVD = wmi.GetWmiObject( - "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); + HostedSolutionLog.LogEnd("InsertDVD"); + return CreateSuccessJobResult(); } public JobResult EjectDVD(string vmId) { - // find CD/DVD disk - ManagementObject objDvd = wmi.GetWmiObject( - "Msvm_ResourceAllocationSettingData", "ResourceSubType = 'Microsoft Virtual CD/DVD Disk'" - + " and InstanceID Like 'Microsoft:{0}%'", vmId); + HostedSolutionLog.LogStart("InsertDVD"); + HostedSolutionLog.DebugInfo("Virtual Machine: {0}", vmId); - // get VM service - ManagementObject objVmsvc = GetVirtualSystemManagementService(); + try + { + var vm = GetVirtualMachineEx(vmId); + DvdDriveHelper.Set(PowerShell, vm.Name, null); + } + catch (Exception ex) + { + HostedSolutionLog.LogError("InsertDVD", ex); + throw; + } - // get method - ManagementBaseObject inParams = objVmsvc.GetMethodParameters("RemoveVirtualSystemResources"); - inParams["TargetSystem"] = GetVirtualMachineObject(vmId); - inParams["ResourceSettingData"] = new object[] { objDvd.Path.Path }; - - // execute method - ManagementBaseObject outParams = objVmsvc.InvokeMethod("RemoveVirtualSystemResources", inParams, null); - return CreateJobResultFromWmiMethodResults(outParams); + HostedSolutionLog.LogEnd("InsertDVD"); + return CreateSuccessJobResult(); } #endregion @@ -1071,7 +1069,6 @@ namespace WebsitePanel.Providers.Virtualization HostedSolutionLog.LogStart("GetSwitches"); HostedSolutionLog.DebugInfo("ComputerName: {0}", computerName); - Runspace runSpace = null; List switches = new List(); try @@ -1100,53 +1097,67 @@ namespace WebsitePanel.Providers.Virtualization HostedSolutionLog.LogEnd("GetSwitches"); return switches; - } public bool SwitchExists(string switchId) { - ManagementObject objSwitch = wmi.GetWmiObject("msvm_VirtualSwitch", "Name = '{0}'", switchId); - return (objSwitch != null); + return GetSwitches().Any(s => s.Name == switchId); } public VirtualSwitch CreateSwitch(string name) { - // generate ID for new virtual switch - string id = Guid.NewGuid().ToString(); + // Create private switch - // get switch management object - ManagementObject objNetworkSvc = GetVirtualSwitchManagementService(); + HostedSolutionLog.LogStart("CreateSwitch"); + HostedSolutionLog.DebugInfo("Name: {0}", name); - ManagementBaseObject inParams = objNetworkSvc.GetMethodParameters("CreateSwitch"); - inParams["Name"] = id; - inParams["FriendlyName"] = name; - inParams["NumLearnableAddresses"] = SWITCH_PORTS_NUMBER; + VirtualSwitch virtualSwitch = null; - // invoke method - ManagementBaseObject outParams = objNetworkSvc.InvokeMethod("CreateSwitch", inParams, null); + try + { + Command cmd = new Command("New-VMSwitch"); - // process output parameters - ManagementObject objSwitch = wmi.GetWmiObjectByPath((string)outParams["CreatedVirtualSwitch"]); - return CreateSwitchFromWmiObject(objSwitch); + cmd.Parameters.Add("SwitchType", "Private"); + cmd.Parameters.Add("Name", name); + + Collection 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) { - // find requested switch - ManagementObject objSwitch = wmi.GetWmiObject("msvm_VirtualSwitch", "Name = '{0}'", switchId); + HostedSolutionLog.LogStart("DeleteSwitch"); + HostedSolutionLog.DebugInfo("switchId: {0}", switchId); - if (objSwitch == null) - throw new Exception("Virtual switch with the specified ID was not found."); + try + { + 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 - ManagementObject objNetworkSvc = GetVirtualSwitchManagementService(); - - // 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"]); + HostedSolutionLog.LogEnd("DeleteSwitch"); + return ReturnCode.OK; } #endregion @@ -2102,6 +2113,17 @@ exit", Convert.ToInt32(objDisk["Index"]))); #endregion #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() { JobResult result = new JobResult(); @@ -2540,15 +2562,5 @@ exit", Convert.ToInt32(objDisk["Index"]))); #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); - } - } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/WebsitePanel.Providers.Virtualization.HyperV2012R2.csproj b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/WebsitePanel.Providers.Virtualization.HyperV2012R2.csproj index 2198fbaa..d033344b 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/WebsitePanel.Providers.Virtualization.HyperV2012R2.csproj +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/WebsitePanel.Providers.Virtualization.HyperV2012R2.csproj @@ -54,6 +54,7 @@ VersionInfo.cs +