You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ta...@apache.org on 2014/11/04 07:31:27 UTC

[11/11] git commit: updated refs/heads/master to 8b636bd

CLOUDSTACK-7800: VMware - Hot plug/unplug NIC to/from VM only when vmware tools are installed, else assert for exception

Signed-off-by: SrikanteswaraRao Talluri <ta...@apache.org>


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

Branch: refs/heads/master
Commit: 8b636bd41e2cf737d9e35b24741a81cf0912a695
Parents: 9e19a9a
Author: Gaurav Aradhye <ga...@clogeny.com>
Authored: Tue Oct 28 11:05:20 2014 +0530
Committer: SrikanteswaraRao Talluri <ta...@apache.org>
Committed: Tue Nov 4 11:59:50 2014 +0530

----------------------------------------------------------------------
 test/integration/smoke/test_nic.py | 352 ++++++++++++++++++--------------
 1 file changed, 200 insertions(+), 152 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8b636bd4/test/integration/smoke/test_nic.py
----------------------------------------------------------------------
diff --git a/test/integration/smoke/test_nic.py b/test/integration/smoke/test_nic.py
index 488ed0a..f130bbe 100644
--- a/test/integration/smoke/test_nic.py
+++ b/test/integration/smoke/test_nic.py
@@ -15,24 +15,27 @@
 # specific language governing permissions and limitations
 # under the License.
 """ NIC tests for VM """
-import marvin
-from marvin.codes import FAILED
-from marvin.cloudstackTestCase import *
-from marvin.cloudstackAPI import *
-from marvin.sshClient import SshClient
-from marvin.lib.utils import *
-from marvin.lib.base import *
-from marvin.lib.common import *
+from marvin.cloudstackTestCase import cloudstackTestCase, unittest
+from marvin.lib.base import (Account,
+                             ServiceOffering,
+                             Network,
+                             VirtualMachine,
+                             NetworkOffering)
+from marvin.lib.common import (get_zone,
+                               get_template,
+                               get_domain)
 from nose.plugins.attrib import attr
 
 import signal
 import sys
 import time
 
+
 class TestNic(cloudstackTestCase):
 
     def setUp(self):
         self.cleanup = []
+
         def signal_handler(signal, frame):
             self.tearDown()
             sys.exit(0)
@@ -40,171 +43,217 @@ class TestNic(cloudstackTestCase):
         # assign the signal handler immediately
         signal.signal(signal.SIGINT, signal_handler)
 
-        hypervisor = self.testClient.getHypervisorInfo()
-        if hypervisor.lower() == "hyperv":
+        self.hypervisor = self.testClient.getHypervisorInfo()
+        if self.hypervisor.lower() == "hyperv":
             raise unittest.SkipTest("Not supported on Hyper-V")
 
         try:
             self.apiclient = self.testClient.getApiClient()
-            self.dbclient  = self.testClient.getDbConnection()
-            self.services  = self.testClient.getParsedTestDataConfig()
+            self.dbclient = self.testClient.getDbConnection()
+            self.services = self.testClient.getParsedTestDataConfig()
 
             # Get Zone, Domain and templates
             domain = get_domain(self.apiclient)
-            zone = get_zone(self.apiclient, self.testClient.getZoneForTests())
-            self.services['mode'] = zone.networktype
+            self.zone = get_zone(
+                self.apiclient,
+                self.testClient.getZoneForTests()
+                )
 
-            #if local storage is enabled, alter the offerings to use localstorage
-            #this step is needed for devcloud
-            if zone.localstorageenabled == True:
-                self.services["service_offerings"]["tiny"]["storagetype"] = 'local'
+            # if local storage is enabled, alter the offerings to use
+            # localstorage
+            # this step is needed for devcloud
+            if self.zone.localstorageenabled:
+                self.services["service_offerings"][
+                    "tiny"]["storagetype"] = 'local'
 
             template = get_template(
-                                self.apiclient,
-                                zone.id,
-                                self.services["ostype"]
-                                )
+                self.apiclient,
+                self.zone.id,
+                self.services["ostype"]
+            )
             # Set Zones and disk offerings
