You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by bf...@apache.org on 2013/11/04 23:32:23 UTC

[41/56] [abbrv] Changes for switching all wmi calls to V2 namespace. V1 namespace is deprecated so it is better to be on v2 namespace.

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1601498b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/IWmiCallsV2.cs
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/IWmiCallsV2.cs b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/IWmiCallsV2.cs
index b3695c7..82b6885 100644
--- a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/IWmiCallsV2.cs
+++ b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/IWmiCallsV2.cs
@@ -1,22 +1,50 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using CloudStack.Plugin.WmiWrappers.ROOT.VIRTUALIZATION.V2;
-using System.Management;
-
-namespace HypervResource
-{
-    public interface IWmiCallsV2
-    {
-        ComputerSystem AddUserData(ComputerSystem vm, string userData);
-        void DeleteHostKvpItem(ComputerSystem vm, string key);
-        VirtualSystemManagementService GetVirtualisationSystemManagementService();
-        ComputerSystem GetComputerSystem(string displayName);        
-        List<string> GetVmElementNames();
-        VirtualSystemSettingData GetVmSettings(ComputerSystem vm);
-        KvpExchangeComponentSettingData GetKvpSettings(VirtualSystemSettingData vmSettings);
-        string GetDefaultDataRoot();
-    }
-}
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using CloudStack.Plugin.WmiWrappers.ROOT.VIRTUALIZATION.V2;
+using System.Management;
+
+namespace HypervResource
+{
+    public interface IWmiCallsV2
+    {
+        System.Management.ManagementPath AddDiskDriveToVm(ComputerSystem vm, string vhdfile, string cntrllerAddr, string driveResourceType);
+        ComputerSystem AddUserData(ComputerSystem vm, string userData);
+        void AttachIso(string displayName, string iso);
+        void CreateDynamicVirtualHardDisk(ulong MaxInternalSize, string Path);
+        SyntheticEthernetPortSettingData CreateNICforVm(ComputerSystem vm, string mac);
+        ComputerSystem CreateVM(string name, long memory_mb, int vcpus);
+        void DeleteHostKvpItem(ComputerSystem vm, string key);
+        void DeleteSwitchPort(string elementName);
+        ComputerSystem DeployVirtualMachine(dynamic jsonObj, string systemVmIso);
+        void DestroyVm(dynamic jsonObj);
+        void DestroyVm(string displayName);
+        void DetachDisk(string displayName, string diskFileName);
+        ComputerSystem GetComputerSystem(string displayName);
+        string GetDefaultDataRoot();
+        string GetDefaultVirtualDiskFolder();
+        ResourceAllocationSettingData GetDvdDriveSettings(VirtualSystemSettingData vmSettings);
+        EthernetPortAllocationSettingData[] GetEthernetConnections(ComputerSystem vm);
+        SyntheticEthernetPortSettingData[] GetEthernetPortSettings(ComputerSystem vm);
+        ResourceAllocationSettingData GetIDEControllerSettings(VirtualSystemSettingData vmSettings, string cntrllerAddr);
+        ImageManagementService GetImageManagementService();
+        KvpExchangeComponentSettingData GetKvpSettings(VirtualSystemSettingData vmSettings);
+        void GetMemoryResources(out ulong physicalRamKBs, out ulong freeMemoryKBs);
+        MemorySettingData GetMemSettings(VirtualSystemSettingData vmSettings);
+        void GetProcessorResources(out uint cores, out uint mhz);
+        void GetProcessorUsageInfo(out double cpuUtilization);
+        ProcessorSettingData GetProcSettings(VirtualSystemSettingData vmSettings);
+        ResourceAllocationSettingData.ResourceAllocationSettingDataCollection GetResourceAllocationSettings(VirtualSystemSettingData vmSettings);
+        void GetSummaryInfo(System.Collections.Generic.Dictionary<string, VmStatsEntry> vmProcessorInfo, System.Collections.Generic.List<System.Management.ManagementPath> vmsToInspect);
+        SyntheticEthernetPortSettingData GetSyntheticEthernetPortSettings(EthernetSwitchPort port);
+        VirtualSystemManagementService GetVirtualisationSystemManagementService();
+        VirtualEthernetSwitchManagementService GetVirtualSwitchManagementService();
+        EthernetSwitchPortVlanSettingData GetVlanSettings(EthernetPortAllocationSettingData ethernetConnection);
+        System.Collections.Generic.List<string> GetVmElementNames();
+        VirtualSystemSettingData GetVmSettings(ComputerSystem vm);
+        void patchSystemVmIso(string vmName, string systemVmIso);
+        void SetState(ComputerSystem vm, ushort requiredState);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1601498b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/WmiCalls.cs
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/WmiCalls.cs b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/WmiCalls.cs
deleted file mode 100644
index 985ceba..0000000
--- a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/WmiCalls.cs
+++ /dev/null
@@ -1,1419 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using CloudStack.Plugin.WmiWrappers.ROOT.VIRTUALIZATION;
-using log4net;
-using System.Globalization;
-using System.Management;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
-using CloudStack.Plugin.WmiWrappers.ROOT.CIMV2;
-using System.IO;
-using System.Net.NetworkInformation;
-using System.Net;
-
-namespace HypervResource
-{
-    public class WmiCalls : IWmiCalls
-    {
-        private IWmiCallsV2 wmiCallsV2;
-        public WmiCalls()
-        {
-            wmiCallsV2 = new WmiCallsV2();
-        }
-        public static void Initialize()
-        {
-            // Trigger assembly load into curren appdomain
-        }
-
-        private static ILog logger = LogManager.GetLogger(typeof(WmiCalls));
-
-        /// <summary>
-        /// Returns ComputerSystem lacking any NICs and VOLUMEs
-        /// </summary>
-        public ComputerSystem CreateVM(string name, long memory_mb, int vcpus)
-        {
-            // Obtain controller for Hyper-V virtualisation subsystem
-            VirtualSystemManagementService vmMgmtSvc = GetVirtualisationSystemManagementService();
-
-            // Create VM with correct name and default resources
-            ComputerSystem vm = CreateDefaultVm(vmMgmtSvc, name);
-
-            // Update the resource settings for the VM.
-
-            // Resource settings are referenced through the Msvm_VirtualSystemSettingData object.
-            VirtualSystemSettingData vmSettings = GetVmSettings(vm);
-
-            // For memory settings, there is no Dynamic Memory, so reservation, limit and quantity are identical.
-            MemorySettingData memSettings = GetMemSettings(vmSettings);
-            memSettings.LateBoundObject["VirtualQuantity"] = memory_mb;
-            memSettings.LateBoundObject["Reservation"] = memory_mb;
-            memSettings.LateBoundObject["Limit"] = memory_mb;
-
-            // Update the processor settings for the VM, static assignment of 100% for CPU limit
-            ProcessorSettingData procSettings = GetProcSettings(vmSettings);
-            procSettings.LateBoundObject["VirtualQuantity"] = vcpus;
-            procSettings.LateBoundObject["Reservation"] = vcpus;
-            procSettings.LateBoundObject["Limit"] = 100000;
-
-            ModifyVmResources(vmMgmtSvc, vm, new String[] {
-                memSettings.LateBoundObject.GetText(TextFormat.CimDtd20),
-                procSettings.LateBoundObject.GetText(TextFormat.CimDtd20)
-                });
-            logger.InfoFormat("VM with display name {0} has GUID {1}", vm.ElementName, vm.Name);
-            logger.DebugFormat("Resources for vm {0}: {1} MB memory, {2} vcpus", name, memory_mb, vcpus);
-
-            return vm;
-        }
-
-        /// <summary>
-        /// Create a (synthetic) nic, and attach it to the vm
-        /// </summary>
-        /// <param name="vm"></param>
-        /// <param name="mac"></param>
-        /// <param name="vlan"></param>
-        /// <returns></returns>
-        public SyntheticEthernetPortSettingData CreateNICforVm(ComputerSystem vm, string mac, string vlan)
-        {
-            logger.DebugFormat("Creating nic for VM {0} (GUID {1})", vm.ElementName, vm.Name);
-
-            // Obtain controller for Hyper-V networking subsystem
-            VirtualSwitchManagementService vmNetMgmtSvc = GetVirtualSwitchManagementService();
-
-            // Create NIC resource by cloning the default NIC 
-            var synthNICsSettings = SyntheticEthernetPortSettingData.GetInstances(vmNetMgmtSvc.Scope, "InstanceID LIKE \"%Default\"");
-
-            // Assert
-            if (synthNICsSettings.Count != 1)
-            {
-                var errMsg = string.Format("Internal error, coudl not find default SyntheticEthernetPort instance");
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-            var defaultSynthNICSettings = synthNICsSettings.OfType<SyntheticEthernetPortSettingData>().First();
-
-            var newSynthNICSettings = new SyntheticEthernetPortSettingData((ManagementBaseObject)defaultSynthNICSettings.LateBoundObject.Clone());
-
-            // Get the virtual switch
-            VirtualSwitch vSwitch = GetExternalVirtSwitch();
-
-            // Crate switch port for new VM
-            ManagementPath newSwitchPath = CreateSwitchPortForVm(vm, vmNetMgmtSvc, vSwitch);
-
-            // Add required VLAND support
-            if (vlan != null)
-            {
-                SetPortVlan(vlan, vmNetMgmtSvc, newSwitchPath);
-            }
-
-            logger.DebugFormat("Created switch port {0} on switch {1}", newSwitchPath.Path, vSwitch.Path.Path);
-
-            //  Assign configuration to new NIC
-            string normalisedMAC = string.Join("", (mac.Split(new char[] { ':' })));
-            newSynthNICSettings.LateBoundObject["Connection"] = new string[] { newSwitchPath.Path };
-            newSynthNICSettings.LateBoundObject["ElementName"] = vm.ElementName;
-            newSynthNICSettings.LateBoundObject["Address"] = normalisedMAC;
-            newSynthNICSettings.LateBoundObject["StaticMacAddress"] = "TRUE";
-            newSynthNICSettings.LateBoundObject["VirtualSystemIdentifiers"] = new string[] { "{" + Guid.NewGuid().ToString() + "}" };
-            newSynthNICSettings.CommitObject();
-
-            // Insert NIC into vm
-            string[] newResources = new string[] { newSynthNICSettings.LateBoundObject.GetText(System.Management.TextFormat.CimDtd20)};
-            ManagementPath[] newResourcePaths = AddVirtualResource(newResources, vm );
-
-            // assert
-            if (newResourcePaths.Length != 1)
-            {
-                var errMsg = string.Format(
-                    "Failed to properly insert a single NIC on VM {0} (GUID {1}): number of resource created {2}",
-                    vm.ElementName,
-                    vm.Name,
-                    newResourcePaths.Length);
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-
-            return new SyntheticEthernetPortSettingData(newResourcePaths[0]);
-        }
-
-        public const string IDE_HARDDISK_DRIVE = "Microsoft Synthetic Disk Drive";
-        public const string IDE_ISO_DRIVE  = "Microsoft Synthetic DVD Drive";
-
-        public const string IDE_ISO_DISK = "Microsoft Virtual CD/DVD Disk"; // For IDE_ISO_DRIVE
-        public const string IDE_HARDDISK_DISK = "Microsoft Virtual Hard Disk"; // For IDE_HARDDISK_DRIVE
-
-        /// <summary>
-        /// Create new VM.  By default we start it. 
-        /// </summary>
-
-        public ComputerSystem DeployVirtualMachine(dynamic jsonObj, string systemVmIso)
-        {
-            var vmInfo = jsonObj.vm;
-            string vmName = vmInfo.name;
-            var nicInfo = vmInfo.nics;
-            int vcpus = vmInfo.cpus;
-            int memSize = vmInfo.maxRam / 1048576;
-            string errMsg = vmName;
-            var diskDrives = vmInfo.disks;
-            var bootArgs = vmInfo.bootArgs;
-
-            // assert
-            errMsg = vmName + ": missing disk information, array empty or missing, agent expects *at least* one disk for a VM";
-            if (diskDrives == null)
-            {
-                logger.Error(errMsg);
-                throw new ArgumentException(errMsg);
-            }
-            // assert
-            errMsg = vmName + ": missing NIC information, array empty or missing, agent expects at least an empty array.";
-            if (nicInfo == null )
-            {
-                logger.Error(errMsg);
-                throw new ArgumentException(errMsg);
-            }
-
-
-            // For existing VMs, return when we spot one of this name not stopped.  In the meantime, remove any existing VMs of same name.
-            ComputerSystem vmWmiObj = null;
-            while ((vmWmiObj = GetComputerSystem(vmName)) != null)
-            {
-                logger.WarnFormat("Create request for existing vm, name {0}", vmName);
-                if (vmWmiObj.EnabledState == EnabledState.Disabled)
-                {
-                    logger.InfoFormat("Deleting existing VM with name {0}, before we go on to create a VM with the same name", vmName);
-                    DestroyVm(vmName);
-                }
-                else
-                {
-                    // TODO: revise exception type
-                    errMsg = string.Format("Create VM failing, because there exists a VM with name {0}, state {1}", 
-                        vmName,
-                        EnabledState.ToString(vmWmiObj.EnabledState));
-                    var ex = new WmiException(errMsg);
-                    logger.Error(errMsg, ex);
-                    throw ex;
-                }
-            }
-
-            // Create vm carcase
-            logger.DebugFormat("Going ahead with create VM {0}, {1} vcpus, {2}MB RAM", vmName, vcpus, memSize);
-            var newVm = CreateVM(vmName, memSize, vcpus);
-
-            foreach (var diskDrive in diskDrives)
-            {
-                string vhdFile = null;
-                string diskName = null;
-                VolumeObjectTO volInfo = VolumeObjectTO.ParseJson(diskDrive.data);
-                if (volInfo != null)
-                {
-                    // assert
-                    errMsg = vmName + ": volume missing primaryDataStore for disk " + diskDrive.ToString();
-                    if (volInfo.primaryDataStore == null)
-                    {
-                        logger.Error(errMsg);
-                        throw new ArgumentException(errMsg);
-                    }
-                    diskName = volInfo.name;
-
-                    // assert
-                    errMsg = vmName + ": can't deal with DataStore type for disk " + diskDrive.ToString();
-                    if (volInfo.primaryDataStore == null)
-                    {
-                        logger.Error(errMsg);
-                        throw new ArgumentException(errMsg);
-                    }
-                    errMsg = vmName + ": Malformed PrimaryDataStore for disk " + diskDrive.ToString();
-                    if (String.IsNullOrEmpty(volInfo.primaryDataStore.path))
-                    {
-                        logger.Error(errMsg);
-                        throw new ArgumentException(errMsg);
-                    }
-                    errMsg = vmName + ": Missing folder PrimaryDataStore for disk " + diskDrive.ToString() + ", missing path: " +  volInfo.primaryDataStore.path;
-                    if (!Directory.Exists(volInfo.primaryDataStore.path))
-                    {
-                        logger.Error(errMsg);
-                        throw new ArgumentException(errMsg);
-                    }
-
-                    vhdFile = volInfo.FullFileName;
-                    if (!System.IO.File.Exists(vhdFile))
-                    {
-                        errMsg = vmName + ": non-existent volume, missing " + vhdFile + " for drive " + diskDrive.ToString();
-                        logger.Error(errMsg);
-                        throw new ArgumentException(errMsg);
-                    }
-                    logger.Debug("Going to create " + vmName + " with attached voluem " + diskName + " at " + vhdFile);
-                }
-
-                string driveType = diskDrive.type;
-
-                string ideCtrllr = "0";
-                string driveResourceType = null;
-                switch (driveType) {
-                    case "ROOT":
-                        ideCtrllr = "0";
-                        driveResourceType = IDE_HARDDISK_DRIVE;
-                        break;
-                    case "ISO":
-                        ideCtrllr = "1";
-                        driveResourceType = IDE_ISO_DRIVE;
-                        break;
-                    default: 
-                        // TODO: double check exception type
-                        errMsg = string.Format("Unknown disk type {0} for disk {1}, vm named {2}", 
-                                string.IsNullOrEmpty(driveType) ? "NULL" : driveType,
-                                string.IsNullOrEmpty(diskName) ? "NULL" : diskName, vmName);
-                        var ex = new WmiException(errMsg);
-                        logger.Error(errMsg, ex);
-                        throw ex;
-                }
-                logger.DebugFormat("Create disk type {1} (Named: {0}), on vm {2} {3}", diskName, driveResourceType, vmName, 
-                                        string.IsNullOrEmpty(vhdFile) ? " no disk to insert" : ", inserting disk" +vhdFile );
-                AddDiskDriveToVm(newVm, vhdFile, ideCtrllr, driveResourceType);
-            }
-
-            // Add the Nics to the VM in the deviceId order.
-            String publicIpAddress ="";
-            for (int i = 0; i <= 2; i++)
-            {
-                foreach (var nic in nicInfo)
-                {
-
-                    int nicid = nic.deviceId;
-                    string mac = nic.mac;
-                    string vlan = null;
-                    string isolationUri = nic.isolationUri;
-                    if (isolationUri != null && isolationUri.StartsWith("vlan://") && !isolationUri.Equals("vlan://untagged"))
-                    {
-                        vlan = isolationUri.Substring("vlan://".Length);
-                        int tmp;
-                        if (!int.TryParse(vlan, out tmp))
-                        {
-                            // TODO: double check exception type
-                            errMsg = string.Format("Invalid VLAN value {0} for on vm {1} for nic uuid {2}", isolationUri, vmName, nic.uuid);
-                            var ex = new WmiException(errMsg);
-                            logger.Error(errMsg, ex);
-                            throw ex;
-                        }
-                    }
-                    if (i == 2)
-                    {
-                        publicIpAddress = nic.ip;
-                    }
-                    if (nicid == i)
-                    {
-                        CreateNICforVm(newVm, mac, vlan);
-                        break;
-                    }
-                }
-            }
-
-            // pass the boot args for the VM using KVP component.
-            // We need to pass the boot args to system vm's to get them configured with cloudstack configuration.
-            // Add new user data
-            var vm = wmiCallsV2.GetComputerSystem(vmName);
-            if (bootArgs != null)
-            {
-                String bootargs = bootArgs;
-                wmiCallsV2.AddUserData(vm, bootargs);
-            }
-
-            // call patch systemvm iso only for systemvms
-            if (vmName.StartsWith("r-") || vmName.StartsWith("s-") || vmName.StartsWith("v-"))
-            {
-                patchSystemVmIso(vmName, systemVmIso);
-            }
-
-            logger.DebugFormat("Starting VM {0}", vmName);
-            SetState(newVm, RequiredState.Enabled);
-
-            // we need to reboot to get the hv kvp daemon get started vr gets configured.
-            if (vmName.StartsWith("r-") || vmName.StartsWith("s-") || vmName.StartsWith("v-"))
-            {
-                System.Threading.Thread.Sleep(90000);
-                SetState(newVm, RequiredState.Reboot);
-                // wait for the second boot and then return with sucess
-                if (pingResource(publicIpAddress) == true)
-                {
-                }
-            }
-            
-            logger.InfoFormat("Started VM {0}", vmName);
-            return newVm;
-       }
-
-        public static Boolean pingResource(String ip)
-        {
-            PingOptions pingOptions = null;
-            PingReply pingReply = null;
-            IPAddress ipAddress = null;
-            Ping pingSender = new Ping();
-            int numberOfPings = 4;
-            int pingTimeout = 1000;
-            int byteSize = 32;
-            byte[] buffer = new byte[byteSize];
-            ipAddress = IPAddress.Parse(ip);
-            pingOptions = new PingOptions();
-            for (int i = 0; i < numberOfPings; i++)
-            {
-                pingReply = pingSender.Send(ipAddress, pingTimeout, buffer, pingOptions);
-                if (pingReply.Status == IPStatus.Success)
-                {
-                    return true;
-                }
-                else
-                {
-                    // wait for the second boot and then return with suces
-                    System.Threading.Thread.Sleep(30000);
-                }
-            }
-            return false;
-        }
-
-        /// this method is to add a dvd drive and attach the systemvm iso.
-        /// 
-
-
-        public void patchSystemVmIso(String vmName, String systemVmIso)
-        {
-            ComputerSystem vmObject = GetComputerSystem(vmName);
-            AddDiskDriveToVm(vmObject, "", "1", IDE_ISO_DRIVE);
-
-            AttachIso(vmName, systemVmIso);
-        }
-
-        /// <summary>
-        /// Create a disk and attach it to the vm
-        /// </summary>
-        /// <param name="vm"></param>
-        /// <param name="cntrllerAddr"></param>
-        /// <param name="driveResourceType">IDE_HARDDISK_DRIVE or IDE_ISO_DRIVE</param>
-        public ManagementPath AddDiskDriveToVm(ComputerSystem vm, string vhdfile, string cntrllerAddr, string driveResourceType)
-        {
-            logger.DebugFormat("Creating DISK for VM {0} (GUID {1}) by attaching {2}", 
-                        vm.ElementName,
-                        vm.Name,
-                        vhdfile);
-
-            // Determine disk type for drive and assert drive type valid
-            string diskResourceSubType = null;
-            switch(driveResourceType) {
-                case IDE_HARDDISK_DRIVE:
-                    diskResourceSubType = IDE_HARDDISK_DISK;
-                    break;
-                case IDE_ISO_DRIVE: 
-                    diskResourceSubType = IDE_ISO_DISK;
-                    break;
-                default:
-                    var errMsg = string.Format(
-                        "Unrecognised disk drive type {0} for VM {1} (GUID {2})",
-                        string.IsNullOrEmpty(driveResourceType) ? "NULL": driveResourceType, 
-                        vm.ElementName,
-                        vm.Name);
-                    var ex = new WmiException(errMsg);
-                    logger.Error(errMsg, ex);
-                    throw ex;
-            }
-
-            ManagementPath newDrivePath = AttachNewDriveToVm(vm, cntrllerAddr, driveResourceType);
-
-            // If there's not disk to insert, we are done.
-            if (String.IsNullOrEmpty(vhdfile))
-            {
-                logger.DebugFormat("No disk to be added to drive, disk drive {0} is complete", newDrivePath.Path);
-            }
-            else
-            {
-                InsertDiskImage(vm, vhdfile, diskResourceSubType, newDrivePath);
-            }
-            return newDrivePath;
-    }
-
-        private ManagementPath AttachNewDriveToVm(ComputerSystem vm, string cntrllerAddr, string driveType)
-        {
-            // Disk drives are attached to a 'Parent' IDE controller.  We IDE Controller's settings for the 'Path', which our new Disk drive will use to reference it.
-            VirtualSystemSettingData vmSettings = GetVmSettings(vm);
-            var ctrller = GetIDEControllerSettings(vmSettings, cntrllerAddr);
-
-            // A description of the drive is created by modifying a clone of the default ResourceAllocationSettingData for that drive type
-            string defaultDriveQuery = String.Format("ResourceSubType LIKE \"{0}\" AND InstanceID LIKE \"%Default\"", driveType);
-            var newDiskDriveSettings = CloneResourceAllocationSetting(defaultDriveQuery);
-
-            // Set IDE controller and address on the controller for the new drive
-            newDiskDriveSettings.LateBoundObject["Parent"] = ctrller.Path.ToString();
-            newDiskDriveSettings.LateBoundObject["Address"] = "0";
-            newDiskDriveSettings.CommitObject();
-
-            // Add this new disk drive to the VM
-            logger.DebugFormat("Creating disk drive type {0}, parent IDE controller is {1} and address on controller is {2}",
-                newDiskDriveSettings.ResourceSubType,
-                newDiskDriveSettings.Parent,
-                newDiskDriveSettings.Address);
-            string[] newDriveResource = new string[] { newDiskDriveSettings.LateBoundObject.GetText(System.Management.TextFormat.CimDtd20) };
-            ManagementPath[] newDrivePaths = AddVirtualResource(newDriveResource, vm);
-
-            // assert
-            if (newDrivePaths.Length != 1)
-            {
-                var errMsg = string.Format(
-                    "Failed to add disk drive type {3} to VM {0} (GUID {1}): number of resource created {2}",
-                    vm.ElementName,
-                    vm.Name,
-                    newDrivePaths.Length,
-                    driveType);
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-            logger.DebugFormat("New disk drive type {0} WMI path is {1}s",
-                newDiskDriveSettings.ResourceSubType,
-                newDrivePaths[0].Path);
-            return newDrivePaths[0];
-        }
-
-        /// <summary>
-        /// Attach iso to the vm
-        /// </summary>
-        /// <param name="vm"></param>
-        /// <param name="isoPath"></param>
-        private void AttachIsoToVm(ComputerSystem vm, string isoPath)
-        {
-            // Disk drives are attached to a 'Parent' IDE controller.  We IDE Controller's settings for the 'Path', which our new Disk drive will use to reference it.
-            VirtualSystemSettingData vmSettings = GetVmSettings(vm);
-            var ctrller = GetDvdDriveSettings(vmSettings);
-
-            // A description of the drive is created by modifying a clone of the default ResourceAllocationSettingData for that drive type
-            string defaultDiskQuery = String.Format("ResourceSubType LIKE \"{0}\" AND InstanceID LIKE \"%Default\"", IDE_ISO_DISK);
-            var newDiskSettings = CloneResourceAllocationSetting(defaultDiskQuery);
-
-            // Set IDE controller and address on the controller for the new drive
-            newDiskSettings.LateBoundObject["Parent"] = ctrller.Path.ToString();
-            newDiskSettings.LateBoundObject["Connection"] = new string[] { isoPath };
-            newDiskSettings.CommitObject();
-
-            // Add the new vhd object as a virtual hard disk to the vm.
-            string[] newDiskResource = new string[] { newDiskSettings.LateBoundObject.GetText(System.Management.TextFormat.CimDtd20) };
-            ManagementPath[] newDiskPaths = AddVirtualResource(newDiskResource, vm);
-            // assert
-            if (newDiskPaths.Length != 1)
-            {
-                var errMsg = string.Format(
-                    "Failed to add disk image to VM {0} (GUID {1}): number of resource created {2}",
-                    vm.ElementName,
-                    vm.Name,
-                    newDiskPaths.Length);
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-            logger.InfoFormat("Created disk {2} for VM {0} (GUID {1}), image {3} ",
-                    vm.ElementName,
-                    vm.Name,
-                    newDiskPaths[0].Path,
-                    isoPath);
-        }
-
-        private void InsertDiskImage(ComputerSystem vm, string vhdfile, string diskResourceSubType, ManagementPath drivePath)
-        {
-            // A description of the disk is created by modifying a clone of the default ResourceAllocationSettingData for that disk type
-            string defaultDiskQuery = String.Format("ResourceSubType LIKE \"{0}\" AND InstanceID LIKE \"%Default\"", diskResourceSubType);
-            var newDiskSettings = CloneResourceAllocationSetting(defaultDiskQuery);
-
-            // Set disk drive and VHD file on disk for new disk
-            newDiskSettings.LateBoundObject["Parent"] = drivePath.Path;
-            newDiskSettings.LateBoundObject["Connection"] = new string[] { vhdfile };
-            newDiskSettings.CommitObject();
-
-            // Add the new vhd object as a virtual hard disk to the vm.
-            string[] newDiskResource = new string[] { newDiskSettings.LateBoundObject.GetText(System.Management.TextFormat.CimDtd20) };
-            ManagementPath[] newDiskPaths = AddVirtualResource(newDiskResource, vm);
-            // assert
-            if (newDiskPaths.Length != 1)
-            {
-                var errMsg = string.Format(
-                    "Failed to add disk image type {3} to VM {0} (GUID {1}): number of resource created {2}",
-                    vm.ElementName,
-                    vm.Name,
-                    newDiskPaths.Length,
-                    diskResourceSubType);
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-            logger.InfoFormat("Created disk {2} for VM {0} (GUID {1}), image {3} ",
-                    vm.ElementName,
-                    vm.Name,
-                    newDiskPaths[0].Path,
-                    vhdfile);
-        }
-
-        private ResourceAllocationSettingData CloneResourceAllocationSetting(string wmiQuery)
-        {
-            var defaultDiskDriveSettingsObjs = ResourceAllocationSettingData.GetInstances(wmiQuery);
-
-            // assert
-            if (defaultDiskDriveSettingsObjs.Count != 1)
-            {
-                var errMsg = string.Format("Failed to find Msvm_ResourceAllocationSettingData for the query {0}", wmiQuery);
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-
-            ResourceAllocationSettingData defaultDiskDriveSettings = defaultDiskDriveSettingsObjs.OfType<ResourceAllocationSettingData>().First();
-            return new ResourceAllocationSettingData((ManagementBaseObject)defaultDiskDriveSettings.LateBoundObject.Clone());
-        }
-
-        public void AttachIso(string displayName, string iso)
-        {
-            logger.DebugFormat("Got request to attach iso {0} to vm {1}", iso, displayName);
-
-            ComputerSystem vm = GetComputerSystem(displayName);
-            if (vm == null)
-            {
-                logger.DebugFormat("VM {0} not found", displayName);
-                return;
-            }
-            else
-            {
-                AttachIsoToVm(vm, iso);
-            }
-        }
-
-        public void DestroyVm(dynamic jsonObj)
-        {
-            string vmToDestroy = jsonObj.vmName;
-            DestroyVm(vmToDestroy);
-        }
-        
-        /// <summary>
-        /// Remove all VMs and all SwitchPorts with the displayName.  VHD gets deleted elsewhere.
-        /// </summary>
-        /// <param name="displayName"></param>
-        public void DestroyVm(string displayName)
-        {
-            logger.DebugFormat("Got request to destroy vm {0}", displayName);
-
-            var vm = GetComputerSystem(displayName);
-            if ( vm  == null )
-            {
-                logger.DebugFormat("VM {0} already destroyed (or never existed)", displayName);
-                return;
-            }
-
-            // Stop VM
-            logger.DebugFormat("Stop VM {0} (GUID {1})", vm.ElementName, vm.Name);
-            SetState(vm, RequiredState.Disabled);
-
-            // Delete SwitchPort
-            DeleteSwitchPort(vm.ElementName);
-
-            // Delete VM
-            var virtSysMgmtSvc = GetVirtualisationSystemManagementService();
-            ManagementPath jobPath;
-
-            do
-            {
-                logger.DebugFormat("Delete VM {0} (GUID {1})", vm.ElementName, vm.Name);
-                var ret_val = virtSysMgmtSvc.DestroyVirtualSystem(vm.Path, out jobPath);
-
-                if (ret_val == ReturnCode.Started)
-                {
-                    JobCompleted(jobPath);
-                }
-                else if (ret_val != ReturnCode.Completed)
-                {
-                    var errMsg = string.Format(
-                        "Failed Delete VM {0} (GUID {1}) due to {2}",
-                        vm.ElementName,
-                        vm.Name,
-                        ReturnCode.ToString(ret_val));
-                    var ex = new WmiException(errMsg);
-                    logger.Error(errMsg, ex);
-                    throw ex;
-                }
-                vm = GetComputerSystem(displayName);
-            }
-            while (vm != null);
-        }
-
-        public void SetState(ComputerSystem vm, ushort requiredState)
-        {
-            logger.InfoFormat(
-                "Changing state of {0} (GUID {1}) to {2}", 
-                vm.ElementName, 
-                vm.Name,  
-                RequiredState.ToString(requiredState));
-
-            ManagementPath jobPath;
-            // TimeSpan is a value type; default ctor is equivalent to 0.
-            var ret_val = vm.RequestStateChange(requiredState, new TimeSpan(), out jobPath);
-
-            // If the Job is done asynchronously
-            if (ret_val == ReturnCode.Started)
-            {
-                JobCompleted(jobPath);
-            }
-            else if (ret_val == 32775)
-            {
-                logger.InfoFormat("RequestStateChange returned 32775, which means vm in wrong state for requested state change.  Treating as if requested state was reached");
-            }
-            else if (ret_val != ReturnCode.Completed)
-            {
-                var errMsg = string.Format(
-                    "Failed to change state of VM {0} (GUID {1}) to {2} due to {3}",
-                    vm.ElementName,
-                    vm.Name,
-                    RequiredState.ToString(requiredState),
-                    ReturnCode.ToString(ret_val));
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-
-            logger.InfoFormat(
-                "Successfully changed vm state of {0} (GUID {1} to requested state {2}", 
-                vm.ElementName, 
-                vm.Name,  
-                requiredState);
-        }
-
-
-        //TODO:  Write method to delete SwitchPort based on Name
-        public bool DeleteSwitchPort(string elementName)
-        {
-            var virtSwitchMgmtSvc = GetVirtualSwitchManagementService();
-            // Get NIC path
-            var condition = string.Format("ElementName=\"{0}\"", elementName);
-            var switchPortCollection = SwitchPort.GetInstances(virtSwitchMgmtSvc.Scope, condition);
-            if (switchPortCollection.Count == 0)
-            {
-                return true;
-            }
-
-            foreach (SwitchPort port in switchPortCollection)
-            {
-                // Destroy
-                var ret_val = virtSwitchMgmtSvc.DeleteSwitchPort(port.Path);
-
-                if (ret_val != ReturnCode.Completed)
-                {
-                    return false;
-                }
-            }
-
-            return true;
-        }
-
-        // Add new 
-        private ManagementPath[] AddVirtualResource(string[] resourceSettings, ComputerSystem vm )
-        {
-            var virtSysMgmtSvc = GetVirtualisationSystemManagementService();
-
-            ManagementPath jobPath;
-            ManagementPath[] resourcePaths;
-            var ret_val = virtSysMgmtSvc.AddVirtualSystemResources(
-                resourceSettings, 
-                vm.Path,
-                out jobPath,
-                out resourcePaths);
-
-            // If the Job is done asynchronously
-            if (ret_val == ReturnCode.Started)
-            {
-                JobCompleted(jobPath);
-            }
-            else if (ret_val != ReturnCode.Completed)
-            {
-                var errMsg = string.Format(
-                    "Failed to add resources to VM {0} (GUID {1}) due to {2}",
-                    vm.ElementName,
-                    vm.Name,
-                    ReturnCode.ToString(ret_val));
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-
-            return resourcePaths;
-        }
-
-        private ManagementPath CreateSwitchPortForVm(ComputerSystem vm, VirtualSwitchManagementService vmNetMgmtSvc, VirtualSwitch vSwitch)
-        {
-            ManagementPath newSwitchPath = null;
-            var ret_val = vmNetMgmtSvc.CreateSwitchPort(
-                vm.ElementName,
-                Guid.NewGuid().ToString(),
-                "",
-                vSwitch.Path,
-                out newSwitchPath);
-            // Job is always done synchronously
-            if (ret_val != ReturnCode.Completed)
-            {
-                var errMsg = string.Format(
-                    "Failed to create switch for NIC on VM {0} (GUID {1}), error code {2}",
-                    vm.ElementName,
-                    vm.Name,
-                    ret_val);
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-            return newSwitchPath;
-        }
-
-        // add vlan support by setting AccessVLAN on VLANEndpointSettingData for port
-        private void SetPortVlan(string vlan, VirtualSwitchManagementService vmNetMgmtSvc, ManagementPath newSwitchPath)
-        {
-            logger.DebugFormat("Setting VLAN to {0}", vlan);
-
-            VLANEndpointSettingData vlanEndpointSettings = GetVlanEndpointSettings(vmNetMgmtSvc, newSwitchPath);
-            vlanEndpointSettings.LateBoundObject["AccessVLAN"] = vlan;
-            vlanEndpointSettings.CommitObject();
-        }
-
-        public VLANEndpointSettingData GetVlanEndpointSettings(VirtualSwitchManagementService vmNetMgmtSvc, ManagementPath newSwitchPath)
-        {
-            // Get Msvm_VLANEndpoint through associated with new Port
-            var vlanEndpointQuery = new RelatedObjectQuery(newSwitchPath.Path, VLANEndpoint.CreatedClassName);
-            var vlanEndpointSearch = new ManagementObjectSearcher(vmNetMgmtSvc.Scope, vlanEndpointQuery);
-            var vlanEndpointCollection = new VLANEndpoint.VLANEndpointCollection(vlanEndpointSearch.Get());
-
-            // assert
-            if (vlanEndpointCollection.Count != 1)
-            {
-                var errMsg = string.Format("No VLANs for vSwitch on Hyper-V server for switch {0}", newSwitchPath.Path);
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-
-            VLANEndpoint vlanEndpoint = vlanEndpointCollection.OfType<VLANEndpoint>().First();
-
-            // Get Msvm_VLANEndpointSettingData assocaited with Msvm_VLANEndpoint
-            var vlanEndpointSettingsQuery = new RelatedObjectQuery(vlanEndpoint.Path.Path, VLANEndpointSettingData.CreatedClassName);
-            var vlanEndpointSettingsSearch = new ManagementObjectSearcher(vmNetMgmtSvc.Scope, vlanEndpointSettingsQuery);
-            var vlanEndpointSettingsCollection = new VLANEndpointSettingData.VLANEndpointSettingDataCollection(vlanEndpointSettingsSearch.Get());
-
-            // assert
-            if (vlanEndpointSettingsCollection.Count != 1)
-            {
-                var errMsg = string.Format("Internal error, VLAN for vSwitch not setup propertly Hyper-V");
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-
-            VLANEndpointSettingData vlanEndpointSettings = vlanEndpointSettingsCollection.OfType<VLANEndpointSettingData>().First();
-            return vlanEndpointSettings;
-        }
-
-        /// <summary>
-        /// External VSwitch has an external NIC, and we assume there is only one external NIC
-        /// </summary>
-        /// <param name="vmSettings"></param>
-        /// <returns></returns>
-        /// <throw>Throws if there is no vswitch</throw>
-        public VirtualSwitch GetExternalVirtSwitch()
-        {
-            // Work back from the first *bound* external NIC we find.
-            var externNICs = ExternalEthernetPort.GetInstances("IsBound = TRUE");
-
-            if (externNICs.Count == 0 )
-            {
-                var errMsg = "No ExternalEthernetPort available to Hyper-V";
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-
-            ExternalEthernetPort externNIC = externNICs.OfType<ExternalEthernetPort>().First();
-
-            // A sequence of ASSOCIATOR objects need to be traversed to get from external NIC the vswitch.
-            // We use ManagementObjectSearcher objects to execute this sequence of questions
-            // NB: default scope of ManagementObjectSearcher is '\\.\root\cimv2', which does not contain
-            // the virtualisation objects.
-            var endpointQuery = new RelatedObjectQuery(externNIC.Path.Path, SwitchLANEndpoint.CreatedClassName);
-            var endpointSearch = new ManagementObjectSearcher(externNIC.Scope, endpointQuery);
-            var endpointCollection = new SwitchLANEndpoint.SwitchLANEndpointCollection(endpointSearch.Get());
-
-            // assert
-            if (endpointCollection.Count < 1 )
-            {
-                var errMsg = string.Format("No SwitchLANEndpoint for external NIC {0} on Hyper-V server", externNIC.Name);
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-
-            SwitchLANEndpoint endPoint = endpointCollection.OfType<SwitchLANEndpoint>().First();
-            var switchPortQuery = new RelatedObjectQuery(endPoint.Path.Path, SwitchPort.CreatedClassName);
-            var switchPortSearch = new ManagementObjectSearcher(externNIC.Scope, switchPortQuery);
-            var switchPortCollection = new SwitchPort.SwitchPortCollection(switchPortSearch.Get());
-
-            // assert
-            if (switchPortCollection.Count < 1 )
-            {
-                var errMsg = string.Format("No SwitchPort for external NIC {0} on Hyper-V server", externNIC.Name);
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-
-            SwitchPort switchPort = switchPortCollection.OfType<SwitchPort>().First();
-            var vSwitchQuery = new RelatedObjectQuery(switchPort.Path.Path, VirtualSwitch.CreatedClassName);
-            var vSwitchSearch = new ManagementObjectSearcher(externNIC.Scope, vSwitchQuery);
-            var vSwitchCollection = new VirtualSwitch.VirtualSwitchCollection(vSwitchSearch.Get());
-
-            // assert
-            if (vSwitchCollection.Count < 1)
-            {
-                var errMsg = string.Format("No virtual switch for external NIC {0} on Hyper-V server", externNIC.Name);
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-
-            VirtualSwitch vSwitch = vSwitchCollection.OfType<VirtualSwitch>().First();
-
-            return vSwitch;
-        }
-
-
-        private void ModifyVmResources(VirtualSystemManagementService vmMgmtSvc, ComputerSystem vm, string[] resourceSettings)
-        {
-            // Resource settings are changed through the management service
-            System.Management.ManagementPath jobPath;
-
-            var ret_val = vmMgmtSvc.ModifyVirtualSystemResources(vm.Path,
-                resourceSettings,
-                out jobPath);
-            // If the Job is done asynchronously
-            if (ret_val == ReturnCode.Started)
-            {
-                JobCompleted(jobPath);
-            }
-            else if (ret_val != ReturnCode.Completed)
-            {
-                var errMsg = string.Format(
-                    "Failed to update VM {0} (GUID {1}) due to {2} (ModifyVirtualSystem call), existing VM not deleted",
-                    vm.ElementName,
-                    vm.Name,
-                    ReturnCode.ToString(ret_val));
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-        }
-
-        private ComputerSystem CreateDefaultVm(VirtualSystemManagementService vmMgmtSvc, string name)
-        {
-            // Tweak default settings by basing new VM on default global setting object 
-            // with designed display name.
-
-            VirtualSystemGlobalSettingData vs_gs_data = VirtualSystemGlobalSettingData.CreateInstance();
-            vs_gs_data.LateBoundObject["ElementName"] = name;
-
-            System.Management.ManagementPath jobPath;
-            System.Management.ManagementPath defined_sys;
-            var ret_val = vmMgmtSvc.DefineVirtualSystem(
-                new string[0],
-                null,
-                vs_gs_data.LateBoundObject.GetText(System.Management.TextFormat.CimDtd20),
-                out defined_sys,
-                out jobPath);
-
-            // If the Job is done asynchronously
-            if (ret_val == ReturnCode.Started)
-            {
-                JobCompleted(jobPath);
-            }
-            else if (ret_val != ReturnCode.Completed)
-            {
-                var errMsg = string.Format(
-                    "Failed to create VM {0} due to {1} (DefineVirtualSystem call)",
-                    name, ReturnCode.ToString(ret_val));
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-
-            logger.DebugFormat(CultureInfo.InvariantCulture, "Created VM {0}", name);
-
-            // Is the defined_system real?
-            var vm = new ComputerSystem(defined_sys);
-
-            // Assertion
-            if (vm.ElementName.CompareTo(name) != 0)
-            {
-                var errMsg = string.Format(
-                    "New VM created with wrong name (is {0}, should be {1}, GUID {2})",
-                    vm.ElementName,
-                    name,
-                    vm.Name);
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-
-            return vm;
-        }
-
-        public  VirtualSwitchManagementService GetVirtualSwitchManagementService()
-        {
-            // VirtualSwitchManagementService is a singleton, most anonymous way of lookup is by asking for the set
-            // of local instances, which should be size 1.
-            var virtSwtichSvcCollection = VirtualSwitchManagementService.GetInstances();
-            foreach (VirtualSwitchManagementService item in virtSwtichSvcCollection)
-            {
-                return item;
-            }
-
-            var errMsg = string.Format("No Hyper-V subsystem on server");
-            var ex = new WmiException(errMsg);
-            logger.Error(errMsg, ex);
-            throw ex;
-        }
-
-        public  void CreateDynamicVirtualHardDisk(ulong MaxInternalSize, string Path)
-        {
-            // Resource settings are changed through the management service
-            System.Management.ManagementPath jobPath;
-            var imgMgr = GetImageManagementService();
-            var ret_val = imgMgr.CreateDynamicVirtualHardDisk(MaxInternalSize, Path, out jobPath);
-            // If the Job is done asynchronously
-            if (ret_val == ReturnCode.Started)
-            {
-                JobCompleted(jobPath);
-            }
-            else if (ret_val != ReturnCode.Completed)
-            {
-                var errMsg = string.Format(
-                    "Failed to CreateDynamicVirtualHardDisk size {0}, path {1} to {2}",
-                    MaxInternalSize,
-                    Path,
-                    ReturnCode.ToString(ret_val));
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-        }
-
-        public  ImageManagementService GetImageManagementService()
-        {
-            // VirtualSystemManagementService is a singleton, most anonymous way of lookup is by asking for the set
-            // of local instances, which should be size 1.
-
-            var coll = ImageManagementService.GetInstances();
-            foreach (ImageManagementService item in coll)
-            {
-                return item;
-            }
-
-            var errMsg = string.Format("No Hyper-V subsystem on server");
-            var ex = new WmiException(errMsg);
-            logger.Error(errMsg, ex);
-            throw ex;
-        }
-
-
-        public  VirtualSystemManagementService GetVirtualisationSystemManagementService()
-        {
-            // VirtualSystemManagementService is a singleton, most anonymous way of lookup is by asking for the set
-            // of local instances, which should be size 1.
-           
-            var virtSysMgmtSvcCollection = VirtualSystemManagementService.GetInstances();
-            foreach (VirtualSystemManagementService item in virtSysMgmtSvcCollection)
-            {
-                return item;
-            }
-
-            var errMsg = string.Format("No Hyper-V subsystem on server");
-            var ex = new WmiException(errMsg);
-            logger.Error(errMsg, ex);
-            throw ex;
-        }
-
-        /// <summary>
-        /// Similar to http://msdn.microsoft.com/en-us/library/hh850031%28v=vs.85%29.aspx
-        /// </summary>
-        /// <param name="jobPath"></param>
-        /// <returns></returns>
-        private  void JobCompleted(ManagementPath jobPath)
-        {
-            ConcreteJob jobObj = null;
-            for(;;)
-            {
-                jobObj = new ConcreteJob(jobPath);
-                if (jobObj.JobState != JobState.Starting && jobObj.JobState != JobState.Running)
-                {
-                    break;
-                }
-                logger.InfoFormat("In progress... {0}% completed.", jobObj.PercentComplete);
-                System.Threading.Thread.Sleep(1000);
-            }
-
-            if (jobObj.JobState != JobState.Completed)
-            {
-                var errMsg = string.Format(
-                    "Hyper-V Job failed, Error Code:{0}, Description: {1}", 
-                    jobObj.ErrorCode, 
-                    jobObj.ErrorDescription);
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-
-            logger.DebugFormat("WMI job succeeded: {0}, Elapsed={1}", jobObj.Description, jobObj.ElapsedTime);
-        }
-
-        public  void GetProcessorResources(out uint cores, out uint mhz)
-        {
-            //  Processor processors
-            cores = 0;
-            mhz = 0;
-            Processor.ProcessorCollection procCol = Processor.GetInstances();
-            foreach (Processor procInfo in procCol)
-            {
-                cores += procInfo.NumberOfCores;
-                mhz = procInfo.MaxClockSpeed;
-           }
-        }
-        
-        public  void GetProcessorUsageInfo(out double cpuUtilization)
-        {
-            PerfFormattedData_Counters_ProcessorInformation.PerfFormattedData_Counters_ProcessorInformationCollection coll = 
-                            PerfFormattedData_Counters_ProcessorInformation.GetInstances("Name=\"_Total\"");
-            cpuUtilization = 100;
-            // Use the first one
-            foreach (PerfFormattedData_Counters_ProcessorInformation procInfo in coll)
-            {
-                // Idle during a given internal 
-                // See http://library.wmifun.net/cimv2/win32_perfformatteddata_counters_processorinformation.html
-                cpuUtilization = 100.0 - (double)procInfo.PercentIdleTime;            
-            }
-        }
-
-
-        public  void GetMemoryResources(out ulong physicalRamKBs, out ulong freeMemoryKBs)
-        {
-            OperatingSystem0 os = new OperatingSystem0();
-            physicalRamKBs = os.TotalVisibleMemorySize;
-            freeMemoryKBs = os.FreePhysicalMemory;
-        }
-
-        public  string GetDefaultVirtualDiskFolder()
-        {
-            VirtualSystemManagementServiceSettingData.VirtualSystemManagementServiceSettingDataCollection coll = VirtualSystemManagementServiceSettingData.GetInstances();
-            string defaultVirtualHardDiskPath = null;
-            foreach (VirtualSystemManagementServiceSettingData settings in coll)
-            {
-                return settings.DefaultVirtualHardDiskPath;
-            }
-
-            // assert
-            if (!System.IO.Directory.Exists(defaultVirtualHardDiskPath) ){
-                var errMsg = string.Format(
-                    "Hyper-V DefaultVirtualHardDiskPath is invalid!");
-                logger.Error(errMsg);
-                return null;
-            }
-            
-            return defaultVirtualHardDiskPath;
-        }
-
-        public  ComputerSystem GetComputerSystem(string displayName)
-        {
-            var wmiQuery = String.Format("ElementName=\"{0}\"", displayName);
-            ComputerSystem.ComputerSystemCollection vmCollection = ComputerSystem.GetInstances(wmiQuery);
-
-            // Return the first one
-            foreach (ComputerSystem vm in vmCollection)
-            {
-                return vm;
-            }
-            return null;
-        }
-
-        public  List<string> GetVmElementNames()
-        {
-            List<string> result = new List<string>();
-            ComputerSystem.ComputerSystemCollection vmCollection = ComputerSystem.GetInstances();
-
-            // Return the first one
-            foreach (ComputerSystem vm in vmCollection)
-            {
-                if (vm.Caption.StartsWith("Hosting Computer System") )
-                {
-                    continue;
-                }
-                result.Add(vm.ElementName);
-            }
-            return result;
-        }
-
-        public  ProcessorSettingData GetProcSettings(VirtualSystemSettingData vmSettings)
-        {
-            // An ASSOCIATOR object provides the cross reference from the VirtualSystemSettingData and the 
-            // ProcessorSettingData, but generated wrappers do not expose a ASSOCIATOR OF query as a method.
-            // Instead, we use the System.Management to code the equivalant of 
-            //  string query = string.Format( "ASSOCIATORS OF {{{0}}} WHERE ResultClass = {1}", vmSettings.path, resultclassName);
-            //
-            var wmiObjQuery = new RelatedObjectQuery(vmSettings.Path.Path, ProcessorSettingData.CreatedClassName);
-
-            // NB: default scope of ManagementObjectSearcher is '\\.\root\cimv2', which does not contain
-            // the virtualisation objects.
-            var wmiObjectSearch = new ManagementObjectSearcher(vmSettings.Scope, wmiObjQuery);
-            var wmiObjCollection = new ProcessorSettingData.ProcessorSettingDataCollection(wmiObjectSearch.Get());
-
-            foreach (ProcessorSettingData wmiObj in wmiObjCollection)
-            {
-                return wmiObj;
-            }
-
-            var errMsg = string.Format("No ProcessorSettingData in VirtualSystemSettingData {0}", vmSettings.Path.Path);
-            var ex = new WmiException(errMsg);
-            logger.Error(errMsg, ex);
-            throw ex;
-        }
-
-        public  MemorySettingData GetMemSettings(VirtualSystemSettingData vmSettings)
-        {
-            // An ASSOCIATOR object provides the cross reference from the VirtualSystemSettingData and the 
-            // MemorySettingData, but generated wrappers do not expose a ASSOCIATOR OF query as a method.
-            // Instead, we use the System.Management to code the equivalant of 
-            //  string query = string.Format( "ASSOCIATORS OF {{{0}}} WHERE ResultClass = {1}", vmSettings.path, resultclassName);
-            //
-            var wmiObjQuery = new RelatedObjectQuery(vmSettings.Path.Path, MemorySettingData.CreatedClassName);
-
-            // NB: default scope of ManagementObjectSearcher is '\\.\root\cimv2', which does not contain
-            // the virtualisation objects.
-            var wmiObjectSearch = new ManagementObjectSearcher(vmSettings.Scope, wmiObjQuery);
-            var wmiObjCollection = new MemorySettingData.MemorySettingDataCollection(wmiObjectSearch.Get());
-
-            foreach (MemorySettingData wmiObj in wmiObjCollection)
-            {
-                return wmiObj;
-            }
-
-            var errMsg = string.Format("No MemorySettingData in VirtualSystemSettingData {0}", vmSettings.Path.Path);
-            var ex = new WmiException(errMsg);
-            logger.Error(errMsg, ex);
-            throw ex;
-        }
-
-        public  ResourceAllocationSettingData GetDvdDriveSettings(VirtualSystemSettingData vmSettings)
-        {
-            var wmiObjCollection = GetResourceAllocationSettings(vmSettings);
-
-            foreach (ResourceAllocationSettingData wmiObj in wmiObjCollection)
-            {
-                if (wmiObj.ResourceType == 16)
-                {
-                    return wmiObj;
-                }
-            }
-
-            var errMsg = string.Format(
-                                "Cannot find the Dvd drive in VirtualSystemSettingData {0}",
-                                vmSettings.Path.Path);
-            var ex = new WmiException(errMsg);
-            logger.Error(errMsg, ex);
-            throw ex;
-        }
-
-        public  ResourceAllocationSettingData GetIDEControllerSettings(VirtualSystemSettingData vmSettings, string cntrllerAddr)
-        {
-            var wmiObjCollection = GetResourceAllocationSettings(vmSettings);
-
-            foreach (ResourceAllocationSettingData wmiObj in wmiObjCollection)
-            {
-                if (wmiObj.ResourceSubType == "Microsoft Emulated IDE Controller" && wmiObj.Address == cntrllerAddr)
-                {
-                    return wmiObj;
-                }
-            }
-
-            var errMsg = string.Format(
-                                "Cannot find the Microsoft Emulated IDE Controlle at address {0} in VirtualSystemSettingData {1}", 
-                                cntrllerAddr, 
-                                vmSettings.Path.Path);
-            var ex = new WmiException(errMsg);
-            logger.Error(errMsg, ex);
-            throw ex;
-        }
-
-        /// <summary>
-        /// VM resources, typically hardware a described by a generic MSVM_ResourceAllocationSettingData object.  The hardware type being 
-        /// described is identified in two ways:  in general terms using an enum in the ResourceType field, and in terms of the implementation 
-        /// using text in the ResourceSubType field.
-        /// See http://msdn.microsoft.com/en-us/library/cc136877%28v=vs.85%29.aspx
-        /// </summary>
-        /// <param name="vmSettings"></param>
-        /// <returns></returns>
-        public  ResourceAllocationSettingData.ResourceAllocationSettingDataCollection GetResourceAllocationSettings(VirtualSystemSettingData vmSettings)
-        {
-            // An ASSOCIATOR object provides the cross reference from the VirtualSystemSettingData and the 
-            // ResourceAllocationSettingData, but generated wrappers do not expose a ASSOCIATOR OF query as a method.
-            // Instead, we use the System.Management to code the equivalant of 
-            //  string query = string.Format( "ASSOCIATORS OF {{{0}}} WHERE ResultClass = {1}", vmSettings.path, resultclassName);
-            //
-            var wmiObjQuery = new RelatedObjectQuery(vmSettings.Path.Path, ResourceAllocationSettingData.CreatedClassName);
-
-            // NB: default scope of ManagementObjectSearcher is '\\.\root\cimv2', which does not contain
-            // the virtualisation objects.
-            var wmiObjectSearch = new ManagementObjectSearcher(vmSettings.Scope, wmiObjQuery);
-            var wmiObjCollection = new ResourceAllocationSettingData.ResourceAllocationSettingDataCollection(wmiObjectSearch.Get());
-
-            if (wmiObjCollection != null)
-            {
-                return wmiObjCollection;
-            }
-
-            var errMsg = string.Format("No ResourceAllocationSettingData in VirtualSystemSettingData {0}", vmSettings.Path.Path);
-            var ex = new WmiException(errMsg);
-            logger.Error(errMsg, ex);
-            throw ex;
-        }
-
-        public  SwitchPort[] GetSwitchPorts(ComputerSystem vm)
-        {
-            var virtSwitchMgmtSvc = GetVirtualSwitchManagementService();
-            // Get NIC path
-            var condition = string.Format("ElementName=\"{0}\"", vm.ElementName);
-            var switchPortCollection = SwitchPort.GetInstances(virtSwitchMgmtSvc.Scope, condition);
-
-            List<SwitchPort> result = new List<SwitchPort>(switchPortCollection.Count);
-            foreach (SwitchPort item in switchPortCollection)
-            {
-                result.Add(item);
-            }
-            return result.ToArray();
-        }
-
-
-        /// <summary>
-        /// Deprecated
-        /// </summary>
-        /// <param name="nic"></param>
-        /// <returns></returns>
-        public  SwitchPort GetSwitchPort(SyntheticEthernetPort nic)
-        {
-            // An ASSOCIATOR object provides the cross reference between WMI objects, 
-            // but generated wrappers do not expose a ASSOCIATOR OF query as a method.
-            // Instead, we use the System.Management to code the equivalant of 
-            //  string query = string.Format( "ASSOCIATORS OF {{{0}}} WHERE ResultClass = {1}", wmiObject.path, resultclassName);
-            //
-            var wmiObjQuery = new RelatedObjectQuery(nic.Path.Path, VmLANEndpoint.CreatedClassName);
-
-            // NB: default scope of ManagementObjectSearcher is '\\.\root\cimv2', which does not contain
-            // the virtualisation objects.
-            var wmiObjectSearch = new ManagementObjectSearcher(nic.Scope, wmiObjQuery);
-            var wmiObjCollection = new VmLANEndpoint.VmLANEndpointCollection(wmiObjectSearch.Get());
-
-            // assert
-            if (wmiObjCollection.Count < 1)
-            {
-                var errMsg = string.Format("No VmLANEndpoint for external NIC {0} on Hyper-V server", nic.Name);
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-
-            VmLANEndpoint vmEndPoint = wmiObjCollection.OfType<VmLANEndpoint>().First();
-            var switchPortQuery = new RelatedObjectQuery(vmEndPoint.Path.Path, SwitchPort.CreatedClassName);
-            var switchPortSearch = new ManagementObjectSearcher(nic.Scope, switchPortQuery);
-            var switchPortCollection = new SwitchPort.SwitchPortCollection(switchPortSearch.Get());
-
-            // assert
-            if (switchPortCollection.Count < 1)
-            {
-                var errMsg = string.Format("No SwitchPort for external NIC {0} on Hyper-V server", nic.Name);
-                var ex = new WmiException(errMsg);
-                logger.Error(errMsg, ex);
-                throw ex;
-            }
-
-            SwitchPort switchPort = wmiObjCollection.OfType<SwitchPort>().First();
-
-            return switchPort;
-        }
-
-        public  SyntheticEthernetPortSettingData[] GetEthernetPorts(ComputerSystem vm)
-        {
-            // An ASSOCIATOR object provides the cross reference from the ComputerSettings and the 
-            // SyntheticEthernetPortSettingData, via the VirtualSystemSettingData.
-            // However, generated wrappers do not expose a ASSOCIATOR OF query as a method.
-            // Instead, we use the System.Management to code the equivalant of 
-            //
-            // string query = string.Format( "ASSOCIATORS OF {{{0}}} WHERE ResultClass = {1}", vm.path, resultclassName);
-            //
-            VirtualSystemSettingData vmSettings = GetVmSettings(vm);
-
-            var wmiObjQuery = new RelatedObjectQuery(vmSettings.Path.Path, SyntheticEthernetPortSettingData.CreatedClassName);
-
-            // NB: default scope of ManagementObjectSearcher is '\\.\root\cimv2', which does not contain
-            // the virtualisation objects.
-            var wmiObjectSearch = new ManagementObjectSearcher(vm.Scope, wmiObjQuery);
-            var wmiObjCollection = new SyntheticEthernetPortSettingData.SyntheticEthernetPortSettingDataCollection(wmiObjectSearch.Get());
-
-            List<SyntheticEthernetPortSettingData> results = new List<SyntheticEthernetPortSettingData>(wmiObjCollection.Count);
-            foreach (SyntheticEthernetPortSettingData item in wmiObjCollection)
-            {
-                results.Add(item);
-            }
-
-            return results.ToArray();
-        }
-
-        public  VirtualSystemSettingData GetVmSettings(ComputerSystem vm)
-        {
-            // An ASSOCIATOR object provides the cross reference from the ComputerSettings and the 
-            // VirtualSystemSettingData, but generated wrappers do not expose a ASSOCIATOR OF query as a method.
-            // Instead, we use the System.Management to code the equivalant of 
-            //  string query = string.Format( "ASSOCIATORS OF {{{0}}} WHERE ResultClass = {1}", vm.path, resultclassName);
-            //
-            var wmiObjQuery = new RelatedObjectQuery(vm.Path.Path, VirtualSystemSettingData.CreatedClassName);
-
-            // NB: default scope of ManagementObjectSearcher is '\\.\root\cimv2', which does not contain
-            // the virtualisation objects.
-            var wmiObjectSearch = new ManagementObjectSearcher(vm.Scope, wmiObjQuery);
-            var wmiObjCollection = new VirtualSystemSettingData.VirtualSystemSettingDataCollection(wmiObjectSearch.Get());
-
-            // When snapshots are taken into account, there can be multiple settings objects
-            // take the first one that isn't a snapshot
-            foreach (VirtualSystemSettingData wmiObj in wmiObjCollection)
-            {
-                if (wmiObj.SettingType == 3)
-                {
-                    return wmiObj;
-                }
-            }
-
-            var errMsg = string.Format("No VirtualSystemSettingData for VM {0}, path {1}", vm.ElementName, vm.Path.Path);
-            var ex = new WmiException(errMsg);
-            logger.Error(errMsg, ex);
-            throw ex;
-        }
-    }
-}