From 8b3332e3c70fb6c5061c1caa6d4fea80e6d938f5 Mon Sep 17 00:00:00 2001 From: AlexanderTr Date: Fri, 20 Mar 2015 21:24:07 +0300 Subject: [PATCH 1/2] wsp-10323 Convert the VSP provider into one utilizing PowerShell. Step 6 Create\Delete\Export --- .../Helpers/BiosHelper.cs | 8 +- .../Helpers/DvdDriveHelper.cs | 8 +- .../Helpers/HardDriveHelper.cs | 6 +- .../Helpers/NetworkAdapterHelper.cs | 12 +- .../Helpers/SnapshotHelper.cs | 2 +- .../Helpers/VirtualMachineHelper.cs | 10 +- .../HyperV2012R2.cs | 403 ++++-------------- .../PowerShellManager.cs | 73 +--- 8 files changed, 121 insertions(+), 401 deletions(-) diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/BiosHelper.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/BiosHelper.cs index 21dafb52..fdb71f50 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/BiosHelper.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/BiosHelper.cs @@ -23,7 +23,7 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("VMName", name); - Collection result = powerShell.Execute(cmd, false); + Collection result = powerShell.Execute(cmd, true); if (result != null && result.Count > 0) { info.NumLockEnabled = true; @@ -56,7 +56,7 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("VMName", name); - Collection result = powerShell.Execute(cmd, false); + Collection result = powerShell.Execute(cmd, true); if (result != null && result.Count > 0) { info.NumLockEnabled = Convert.ToBoolean(result[0].GetProperty("NumLockEnabled")); @@ -89,7 +89,7 @@ namespace WebsitePanel.Providers.Virtualization else cmd.Parameters.Add("FirstBootDevice", HardDriveHelper.GetPS(powerShell, vm.Name).FirstOrDefault()); - powerShell.Execute(cmd, false); + powerShell.Execute(cmd, true); } // for others win and linux else @@ -102,7 +102,7 @@ namespace WebsitePanel.Providers.Virtualization : new[] { "IDE", "CD", "LegacyNetworkAdapter", "Floppy" }; cmd.Parameters.Add("StartupOrder", bootOrder); - powerShell.Execute(cmd, false); + powerShell.Execute(cmd, true); } } } 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 012232ee..ce039f0c 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/DvdDriveHelper.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/DvdDriveHelper.cs @@ -36,7 +36,7 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("VMName", vmName); - Collection result = powerShell.Execute(cmd, false); + Collection result = powerShell.Execute(cmd, true); if (result != null && result.Count > 0) { @@ -57,7 +57,7 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("ControllerNumber", dvd.ControllerNumber); cmd.Parameters.Add("ControllerLocation", dvd.ControllerLocation); - powerShell.Execute(cmd, false); + powerShell.Execute(cmd, true); } public static void Update(PowerShellManager powerShell, VirtualMachine vm, bool dvdDriveShouldBeInstalled) @@ -74,7 +74,7 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("VMName", vmName); - powerShell.Execute(cmd, false); + powerShell.Execute(cmd, true); } public static void Remove(PowerShellManager powerShell, string vmName) @@ -87,7 +87,7 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("ControllerNumber", dvd.ControllerNumber); cmd.Parameters.Add("ControllerLocation", dvd.ControllerLocation); - powerShell.Execute(cmd, false); + powerShell.Execute(cmd, true); } } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/HardDriveHelper.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/HardDriveHelper.cs index c8a951d6..b2e90e90 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/HardDriveHelper.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/HardDriveHelper.cs @@ -47,7 +47,7 @@ namespace WebsitePanel.Providers.Virtualization // Command cmd = new Command("Get-VM"); - // Collection result = powerShell.Execute(cmd, false); + // Collection result = powerShell.Execute(cmd, true); // if (result == null || result.Count == 0) // return null; @@ -63,7 +63,7 @@ namespace WebsitePanel.Providers.Virtualization Command cmd = new Command("Get-VMHardDiskDrive"); cmd.Parameters.Add("VMName", vmname); - return powerShell.Execute(cmd, false); + return powerShell.Execute(cmd, true); } public static void GetVirtualHardDiskDetail(PowerShellManager powerShell, string path, ref VirtualHardDiskInfo disk) @@ -72,7 +72,7 @@ namespace WebsitePanel.Providers.Virtualization { Command cmd = new Command("Get-VHD"); cmd.Parameters.Add("Path", path); - Collection result = powerShell.Execute(cmd, false); + Collection result = powerShell.Execute(cmd, true); if (result != null && result.Count > 0) { disk.DiskFormat = result[0].GetEnum("VhdFormat"); 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 bd6f9b37..f14f8f97 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/NetworkAdapterHelper.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/NetworkAdapterHelper.cs @@ -26,7 +26,7 @@ namespace WebsitePanel.Providers.Virtualization Command cmd = new Command("Get-VMNetworkAdapter"); if (!string.IsNullOrEmpty(vmName)) cmd.Parameters.Add("VMName", vmName); - Collection result = powerShell.Execute(cmd, false); + Collection result = powerShell.Execute(cmd, true); if (result != null && result.Count > 0) { foreach (PSObject psAdapter in result) @@ -89,8 +89,9 @@ namespace WebsitePanel.Providers.Virtualization else cmd.Parameters.Add("StaticMacAddress", macAddress); - powerShell.Execute(cmd, false); + powerShell.Execute(cmd, true); } + public static void Delete(PowerShellManager powerShell, string vmName, string macAddress) { var networkAdapter = Get(powerShell, vmName, macAddress); @@ -98,12 +99,17 @@ namespace WebsitePanel.Providers.Virtualization if (networkAdapter == null) return; + Delete(powerShell, vmName, networkAdapter); + } + + public static void Delete(PowerShellManager powerShell, string vmName, VirtualMachineNetworkAdapter networkAdapter) + { Command cmd = new Command("Remove-VMNetworkAdapter"); cmd.Parameters.Add("VMName", vmName); cmd.Parameters.Add("Name", networkAdapter.Name); - powerShell.Execute(cmd, false); + powerShell.Execute(cmd, true); } } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/SnapshotHelper.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/SnapshotHelper.cs index b5dee5c2..fa738ce0 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/SnapshotHelper.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/SnapshotHelper.cs @@ -66,7 +66,7 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("Name", snapshot.Name); if (includeChilds) cmd.Parameters.Add("IncludeAllChildSnapshots", true); - powerShell.Execute(cmd, false); + powerShell.Execute(cmd, true); } } } 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 e7d05288..bd1291a1 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/VirtualMachineHelper.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/VirtualMachineHelper.cs @@ -21,7 +21,7 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("VMName", name); cmd.Parameters.Add("Name", "HeartBeat"); - Collection result = powerShell.Execute(cmd, false); + Collection result = powerShell.Execute(cmd, true); if (result != null && result.Count > 0) { var statusString = result[0].GetProperty("PrimaryOperationalStatus"); @@ -41,7 +41,7 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("VMName", name); - Collection result = powerShell.Execute(cmd, false); + Collection result = powerShell.Execute(cmd, true); if (result != null && result.Count > 0) { procs = Convert.ToInt32(result[0].GetProperty("Count")); @@ -58,7 +58,7 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("VMName", name); - Collection result = powerShell.Execute(cmd, false); + Collection result = powerShell.Execute(cmd, true); if (result != null && result.Count > 0) { info.DynamicMemoryEnabled = Convert.ToBoolean(result[0].GetProperty("DynamicMemoryEnabled")); @@ -81,7 +81,7 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("Reserve", Convert.ToInt64(cpuReserveSettings * 1000)); cmd.Parameters.Add("RelativeWeight", cpuWeightSettings); - powerShell.Execute(cmd, false); + powerShell.Execute(cmd, true); } public static void UpdateMemory(PowerShellManager powerShell, VirtualMachine vm, long ramMB) @@ -91,7 +91,7 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("VMName", vm.Name); cmd.Parameters.Add("StartupBytes", ramMB * Constants.Size1M); - powerShell.Execute(cmd, false); + powerShell.Execute(cmd, true); } } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/HyperV2012R2.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/HyperV2012R2.cs index 7b1801ea..b8ad22ab 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/HyperV2012R2.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/HyperV2012R2.cs @@ -163,7 +163,7 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("Id", vmId); - Collection result = PowerShell.Execute(cmd, false); + Collection result = PowerShell.Execute(cmd, true); if (result != null && result.Count > 0) { vm.Name = result[0].GetProperty("Name").ToString(); @@ -232,7 +232,7 @@ namespace WebsitePanel.Providers.Virtualization { Command cmd = new Command("Get-VM"); - Collection result = PowerShell.Execute(cmd, false); + Collection result = PowerShell.Execute(cmd, true); foreach (PSObject current in result) { VirtualMachine vm = new VirtualMachine @@ -332,8 +332,9 @@ namespace WebsitePanel.Providers.Virtualization // Add new VM Command cmdNew = new Command("New-VM"); cmdNew.Parameters.Add("Name", vm.Name); + cmdNew.Parameters.Add("Generation", vm.Generation > 1 ? vm.Generation : 1); cmdNew.Parameters.Add("VHDPath", vm.VirtualHardDrivePath); - PowerShell.Execute(cmdNew, false); + PowerShell.Execute(cmdNew, true); // Set VM Command cmdSet = new Command("Set-VM"); @@ -350,7 +351,7 @@ namespace WebsitePanel.Providers.Virtualization } if (autoStopAction != AutomaticStopAction.Undefined) cmdSet.Parameters.Add("AutomaticStopAction", autoStopAction.ToString()); - PowerShell.Execute(cmdSet, false); + PowerShell.Execute(cmdSet, true); // Get created machine Id var createdMachine = GetVirtualMachines().FirstOrDefault(m => m.Name == vm.Name); @@ -396,168 +397,6 @@ namespace WebsitePanel.Providers.Virtualization return vm; } - - private void AddVirtualMachineDvdDrive(string vmId, ManagementObject objVM) - { - // load IDE 1 controller - ManagementObject objIDE1 = wmi.GetWmiObject( - "Msvm_ResourceAllocationSettingData", "ResourceSubType = 'Microsoft Emulated IDE Controller'" - + " and InstanceID Like 'Microsoft:{0}%' and Address = 1", vmId); - - // load default hard disk drive - ManagementObject objDefaultDvd = wmi.GetWmiObject( - "Msvm_ResourceAllocationSettingData", "ResourceSubType = 'Microsoft Synthetic DVD Drive'" - + " and InstanceID like '%Default'"); - ManagementObject objDvd = (ManagementObject)objDefaultDvd.Clone(); - objDvd["Parent"] = objIDE1.Path; - objDvd["Address"] = 0; - - // add DVD drive to VM resources - AddVirtualMachineResources(objVM, objDvd); - } - - private void AddNetworkAdapter(ManagementObject objVm, string switchId, string portName, string macAddress, string adapterName, bool legacyAdapter) - { - string nicClassName = GetNetworkAdapterClassName(legacyAdapter); - - string vmId = (string)objVm["Name"]; - - // check if already exists - ManagementObject objNic = wmi.GetWmiObject( - nicClassName, "InstanceID like 'Microsoft:{0}%' and Address = '{1}'", vmId, macAddress); - - if (objNic != null) - return; // exists - exit - - portName = String.Format("{0} - {1}", - portName, (adapterName == EXTERNAL_NETWORK_ADAPTER_NAME) ? "External" : "Private"); - - // Network service - ManagementObject objNetworkSvc = GetVirtualSwitchManagementService(); - - // default NIC - ManagementObject objDefaultNic = wmi.GetWmiObject(nicClassName, "InstanceID like '%Default'"); - - // find switch - ManagementObject objSwitch = wmi.GetWmiObject("msvm_VirtualSwitch", "Name = '{0}'", switchId); - - // create switch port - ManagementBaseObject inParams = objNetworkSvc.GetMethodParameters("CreateSwitchPort"); - inParams["VirtualSwitch"] = objSwitch; - inParams["Name"] = portName; - inParams["FriendlyName"] = portName; - inParams["ScopeOfResidence"] = ""; - - // invoke method - ManagementBaseObject outParams = objNetworkSvc.InvokeMethod("CreateSwitchPort", inParams, null); - - // process output parameters - ReturnCode code = (ReturnCode)Convert.ToInt32(outParams["ReturnValue"]); - if (code == ReturnCode.OK) - { - // created port - ManagementObject objPort = wmi.GetWmiObjectByPath((string)outParams["CreatedSwitchPort"]); - - // create NIC - ManagementObject objExtNic = (ManagementObject)objDefaultNic.Clone(); - objExtNic["Connection"] = new string[] { objPort.Path.Path }; - - if (!String.IsNullOrEmpty(macAddress)) - { - objExtNic["StaticMacAddress"] = true; - objExtNic["Address"] = macAddress; - } - else - { - objExtNic["StaticMacAddress"] = false; - } - objExtNic["ElementName"] = adapterName; - - if (!legacyAdapter) - objExtNic["VirtualSystemIdentifiers"] = new string[] { Guid.NewGuid().ToString("B") }; - - // add NIC - ManagementObject objCreatedExtNic = AddVirtualMachineResources(objVm, objExtNic); - } - } - - private string GetNetworkAdapterClassName(bool legacy) - { - return legacy ? "Msvm_EmulatedEthernetPortSettingData" : "Msvm_SyntheticEthernetPortSettingData"; - } - - private ManagementObject AddVirtualMachineResources(ManagementObject objVm, ManagementObject resource) - { - if (resource == null) - return resource; - - // request management service - ManagementObject objVmsvc = GetVirtualSystemManagementService(); - - // add resources - string txtResource = resource.GetText(TextFormat.CimDtd20); - ManagementBaseObject inParams = objVmsvc.GetMethodParameters("AddVirtualSystemResources"); - inParams["TargetSystem"] = objVm; - inParams["ResourceSettingData"] = new string[] { txtResource }; - ManagementBaseObject outParams = objVmsvc.InvokeMethod("AddVirtualSystemResources", inParams, null); - JobResult result = CreateJobResultFromWmiMethodResults(outParams); - - if (result.ReturnValue == ReturnCode.OK) - { - string[] wmiPaths = (string[])outParams["NewResources"]; - return wmi.GetWmiObjectByPath(wmiPaths[0]); - } - else if (result.ReturnValue == ReturnCode.JobStarted) - { - if (JobCompleted(result.Job)) - { - string[] wmiPaths = (string[])outParams["NewResources"]; - return wmi.GetWmiObjectByPath(wmiPaths[0]); - } - else - { - throw new Exception("Cannot add virtual machine resources"); - } - } - else - { - throw new Exception("Cannot add virtual machine resources: " + txtResource); - } - } - - private JobResult RemoveVirtualMachineResources(ManagementObject objVm, ManagementObject resource) - { - if (resource == null) - return null; - - // request management service - ManagementObject objVmsvc = GetVirtualSystemManagementService(); - - // remove resources - ManagementBaseObject inParams = objVmsvc.GetMethodParameters("RemoveVirtualSystemResources"); - inParams["TargetSystem"] = objVm; - inParams["ResourceSettingData"] = new string[] { resource.Path.Path }; - ManagementBaseObject outParams = objVmsvc.InvokeMethod("RemoveVirtualSystemResources", inParams, null); - JobResult result = CreateJobResultFromWmiMethodResults(outParams); - if (result.ReturnValue == ReturnCode.OK) - { - return result; - } - else if (result.ReturnValue == ReturnCode.JobStarted) - { - if (!JobCompleted(result.Job)) - { - throw new Exception("Cannot remove virtual machine resources"); - } - } - else - { - throw new Exception("Cannot remove virtual machine resources: " + resource.Path.Path); - } - - return result; - } - public JobResult ChangeVirtualMachineState(string vmId, VirtualMachineRequestedState newState) { HostedSolutionLog.LogStart("ChangeVirtualMachineState"); @@ -604,8 +443,8 @@ namespace WebsitePanel.Providers.Virtualization //cmd.Parameters.Add("AsJob"); paramList.ForEach(p => cmd.Parameters.Add(p)); - PowerShell.Execute(cmd, false); - jobResult = JobHelper.CreateSuccessResult(); + PowerShell.Execute(cmd, true); + jobResult = JobHelper.CreateSuccessResult(ReturnCode.JobStarted); } catch (Exception ex) { @@ -633,7 +472,7 @@ namespace WebsitePanel.Providers.Virtualization if (force) cmd.Parameters.Add("Force"); //if (!string.IsNullOrEmpty(reason)) cmd.Parameters.Add("Reason", reason); - PowerShell.Execute(cmd, false); + PowerShell.Execute(cmd, true); } catch (Exception ex) { @@ -665,133 +504,58 @@ namespace WebsitePanel.Providers.Virtualization public JobResult RenameVirtualMachine(string vmId, string name) { - // load virtual machine - ManagementObject objVm = GetVirtualMachineObject(vmId); + var vm = GetVirtualMachine(vmId); - // load machine settings - ManagementObject objVmSettings = GetVirtualMachineSettingsObject(vmId); + Command cmdSet = new Command("Rename-VM"); + cmdSet.Parameters.Add("Name", vm.Name); + cmdSet.Parameters.Add("NewName", name); + PowerShell.Execute(cmdSet, true); - // rename machine - objVmSettings["ElementName"] = name; - - // save - ManagementObject objVmsvc = GetVirtualSystemManagementService(); - ManagementBaseObject inParams = objVmsvc.GetMethodParameters("ModifyVirtualSystem"); - inParams["ComputerSystem"] = objVm.Path.Path; - inParams["SystemSettingData"] = objVmSettings.GetText(TextFormat.CimDtd20); - ManagementBaseObject outParams = objVmsvc.InvokeMethod("ModifyVirtualSystem", inParams, null); - return CreateJobResultFromWmiMethodResults(outParams); + return JobHelper.CreateSuccessResult(); } public JobResult DeleteVirtualMachine(string vmId) { - // load virtual machine object - ManagementObject objVm = GetVirtualMachineObject(vmId); - - // check state - VirtualMachine vm = GetVirtualMachine(vmId); + var vm = GetVirtualMachineEx(vmId); // The virtual computer system must be in the powered off or saved state prior to calling this method. - if (vm.State == VirtualMachineState.Saved - || vm.State == VirtualMachineState.Off) - { - // delete network adapters and ports - DeleteNetworkAdapters(objVm); - - // destroy machine - ManagementObject objVmsvc = GetVirtualSystemManagementService(); - - // get method - ManagementBaseObject inParams = objVmsvc.GetMethodParameters("DestroyVirtualSystem"); - inParams["ComputerSystem"] = objVm; - - // invoke method - ManagementBaseObject outParams = objVmsvc.InvokeMethod("DestroyVirtualSystem", inParams, null); - return CreateJobResultFromWmiMethodResults(outParams); - } - else - { + if (vm.State != VirtualMachineState.Saved && vm.State != VirtualMachineState.Off) throw new Exception("The virtual computer system must be in the powered off or saved state prior to calling Destroy method."); + + // Delete network adapters and network switchesw + foreach (var networkAdapter in vm.Adapters) + { + NetworkAdapterHelper.Delete(PowerShell, vm.Name, networkAdapter); + + if (!string.IsNullOrEmpty(networkAdapter.SwitchName)) + DeleteSwitch(networkAdapter.SwitchName); } - } - private void DeleteNetworkAdapters(ManagementObject objVM) - { - string vmId = (string)objVM["Name"]; + object[] errors; - // delete synthetic adapters - foreach (ManagementObject objNic in wmi.GetWmiObjects("Msvm_SyntheticEthernetPortSettingData", "InstanceID like 'Microsoft:{0}%'", vmId)) - DeleteNetworkAdapter(objVM, objNic); + Command cmdSet = new Command("Remove-VM"); + cmdSet.Parameters.Add("Name", vm.Name); + cmdSet.Parameters.Add("Force"); + PowerShell.Execute(cmdSet, false, out errors); - // delete legacy adapters - foreach (ManagementObject objNic in wmi.GetWmiObjects("Msvm_EmulatedEthernetPortSettingData", "InstanceID like 'Microsoft:{0}%'", vmId)) - DeleteNetworkAdapter(objVM, objNic); - } + PowerShellManager.ExceptionIfErrors(errors); - private void DeleteNetworkAdapter(ManagementObject objVM, string macAddress) - { - // locate network adapter - ManagementObject objNic = wmi.GetWmiObject("CIM_ResourceAllocationSettingData", "Address = '{0}'", macAddress); - - // delete adapter - DeleteNetworkAdapter(objVM, objNic); - } - - private void DeleteNetworkAdapter(ManagementObject objVM, ManagementObject objNic) - { - if (objNic == null) - return; - - // delete corresponding switch port - string[] conn = (string[])objNic["Connection"]; - if (conn != null && conn.Length > 0) - DeleteSwitchPort(conn[0]); - - // delete adapter - RemoveVirtualMachineResources(objVM, objNic); - } - - private void DeleteSwitchPort(string portPath) - { - // Network service - ManagementObject objNetworkSvc = GetVirtualSwitchManagementService(); - - // create switch port - ManagementBaseObject inParams = objNetworkSvc.GetMethodParameters("DeleteSwitchPort"); - inParams["SwitchPort"] = portPath; - - // invoke method - objNetworkSvc.InvokeMethod("DeleteSwitchPort", inParams, null); + return JobHelper.CreateSuccessResult(ReturnCode.JobStarted); } public JobResult ExportVirtualMachine(string vmId, string exportPath) { - // load virtual machine object - ManagementObject objVm = GetVirtualMachineObject(vmId); - - // check state - VirtualMachine vm = GetVirtualMachine(vmId); + var vm = GetVirtualMachine(vmId); // The virtual computer system must be in the powered off or saved state prior to calling this method. - if (vm.State == VirtualMachineState.Off) - { - // export machine - ManagementObject objVmsvc = GetVirtualSystemManagementService(); - - // get method - ManagementBaseObject inParams = objVmsvc.GetMethodParameters("ExportVirtualSystem"); - inParams["ComputerSystem"] = objVm; - inParams["CopyVmState"] = true; - inParams["ExportDirectory"] = FileUtils.EvaluateSystemVariables(exportPath); - - // invoke method - ManagementBaseObject outParams = objVmsvc.InvokeMethod("ExportVirtualSystem", inParams, null); - return CreateJobResultFromWmiMethodResults(outParams); - } - else - { + if (vm.State != VirtualMachineState.Off) throw new Exception("The virtual computer system must be in the powered off or saved state prior to calling Export method."); - } + + Command cmdSet = new Command("Export-VM"); + cmdSet.Parameters.Add("Name", vm.Name); + cmdSet.Parameters.Add("Path", FileUtils.EvaluateSystemVariables(exportPath)); + PowerShell.Execute(cmdSet, true); + return JobHelper.CreateSuccessResult(ReturnCode.JobStarted); } #endregion @@ -808,7 +572,7 @@ namespace WebsitePanel.Providers.Virtualization Command cmd = new Command("Get-VMSnapshot"); cmd.Parameters.Add("VMName", vm.Name); - Collection result = PowerShell.Execute(cmd, false); + Collection result = PowerShell.Execute(cmd, true); if (result != null && result.Count > 0) { foreach (PSObject psSnapshot in result) @@ -833,7 +597,7 @@ namespace WebsitePanel.Providers.Virtualization Command cmd = new Command("Get-VMSnapshot"); cmd.Parameters.Add("Id", snapshotId); - Collection result = PowerShell.Execute(cmd, false); + Collection result = PowerShell.Execute(cmd, true); if (result != null && result.Count > 0) { return SnapshotHelper.GetFromPS(result[0]); @@ -857,7 +621,7 @@ namespace WebsitePanel.Providers.Virtualization Command cmd = new Command("Checkpoint-VM"); cmd.Parameters.Add("Name", vm.Name); - PowerShell.Execute(cmd, false); + PowerShell.Execute(cmd, true); return JobHelper.CreateSuccessResult(ReturnCode.JobStarted); } catch (Exception ex) @@ -879,7 +643,7 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("Name", snapshot.Name); cmd.Parameters.Add("NewName", name); - PowerShell.Execute(cmd, false); + PowerShell.Execute(cmd, true); return JobHelper.CreateSuccessResult(); } catch (Exception ex) @@ -900,7 +664,7 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("VMName", vm.Name); cmd.Parameters.Add("Name", snapshot.Name); - PowerShell.Execute(cmd, false); + PowerShell.Execute(cmd, true); return JobHelper.CreateSuccessResult(); } catch (Exception ex) @@ -1042,7 +806,10 @@ namespace WebsitePanel.Providers.Virtualization if (!string.IsNullOrEmpty(computerName)) cmd.Parameters.Add("ComputerName", computerName); if (!string.IsNullOrEmpty(type)) cmd.Parameters.Add("SwitchType", type); - Collection result = PowerShell.Execute(cmd,false); + object[] errors; + Collection result = PowerShell.Execute(cmd, false, out errors); + PowerShellManager.ExceptionIfErrors(errors); + foreach (PSObject current in result) { VirtualSwitch sw = new VirtualSwitch(); @@ -1083,7 +850,7 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("SwitchType", "Private"); cmd.Parameters.Add("Name", name); - Collection result = PowerShell.Execute(cmd, false); + Collection result = PowerShell.Execute(cmd, true); if (result != null && result.Count > 0) { virtualSwitch = new VirtualSwitch(); @@ -1102,7 +869,7 @@ namespace WebsitePanel.Providers.Virtualization return virtualSwitch; } - public ReturnCode DeleteSwitch(string switchId) + public ReturnCode DeleteSwitch(string switchId) // switchId is SwitchName { HostedSolutionLog.LogStart("DeleteSwitch"); HostedSolutionLog.DebugInfo("switchId: {0}", switchId); @@ -1111,7 +878,8 @@ namespace WebsitePanel.Providers.Virtualization { Command cmd = new Command("Remove-VMSwitch"); cmd.Parameters.Add("Name", switchId); - PowerShell.Execute(cmd, false); + cmd.Parameters.Add("Force"); + PowerShell.Execute(cmd, true); } catch (Exception ex) { @@ -1438,13 +1206,6 @@ namespace WebsitePanel.Providers.Virtualization } } - private string GetPropertyValue(string propertyName, XmlDocument doc) - { - string xpath = string.Format(@"//PROPERTY[@NAME = '{0}']/VALUE/child::text()", propertyName); - XmlNode node = doc.SelectSingleNode(xpath); - return node != null ? node.Value : null; - } - public MountedDiskInfo MountVirtualHardDisk(string vhdPath) { ManagementObject objImgSvc = GetImageManagementService(); @@ -1687,7 +1448,7 @@ exit", Convert.ToInt32(objDisk["Index"]))); cmd.Parameters.Add("DestinationPath", destinationPath); cmd.Parameters.Add("VHDType", diskType.ToString()); - PowerShell.Execute(cmd, false); + PowerShell.Execute(cmd, true); return JobHelper.CreateSuccessResult(ReturnCode.JobStarted); } catch (Exception ex) @@ -1840,53 +1601,41 @@ exit", Convert.ToInt32(objDisk["Index"]))); #region Jobs public ConcreteJob GetJob(string jobId) { - HostedSolutionLog.LogStart("GetJob"); - HostedSolutionLog.DebugInfo("jobId: {0}", jobId); + throw new NotImplementedException(); - Runspace runSpace = null; - ConcreteJob job; + //HostedSolutionLog.LogStart("GetJob"); + //HostedSolutionLog.DebugInfo("jobId: {0}", jobId); - try - { - Command cmd = new Command("Get-Job"); + //Runspace runSpace = null; + //ConcreteJob job; - if (!string.IsNullOrEmpty(jobId)) cmd.Parameters.Add("Id", jobId); + //try + //{ + // Command cmd = new Command("Get-Job"); - Collection result = PowerShell.Execute( cmd, false); - job = JobHelper.CreateFromPSObject(result); - } - catch (Exception ex) - { - HostedSolutionLog.LogError("GetJob", ex); - throw; - } + // if (!string.IsNullOrEmpty(jobId)) cmd.Parameters.Add("Id", jobId); - HostedSolutionLog.LogEnd("GetJob"); - return job; + // Collection result = PowerShell.Execute(cmd, true); + // job = JobHelper.CreateFromPSObject(result); + //} + //catch (Exception ex) + //{ + // HostedSolutionLog.LogError("GetJob", ex); + // throw; + //} + + //HostedSolutionLog.LogEnd("GetJob"); + //return job; } public List GetAllJobs() { - List jobs = new List(); - - ManagementObjectCollection objJobs = wmi.GetWmiObjects("CIM_ConcreteJob"); - foreach (ManagementObject objJob in objJobs) - jobs.Add(CreateJobFromWmiObject(objJob)); - - return jobs; + throw new NotImplementedException(); } public ChangeJobStateReturnCode ChangeJobState(string jobId, ConcreteJobRequestedState newState) { - ManagementObject objJob = GetJobWmiObject(jobId); - - // get method - ManagementBaseObject inParams = objJob.GetMethodParameters("RequestStateChange"); - inParams["RequestedState"] = (Int32)newState; - - // invoke method - ManagementBaseObject outParams = objJob.InvokeMethod("RequestStateChange", inParams, null); - return (ChangeJobStateReturnCode)Convert.ToInt32(outParams["ReturnValue"]); + throw new NotImplementedException(); } #endregion @@ -2504,7 +2253,7 @@ exit", Convert.ToInt32(objDisk["Index"]))); private PowerShellManager _powerShell; protected PowerShellManager PowerShell { - get { return _powerShell ?? (_powerShell = new PowerShellManager()); } + get { return _powerShell ?? (_powerShell = new PowerShellManager(ServerNameSettings)); } } #endregion diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/PowerShellManager.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/PowerShellManager.cs index 949b08bd..74298da0 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/PowerShellManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/PowerShellManager.cs @@ -12,12 +12,14 @@ namespace WebsitePanel.Providers.Virtualization { public class PowerShellManager : IDisposable { + private readonly string _remoteComputerName; protected static InitialSessionState session = null; protected Runspace RunSpace { get; set; } - public PowerShellManager() + public PowerShellManager(string remoteComputerName) { + _remoteComputerName = remoteComputerName; OpenRunspace(); } @@ -61,24 +63,27 @@ namespace WebsitePanel.Providers.Virtualization return Execute(cmd, true); } - public Collection Execute(Command cmd, bool useDomainController) + public Collection Execute(Command cmd, bool addComputerNameParameter) { object[] errors; - return Execute(cmd, useDomainController, out errors); + return Execute(cmd, addComputerNameParameter, out errors); } - public Collection Execute(Command cmd, out object[] errors) - { - return Execute(cmd, true, out errors); - } - - public Collection Execute(Command cmd, bool useDomainController, out object[] errors) + public Collection Execute(Command cmd, bool addComputerNameParameter, out object[] errors) { HostedSolutionLog.LogStart("Execute"); List errorList = new List(); HostedSolutionLog.DebugCommand(cmd); Collection results = null; + + // Add computerName parameter to command if it is remote server + if (addComputerNameParameter) + { + if (!string.IsNullOrEmpty(_remoteComputerName)) + cmd.Parameters.Add("ComputerName", _remoteComputerName); + } + // Create a pipeline Pipeline pipeLine = RunSpace.CreatePipeline(); using (pipeLine) @@ -88,6 +93,8 @@ namespace WebsitePanel.Providers.Virtualization // Execute the pipeline and save the objects returned. results = pipeLine.Invoke(); + // Only non-terminating errors are delivered here. + // Terminating errors raise exceptions instead. // Log out any errors in the pipeline execution // NOTE: These errors are NOT thrown as exceptions! // Be sure to check this to ensure that no errors @@ -108,52 +115,10 @@ namespace WebsitePanel.Providers.Virtualization return results; } - - /// - /// Returns the identity of the object from the shell execution result - /// - /// - /// - public static string GetResultObjectIdentity(Collection result) + public static void ExceptionIfErrors(object[] errors) { - HostedSolutionLog.LogStart("GetResultObjectIdentity"); - if (result == null) - throw new ArgumentNullException("result", "Execution result is not specified"); - - if (result.Count < 1) - throw new ArgumentException("Execution result is empty", "result"); - - if (result.Count > 1) - throw new ArgumentException("Execution result contains more than one object", "result"); - - PSMemberInfo info = result[0].Members["Identity"]; - if (info == null) - throw new ArgumentException("Execution result does not contain Identity property", "result"); - - string ret = info.Value.ToString(); - HostedSolutionLog.LogEnd("GetResultObjectIdentity"); - return ret; - } - - public static string GetResultObjectDN(Collection result) - { - HostedSolutionLog.LogStart("GetResultObjectDN"); - if (result == null) - throw new ArgumentNullException("result", "Execution result is not specified"); - - if (result.Count < 1) - throw new ArgumentException("Execution result does not contain any object"); - - if (result.Count > 1) - throw new ArgumentException("Execution result contains more than one object"); - - PSMemberInfo info = result[0].Members["DistinguishedName"]; - if (info == null) - throw new ArgumentException("Execution result does not contain DistinguishedName property", "result"); - - string ret = info.Value.ToString(); - HostedSolutionLog.LogEnd("GetResultObjectDN"); - return ret; + if (errors != null && errors.Length > 0) + throw new Exception("Invoke error: " + string.Join("; ", errors.Select(e => e.ToString()))); } } } From e96a2195b0aecc38769ccb58b925a55905474b91 Mon Sep 17 00:00:00 2001 From: AlexanderTr Date: Sun, 22 Mar 2015 07:35:09 +0300 Subject: [PATCH 2/2] wsp-10323 Convert the VSP provider into one utilizing PowerShell. Step 7 --- .../Constants.cs | 10 ++ .../Helpers/NetworkAdapterHelper.cs | 14 +- .../HyperV2012R2.cs | 168 +++++++----------- 3 files changed, 80 insertions(+), 112 deletions(-) diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Constants.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Constants.cs index 7821a6fd..b487d4cf 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Constants.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Constants.cs @@ -8,6 +8,16 @@ namespace WebsitePanel.Providers.Virtualization { public static class Constants { + public const string CONFIG_USE_DISKPART_TO_CLEAR_READONLY_FLAG = "WebsitePanel.HyperV.UseDiskPartClearReadOnlyFlag"; + public const string WMI_VIRTUALIZATION_NAMESPACE = @"root\virtualization\v2"; + public const string WMI_CIMV2_NAMESPACE = @"root\cimv2"; + + public const string LIBRARY_INDEX_FILE_NAME = "index.xml"; + + public const string EXTERNAL_NETWORK_ADAPTER_NAME = "External Network Adapter"; + public const string PRIVATE_NETWORK_ADAPTER_NAME = "Private Network Adapter"; + public const string MANAGEMENT_NETWORK_ADAPTER_NAME = "Management Network Adapter"; + public const Int64 Size1G = 0x40000000; public const Int64 Size1M = 0x100000; } 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 f14f8f97..f2c99ce5 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/NetworkAdapterHelper.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/NetworkAdapterHelper.cs @@ -10,15 +10,7 @@ using System.Threading.Tasks; namespace WebsitePanel.Providers.Virtualization { public static class NetworkAdapterHelper - { - #region Constants - - private const string EXTERNAL_NETWORK_ADAPTER_NAME = "External Network Adapter"; - private const string PRIVATE_NETWORK_ADAPTER_NAME = "Private Network Adapter"; - private const string MANAGEMENT_NETWORK_ADAPTER_NAME = "Management Network Adapter"; - - #endregion - + { public static VirtualMachineNetworkAdapter[] Get(PowerShellManager powerShell, string vmName) { List adapters = new List(); @@ -60,7 +52,7 @@ namespace WebsitePanel.Providers.Virtualization else if (vm.ExternalNetworkEnabled && !String.IsNullOrEmpty(vm.ExternalNicMacAddress) && Get(powerShell,vm.Name,vm.ExternalNicMacAddress) == null) { - Add(powerShell, vm.Name, vm.ExternalSwitchId, vm.ExternalNicMacAddress, EXTERNAL_NETWORK_ADAPTER_NAME, vm.LegacyNetworkAdapter); + Add(powerShell, vm.Name, vm.ExternalSwitchId, vm.ExternalNicMacAddress, Constants.EXTERNAL_NETWORK_ADAPTER_NAME, vm.LegacyNetworkAdapter); } // Private NIC @@ -72,7 +64,7 @@ namespace WebsitePanel.Providers.Virtualization else if (vm.PrivateNetworkEnabled && !String.IsNullOrEmpty(vm.PrivateNicMacAddress) && Get(powerShell, vm.Name, vm.PrivateNicMacAddress) == null) { - Add(powerShell, vm.Name, vm.PrivateSwitchId, vm.PrivateNicMacAddress, PRIVATE_NETWORK_ADAPTER_NAME, vm.LegacyNetworkAdapter); + Add(powerShell, vm.Name, vm.PrivateSwitchId, vm.PrivateNicMacAddress, Constants.PRIVATE_NETWORK_ADAPTER_NAME, vm.LegacyNetworkAdapter); } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/HyperV2012R2.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/HyperV2012R2.cs index b8ad22ab..8d8d9cdf 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/HyperV2012R2.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/HyperV2012R2.cs @@ -57,25 +57,6 @@ namespace WebsitePanel.Providers.Virtualization { public class HyperV2012R2 : HostingServiceProviderBase, IVirtualizationServer { - #region Constants - private const string CONFIG_USE_DISKPART_TO_CLEAR_READONLY_FLAG = "WebsitePanel.HyperV.UseDiskPartClearReadOnlyFlag"; - private const string WMI_VIRTUALIZATION_NAMESPACE = @"root\virtualization\v2"; - private const string WMI_CIMV2_NAMESPACE = @"root\cimv2"; - - private const int SWITCH_PORTS_NUMBER = 1024; - private const string LIBRARY_INDEX_FILE_NAME = "index.xml"; - private const string EXTERNAL_NETWORK_ADAPTER_NAME = "External Network Adapter"; - private const string PRIVATE_NETWORK_ADAPTER_NAME = "Private Network Adapter"; - private const string MANAGEMENT_NETWORK_ADAPTER_NAME = "Management Network Adapter"; - - 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 protected string ServerNameSettings { @@ -119,16 +100,17 @@ namespace WebsitePanel.Providers.Virtualization #endregion #region Fields - private Wmi _wmi = null; + private PowerShellManager _powerShell; + protected PowerShellManager PowerShell + { + get { return _powerShell ?? (_powerShell = new PowerShellManager(ServerNameSettings)); } + } + + private Wmi _wmi; private Wmi wmi { - get - { - if (_wmi == null) - _wmi = new Wmi(ServerNameSettings, WMI_VIRTUALIZATION_NAMESPACE); - return _wmi; - } + get { return _wmi ?? (_wmi = new Wmi(ServerNameSettings, Constants.WMI_VIRTUALIZATION_NAMESPACE)); } } #endregion @@ -169,7 +151,7 @@ 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")) / Size1M; + vm.RamUsage = ConvertNullableToInt64(result[0].GetProperty("MemoryAssigned")) / Constants.Size1M; vm.Uptime = Convert.ToInt64(result[0].GetProperty("UpTime").TotalMilliseconds); vm.Status = result[0].GetProperty("Status").ToString(); vm.ReplicationState = result[0].GetProperty("ReplicationState").ToString(); @@ -203,7 +185,7 @@ namespace WebsitePanel.Providers.Virtualization if (vm.Disks != null && vm.Disks.GetLength(0) > 0) { vm.VirtualHardDrivePath = vm.Disks[0].Path; - vm.HddSize = Convert.ToInt32(vm.Disks[0].FileSize / Size1G); + vm.HddSize = Convert.ToInt32(vm.Disks[0].FileSize / Constants.Size1G); } // network adapters @@ -219,7 +201,6 @@ namespace WebsitePanel.Providers.Virtualization HostedSolutionLog.LogEnd("GetVirtualMachine"); return vm; - } public List GetVirtualMachines() @@ -557,6 +538,7 @@ namespace WebsitePanel.Providers.Virtualization PowerShell.Execute(cmdSet, true); return JobHelper.CreateSuccessResult(ReturnCode.JobStarted); } + #endregion #region Snapshots @@ -895,7 +877,7 @@ namespace WebsitePanel.Providers.Virtualization #region Library public LibraryItem[] GetLibraryItems(string path) { - path = Path.Combine(FileUtils.EvaluateSystemVariables(path), LIBRARY_INDEX_FILE_NAME); + path = Path.Combine(FileUtils.EvaluateSystemVariables(path), Constants.LIBRARY_INDEX_FILE_NAME); // convert to UNC if it is a remote computer path = ConvertToUNC(path); @@ -971,14 +953,6 @@ namespace WebsitePanel.Providers.Virtualization return items.ToArray(); } - private string ConvertToUNC(string path) - { - if (String.IsNullOrEmpty(ServerNameSettings) - || path.StartsWith(@"\\")) - return path; - - return String.Format(@"\\{0}\{1}", ServerNameSettings, path.Replace(":", "$")); - } #endregion #region KVP @@ -1208,6 +1182,39 @@ namespace WebsitePanel.Providers.Virtualization public MountedDiskInfo MountVirtualHardDisk(string vhdPath) { + //MountedDiskInfo diskInfo = new MountedDiskInfo(); + //vhdPath = FileUtils.EvaluateSystemVariables(vhdPath); + + //// Mount disk + //Command cmd = new Command("Mount-VHD"); + + //cmd.Parameters.Add("Path", vhdPath); + //cmd.Parameters.Add("PassThru"); + + //// Get disk address + //var result = PowerShell.Execute(cmd, true); + + //try + //{ + // if (result == null || result.Count == 0) + // throw new Exception("Failed to mount disk"); + + // diskInfo.DiskAddress = result[0].GetString("DiskNumber"); + + // // Get disk volumes + + //} + //catch (Exception ex) + //{ + // // unmount disk + // UnmountVirtualHardDisk(vhdPath); + + // // throw error + // throw ex; + //} + + //return diskInfo; + ManagementObject objImgSvc = GetImageManagementService(); // get method params @@ -1264,11 +1271,11 @@ namespace WebsitePanel.Providers.Virtualization // check if DiskPart must be used to bring disk online and clear read-only flag bool useDiskPartToClearReadOnly = false; - if (ConfigurationManager.AppSettings[CONFIG_USE_DISKPART_TO_CLEAR_READONLY_FLAG] != null) - useDiskPartToClearReadOnly = Boolean.Parse(ConfigurationManager.AppSettings[CONFIG_USE_DISKPART_TO_CLEAR_READONLY_FLAG]); + if (ConfigurationManager.AppSettings[Constants.CONFIG_USE_DISKPART_TO_CLEAR_READONLY_FLAG] != null) + useDiskPartToClearReadOnly = Boolean.Parse(ConfigurationManager.AppSettings[Constants.CONFIG_USE_DISKPART_TO_CLEAR_READONLY_FLAG]); // determine disk index for DiskPart - Wmi cimv2 = new Wmi(ServerNameSettings, WMI_CIMV2_NAMESPACE); + Wmi cimv2 = new Wmi(ServerNameSettings, Constants.WMI_CIMV2_NAMESPACE); ManagementObject objDisk = cimv2.GetWmiObject("win32_diskdrive", "Model='Msft Virtual Disk SCSI Disk Device' and ScsiTargetID={0} and ScsiLogicalUnit={1} and scsiPort={2}", targetId, lun, portNumber); @@ -1401,29 +1408,23 @@ exit", Convert.ToInt32(objDisk["Index"]))); public ReturnCode UnmountVirtualHardDisk(string vhdPath) { - ManagementObject objImgSvc = GetImageManagementService(); + Command cmd = new Command("Dismount-VHD"); - // get method params - ManagementBaseObject inParams = objImgSvc.GetMethodParameters("Unmount"); - inParams["Path"] = FileUtils.EvaluateSystemVariables(vhdPath); + cmd.Parameters.Add("Path", FileUtils.EvaluateSystemVariables(vhdPath)); - ManagementBaseObject outParams = (ManagementBaseObject)objImgSvc.InvokeMethod("Unmount", inParams, null); - return (ReturnCode)Convert.ToInt32(outParams["ReturnValue"]); + PowerShell.Execute(cmd, true); + return ReturnCode.OK; } public JobResult ExpandVirtualHardDisk(string vhdPath, UInt64 sizeGB) { - const UInt64 Size1G = 0x40000000; + Command cmd = new Command("Resize-VHD"); - ManagementObject objImgSvc = GetImageManagementService(); + cmd.Parameters.Add("Path", FileUtils.EvaluateSystemVariables(vhdPath)); + cmd.Parameters.Add("SizeBytes", sizeGB * Constants.Size1G); - // get method params - ManagementBaseObject inParams = objImgSvc.GetMethodParameters("ExpandVirtualHardDisk"); - inParams["Path"] = FileUtils.EvaluateSystemVariables(vhdPath); - inParams["MaxInternalSize"] = sizeGB * Size1G; - - ManagementBaseObject outParams = (ManagementBaseObject)objImgSvc.InvokeMethod("ExpandVirtualHardDisk", inParams, null); - return CreateJobResultFromWmiMethodResults(outParams); + PowerShell.Execute(cmd, true); + return JobHelper.CreateSuccessResult(ReturnCode.JobStarted); } public JobResult ConvertVirtualHardDisk(string sourcePath, string destinationPath, VirtualHardDiskType diskType) @@ -1888,15 +1889,6 @@ exit", Convert.ToInt32(objDisk["Index"]))); return value == null ? 0 : Convert.ToInt64(value); } - //protected VirtualMachineSnapshot GetSnapshotById(string id) - //{ - // var vms = GetVirtualMachines(); - // var allSnapshots = vms.SelectMany(vm => GetVirtualMachineSnapshots(vm.Id.ToString())); - - // return allSnapshots.FirstOrDefault(s => s.Id == id); - //} - - protected JobResult CreateJobResultFromWmiMethodResults(ManagementBaseObject outParams) { JobResult result = new JobResult(); @@ -1918,21 +1910,11 @@ exit", Convert.ToInt32(objDisk["Index"]))); return result; } - private ManagementObject GetJobWmiObject(string id) - { - return wmi.GetWmiObject("msvm_ConcreteJob", "InstanceID = '{0}'", id); - } - private ManagementObject GetVirtualSystemManagementService() { return wmi.GetWmiObject("msvm_VirtualSystemManagementService"); } - private ManagementObject GetVirtualSwitchManagementService() - { - return wmi.GetWmiObject("msvm_VirtualSwitchManagementService"); - } - protected ManagementObject GetImageManagementService() { return wmi.GetWmiObject("msvm_ImageManagementService"); @@ -1949,18 +1931,13 @@ exit", Convert.ToInt32(objDisk["Index"]))); wmi.GetWmiObject("Msvm_VirtualSystemSettingData", "InstanceID = '{0}'", "Microsoft:" + snapshotId); } - - - - private VirtualSwitch CreateSwitchFromWmiObject(ManagementObject objSwitch) + private string ConvertToUNC(string path) { - if (objSwitch == null || objSwitch.Properties.Count == 0) - return null; + if (String.IsNullOrEmpty(ServerNameSettings) + || path.StartsWith(@"\\")) + return path; - VirtualSwitch sw = new VirtualSwitch(); - sw.SwitchId = (string)objSwitch["Name"]; - sw.Name = (string)objSwitch["ElementName"]; - return sw; + return String.Format(@"\\{0}\{1}", ServerNameSettings, path.Replace(":", "$")); } private ConcreteJob CreateJobFromWmiObject(ManagementBaseObject objJob) @@ -2061,7 +2038,7 @@ exit", Convert.ToInt32(objDisk["Index"]))); return File.Exists(path); else { - Wmi cimv2 = new Wmi(ServerNameSettings, WMI_CIMV2_NAMESPACE); + Wmi cimv2 = new Wmi(ServerNameSettings, Constants.WMI_CIMV2_NAMESPACE); ManagementObject objFile = cimv2.GetWmiObject("CIM_Datafile", "Name='{0}'", path.Replace("\\", "\\\\")); return (objFile != null); } @@ -2073,7 +2050,7 @@ exit", Convert.ToInt32(objDisk["Index"]))); return Directory.Exists(path); else { - Wmi cimv2 = new Wmi(ServerNameSettings, WMI_CIMV2_NAMESPACE); + Wmi cimv2 = new Wmi(ServerNameSettings, Constants.WMI_CIMV2_NAMESPACE); ManagementObject objDir = cimv2.GetWmiObject("Win32_Directory", "Name='{0}'", path.Replace("\\", "\\\\")); return (objDir != null); } @@ -2097,7 +2074,7 @@ exit", Convert.ToInt32(objDisk["Index"]))); return false; // copy using WMI - Wmi cimv2 = new Wmi(ServerNameSettings, WMI_CIMV2_NAMESPACE); + Wmi cimv2 = new Wmi(ServerNameSettings, Constants.WMI_CIMV2_NAMESPACE); ManagementObject objFile = cimv2.GetWmiObject("CIM_Datafile", "Name='{0}'", sourceFileName.Replace("\\", "\\\\")); if (objFile == null) throw new Exception("Source file does not exists: " + sourceFileName); @@ -2247,17 +2224,6 @@ exit", Convert.ToInt32(objDisk["Index"]))); return !String.IsNullOrEmpty(connString); } #endregion Hyper-V Cloud - - #region PowerShell integration - - private PowerShellManager _powerShell; - protected PowerShellManager PowerShell - { - get { return _powerShell ?? (_powerShell = new PowerShellManager(ServerNameSettings)); } - } - - #endregion - - + } -} +} \ No newline at end of file