-            self.services["small"]["zoneid"] = zone.id
+            self.services["small"]["zoneid"] = self.zone.id
             self.services["small"]["template"] = template.id
 
-            self.services["iso1"]["zoneid"] = zone.id
-            self.services["network"]["zoneid"] = zone.id
+            self.services["iso1"]["zoneid"] = self.zone.id
+            self.services["network"]["zoneid"] = self.zone.id
 
             # Create Account, VMs, NAT Rules etc
             self.account = Account.create(
-                                self.apiclient,
-                                self.services["account"],
-                                domainid=domain.id
-                                )
+                self.apiclient,
+                self.services["account"],
+                domainid=domain.id
+            )
             self.cleanup.insert(0, self.account)
 
             self.service_offering = ServiceOffering.create(
-                                        self.apiclient,
-                                        self.services["service_offerings"]["tiny"]
-                                        )
+                self.apiclient,
+                self.services["service_offerings"]["tiny"]
+            )
             self.cleanup.insert(0, self.service_offering)
 
             ####################
-            ### Network offering
+            # Network offering
             self.network_offering = NetworkOffering.create(
-                                        self.apiclient,
-                                        self.services["network_offering"],
-                                        )
+                self.apiclient,
+                self.services["network_offering"],
+            )
             self.cleanup.insert(0, self.network_offering)
-            self.network_offering.update(self.apiclient, state='Enabled') # Enable Network offering
-            self.services["network"]["networkoffering"] = self.network_offering.id
+            self.network_offering.update(
+                self.apiclient,
+                state='Enabled')  # Enable Network offering
+            self.services["network"][
+                "networkoffering"] = self.network_offering.id
 
             self.network_offering_shared = NetworkOffering.create(
-                                        self.apiclient,
-                                        self.services["network_offering_shared"],
-                                        )
+                self.apiclient,
+                self.services["network_offering_shared"],
+            )
             self.cleanup.insert(0, self.network_offering_shared)
-            self.network_offering_shared.update(self.apiclient, state='Enabled') # Enable Network offering
-            self.services["network2"]["networkoffering"] = self.network_offering_shared.id
+            self.network_offering_shared.update(
+                self.apiclient,
+                state='Enabled')  # Enable Network offering
+            self.services["network2"][
+                "networkoffering"] = self.network_offering_shared.id
 
             ################
-            ### Test Network
+            # Test Network
             self.test_network = Network.create(
-                                                 self.apiclient,
-                                                 self.services["network"],
-                                                 self.account.name,
-                                                 self.account.domainid,
-                                                 )
+                self.apiclient,
+                self.services["network"],
+                self.account.name,
+                self.account.domainid,
+            )
             self.cleanup.insert(0, self.test_network)
             self.test_network2 = Network.create(
-                                                 self.apiclient,
-                                                 self.services["network2"],
-                                                 self.account.name,
-                                                 self.account.domainid,
-                                                 zoneid=self.services["network"]["zoneid"]
-                                                 )
+                self.apiclient,
+                self.services["network2"],
+                self.account.name,
+                self.account.domainid,
+                zoneid=self.services["network"]["zoneid"]
+            )
             self.cleanup.insert(0, self.test_network2)
         except Exception as ex:
             self.debug("Exception during NIC test SETUP!: " + str(ex))
 
-    @attr(tags = ["devcloud",  "smoke", "advanced", "advancedns"], required_hardware="true")
+    @attr(
+        tags=[
+            "devcloud",
+            "smoke",
+            "advanced",
+            "advancedns"],
+        required_hardware="true")
     def test_01_nic(self):
-        #TODO: SIMENH: add validation
+        # TODO: SIMENH: add validation
         """Test to add and update added nic to a virtual machine"""
 
