You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ra...@apache.org on 2013/11/20 13:41:51 UTC

git commit: updated refs/heads/4.3 to c86d8e4

Updated Branches:
  refs/heads/4.3 f15c99776 -> c86d8e46e


Add support of attaching nic's to the specified network labels in HyperV


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/c86d8e46
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/c86d8e46
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/c86d8e46

Branch: refs/heads/4.3
Commit: c86d8e46e566321e6542f4744c71fdade88a9ca2
Parents: f15c997
Author: Rajesh Battala <ra...@citrix.com>
Authored: Wed Nov 20 17:55:34 2013 +0530
Committer: Rajesh Battala <ra...@citrix.com>
Committed: Wed Nov 20 17:56:39 2013 +0530

----------------------------------------------------------------------
 .../ServerResource/HypervResource/WmiCallsV2.cs | 41 ++++++++++++++------
 1 file changed, 30 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c86d8e46/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 0a58131..c99c305 100644
--- a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/WmiCallsV2.cs
+++ b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/WmiCallsV2.cs
@@ -336,8 +336,9 @@ namespace HypervResource
             }
 
             String publicIpAddress = "";
+            int nicCount = 0;
             // Add the Nics to the VM in the deviceId order.
-            for (int i = 0; i <= 2; i++)
+            foreach (var nc in nicInfo)
             {
                 foreach (var nic in nicInfo)
                 {
@@ -360,18 +361,23 @@ namespace HypervResource
                         }
                     }
 
-                    if (i == 2)
+                    if (nicCount == 2)
                     {
                          publicIpAddress = nic.ip;
                     }
 
-                    if (nicid == i)
+                    if (nicid == nicCount)
                     {
                         // Create network adapter
                         var newAdapter = CreateNICforVm(newVm, mac);
+                        String switchName ="";
+                        if (nic.name != null)
+                        {
+                            switchName =  nic.name;
+                        }
 
                         // connection to vswitch
-                        var portSettings = AttachNicToPort(newVm, newAdapter);
+                        var portSettings = AttachNicToPort(newVm, newAdapter, switchName);
 
                         // set vlan
                         if (vlan != null)
@@ -383,6 +389,7 @@ namespace HypervResource
                             newAdapter.Path, portSettings.Path, (vlan == null ? "No VLAN" : "VLAN " + vlan));
                     }
                 }
+                nicCount++;
             }
 
             // pass the boot args for the VM using KVP component.
@@ -459,10 +466,18 @@ namespace HypervResource
             return false;
         }
 
-        private EthernetPortAllocationSettingData AttachNicToPort(ComputerSystem newVm, SyntheticEthernetPortSettingData newAdapter)
+        private EthernetPortAllocationSettingData AttachNicToPort(ComputerSystem newVm, SyntheticEthernetPortSettingData newAdapter, String vSwitchName)
         {
             // Get the virtual switch
-            VirtualEthernetSwitch vSwitch = GetExternalVirtSwitch();
+            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\"");
@@ -1157,7 +1172,7 @@ namespace HypervResource
         {
             // Work back from the first *bound* external NIC we find.
             var externNICs = ExternalEthernetPort.GetInstances("IsBound = TRUE");
-
+            VirtualEthernetSwitch vSwitch = null;
             // Assert
             if (externNICs.Count == 0 )
             {
@@ -1166,8 +1181,7 @@ namespace HypervResource
                 logger.Error(errMsg, ex);
                 throw ex;
             }
-
-            ExternalEthernetPort externNIC = externNICs.OfType<ExternalEthernetPort>().First();
+            foreach(ExternalEthernetPort externNIC in externNICs.OfType<ExternalEthernetPort>()) { 
             // 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
@@ -1217,7 +1231,7 @@ namespace HypervResource
             var vSwitchQuery = new RelatedObjectQuery(switchPort.Path.Path, VirtualEthernetSwitch.CreatedClassName);
             var vSwitchSearch = new ManagementObjectSearcher(externNIC.Scope, vSwitchQuery);
             var vSwitchCollection = new VirtualEthernetSwitch.VirtualEthernetSwitchCollection(vSwitchSearch.Get());
-        
+
             // assert
             if (vSwitchCollection.Count < 1)
             {
@@ -1226,7 +1240,12 @@ namespace HypervResource
                 logger.Error(errMsg, ex);
                 throw ex;
             }
-            VirtualEthernetSwitch vSwitch = vSwitchCollection.OfType<VirtualEthernetSwitch>().First();
+            vSwitch = vSwitchCollection.OfType<VirtualEthernetSwitch>().First();
+            if (vSwitch.ElementName.Equals(vSwitchName) == true)
+            {
+                return vSwitch;
+            }
+            }
             return vSwitch;
         }