cloudstack-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "ASF GitHub Bot (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CLOUDSTACK-10107) VMware VM fails to start if it has more than 7 nics
Date Wed, 25 Oct 2017 04:27:00 GMT

    [ https://issues.apache.org/jira/browse/CLOUDSTACK-10107?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16218072#comment-16218072
] 

ASF GitHub Bot commented on CLOUDSTACK-10107:
---------------------------------------------

rhtyd closed pull request #2288: CLOUDSTACK-10107: For VMware VMs add devices without unit
number
URL: https://github.com/apache/cloudstack/pull/2288
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index ccb5d0f7abb..17064ff0d1e 100644
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -1085,18 +1085,15 @@ private PlugNicAnswer execute(PlugNicCommand cmd) {
                 ManagedObjectReference dvsMor = dataCenterMo.getDvSwitchMor(networkInfo.first());
                 dvSwitchUuid = dataCenterMo.getDvSwitchUuid(dvsMor);
                 s_logger.info("Preparing NIC device on dvSwitch : " + dvSwitchUuid);
-                nic =
-                        VmwareHelper.prepareDvNicDevice(vmMo, networkInfo.first(), nicDeviceType,
networkInfo.second(), dvSwitchUuid, nicTo.getMac(), deviceNumber,
-                                deviceNumber + 1, true, true);
+                nic = VmwareHelper.prepareDvNicDevice(vmMo, networkInfo.first(), nicDeviceType,
networkInfo.second(), dvSwitchUuid,
+                        nicTo.getMac(), deviceNumber + 1, true, true);
             } else {
                 s_logger.info("Preparing NIC device on network " + networkInfo.second());
-                nic =
-                        VmwareHelper.prepareNicDevice(vmMo, networkInfo.first(), nicDeviceType,
networkInfo.second(), nicTo.getMac(), deviceNumber, deviceNumber + 1, true,
-                                true);
+                nic = VmwareHelper.prepareNicDevice(vmMo, networkInfo.first(), nicDeviceType,
networkInfo.second(),
+                        nicTo.getMac(), deviceNumber + 1, true, true);
             }
 
             VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec();
-            //VirtualDeviceConfigSpec[] deviceConfigSpecArray = new VirtualDeviceConfigSpec[1];
             VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec();
             deviceConfigSpec.setDevice(nic);
             deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD);
@@ -1754,7 +1751,6 @@ protected StartAnswer execute(StartCommand cmd) {
             int i = 0;
             int ideUnitNumber = 0;
             int scsiUnitNumber = 0;
-            int nicUnitNumber = 0;
             int ideControllerKey = vmMo.getIDEDeviceControllerKey();
             int scsiControllerKey = vmMo.getGenericScsiDeviceControllerKeyNoException();
             int controllerKey;
@@ -2016,21 +2012,21 @@ protected StartAnswer execute(StartCommand cmd) {
                         ManagedObjectReference dvsMor = dataCenterMo.getDvSwitchMor(networkInfo.first());
                         dvSwitchUuid = dataCenterMo.getDvSwitchUuid(dvsMor);
                         s_logger.info("Preparing NIC device on dvSwitch : " + dvSwitchUuid);
-                        nic =
-                                VmwareHelper.prepareDvNicDevice(vmMo, networkInfo.first(),
nicDeviceType, networkInfo.second(), dvSwitchUuid, nicTo.getMac(), nicUnitNumber++,
-                                        i + 1, true, true);
+                        nic = VmwareHelper.prepareDvNicDevice(vmMo, networkInfo.first(),
nicDeviceType, networkInfo.second(), dvSwitchUuid,
+                                nicTo.getMac(), i + 1, true, true);
                         if (nicTo.getUuid() != null) {
                             nicUuidToDvSwitchUuid.put(nicTo.getUuid(), dvSwitchUuid);
                         }
                     } else {
                         s_logger.info("Preparing NIC device on network " + networkInfo.second());
-                        nic =
-                                VmwareHelper.prepareNicDevice(vmMo, networkInfo.first(),
nicDeviceType, networkInfo.second(), nicTo.getMac(), nicUnitNumber++, i + 1, true, true);
+                        nic = VmwareHelper.prepareNicDevice(vmMo, networkInfo.first(), nicDeviceType,
networkInfo.second(),
+                                nicTo.getMac(), i + 1, true, true);
                     }
                 }
                 else{
                     //if NSX API VERSION >= 4.2, connect to br-int (nsx.network), do not
create portgroup else previous behaviour
-                    nic = VmwareHelper.prepareNicOpaque(vmMo, nicDeviceType, networkInfo.second(),
nicTo.getMac(), nicUnitNumber++, i + 1, true, true);
+                    nic = VmwareHelper.prepareNicOpaque(vmMo, nicDeviceType, networkInfo.second(),
+                            nicTo.getMac(), i + 1, true, true);
                 }
 
                 deviceConfigSpecArray[i] = new VirtualDeviceConfigSpec();