-        try:
-            self.virtual_machine = VirtualMachine.create(
-                                        self.apiclient,
-                                        self.services["small"],
-                                        accountid=self.account.name,
-                                        domainid=self.account.domainid,
-                                        serviceofferingid=self.service_offering.id,
-                                        mode=self.services['mode'],
-                                        networkids=[self.test_network.id]
-                                    )
-            self.cleanup.insert(0, self.virtual_machine)
-            list_vm_response = list_virtual_machines(
-                                                     self.apiclient,
-                                                     id=self.virtual_machine.id
-                                                     )
-
-            self.debug(
-                    "Verify listVirtualMachines response for virtual machine: %s" \
-                    % self.virtual_machine.id
-                )
-
-            self.assertEqual(
-                                isinstance(list_vm_response, list),
-                                True,
-                                "Check list response returns a valid list"
-                            )
-
-            self.assertNotEqual(
-                                len(list_vm_response),
-                                0,
-                                "Check VM available in List Virtual Machines"
-                            )
-            vm_response = list_vm_response[0]
-
-            self.assertEqual(
-
-                                vm_response.id,
-                                self.virtual_machine.id,
-                                "Check virtual machine id in listVirtualMachines"
-                            )
-
-            self.assertEqual(
-                        vm_response.name,
-                        self.virtual_machine.name,
-                        "Check virtual machine name in listVirtualMachines"
-                        )
-
-            self.assertEqual(
-                        len(vm_response.nic),
-                        1,
-                        "Verify we only start with one nic"
-                        )
-
-            self.assertEqual(
-                vm_response.nic[0].isdefault,
-                True,
-                "Verify initial adapter is set to default"
-            )
-            existing_nic_ip = vm_response.nic[0].ipaddress
-            existing_nic_id = vm_response.nic[0].id
-
+        hypervisorIsVmware = False
+        isVmwareToolInstalled = False
+        assertForExceptionForNicOperations = False
+        if self.hypervisor.lower() == "vmware":
+            hypervisorIsVmware = True
+
+        self.virtual_machine = VirtualMachine.create(
+            self.apiclient,
+            self.services["small"],
+            accountid=self.account.name,
+            domainid=self.account.domainid,
+            serviceofferingid=self.service_offering.id,
+            networkids=[self.test_network.id],
+            mode=self.zone.networktype if hypervisorIsVmware else "default"
+        )
+
+        # If hypervisor is Vmware, then check if
+        # the vmware tools are installed and the process is running
+        # Vmware tools are necessary for add and remove nic operations
+        if hypervisorIsVmware:
+            sshClient = self.virtual_machine.get_ssh_client()
+            result = str(
+                sshClient.execute("service vmware-tools status")).lower()
+            self.debug("and result is: %s" % result)
+            if "running" in result:
+                isVmwareToolInstalled = True
+
+        # If Vmware tools are not installed in case of vmware hypervisor
+        # then check for exception while performing add and remove nic
+        # operations
+        if hypervisorIsVmware and not isVmwareToolInstalled:
+            assertForExceptionForNicOperations = True
+
+        self.cleanup.insert(0, self.virtual_machine)
+        list_vm_response = VirtualMachine.list(
+            self.apiclient,
+            id=self.virtual_machine.id
+        )
+
+        self.debug(
+            "Verify listVirtualMachines response for virtual machine: %s"
+            % self.virtual_machine.id
+        )
+
+        self.assertEqual(
+            isinstance(list_vm_response, list),
+            True,
+            "Check list response returns a valid list"
+        )
+
+        self.assertNotEqual(
+            len(list_vm_response),
+            0,
+            "Check VM available in List Virtual Machines"
+        )
+        vm_response = list_vm_response[0]
+
+        self.assertEqual(
+
+            vm_response.id,
+            self.virtual_machine.id,
+            "Check virtual machine id in listVirtualMachines"
+        )
+
+        self.assertEqual(
+            vm_response.name,
+            self.virtual_machine.name,
+            "Check virtual machine name in listVirtualMachines"
+        )
+
+        self.assertEqual(
+            len(vm_response.nic),
+            1,
+            "Verify we only start with one nic"
+        )
+
+        self.assertEqual(
+            vm_response.nic[0].isdefault,
+            True,
+            "Verify initial adapter is set to default"
+        )
+        existing_nic_ip = vm_response.nic[0].ipaddress
+        existing_nic_id = vm_response.nic[0].id
+
+        if assertForExceptionForNicOperations:
+            with self.assertRaises(Exception):
+                self.virtual_machine.add_nic(
+                    self.apiclient,
+                    self.test_network2.id)
+
+        else:
             # 1. add a nic
