You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by da...@apache.org on 2014/07/28 23:21:57 UTC
[1/2] CLOUDSTACK-6518 [Hyper-V] Efficient way of finding the empty
nic in VR/VpcVR to configure VPC entities
Repository: cloudstack
Updated Branches:
refs/heads/4.4 2025f359c -> 095fb09b7
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/095fb09b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/WmiCallsV2.cs
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/WmiCallsV2.cs b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/WmiCallsV2.cs
index 104ee2d..1c5a458 100644
--- a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/WmiCallsV2.cs
+++ b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/WmiCallsV2.cs
@@ -1,261 +1,261 @@
-// 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.V2;
-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 WmiCallsV2 : IWmiCallsV2
- {
- public static String CloudStackUserDataKey = "cloudstack-vm-userdata";
-
- /// <summary>
- /// Defines the migration types.
- /// </summary>
- public enum MigrationType
- {
- VirtualSystem = 32768,
- Storage = 32769,
- Staged = 32770,
- VirtualSystemAndStorage = 32771
- };
-
- /// <summary>
- /// Defines migration transport types.
- /// </summary>
- public enum TransportType
- {
- TCP = 5,
- SMB = 32768
- };
-
- public static void Initialize()
- {
- // Trigger assembly load into curren appdomain
- }
-
- private static ILog logger = LogManager.GetLogger(typeof(WmiCallsV2));
-
- /// <summary>
- /// Returns ping status of the given ip
- /// </summary>
- public static String PingHost(String ip)
- {
- return "Success";
- }
-
- /// <summary>
- /// Returns ComputerSystem lacking any NICs and VOLUMEs
- /// </summary>
- public ComputerSystem AddUserData(ComputerSystem vm, string userData)
- {
- // Obtain controller for Hyper-V virtualisation subsystem
- VirtualSystemManagementService vmMgmtSvc = GetVirtualisationSystemManagementService();
-
- // Create object to hold the data.
- KvpExchangeDataItem kvpItem = KvpExchangeDataItem.CreateInstance();
- kvpItem.LateBoundObject["Name"] = WmiCallsV2.CloudStackUserDataKey;
- kvpItem.LateBoundObject["Data"] = userData;
- kvpItem.LateBoundObject["Source"] = 0;
- logger.Debug("VM " + vm.Name + " gets userdata " + userData);
-
- // Update the resource settings for the VM.
- System.Management.ManagementBaseObject kvpMgmtObj = kvpItem.LateBoundObject;
- System.Management.ManagementPath jobPath;
- String kvpStr = kvpMgmtObj.GetText(System.Management.TextFormat.CimDtd20);
- uint ret_val = vmMgmtSvc.AddKvpItems(new String[] { kvpStr }, vm.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 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;
- }
-
- return vm;
- }
-
- /// <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)
- {
- logger.DebugFormat("Creating nic for VM {0} (GUID {1})", vm.ElementName, vm.Name);
-
- // Obtain controller for Hyper-V networking subsystem
- var 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());
-
- // Assign configuration to new NIC
- string normalisedMAC = string.Join("", (mac.Split(new char[] { ':' })));
- 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_CONTROLLER = "Microsoft:Hyper-V:Emulated IDE Controller";
- public const string SCSI_CONTROLLER = "Microsoft:Hyper-V:Synthetic SCSI Controller";
- public const string HARDDISK_DRIVE = "Microsoft:Hyper-V:Synthetic Disk Drive";
- public const string ISO_DRIVE = "Microsoft:Hyper-V:Synthetic DVD Drive";
-
- // TODO: names harvested from Msvm_ResourcePool, not clear how to create new instances
- public const string ISO_DISK = "Microsoft:Hyper-V:Virtual CD/DVD Disk"; // For IDE_ISO_DRIVE
- public const string HARDDISK_DISK = "Microsoft:Hyper-V: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);
- }
+// 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.V2;
+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 WmiCallsV2 : IWmiCallsV2
+ {
+ public static String CloudStackUserDataKey = "cloudstack-vm-userdata";
+
+ /// <summary>
+ /// Defines the migration types.
+ /// </summary>
+ public enum MigrationType
+ {
+ VirtualSystem = 32768,
+ Storage = 32769,
+ Staged = 32770,
+ VirtualSystemAndStorage = 32771
+ };
+
+ /// <summary>
+ /// Defines migration transport types.
+ /// </summary>
+ public enum TransportType
+ {
+ TCP = 5,
+ SMB = 32768
+ };
+
+ public static void Initialize()
+ {
+ // Trigger assembly load into curren appdomain
+ }
+
+ private static ILog logger = LogManager.GetLogger(typeof(WmiCallsV2));
+
+ /// <summary>
+ /// Returns ping status of the given ip
+ /// </summary>
+ public static String PingHost(String ip)
+ {
+ return "Success";
+ }
+
+ /// <summary>
+ /// Returns ComputerSystem lacking any NICs and VOLUMEs
+ /// </summary>
+ public ComputerSystem AddUserData(ComputerSystem vm, string userData)
+ {
+ // Obtain controller for Hyper-V virtualisation subsystem
+ VirtualSystemManagementService vmMgmtSvc = GetVirtualisationSystemManagementService();
+
+ // Create object to hold the data.
+ KvpExchangeDataItem kvpItem = KvpExchangeDataItem.CreateInstance();
+ kvpItem.LateBoundObject["Name"] = WmiCallsV2.CloudStackUserDataKey;
+ kvpItem.LateBoundObject["Data"] = userData;
+ kvpItem.LateBoundObject["Source"] = 0;
+ logger.Debug("VM " + vm.Name + " gets userdata " + userData);
+
+ // Update the resource settings for the VM.
+ System.Management.ManagementBaseObject kvpMgmtObj = kvpItem.LateBoundObject;
+ System.Management.ManagementPath jobPath;
+ String kvpStr = kvpMgmtObj.GetText(System.Management.TextFormat.CimDtd20);
+ uint ret_val = vmMgmtSvc.AddKvpItems(new String[] { kvpStr }, vm.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 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;
+ }
+
+ return vm;
+ }
+
+ /// <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)
+ {
+ logger.DebugFormat("Creating nic for VM {0} (GUID {1})", vm.ElementName, vm.Name);
+
+ // Obtain controller for Hyper-V networking subsystem
+ var 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());
+
+ // Assign configuration to new NIC
+ string normalisedMAC = string.Join("", (mac.Split(new char[] { ':' })));
+ 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_CONTROLLER = "Microsoft:Hyper-V:Emulated IDE Controller";
+ public const string SCSI_CONTROLLER = "Microsoft:Hyper-V:Synthetic SCSI Controller";
+ public const string HARDDISK_DRIVE = "Microsoft:Hyper-V:Synthetic Disk Drive";
+ public const string ISO_DRIVE = "Microsoft:Hyper-V:Synthetic DVD Drive";
+
+ // TODO: names harvested from Msvm_ResourcePool, not clear how to create new instances
+ public const string ISO_DISK = "Microsoft:Hyper-V:Virtual CD/DVD Disk"; // For IDE_ISO_DRIVE
+ public const string HARDDISK_DISK = "Microsoft:Hyper-V: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 if (vmWmiObj.EnabledState == EnabledState.Enabled)
{
string infoMsg = string.Format("Create VM discovered there exists a VM with name {0}, state {1}",
@@ -379,6 +379,8 @@ namespace HypervResource
}
int nicCount = 0;
+ int enableState = 2;
+
// Add the Nics to the VM in the deviceId order.
foreach (var nc in nicInfo)
{
@@ -417,13 +419,17 @@ namespace HypervResource
throw ex;
}
}
- if(nicIp.Equals("0.0.0.0") && nicNetmask.Equals("255.255.255.255") ) {
- // this is the extra nic added to VR.
- vlan = defaultvlan;
- }
-
+
+
if (nicid == nicCount)
{
+ if (nicIp.Equals("0.0.0.0") && nicNetmask.Equals("255.255.255.255"))
+ {
+ // this is the extra nic added to VR.
+ vlan = null;
+ enableState = 3;
+ }
+
// Create network adapter
var newAdapter = CreateNICforVm(newVm, mac);
String switchName ="";
@@ -431,10 +437,11 @@ namespace HypervResource
{
switchName = nic.name;
}
-
+ EthernetPortAllocationSettingData portSettings = null;
// connection to vswitch
- var portSettings = AttachNicToPort(newVm, newAdapter, switchName);
-
+ portSettings = AttachNicToPort(newVm, newAdapter, switchName, enableState);
+ //reset the flag for other nics
+ enableState = 2;
// set vlan
if (vlan != null)
{
@@ -446,38 +453,38 @@ namespace HypervResource
SetBandWidthLimit((ulong)networkRateMbps, portSettings);
}
- logger.DebugFormat("Created adapter {0} on port {1}, {2}",
- newAdapter.Path, portSettings.Path, (vlan == null ? "No VLAN" : "VLAN " + vlan));
- // logger.DebugFormat("Created adapter {0} on port {1}, {2}",
- // newAdapter.Path, portSettings.Path, (vlan == null ? "No VLAN" : "VLAN " + vlan));
- }
- }
- nicCount++;
- }
-
-
- // 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 = GetComputerSystem(vmName);
- if (bootArgs != null && !String.IsNullOrEmpty((string)bootArgs))
- {
-
- String bootargs = bootArgs;
- AddUserData(vm, bootargs);
- }
-
- // call patch systemvm iso only for systemvms
- if (vmName.StartsWith("r-") || vmName.StartsWith("s-") || vmName.StartsWith("v-"))
- {
- if (systemVmIso != null && systemVmIso.Length != 0)
- {
- patchSystemVmIso(vmName, systemVmIso);
- }
- }
+ logger.DebugFormat("Created adapter {0} on port {1}, {2}",
+ newAdapter.Path, portSettings.Path, (vlan == null ? "No VLAN" : "VLAN " + vlan));
+ // logger.DebugFormat("Created adapter {0} on port {1}, {2}",
+ // newAdapter.Path, portSettings.Path, (vlan == null ? "No VLAN" : "VLAN " + vlan));
+ }
+ }
+ nicCount++;
+ }
+
- logger.DebugFormat("Starting VM {0}", vmName);
- SetState(newVm, RequiredState.Enabled);
+ // 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 = GetComputerSystem(vmName);
+ if (bootArgs != null && !String.IsNullOrEmpty((string)bootArgs))
+ {
+
+ String bootargs = bootArgs;
+ AddUserData(vm, bootargs);
+ }
+
+ // call patch systemvm iso only for systemvms
+ if (vmName.StartsWith("r-") || vmName.StartsWith("s-") || vmName.StartsWith("v-"))
+ {
+ if (systemVmIso != null && systemVmIso.Length != 0)
+ {
+ patchSystemVmIso(vmName, systemVmIso);
+ }
+ }
+
+ logger.DebugFormat("Starting VM {0}", vmName);
+ SetState(newVm, RequiredState.Enabled);
// Mark the VM as created by cloudstack tag
TagVm(newVm);
@@ -519,7 +526,7 @@ namespace HypervResource
return false;
}
- private EthernetPortAllocationSettingData AttachNicToPort(ComputerSystem newVm, SyntheticEthernetPortSettingData newAdapter, String vSwitchName)
+ private EthernetPortAllocationSettingData AttachNicToPort(ComputerSystem newVm, SyntheticEthernetPortSettingData newAdapter, String vSwitchName, int enableState)
{
// Get the virtual switch
VirtualEthernetSwitch vSwitch = GetExternalVirtSwitch(vSwitchName);
@@ -548,7 +555,7 @@ namespace HypervResource
var newEthernetPortSettings = new EthernetPortAllocationSettingData((ManagementBaseObject)defaultEthernetPortSettingsObj.LateBoundObject.Clone());
newEthernetPortSettings.LateBoundObject["Parent"] = newAdapter.Path.Path;
newEthernetPortSettings.LateBoundObject["HostResource"] = new string[] { vSwitch.Path.Path };
-
+ newEthernetPortSettings.LateBoundObject["EnabledState"] = enableState; //3 disabled 2 Enabled
// Insert NIC into vm
string[] newResources = new string[] { newEthernetPortSettings.LateBoundObject.GetText(System.Management.TextFormat.CimDtd20) };
ManagementPath[] newResourcePaths = AddVirtualResource(newResources, newVm);
@@ -908,8 +915,19 @@ namespace HypervResource
return new ResourceAllocationSettingData((ManagementBaseObject)defaultDiskDriveSettings.LateBoundObject.Clone());
}
- // 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-"))
+ // Modify the systemvm nic's VLAN id
+ public void ModifyVmVLan(string vmName, String vlanid, String mac)
+ {
+ int enableState = 2;
+ bool enable = true;
+ ComputerSystem vm = GetComputerSystem(vmName);
+ SyntheticEthernetPortSettingData[] nicSettingsViaVm = GetEthernetPortSettings(vm);
+ // Obtain controller for Hyper-V virtualisation subsystem
+ VirtualSystemManagementService vmMgmtSvc = GetVirtualisationSystemManagementService();
+ EthernetPortAllocationSettingData networkAdapter = null;
+ string normalisedMAC = string.Join("", (mac.Split(new char[] { ':' })));
+ int index = 0;
+ foreach (SyntheticEthernetPortSettingData item in nicSettingsViaVm)
{
System.Threading.Thread.Sleep(90000);
// wait for the second boot and then return with sucesss
@@ -918,1588 +936,229 @@ namespace HypervResource
{
System.Threading.Thread.Sleep(90000);
}
- else
- {
- pingResource(publicIpAddress);
- }*/
- }
- logger.InfoFormat("Started VM {0}", vmName);
- return newVm;
- }
+ index++;
+ }
+ String vSwitchName = "";
+ VirtualEthernetSwitch vSwitch = GetExternalVirtSwitch(vSwitchName);
+ EthernetPortAllocationSettingData[] ethernetConnections = GetEthernetConnections(vm);
+ networkAdapter = ethernetConnections[index];
+ networkAdapter.LateBoundObject["EnabledState"] = enableState; //3 disabled 2 Enabled
+ networkAdapter.LateBoundObject["HostResource"] = new string[] { vSwitch.Path.Path };
+
+ ModifyVmResources(vmMgmtSvc, vm, new String[] {
+ networkAdapter.LateBoundObject.GetText(TextFormat.CimDtd20)
+ });
- public static Boolean pingResource(String ip)
- {
- PingOptions pingOptions = null;
- PingReply pingReply = null;
- IPAddress ipAddress = null;
- Ping pingSender = new Ping();
- int numberOfPings = 6;
- 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)
- {
- System.Threading.Thread.Sleep(30000);
- return true;
- }
- else
- {
- // wait for the second boot and then return with suces
- System.Threading.Thread.Sleep(30000);
- }
- }
- return false;
- }
-
- private EthernetPortAllocationSettingData AttachNicToPort(ComputerSystem newVm, SyntheticEthernetPortSettingData newAdapter, String vSwitchName, int enableState)
- {
- // Get the virtual switch
- VirtualEthernetSwitch vSwitch = GetExternalVirtSwitch(vSwitchName);
- //check the the recevied vSwitch is the same as vSwitchName.
- if (!vSwitchName.Equals("") && !vSwitch.ElementName.Equals(vSwitchName))
- {
- var errMsg = string.Format("Internal error, coudl not find Virtual Switch with the name : " +vSwitchName);
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- throw ex;
- }
-
- // Create port for adapter
- var defaultEthernetPortSettings = EthernetPortAllocationSettingData.GetInstances(vSwitch.Scope, "InstanceID LIKE \"%Default\"");
-
- // assert
- if (defaultEthernetPortSettings.Count != 1)
- {
- var errMsg = string.Format("Internal error, coudl not find default EthernetPortAllocationSettingData instance");
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- throw ex;
- }
-
- var defaultEthernetPortSettingsObj = defaultEthernetPortSettings.OfType<EthernetPortAllocationSettingData>().First();
- var newEthernetPortSettings = new EthernetPortAllocationSettingData((ManagementBaseObject)defaultEthernetPortSettingsObj.LateBoundObject.Clone());
- newEthernetPortSettings.LateBoundObject["Parent"] = newAdapter.Path.Path;
- newEthernetPortSettings.LateBoundObject["HostResource"] = new string[] { vSwitch.Path.Path };
- newEthernetPortSettings.LateBoundObject["EnabledState"] = enableState; //3 disabled 2 Enabled
- // Insert NIC into vm
- string[] newResources = new string[] { newEthernetPortSettings.LateBoundObject.GetText(System.Management.TextFormat.CimDtd20) };
- ManagementPath[] newResourcePaths = AddVirtualResource(newResources, newVm);
-
- // 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}",
- newVm.ElementName,
- newVm.Name,
- newResourcePaths.Length);
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- throw ex;
- }
-
- return new EthernetPortAllocationSettingData(newResourcePaths[0]);
- }
-
- /// this method is to add a dvd drive and attach the systemvm iso.
- ///
- public void patchSystemVmIso(String vmName, String systemVmIso)
- {
- ComputerSystem vmObject = GetComputerSystem(vmName);
- AddDiskDriveToIdeController(vmObject, "", "1", ISO_DRIVE);
- AttachIso(vmName, systemVmIso);
- }
-
- public void AttachDisk(string vmName, string diskPath, string addressOnController)
- {
- logger.DebugFormat("Got request to attach disk {0} to vm {1}", diskPath, vmName);
-
- ComputerSystem vm = GetComputerSystem(vmName);
- if (vm == null)
- {
- logger.DebugFormat("VM {0} not found", vmName);
- return;
- }
- else
- {
- ManagementPath newDrivePath = GetDiskDriveOnScsiController(vm, addressOnController);
- if (newDrivePath == null)
- {
- newDrivePath = AttachDiskDriveToScsiController(vm, addressOnController);
- }
- InsertDiskImage(vm, diskPath, HARDDISK_DISK, newDrivePath);
- }
- }
-
- /// </summary>
- /// <param name="vm"></param>
- /// <param name="cntrllerAddr"></param>
- /// <param name="driveResourceType">IDE_HARDDISK_DRIVE or IDE_ISO_DRIVE</param>
- public ManagementPath AddDiskDriveToIdeController(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 HARDDISK_DRIVE:
- diskResourceSubType = HARDDISK_DISK;
- break;
- case ISO_DRIVE:
- diskResourceSubType = 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 = AttachNewDrive(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;
- }
-
-
- public void DetachDisk(string displayName, string diskFileName)
- {
- logger.DebugFormat("Got request to detach virtual disk {0} from vm {1}", diskFileName, displayName);
-
- ComputerSystem vm = GetComputerSystem(displayName);
- if (vm == null)
- {
- logger.DebugFormat("VM {0} not found", displayName);
- return;
- }
- else
- {
- RemoveStorageImage(vm, diskFileName);
- }
- }
-
- /// <summary>
- /// Removes a disk image from a drive, but does not remove the drive itself.
- /// </summary>
- /// <param name="vm"></param>
- /// <param name="diskFileName"></param>
- private void RemoveStorageImage(ComputerSystem vm, string diskFileName)
- {
- // Obtain StorageAllocationSettingData for disk
- StorageAllocationSettingData.StorageAllocationSettingDataCollection storageSettingsObjs = StorageAllocationSettingData.GetInstances();
-
- StorageAllocationSettingData imageToRemove = null;
- foreach (StorageAllocationSettingData item in storageSettingsObjs)
- {
- if (item.HostResource == null || item.HostResource.Length != 1)
- {
- continue;
- }
-
- string hostResource = item.HostResource[0];
- if (Path.Equals(hostResource, diskFileName))
- {
- imageToRemove = item;
- break;
- }
- }
-
- // assert
- if (imageToRemove == null)
- {
- var errMsg = string.Format(
- "Failed to remove disk image {0} from VM {1} (GUID {2}): the disk image is not attached.",
- diskFileName,
- vm.ElementName,
- vm.Name);
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- throw ex;
- }
-
- RemoveStorageResource(imageToRemove.Path, vm);
-
- logger.InfoFormat("Removed disk image {0} from VM {1} (GUID {2}): the disk image is not attached.",
- diskFileName,
- vm.ElementName,
- vm.Name);
- }
-
- private ManagementPath AttachNewDrive(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["AddressOnParent"] = "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.AddressOnParent);
- 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];
- }
-
- private ManagementPath AddScsiController(ComputerSystem vm)
- {
- // A description of the controller is created by modifying a clone of the default ResourceAllocationSettingData for scsi controller
- string scsiQuery = String.Format("ResourceSubType LIKE \"{0}\" AND InstanceID LIKE \"%Default\"", SCSI_CONTROLLER);
- var scsiSettings = CloneResourceAllocationSetting(scsiQuery);
-
- scsiSettings.LateBoundObject["ElementName"] = "SCSI Controller";
- scsiSettings.CommitObject();
-
- // Insert SCSI controller into vm
- string[] newResources = new string[] { scsiSettings.LateBoundObject.GetText(System.Management.TextFormat.CimDtd20) };
- ManagementPath[] newResourcePaths = AddVirtualResource(newResources, vm);
-
- // assert
- if (newResourcePaths.Length != 1)
- {
- var errMsg = string.Format(
- "Failed to add scsi controller to 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;
- }
-
- logger.DebugFormat("New controller type {0} WMI path is {1}s",
- scsiSettings.ResourceSubType,
- newResourcePaths[0].Path);
- return newResourcePaths[0];
- }
-
- private ManagementPath GetDiskDriveOnScsiController(ComputerSystem vm, string addrOnController)
- {
- VirtualSystemSettingData vmSettings = GetVmSettings(vm);
- var wmiObjCollection = GetResourceAllocationSettings(vmSettings);
- foreach (ResourceAllocationSettingData wmiObj in wmiObjCollection)
- {
- if (wmiObj.ResourceSubType == HARDDISK_DRIVE)
- {
- ResourceAllocationSettingData parent = new ResourceAllocationSettingData(new ManagementObject(wmiObj.Parent));
- if (parent.ResourceSubType == SCSI_CONTROLLER && wmiObj.AddressOnParent == addrOnController)
- {
- return wmiObj.Path;
- }
- }
- }
- return null;
- }
-
- private ManagementPath AttachDiskDriveToScsiController(ComputerSystem vm, string addrOnController)
- {
- // Disk drives are attached to a 'Parent' Scsi controller.
- VirtualSystemSettingData vmSettings = GetVmSettings(vm);
- var ctrller = GetScsiControllerSettings(vmSettings);
-
- // 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\"", HARDDISK_DRIVE);
- var newDiskDriveSettings = CloneResourceAllocationSetting(defaultDriveQuery);
-
- // Set IDE controller and address on the controller for the new drive
- newDiskDriveSettings.LateBoundObject["Parent"] = ctrller.Path.ToString();
- newDiskDriveSettings.LateBoundObject["AddressOnParent"] = addrOnController;
- 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.AddressOnParent);
- 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,
- HARDDISK_DRIVE);
- 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];
- }
-
-
- private void InsertDiskImage(ComputerSystem vm, string diskImagePath, 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 = CloneStorageAllocationSetting(defaultDiskQuery);
-
- // Set file containing the disk image
- newDiskSettings.LateBoundObject["Parent"] = drivePath.Path;
-
- // V2 API uses HostResource to specify image, see http://msdn.microsoft.com/en-us/library/hh859775(v=vs.85).aspx
- newDiskSettings.LateBoundObject["HostResource"] = new string[] { diskImagePath };
- newDiskSettings.CommitObject();
-
- // Add the new Msvm_StorageAllocationSettingData object as a virtual hard disk to the vm.
- string[] newDiskResource = new string[] { newDiskSettings.LateBoundObject.GetText(System.Management.TextFormat.CimDtd20) };
- ManagementPath[] newDiskPaths = AddStorageResource(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,
- diskImagePath);
- }
-
- /// <summary>
- /// Create Msvm_StorageAllocationSettingData corresponding to the ISO image, and
- /// associate this with the VM's DVD drive.
- /// </summary>
- private void AttachIso(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 driveWmiObj = GetDvdDriveSettings(vmSettings);
- InsertDiskImage(vm, isoPath, ISO_DISK, driveWmiObj.Path);
- }
-
- private static 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());
- }
-
- // Modify the systemvm nic's VLAN id
- public void ModifyVmVLan(string vmName, String vlanid, String mac)
- {
- int enableState = 2;
- bool enable = true;
- ComputerSystem vm = GetComputerSystem(vmName);
- SyntheticEthernetPortSettingData[] nicSettingsViaVm = GetEthernetPortSettings(vm);
- // Obtain controller for Hyper-V virtualisation subsystem
- VirtualSystemManagementService vmMgmtSvc = GetVirtualisationSystemManagementService();
- EthernetPortAllocationSettingData networkAdapter = null;
- string normalisedMAC = string.Join("", (mac.Split(new char[] { ':' })));
- int index = 0;
- foreach (SyntheticEthernetPortSettingData item in nicSettingsViaVm)
- {
- if (normalisedMAC.ToLower().Equals(item.Address.ToLower()))
- {
- break;
- }
- index++;
- }
- String vSwitchName = "";
- VirtualEthernetSwitch vSwitch = GetExternalVirtSwitch(vSwitchName);
- EthernetPortAllocationSettingData[] ethernetConnections = GetEthernetConnections(vm);
- networkAdapter = ethernetConnections[index];
- networkAdapter.LateBoundObject["EnabledState"] = enableState; //3 disabled 2 Enabled
- networkAdapter.LateBoundObject["HostResource"] = new string[] { vSwitch.Path.Path };
-
- ModifyVmResources(vmMgmtSvc, vm, new String[] {
- networkAdapter.LateBoundObject.GetText(TextFormat.CimDtd20)
- });
-
- EthernetSwitchPortVlanSettingData vlanSettings = GetVlanSettings(ethernetConnections[index]);
-
- if (vlanSettings == null)
- {
- // when modifying nic to not connected dont create vlan
- if (enable)
- {
- if (vlanid != null)
- {
- SetPortVlan(vlanid, networkAdapter);
- }
- }
- }
- else
- {
- if (enable)
- {
- if (vlanid != null)
- {
- //Assign vlan configuration to nic
- vlanSettings.LateBoundObject["AccessVlanId"] = vlanid;
- vlanSettings.LateBoundObject["OperationMode"] = 1;
- ModifyFeatureVmResources(vmMgmtSvc, vm, new String[] {
- vlanSettings.LateBoundObject.GetText(TextFormat.CimDtd20)});
- }
- }
- else
- {
- var virtSysMgmtSvc = GetVirtualisationSystemManagementService();
-
- // This method will remove the vlan settings present on the Nic
- ManagementPath jobPath;
- var ret_val = virtSysMgmtSvc.RemoveFeatureSettings(new ManagementPath[] { vlanSettings.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 remove vlan resource {0} from VM {1} (GUID {2}) due to {3}",
- vlanSettings.Path,
- vm.ElementName,
- vm.Name,
- ReturnCode.ToString(ret_val));
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- }
- }
- }
- }
-
- // This is disabling the VLAN settings on the specified nic. It works Awesome.
- public void DisableNicVlan(String mac, String vmName)
- {
- ComputerSystem vm = GetComputerSystem(vmName);
- SyntheticEthernetPortSettingData[] nicSettingsViaVm = GetEthernetPortSettings(vm);
- // Obtain controller for Hyper-V virtualisation subsystem
- VirtualSystemManagementService vmMgmtSvc = GetVirtualisationSystemManagementService();
- string normalisedMAC = string.Join("", (mac.Split(new char[] { ':' })));
- int index = 0;
- foreach (SyntheticEthernetPortSettingData item in nicSettingsViaVm)
- {
- if (normalisedMAC.ToLower().Equals(item.Address.ToLower()))
- {
- break;
- }
- index++;
- }
-
- //TODO: make sure the index wont be out of range.
-
- EthernetPortAllocationSettingData[] ethernetConnections = GetEthernetConnections(vm);
- EthernetSwitchPortVlanSettingData vlanSettings = GetVlanSettings(ethernetConnections[index]);
-
- var virtSysMgmtSvc = GetVirtualisationSystemManagementService();
-
- // This method will remove the vlan settings present on the Nic
- ManagementPath jobPath;
- var ret_val = virtSysMgmtSvc.RemoveFeatureSettings(new ManagementPath[]{ vlanSettings.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 remove vlan resource {0} from VM {1} (GUID {2}) due to {3}",
- vlanSettings.Path,
- vm.ElementName,
- vm.Name,
- ReturnCode.ToString(ret_val));
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- throw ex;
- }
- }
-
- // Modify All VM Nics to disable
- public void DisableVmNics()
- {
- ComputerSystem vm = GetComputerSystem("test");
- EthernetPortAllocationSettingData[] ethernetConnections = GetEthernetConnections(vm);
- // Get the virtual switch
- VirtualEthernetSwitch vSwitch = GetExternalVirtSwitch("vswitch2");
-
- foreach (EthernetPortAllocationSettingData epasd in ethernetConnections)
- {
- epasd.LateBoundObject["EnabledState"] = 2; //3 disabled 2 Enabled
- epasd.LateBoundObject["HostResource"] = new string[] { vSwitch.Path.Path };
-
- VirtualSystemManagementService vmMgmtSvc = GetVirtualisationSystemManagementService();
- ModifyVmResources(vmMgmtSvc, vm, new String[] {
- epasd.LateBoundObject.GetText(TextFormat.CimDtd20)
- });
- }
- }
-
- // Modify the systemvm nic's VLAN id
- public void ModifyVmVLan(string vmName, String vlanid, uint pos, bool enable, string switchLabelName)
- {
- // This if to modify the VPC VR nics
- // 1. Enable the network adapter and connect to a switch
- // 2. modify the vlan id
- int enableState = 2;
- ComputerSystem vm = GetComputerSystem(vmName);
- EthernetPortAllocationSettingData[] ethernetConnections = GetEthernetConnections(vm);
- // Obtain controller for Hyper-V virtualisation subsystem
- EthernetPortAllocationSettingData networkAdapter = null;
- VirtualSystemManagementService vmMgmtSvc = GetVirtualisationSystemManagementService();
-
- String vSwitchName = "";
- if (switchLabelName != null)
- vSwitchName = switchLabelName;
- VirtualEthernetSwitch vSwitch = GetExternalVirtSwitch(vSwitchName);
- if (pos <= ethernetConnections.Length)
- {
- if (enable == false)
- {
- enableState = 3;
- }
-
- networkAdapter = ethernetConnections[pos];
- networkAdapter.LateBoundObject["EnabledState"] = enableState; //3 disabled 2 Enabled
- networkAdapter.LateBoundObject["HostResource"] = new string[] { vSwitch.Path.Path };
- ModifyVmResources(vmMgmtSvc, vm, new String[] {
- networkAdapter.LateBoundObject.GetText(TextFormat.CimDtd20)
- });
- }
-
- // check when nic is disabled, removing vlan is required or not.
- EthernetPortAllocationSettingData[] vmEthernetConnections = GetEthernetConnections(vm);
- EthernetSwitchPortVlanSettingData vlanSettings = GetVlanSettings(vmEthernetConnections[pos]);
-
- if (vlanSettings == null)
- {
- // when modifying nic to not connected dont create vlan
- if (enable)
- {
- if (vlanid != null)
- {
- SetPortVlan(vlanid, networkAdapter);
- }
- }
- }
- else
- {
- if (enable)
- {
- if (vlanid != null)
- {
- //Assign vlan configuration to nic
- vlanSettings.LateBoundObject["AccessVlanId"] = vlanid;
- vlanSettings.LateBoundObject["OperationMode"] = 1;
- ModifyFeatureVmResources(vmMgmtSvc, vm, new String[] {
- vlanSettings.LateBoundObject.GetText(TextFormat.CimDtd20)});
- }
- }
- else
- {
- var virtSysMgmtSvc = GetVirtualisationSystemManagementService();
-
- // This method will remove the vlan settings present on the Nic
- ManagementPath jobPath;
- var ret_val = virtSysMgmtSvc.RemoveFeatureSettings(new ManagementPath[] { vlanSettings.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 remove vlan resource {0} from VM {1} (GUID {2}) due to {3}",
- vlanSettings.Path,
- vm.ElementName,
- vm.Name,
- ReturnCode.ToString(ret_val));
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- }
- }
- }
- }
-
- 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
- {
- AttachIso(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
- logger.DebugFormat("Remove associated switch ports for VM {0} (GUID {1})", vm.ElementName, vm.Name);
- 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.DestroySystem(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);
- }
-
- /// <summary>
- /// Migrates a vm to the given destination host
- /// </summary>
- /// <param name="desplayName"></param>
- /// <param name="destination host"></param>
- public void MigrateVm(string vmName, string destination)
- {
- ComputerSystem vm = GetComputerSystem(vmName);
- VirtualSystemMigrationSettingData migrationSettingData = VirtualSystemMigrationSettingData.CreateInstance();
- VirtualSystemMigrationService service = GetVirtualisationSystemMigrationService();
-
- IPAddress addr = IPAddress.Parse(destination);
- IPHostEntry entry = Dns.GetHostEntry(addr);
- string[] destinationHost = new string[] { destination };
-
- migrationSettingData.LateBoundObject["MigrationType"] = MigrationType.VirtualSystem;
- migrationSettingData.LateBoundObject["TransportType"] = TransportType.TCP;
- migrationSettingData.LateBoundObject["DestinationIPAddressList"] = destinationHost;
- string migrationSettings = migrationSettingData.LateBoundObject.GetText(System.Management.TextFormat.CimDtd20);
-
- ManagementPath jobPath;
- var ret_val = service.MigrateVirtualSystemToHost(vm.Path, entry.HostName, migrationSettings, null, null, out jobPath);
- if (ret_val == ReturnCode.Started)
- {
- MigrationJobCompleted(jobPath);
- }
- else if (ret_val != ReturnCode.Completed)
- {
- var errMsg = string.Format(
- "Failed migrating 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;
- }
- }
-
- /// <summary>
- /// Migrates the volume of a vm to a given destination storage
- /// </summary>
- /// <param name="displayName"></param>
- /// <param name="volume"></param>
- /// <param name="destination storage pool"></param>
- public void MigrateVolume(string vmName, string volume, string destination)
- {
- ComputerSystem vm = GetComputerSystem(vmName);
- VirtualSystemSettingData vmSettings = GetVmSettings(vm);
- VirtualSystemMigrationSettingData migrationSettingData = VirtualSystemMigrationSettingData.CreateInstance();
- VirtualSystemMigrationService service = GetVirtualisationSystemMigrationService();
- StorageAllocationSettingData[] sasd = GetStorageSettings(vm);
-
- string[] rasds = null;
- if (sasd != null)
- {
- rasds = new string[1];
- foreach (StorageAllocationSettingData item in sasd)
- {
- string vhdFileName = Path.GetFileNameWithoutExtension(item.HostResource[0]);
- if (!String.IsNullOrEmpty(vhdFileName) && vhdFileName.Equals(volume))
- {
- string newVhdPath = Path.Combine(destination, Path.GetFileName(item.HostResource[0]));
- item.LateBoundObject["HostResource"] = new string[] { newVhdPath };
- item.LateBoundObject["PoolId"] = "";
- rasds[0] = item.LateBoundObject.GetText(System.Management.TextFormat.CimDtd20);
- break;
- }
- }
- }
-
- migrationSettingData.LateBoundObject["MigrationType"] = MigrationType.Storage;
- migrationSettingData.LateBoundObject["TransportType"] = TransportType.TCP;
- string migrationSettings = migrationSettingData.LateBoundObject.GetText(System.Management.TextFormat.CimDtd20);
-
- ManagementPath jobPath;
- var ret_val = service.MigrateVirtualSystemToHost(vm.Path, null, migrationSettings, rasds, null, out jobPath);
- if (ret_val == ReturnCode.Started)
- {
- MigrationJobCompleted(jobPath);
- }
- else if (ret_val != ReturnCode.Completed)
- {
- var errMsg = string.Format(
- "Failed migrating volume {0} of VM {1} (GUID {2}) due to {3}",
- volume,
- vm.ElementName,
- vm.Name,
- ReturnCode.ToString(ret_val));
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- throw ex;
- }
- }
-
- /// <summary>
- /// Migrates the volume of a vm to a given destination storage
- /// </summary>
- /// <param name="displayName"></param>
- /// <param name="destination host"></param>
- /// <param name="volumeToPool"> volume to me migrated to which pool</param>
- public void MigrateVmWithVolume(string vmName, string destination, Dictionary<string, string> volumeToPool)
- {
- ComputerSystem vm = GetComputerSystem(vmName);
- VirtualSystemSettingData vmSettings = GetVmSettings(vm);
- VirtualSystemMigrationSettingData migrationSettingData = VirtualSystemMigrationSettingData.CreateInstance();
- VirtualSystemMigrationService service = GetVirtualisationSystemMigrationService();
- StorageAllocationSettingData[] sasd = GetStorageSettings(vm);
-
- string[] rasds = null;
- if (sasd != null)
- {
- rasds = new string[sasd.Length];
- uint index = 0;
- foreach (StorageAllocationSettingData item in sasd)
- {
- string vhdFileName = Path.GetFileNameWithoutExtension(item.HostResource[0]);
- if (!String.IsNullOrEmpty(vhdFileName) && volumeToPool.ContainsKey(vhdFileName))
- {
- string newVhdPath = Path.Combine(volumeToPool[vhdFileName], Path.GetFileName(item.HostResource[0]));
- item.LateBoundObject["HostResource"] = new string[] { newVhdPath };
- item.LateBoundObject["PoolId"] = "";
- }
-
- rasds[index++] = item.LateBoundObject.GetText(System.Management.TextFormat.CimDtd20);
- }
- }
-
- IPAddress addr = IPAddress.Parse(destination);
- IPHostEntry entry = Dns.GetHostEntry(addr);
- string[] destinationHost = new string[] { destination };
-
- migrationSettingData.LateBoundObject["MigrationType"] = MigrationType.VirtualSystemAndStorage;
- migrationSettingData.LateBoundObject["TransportType"] = TransportType.TCP;
- migrationSettingData.LateBoundObject["DestinationIPAddressList"] = destinationHost;
- string migrationSettings = migrationSettingData.LateBoundObject.GetText(System.Management.TextFormat.CimDtd20);
-
- ManagementPath jobPath;
- var ret_val = service.MigrateVirtualSystemToHost(vm.Path, entry.HostName, migrationSettings, rasds, null, out jobPath);
- if (ret_val == ReturnCode.Started)
- {
- MigrationJobCompleted(jobPath);
- }
- else if (ret_val != ReturnCode.Completed)
- {
- var errMsg = string.Format(
- "Failed migrating VM {0} and its volumes to destination {1} (GUID {2}) due to {3}",
- vm.ElementName,
- destination,
- vm.Name,
- ReturnCode.ToString(ret_val));
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- throw ex;
- }
- }
-
- /// <summary>
- /// Create new storage media resources, e.g. hard disk images and ISO disk images
- /// see http://msdn.microsoft.com/en-us/library/hh859775(v=vs.85).aspx
- /// </summary>
- /// <param name="wmiQuery"></param>
- /// <returns></returns>
- private static StorageAllocationSettingData CloneStorageAllocationSetting(string wmiQuery)
- {
- var defaultDiskImageSettingsObjs = StorageAllocationSettingData.GetInstances(wmiQuery);
-
- // assert
- if (defaultDiskImageSettingsObjs.Count != 1)
- {
- var errMsg = string.Format("Failed to find Msvm_StorageAllocationSettingData for the query {0}", wmiQuery);
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- throw ex;
- }
-
- StorageAllocationSettingData defaultDiskDriveSettings = defaultDiskImageSettingsObjs.OfType<StorageAllocationSettingData>().First();
- return new StorageAllocationSettingData((ManagementBaseObject)defaultDiskDriveSettings.LateBoundObject.Clone());
- }
-
- /// < summary>
- /// Removes a storage resource from a computer system.
- /// </summary>
- /// <param name="storageSettings">Path that uniquely identifies the resource.</param>
- /// <param name="vm">VM to which the disk image will be attached.</param>
- // Add new
- private void RemoveNetworkResource(ManagementPath resourcePath)
- {
- var virtSwitchMgmtSvc = GetVirtualSwitchManagementService();
- ManagementPath jobPath;
- var ret_val = virtSwitchMgmtSvc.RemoveResourceSettings(
- new ManagementPath[] { resourcePath },
- 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 remove network resources {0} from switch due to {1}",
- resourcePath.Path,
- ReturnCode.ToString(ret_val));
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- throw ex;
- }
- }
-
- /// < summary>
- /// Removes a storage resource from a computer system.
- /// </summary>
- /// <param name="storageSettings">Path that uniquely identifies the resource.</param>
- /// <param name="vm">VM to which the disk image will be attached.</param>
- private void RemoveStorageResource(ManagementPath resourcePath, ComputerSystem vm)
- {
- var virtSysMgmtSvc = GetVirtualisationSystemManagementService();
-
- ManagementPath jobPath;
- var ret_val = virtSysMgmtSvc.RemoveResourceSettings(
- new ManagementPath[] { resourcePath },
- 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 remove resource {0} from VM {1} (GUID {2}) due to {3}",
- resourcePath.Path,
- vm.ElementName,
- vm.Name,
- ReturnCode.ToString(ret_val));
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- throw ex;
- }
- }
-
- 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;
- // DateTime is unused
- var ret_val = vm.RequestStateChange(requiredState, new DateTime(), out jobPath);
-
- // If the Job is done asynchronously
- if (ret_val == ReturnCode.Started)
- {
- JobCompleted(jobPath);
- }
- else if (ret_val == 32775)
- { // TODO: check
- 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
- /// <summary>
- /// Delete switch port by removing settings from the switch
- /// </summary>
- /// <param name="elementName"></param>
- /// <returns></returns>
- public void DeleteSwitchPort(string elementName)
- {
- // Get NIC path
- var condition = string.Format("ElementName=\"{0}\"", elementName);
- var virtSwitchMgmtSvc = GetVirtualSwitchManagementService();
-
- var switchPortCollection = EthernetSwitchPort.GetInstances(virtSwitchMgmtSvc.Scope, condition);
- if (switchPortCollection.Count == 0)
- {
- return;
- }
-
- foreach (EthernetSwitchPort port in switchPortCollection)
- {
- var settings = GetSyntheticEthernetPortSettings(port);
- RemoveNetworkResource(settings.Path);
- }
- }
-
- public SyntheticEthernetPortSettingData GetSyntheticEthernetPortSettings(EthernetSwitchPort port)
- {
- // An ASSOCIATOR object provides the cross reference from the EthernetSwitchPort and the
- // SyntheticEthernetPortSettingData, 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(port.Path.Path, SyntheticEthernetPortSettingData.CreatedClassName);
-
- // NB: default scope of ManagementObjectSearcher is '\\.\root\cimv2', which does not contain
- // the virtualisation objects.
- var wmiObjectSearch = new ManagementObjectSearcher(port.Scope, wmiObjQuery);
- var wmiObjCollection = new SyntheticEthernetPortSettingData.SyntheticEthernetPortSettingDataCollection(wmiObjectSearch.Get());
-
- // When snapshots are taken into account, there can be multiple settings objects
- // take the first one that isn't a snapshot
- foreach (SyntheticEthernetPortSettingData wmiObj in wmiObjCollection)
- {
- return wmiObj;
- }
-
- var errMsg = string.Format("No SyntheticEthernetPortSettingData for port {0}, path {1}", port.ElementName, port.Path.Path);
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- throw ex;
- }
-
- /// <summary>
- /// Adds storage images to coputer system (disk image, iso image).
- /// </summary>
- /// <param name="storageSettings">Msvm_StorageAllocationSettings with HostResource configured with image
- /// file and Parent set to a controller associated with the ComputerSystem</param>
- /// <param name="vm">VM to which the disk image will be attached.</param>
- // Add new
- private ManagementPath[] AddStorageResource(string[] storageSettings, ComputerSystem vm)
- {
- return AddVirtualResource(storageSettings, vm);
- }
-
- private ManagementPath[] AddVirtualResource(string[] resourceSettings, ComputerSystem vm )
- {
- var virtSysMgmtSvc = GetVirtualisationSystemManagementService();
-
- ManagementPath jobPath;
- ManagementPath[] resourcePaths;
- var ret_val = virtSysMgmtSvc.AddResourceSettings(
- vm.Path,
- resourceSettings,
- 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[] AddFeatureSettings(string[] featureSettings, ManagementPath affectedConfiguration)
- {
- var virtSysMgmtSvc = GetVirtualisationSystemManagementService();
-
- ManagementPath jobPath;
- ManagementPath[] resultSettings;
- var ret_val = virtSysMgmtSvc.AddFeatureSettings(
- affectedConfiguration,
- featureSettings,
- out jobPath,
- out resultSettings);
-
- // 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 features settings {0} to resource {1} due to {2}",
- featureSettings,
- affectedConfiguration,
- ReturnCode.ToString(ret_val));
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- throw ex;
- }
-
- return resultSettings;
- }
-
- private ManagementPath SetPortVlan(string vlan, EthernetPortAllocationSettingData portPath)
- {
- logger.DebugFormat("Setting VLAN to {0}", vlan);
-
- var vmVirtMgmtSvc = GetVirtualisationSystemManagementService();
- EthernetSwitchPortVlanSettingData.GetInstances();
-
- // Create NIC resource by cloning the default NIC
- var vlanSettings = EthernetSwitchPortVlanSettingData.GetInstances(vmVirtMgmtSvc.Scope, "InstanceID LIKE \"%Default\"");
-
- // Assert
- if (vlanSettings.Count != 1)
- {
- var errMsg = string.Format("Internal error, could not find default EthernetSwitchPortVlanSettingData instance");
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- throw ex;
- }
- var defaultVlanSettings = vlanSettings.OfType<EthernetSwitchPortVlanSettingData>().First();
-
- var newVlanSettings = new EthernetSwitchPortVlanSettingData((ManagementBaseObject)defaultVlanSettings.LateBoundObject.Clone());
-
- // Assign configuration to new NIC
- newVlanSettings.LateBoundObject["AccessVlanId"] = vlan;
- newVlanSettings.LateBoundObject["OperationMode"] = 1; // Access=1, trunk=2, private=3 ;
- newVlanSettings.CommitObject();
-
- // Insert NIC into vm
- string[] newResources = new string[] { newVlanSettings.LateBoundObject.GetText(System.Management.TextFormat.CimDtd20) };
- ManagementPath[] newResourcePaths = AddFeatureSettings(newResources, portPath.Path);
-
- // assert
- if (newResourcePaths.Length != 1)
- {
- var errMsg = string.Format(
- "Failed to properly set VLAN to {0} for NIC on port {1}",
- vlan,
- portPath.Path);
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- throw ex;
- }
-
- return newResourcePaths[0];
- }
-
- private void SetBandWidthLimit(ulong limit, EthernetPortAllocationSettingData portPath)
- {
- logger.DebugFormat("Setting network rate limit to {0}", limit);
-
- var vmVirtMgmtSvc = GetVirtualisationSystemManagementService();
- var bandwidthSettings = EthernetSwitchPortBandwidthSettingData.GetInstances(vmVirtMgmtSvc.Scope, "InstanceID LIKE \"%Default\"");
-
- // Assert
- if (bandwidthSettings.Count != 1)
- {
- var errMsg = string.Format("Internal error, could not find default EthernetSwitchPortBandwidthSettingData instance");
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- throw ex;
- }
- var defaultBandwidthSettings = bandwidthSettings.OfType<EthernetSwitchPortBandwidthSettingData>().First();
-
- var newBandwidthSettings = new EthernetSwitchPortBandwidthSettingData((ManagementBaseObject)defaultBandwidthSettings.LateBoundObject.Clone());
- newBandwidthSettings.Limit = limit * 1000000;
-
- // Insert bandwidth settings to nic
- string[] newResources = new string[] { newBandwidthSettings.LateBoundObject.GetText(System.Management.TextFormat.CimDtd20) };
- ManagementPath[] newResourcePaths = AddFeatureSettings(newResources, portPath.Path);
-
- // assert
- if (newResourcePaths.Length != 1)
- {
- var errMsg = string.Format(
- "Failed to properly apply network rate limit {0} for NIC on port {1}",
- limit,
- portPath.Path);
- var ex = new WmiException(errMsg);
- logger.Error(errMsg, ex);
- throw ex;
- }
- }
-
-
- /// <summary>
- /// External VSwitch has an external NIC, and we assume there is only one external NIC and one external vswitch.
- /// </summary>
- /// <param name="vmSettings"></param>
- /// <returns></ret
<TRUNCATED>
[2/2] git commit: updated refs/heads/4.4 to 095fb09
Posted by da...@apache.org.
CLOUDSTACK-6518 [Hyper-V] Efficient way of finding the empty nic in VR/VpcVR to configure VPC entities
(cherry picked from commit cf41ccaa5b6475dace0bddbe6681c98cc5149189)
Conflicts:
plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs
plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/IWmiCallsV2.cs
plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/WmiCallsV2.cs
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/095fb09b
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/095fb09b
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/095fb09b
Branch: refs/heads/4.4
Commit: 095fb09b7519289ab0d2ae3a880c5477d0cb52cc
Parents: 2025f35
Author: Rajesh Battala <ra...@citrix.com>
Authored: Mon May 5 12:55:59 2014 +0530
Committer: Daan Hoogland <da...@onecht.net>
Committed: Mon Jul 28 23:21:37 2014 +0200
----------------------------------------------------------------------
.../HypervResource/HypervResourceController.cs | 222 +-
.../HypervResource/IWmiCallsV2.cs | 8 +-
.../ServerResource/HypervResource/WmiCallsV2.cs | 2409 ++++--------------
3 files changed, 588 insertions(+), 2051 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/095fb09b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs
index 41a3a8a..40ac159 100644
--- a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs
+++ b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs
@@ -857,29 +857,11 @@ namespace HypervResource
{
using (log4net.NDC.Push(Guid.NewGuid().ToString()))
{
- logger.Info(CloudStackTypes.MigrateVolumeCommand + Utils.CleanString(cmd.ToString()));
-
- string details = null;
- bool result = false;
-
- try
- {
- string vm = (string)cmd.attachedVmName;
- string volume = (string)cmd.volumePath;
- wmiCallsV2.MigrateVolume(vm, volume, GetStoragePoolPath(cmd.pool));
- result = true;
- }
- catch (Exception sysEx)
- {
- details = CloudStackTypes.MigrateVolumeCommand + " failed due to " + sysEx.Message;
- logger.Error(details, sysEx);
- }
-
+ logger.Info(CloudStackTypes.PlugNicCommand + Utils.CleanString(cmd.ToString()));
object ansContent = new
{
- result = result,
- volumePath = (string)cmd.volumePath,
- details = details,
+ result = true,
+ details = "Hot Nic plug not supported, change any empty virtual network adapter network settings",
contextMap = contextMap
};
@@ -1193,28 +1175,21 @@ namespace HypervResource
string details = null;
bool result = false;
- List<dynamic> volumeTos = new List<dynamic>();
-
- try
+ String vmName = cmd.vmName;
+ String vlan = cmd.vlan;
+ string macAddress = cmd.macAddress;
+ uint pos = cmd.index;
+ bool enable = cmd.enable;
+ string switchLableName = cmd.switchLableName;
+ if (macAddress != null)
{
- string vm = (string)cmd.vm.name;
- string destination = (string)cmd.tgtHost;
- var volumeToPoolList = cmd.volumeToFilerAsList;
- var volumeToPool = new Dictionary<string, string>();
- foreach (var item in volumeToPoolList)
- {
- volumeTos.Add(item.t);
- string poolPath = GetStoragePoolPath(item.u);
- volumeToPool.Add((string)item.t.path, poolPath);
- }
-
- wmiCallsV2.MigrateVmWithVolume(vm, destination, volumeToPool);
+ wmiCallsV2.ModifyVmVLan(vmName, vlan, macAddress);
result = true;
}
- catch (Exception sysEx)
- {
- details = CloudStackTypes.MigrateWithStorageCommand + " failed due to " + sysEx.Message;
- logger.Error(details, sysEx);
+ else if (pos >= 1)
+ {
+ wmiCallsV2.ModifyVmVLan(vmName, vlan, pos, enable, switchLableName);
+ result = true;
}
object ansContent = new
@@ -1259,142 +1234,45 @@ namespace HypervResource
{
using (log4net.NDC.Push(Guid.NewGuid().ToString()))
{
- logger.Info(cmdArray.ToString());
- // Log agent configuration
- logger.Info("Agent StartupRoutingCommand received " + cmdArray.ToString());
- dynamic strtRouteCmd = cmdArray[0][CloudStackTypes.StartupRoutingCommand];
-
- // Insert networking details
- string privateIpAddress = strtRouteCmd.privateIpAddress;
- config.PrivateIpAddress = privateIpAddress;
- string subnet;
- System.Net.NetworkInformation.NetworkInterface privateNic = GetNicInfoFromIpAddress(privateIpAddress, out subnet);
- strtRouteCmd.privateIpAddress = privateIpAddress;
- strtRouteCmd.privateNetmask = subnet;
- strtRouteCmd.privateMacAddress = privateNic.GetPhysicalAddress().ToString();
- string storageip = strtRouteCmd.storageIpAddress;
- System.Net.NetworkInformation.NetworkInterface storageNic = GetNicInfoFromIpAddress(storageip, out subnet);
-
- strtRouteCmd.storageIpAddress = storageip;
- strtRouteCmd.storageNetmask = subnet;
- strtRouteCmd.storageMacAddress = storageNic.GetPhysicalAddress().ToString();
- strtRouteCmd.gatewayIpAddress = storageNic.GetPhysicalAddress().ToString();
- strtRouteCmd.hypervisorVersion = System.Environment.OSVersion.Version.Major.ToString() + "." +
- System.Environment.OSVersion.Version.Minor.ToString();
- strtRouteCmd.caps = "hvm";
-
- dynamic details = strtRouteCmd.hostDetails;
- if (details != null)
- {
- string productVersion = System.Environment.OSVersion.Version.Major.ToString() + "." +
- System.Environment.OSVersion.Version.Minor.ToString();
- details.Add("product_version", productVersion);
- details.Add("rdp.server.port", 2179);
- }
-
- // Detect CPUs, speed, memory
- uint cores;
- uint mhz;
- uint sockets;
- wmiCallsV2.GetProcessorResources(out sockets, out cores, out mhz);
- strtRouteCmd.cpus = cores;
- strtRouteCmd.speed = mhz;
- strtRouteCmd.cpuSockets = sockets;
- ulong memoryKBs;
- ulong freeMemoryKBs;
- wmiCallsV2.GetMemoryResources(out memoryKBs, out freeMemoryKBs);
- strtRouteCmd.memory = memoryKBs * 1024; // Convert to bytes
-
- // Need 2 Gig for DOM0, see http://technet.microsoft.com/en-us/magazine/hh750394.aspx
- strtRouteCmd.dom0MinMemory = config.ParentPartitionMinMemoryMb * 1024 * 1024; // Convert to bytes
-
- // Insert storage pool details.
- //
- // Read the localStoragePath for virtual disks from the Hyper-V configuration
- // See http://blogs.msdn.com/b/virtual_pc_guy/archive/2010/05/06/managing-the-default-virtual-machine-location-with-hyper-v.aspx
- // for discussion of Hyper-V file locations paths.
- string localStoragePath = wmiCallsV2.GetDefaultVirtualDiskFolder();
- if (localStoragePath != null)
+ logger.Info(CloudStackTypes.GetVmConfigCommand + Utils.CleanString(cmd.ToString()));
+ bool result = false;
+ String vmName = cmd.vmName;
+ ComputerSystem vm = wmiCallsV2.GetComputerSystem(vmName);
+ List<NicDetails> nicDetails = new List<NicDetails>();
+ var nicSettingsViaVm = wmiCallsV2.GetEthernetPortSettings(vm);
+ NicDetails nic = null;
+ int index = 0;
+ int[] nicStates = new int[8];
+ int[] nicVlan = new int[8];
+ int vlanid = 1;
+
+ var ethernetConnections = wmiCallsV2.GetEthernetConnections(vm);
+ foreach (EthernetPortAllocationSettingData item in ethernetConnections)
+ {
+ EthernetSwitchPortVlanSettingData vlanSettings = wmiCallsV2.GetVlanSettings(item);
+ if (vlanSettings == null)
+ {
+ vlanid = -1;
+ }
+ else
+ {
+ vlanid = vlanSettings.AccessVlanId;
+ }
+ nicStates[index] = (Int32)(item.EnabledState);
+ nicVlan[index] = vlanid;
+ index++;
+ }
+
+ index = 0;
+ foreach (SyntheticEthernetPortSettingData item in nicSettingsViaVm)
{
- // GUID arbitrary. Host agents deals with storage pool in terms of localStoragePath.
- // We use HOST guid.
- string poolGuid = strtRouteCmd.guid;
-
- if (poolGuid == null)
- {
- poolGuid = Guid.NewGuid().ToString();
- logger.InfoFormat("Setting Startup StoragePool GUID to " + poolGuid);
- }
- else
- {
- logger.InfoFormat("Setting Startup StoragePool GUID same as HOST, i.e. " + poolGuid);
- }
-
- long capacity;
- long available;
- GetCapacityForLocalPath(localStoragePath, out capacity, out available);
-
- logger.Debug(CloudStackTypes.StartupStorageCommand + " set available bytes to " + available);
-
- string ipAddr = strtRouteCmd.privateIpAddress;
- var vmStates = wmiCallsV2.GetVmSync(config.PrivateIpAddress);
- strtRouteCmd.vms = Utils.CreateCloudStackMapObject(vmStates);
-
- StoragePoolInfo pi = new StoragePoolInfo(
- poolGuid.ToString(),
- ipAddr,
- localStoragePath,
- localStoragePath,
- StoragePoolType.Filesystem.ToString(),
- capacity,
- available);
-
- // Build StartupStorageCommand using an anonymous type
- // See http://stackoverflow.com/a/6029228/939250
- object ansContent = new
- {
- poolInfo = pi,
- guid = pi.uuid,
- dataCenter = strtRouteCmd.dataCenter,
- resourceType = StorageResourceType.STORAGE_POOL.ToString(), // TODO: check encoding
- contextMap = contextMap
- };
- JObject ansObj = Utils.CreateCloudStackObject(CloudStackTypes.StartupStorageCommand, ansContent);
- cmdArray.Add(ansObj);
+ nic = new NicDetails(item.Address, nicVlan[index], nicStates[index]);
+ index++;
+ nicDetails.Add(nic);
}
- // Convert result to array for type correctness?
- logger.Info(CloudStackTypes.StartupCommand + " result is " + cmdArray.ToString());
- return cmdArray;
- }
- }
-
- // POST api/HypervResource/GetVncPortCommand
- [HttpPost]
- [ActionName(CloudStackTypes.GetVncPortCommand)]
- public JContainer GetVncPortCommand([FromBody]dynamic cmd)
- {
- using (log4net.NDC.Push(Guid.NewGuid().ToString()))
- {
- logger.Info(CloudStackTypes.GetVncPortCommand + Utils.CleanString(cmd.ToString()));
-
- string details = null;
- bool result = false;
- string address = null;
- int port = -9;
- try
- {
- string vmName = (string)cmd.name;
- var sys = wmiCallsV2.GetComputerSystem(vmName);
- address = "instanceId=" + sys.Name ;
- result = true;
- }
- catch (Exception sysEx)
- {
- details = CloudStackTypes.GetVncPortAnswer + " failed due to " + sysEx.Message;
- logger.Error(details, sysEx);
- }
+ result = true;
object ansContent = new
{
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/095fb09b/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 0a64f4b..896a287 100644
--- a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/IWmiCallsV2.cs
+++ b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/IWmiCallsV2.cs
@@ -71,8 +71,8 @@ namespace HypervResource
Dictionary<String, VmState> GetVmSync(String privateIpAddress);
string GetVmNote(System.Management.ManagementPath sysPath);
void ModifyVmVLan(string vmName, String vlanid, string mac);
- void ModifyVmVLan(string vmName, String vlanid, uint pos, bool enable, string switchLabelName);
- void DisableVmNics();
+ void ModifyVmVLan(string vmName, String vlanid, uint pos, bool enable, string switchLabelName);
+ void DisableVmNics();
void DisableNicVlan(String mac, String vmName);
- }
-}
+ }
+}