diff --git a/test/integration/smoke/test_nic.py b/test/integration/smoke/test_nic.py
index 9dc385c5432..c7f8468d7f2 100644
--- a/test/integration/smoke/test_nic.py
+++ b/test/integration/smoke/test_nic.py
@@ -32,6 +32,8 @@
 import sys
 import logging
 import time
+import threading
+import Queue
 
 
 class TestNic(cloudstackTestCase):
@@ -316,6 +318,141 @@ def test_02_nic_with_mac(self):
 
         self.assertTrue(found, "Nic not successfully added with specified mac address")
 
+
+    @attr(tags = ["devcloud", "advanced", "advancedns", "smoke"], required_hardware="true")
+    def test_03_nic_multiple_vmware(self):
+        """Test to adding multiple nics to a VMware VM and restarting VM
+
+           Refer to CLOUDSTACK-10107 for details, in this test we add 8 nics to
+           a VM and stop, start it to show that VMware VMs are not limited to
+           having up to 7 nics.
+        """
+
+        if self.hypervisor.lower() != "vmware":
+            self.skipTest("Skipping test applicable for VMware")
+
+        network_offering = NetworkOffering.create(
+            self.apiclient,
+            self.services["nw_off_isolated_persistent"]
+        )
+        self.cleanup.insert(0, network_offering)
+        network_offering.update(self.apiclient, state='Enabled')
+
+        offering = dict(self.services["network"])
+        offering["networkoffering"] = network_offering.id
+
+        networks = []
+
+        def createNetwork(idx):
+            offering["name"] = "Test Network%s" % idx
+            network = Network.create(
+                self.apiclient,
+                offering,
+                self.account.name,
+                self.account.domainid,
+                zoneid=self.services["network"]["zoneid"]
+            )
+            networks.append(network)
+            self.cleanup.insert(0, network)
+
+
+        class NetworkMaker(threading.Thread):
+            def __init__(self, queue=None, createNetwork=None):
+                threading.Thread.__init__(self)
+                self.queue = queue
+                self.createNetwork = createNetwork
+
+            def run(self):
+                while True:
+                    idx = self.queue.get()
+                    if idx is not None:
+                        self.createNetwork(idx)
+                    self.queue.task_done()
+
+        # Start multiple networks
+        tsize = 8
+        queue = Queue.Queue()
+        for _ in range(tsize):
+            worker = NetworkMaker(queue, createNetwork)
+            worker.setDaemon(True)
+            worker.start()
+
+        for idx in range(tsize):
+            queue.put(idx)
+        queue.join()
+
+        # Deploy a VM
+        vm = VirtualMachine.create(
+            self.apiclient,
+            self.services["small"],
+            accountid=self.account.name,
+            domainid=self.account.domainid,
+            serviceofferingid=self.service_offering.id,
+            networkids=[networks[0].id],
+            mode=self.zone.networktype
+        )
+        self.cleanup.insert(0, vm)
+
+        # Add nics to networks
+        for network in networks[1:]:
+            response = vm.add_nic(self.apiclient, network.id)
+            found = False
+            for nic in response.nic:
+                if nic.networkid == network.id:
+                    found = True
+                    break
+            self.assertTrue(found, "Nic not successfully added for the specific network")
+
+        # Stop VM
+        vm.stop(self.apiclient, forced=True)
+
+        vms = VirtualMachine.list(
+            self.apiclient,
+            id=vm.id
+        )
+        self.assertEqual(
+                validateList(vms)[0],
+                PASS,
+                "vms list validation failed")
+
+        vm_response = vms[0]
+        self.assertEqual(
+            vm_response.state,
+            "Stopped",
+            "Verify the VM is stopped"
+        )
+
+        # Start VM
+        vm.start(self.apiclient)
+
+        vms = VirtualMachine.list(
+            self.apiclient,
+            id=vm.id
+        )
+        self.assertEqual(
+                validateList(vms)[0],
+                PASS,
+                "vms list validation failed")
+
+        vm_response = vms[0]
+        self.assertEqual(
+            vm_response.state,
+            "Running",
+            "Verify the VM is running"
+        )
+
+        self.assertTrue(len(vm_response.nic) == len(networks), "Number of nics on VM not
8")
+
+        # Validate nics exist on each of the network
+        for network in networks:
+            found = False
+            for nic in vm_response.nic:
+                if nic.networkid == network.id:
+                    found = True
+                    break
+            self.assertTrue(found, "Nic not found for the specific network")
+
+
     def tearDown(self):
         try:
             for obj in self.cleanup:
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java
index 65dfe7bd713..dddab4de5ad 100644
--- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java
@@ -89,7 +89,7 @@ public static boolean isReservedScsiDeviceNumber(int deviceNumber) {
     }
 
     public static VirtualDevice prepareNicOpaque(VirtualMachineMO vmMo, VirtualEthernetCardType
deviceType, String portGroupName,
-            String macAddress, int deviceNumber, int contextNumber, boolean conntected, boolean
connectOnStart) throws Exception {
+            String macAddress, int contextNumber, boolean connected, boolean connectOnStart)
throws Exception {
 
         assert(vmMo.getRunningHost().hasOpaqueNSXNetwork());
 
@@ -123,18 +123,17 @@ public static VirtualDevice prepareNicOpaque(VirtualMachineMO vmMo,
VirtualEther
 
         VirtualDeviceConnectInfo connectInfo = new VirtualDeviceConnectInfo();
         connectInfo.setAllowGuestControl(true);
-        connectInfo.setConnected(conntected);
+        connectInfo.setConnected(connected);
         connectInfo.setStartConnected(connectOnStart);
         nic.setAddressType("Manual");
         nic.setConnectable(connectInfo);
         nic.setMacAddress(macAddress);
-        nic.setUnitNumber(deviceNumber);
         nic.setKey(-contextNumber);
         return nic;
     }
 
     public static VirtualDevice prepareNicDevice(VirtualMachineMO vmMo, ManagedObjectReference
morNetwork, VirtualEthernetCardType deviceType, String portGroupName,
-            String macAddress, int deviceNumber, int contextNumber, boolean conntected, boolean
connectOnStart) throws Exception {
+            String macAddress, int contextNumber, boolean connected, boolean connectOnStart)
throws Exception {
 
         VirtualEthernetCard nic;
         switch (deviceType) {
@@ -166,18 +165,17 @@ public static VirtualDevice prepareNicDevice(VirtualMachineMO vmMo,
ManagedObjec
 
         VirtualDeviceConnectInfo connectInfo = new VirtualDeviceConnectInfo();
         connectInfo.setAllowGuestControl(true);
-        connectInfo.setConnected(conntected);
+        connectInfo.setConnected(connected);
         connectInfo.setStartConnected(connectOnStart);
         nic.setAddressType("Manual");
         nic.setConnectable(connectInfo);
         nic.setMacAddress(macAddress);
-        nic.setUnitNumber(deviceNumber);
         nic.setKey(-contextNumber);
         return nic;
     }
 
     public static VirtualDevice prepareDvNicDevice(VirtualMachineMO vmMo, ManagedObjectReference
morNetwork, VirtualEthernetCardType deviceType, String dvPortGroupName,
-            String dvSwitchUuid, String macAddress, int deviceNumber, int contextNumber,
boolean conntected, boolean connectOnStart) throws Exception {
+            String dvSwitchUuid, String macAddress, int contextNumber, boolean connected,
boolean connectOnStart) throws Exception {
 
         VirtualEthernetCard nic;
         switch (deviceType) {
@@ -210,16 +208,13 @@ public static VirtualDevice prepareDvNicDevice(VirtualMachineMO vmMo,
ManagedObj
         dvPortConnection.setPortgroupKey(morNetwork.getValue());
         dvPortBacking.setPort(dvPortConnection);
         nic.setBacking(dvPortBacking);
-        nic.setKey(30);
 
         connectInfo.setAllowGuestControl(true);
-        connectInfo.setConnected(conntected);
+        connectInfo.setConnected(connected);
         connectInfo.setStartConnected(connectOnStart);
         nic.setAddressType("Manual");
         nic.setConnectable(connectInfo);
         nic.setMacAddress(macAddress);
-
-        nic.setUnitNumber(deviceNumber);
         nic.setKey(-contextNumber);
         return nic;
     }


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


> VMware VM fails to start if it has more than 7 nics
> ---------------------------------------------------
>
>                 Key: CLOUDSTACK-10107
>                 URL: https://issues.apache.org/jira/browse/CLOUDSTACK-10107
>             Project: CloudStack
>          Issue Type: Bug
>      Security Level: Public(Anyone can view this level - this is the default.) 
>            Reporter: Rohit Yadav
>            Assignee: Rohit Yadav
>             Fix For: Future, 4.11.0.0
>
>
> The maximum number of NICs that a vSphere based virtual machine is 10 virtual NICs.  However a 
> CloudStack created Instance cannot start if there are greater than 7 NICs attached.  More that 7 NICs can be 
> attached via CloudStack if the VM is already running it is only the start process that fails if more than 7 NICs 
> have been attached. 
> If a VM has greater that 7 NICs a management server log message similar to the following is created: 
> StartCommand failed due to Exception: java.lang.RuntimeException
> Message: Invalid configuration for device '10'.
> java.lang.RuntimeException: Invalid configuration for device '10'.
> The vpxd.log on the vCenter shows: 
> ‐‐> Result:
> ‐‐> (vim.fault.InvalidDeviceSpec) {
> ‐‐>    faultCause = (vmodl.MethodFault) null,  
> ‐‐>    faultMessage = <unset>, 
> ‐‐>    property = "unitNumber",  
> ‐‐>    deviceIndex = 10
> ‐‐>    msg = "Invalid configuration for device '10'."
> ‐‐> }



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Mime
View raw message