-            add_response = self.virtual_machine.add_nic(self.apiclient, self.test_network2.id)
+            self.virtual_machine.add_nic(self.apiclient, self.test_network2.id)
 
             time.sleep(5)
             # now go get the vm list?
 
-            list_vm_response = list_virtual_machines(
-                                                self.apiclient,
-                                                id=self.virtual_machine.id
-                                                )
+            list_vm_response = VirtualMachine.list(
+                self.apiclient,
+                id=self.virtual_machine.id
+            )
 
             self.assertEqual(
-                        len(list_vm_response[0].nic),
-                        2,
-                        "Verify we have 2 NIC's now"
-                        )
+                len(list_vm_response[0].nic),
+                2,
+                "Verify we have 2 NIC's now"
+            )
 
             new_nic_id = ""
             for nc in list_vm_response[0].nic:
@@ -215,12 +264,13 @@ class TestNic(cloudstackTestCase):
 
             time.sleep(5)
 
-            list_vm_response = list_virtual_machines(
-                                                self.apiclient,
-                                                id=self.virtual_machine.id
-                                                )
+            list_vm_response = VirtualMachine.list(
+                self.apiclient,
+                id=self.virtual_machine.id
+            )
 
-            # iterate as we don't know for sure what order our NIC's will be returned to us.
+            # iterate as we don't know for sure what order our NIC's will be
+            # returned to us.
             for nc in list_vm_response[0].nic:
                 if nc.ipaddress == existing_nic_ip:
                     self.assertEqual(
@@ -235,33 +285,28 @@ class TestNic(cloudstackTestCase):
                         "Verify second adapter is set to default"
                     )
 
-            sawException = False
-            try:
+            with self.assertRaises(Exception):
                 self.virtual_machine.remove_nic(self.apiclient, new_nic_id)
-            except Exception as ex:
-                sawException = True
 
-            self.assertEqual(sawException, True, "Make sure we cannot delete the default NIC")
-            self.virtual_machine.update_default_nic(self.apiclient, existing_nic_id)
+            self.virtual_machine.update_default_nic(
+                self.apiclient,
+                existing_nic_id)
             time.sleep(5)
             self.virtual_machine.remove_nic(self.apiclient, new_nic_id)
             time.sleep(5)
 
-            list_vm_response = list_virtual_machines(
-                                                self.apiclient,
-                                                id=self.virtual_machine.id
-                                                )
+            list_vm_response = VirtualMachine.list(
+                self.apiclient,
+                id=self.virtual_machine.id
+            )
 
             self.assertEqual(
-                        len(list_vm_response[0].nic),
-                        1,
-                        "Verify we are back to a signle NIC"
-                        )
+                len(list_vm_response[0].nic),
+                1,
+                "Verify we are back to a signle NIC"
+            )
 
-            return
-        except Exception as ex:
-            self.debug("Exception during NIC test!: " + str(ex))
-            self.assertEqual(True, False, "Exception during NIC test!: " + str(ex))
+        return
 
     def tearDown(self):
         try:
@@ -270,7 +315,10 @@ class TestNic(cloudstackTestCase):
                     obj.delete(self.apiclient)
                     time.sleep(10)
                 except Exception as ex:
-                    self.debug("Error deleting: " + str(obj) + ", exception: " + str(ex))
+                    self.debug(
+                        "Error deleting: " +
+                        str(obj) +
+                        ", exception: " +
+                        str(ex))
         except Exception as e:
             self.debug("Warning! Exception in tearDown: %s" % e)
-