You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by sa...@apache.org on 2014/09/23 13:49:06 UTC

git commit: updated refs/heads/master to 5fb2b3a

Repository: cloudstack
Updated Branches:
  refs/heads/master 2d19bcb46 -> 5fb2b3a0d


Test to verify fix for issue "Exception when attaching data disk to RHEL vm on vSphere

Added Rhel6 template details to test_data.py

Signed-off-by: sanjeev <sa...@apache.org>

Fixed review comments provided in RR 25536


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

Branch: refs/heads/master
Commit: 5fb2b3a0d24c2bcda0745a6b8ff59fae5651e054
Parents: 2d19bcb
Author: sanjeev <sa...@apache.org>
Authored: Wed Sep 10 11:55:26 2014 +0530
Committer: sanjeev <sa...@apache.org>
Committed: Tue Sep 23 17:17:16 2014 +0530

----------------------------------------------------------------------
 .../component/test_escalations_vmware.py        | 205 +++++++++++++++++++
 tools/marvin/marvin/config/test_data.py         |   8 +
 2 files changed, 213 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5fb2b3a0/test/integration/component/test_escalations_vmware.py
----------------------------------------------------------------------
diff --git a/test/integration/component/test_escalations_vmware.py b/test/integration/component/test_escalations_vmware.py
new file mode 100644
index 0000000..fec1f6f
--- /dev/null
+++ b/test/integration/component/test_escalations_vmware.py
@@ -0,0 +1,205 @@
+# 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.
+
+#Import Local Modules
+from marvin.cloudstackTestCase import cloudstackTestCase
+from marvin.lib.utils import (cleanup_resources,
+                              validateList,
+                              get_hypervisor_type)
+from marvin.lib.base import (Account,
+                             VirtualMachine,
+                             ServiceOffering,
+                             Volume,
+                             DiskOffering,
+                             Template,
+                             listConfigurations)
+from marvin.lib.common import (get_domain,
+                               get_zone,
+                               get_template)
+from nose.plugins.attrib import attr
+from ast import literal_eval
+from marvin.codes import PASS
+
+class TestVMware(cloudstackTestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        try:
+            cls._cleanup = []
+            cls.testClient = super(TestVMware, cls).getClsTestClient()
+            cls.api_client = cls.testClient.getApiClient()
+            cls.services = cls.testClient.getParsedTestDataConfig()
+            # Get Domain, Zone, Template
+            cls.domain = get_domain(cls.api_client)
+            cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests())
+            cls.template = get_template(
+                cls.api_client,
+                cls.zone.id,
+                cls.services["ostype"]
+            )
+            if cls.zone.localstorageenabled:
+                cls.storagetype = 'local'
+                cls.services["service_offerings"]["tiny"]["storagetype"] = 'local'
+                cls.services["disk_offering"]["storagetype"] = 'local'
+            else:
+                cls.storagetype = 'shared'
+                cls.services["service_offerings"]["tiny"]["storagetype"] = 'shared'
+                cls.services["disk_offering"]["storagetype"] = 'shared'
+
+            cls.services['mode'] = cls.zone.networktype
+            cls.services["virtual_machine"]["hypervisor"] = cls.testClient.getHypervisorInfo()
+            cls.services["virtual_machine"]["zoneid"] = cls.zone.id
+            cls.services["virtual_machine"]["template"] = cls.template.id
+            cls.services["custom_volume"]["zoneid"] = cls.zone.id
+            # Creating Disk offering, Service Offering and Account
+            cls.disk_offering = DiskOffering.create(
+                cls.api_client,
+                cls.services["disk_offering"]
+            )
+            cls.service_offering = ServiceOffering.create(
+                cls.api_client,
+                cls.services["service_offerings"]["tiny"]
+            )
+            cls.account = Account.create(
+                cls.api_client,
+                cls.services["account"],
+                domainid=cls.domain.id
+            )
+            # Getting authentication for user in newly created Account
+            cls.user = cls.account.user[0]
+            cls.userapiclient = cls.testClient.getUserApiClient(cls.user.username, cls.domain.name)
+            cls._cleanup.append(cls.disk_offering)
+            cls._cleanup.append(cls.service_offering)
+            cls._cleanup.append(cls.account)
+        except Exception as e:
+            cls.tearDownClass()
+            raise Exception("Warning: Exception in setup : %s" % e)
+        return
+
+    def setUp(self):
+
+        self.apiClient = self.testClient.getApiClient()
+        self.cleanup = []
+
+    def tearDown(self):
+        #Clean up, terminate the created volumes
+        cleanup_resources(self.apiClient, self.cleanup)
+        return
+
+    @classmethod
+    def tearDownClass(cls):
+        try:
+            cleanup_resources(cls.api_client, cls._cleanup)
+        except Exception as e:
+            raise Exception("Warning: Exception during cleanup : %s" % e)
+
+    @attr(tags=["advanced"], required_hardware="true")
+    def test1_attach_volume_ide(self):
+        """
+        @desc: Exception when attaching data disk to RHEL VM on vSphere
+        Step1: Confirm that vmware.root.disk.controller = "ide" in Global Settings.
+        Step2: Register RHEl 6.0 template and deploy a VM.
+        Step3: Note that the root disk is attached to IDE.
+        Step4: Create new DATA disk and attempt to attach it to the VM.
+        Verify that step4 succeeds without any exception
+        """
+        self.hypervisor = str(get_hypervisor_type(self.api_client)).lower()
+        if self.hypervisor != "vmware":
+            self.skipTest("This test can be run only on vmware")
+        cmd = listConfigurations.listConfigurationsCmd()
+        cmd.name = "vmware.root.disk.controller"
+        cmd.listAll = True
+        try:
+            config_descs = self.api_client.listConfigurations(cmd)
+        except Exception as e:
+            raise Exception("Failed to fetch configurations: %s" % e)
+        if not isinstance(config_descs, list):
+            raise Exception("List configs didn't returned a valid data")
+        config_desc = config_descs[0]
+        if str(config_desc.value).lower() != "ide":
+            self.skipTest("This test is invalid if {} is not set to ide".format(config_desc.name))
+        """
+        Register RHEL 6.0 template and deploy vm
+        """
+        template = Template.register(
+            self.userapiclient,
+            self.services["rhel60template"],
+            zoneid=self.zone.id,
+            account=self.account.name,
+            domainid=self.account.domainid,
+            hypervisor=self.hypervisor
+        )
+        self.assertIsNotNone(template,"Failed to register Rhel6 template")
+        self.debug(
+            "Registered a template with format {} and id {}".format(
+                self.services["rhel60template"]["format"],template.id)
+        )
+        template.download(self.userapiclient)
+        self.cleanup.append(template)
+        vm = VirtualMachine.create(
+            self.userapiclient,
+            self.services["virtual_machine"],
+            accountid=self.account.name,
+            domainid=self.account.domainid,
+            serviceofferingid=self.service_offering.id,
+            templateid=template.id,
+            zoneid=self.zone.id
+        )
+        self.assertIsNotNone(vm,"Failed to deploy virtual machine")
+        self.cleanup.append(vm)
+        response = VirtualMachine.list(self.userapiclient,id=vm.id)
+        status = validateList(response)
+        self.assertEqual(status[0],PASS,"list vm response returned invalid list")
+        """
+        list root disk of the vm created above and make sure that device type is ide
+        """
+        volume_res = Volume.list(
+            self.userapiclient,
+            virtualmachineid=vm.id,
+            type="root",
+            listAll="true"
+        )
+        self.assertEqual(validateList(volume_res)[0],PASS,"list vm response returned invalid list")
+        chaininfo = volume_res[0].chaininfo
+        device_Bus = literal_eval(chaininfo)["diskDeviceBusName"]
+        if "ide" not in device_Bus:
+            self.fail("Root disk is not created with device type IDE")
+        disk = Volume.create(
+            self.userapiclient,
+            self.services["volume"],
+            zoneid=self.zone.id,
+            diskofferingid=self.disk_offering.id
+        )
+        self.assertIsNotNone(disk,"Failed to create custom volume")
+        self.cleanup.append(disk)
+        try:
+            vm.attach_volume(self.userapiclient,disk)
+            list_volumes = Volume.list(
+                self.userapiclient,
+                listall=self.services["listall"],
+                id=disk.id
+            )
+            attached_volume = list_volumes[0]
+            self.assertEqual(
+                disk.id,
+                attached_volume.id,
+                "list volume response does not match with the volume created and attached to vm"
+            )
+        except Exception as e:
+            self.fail("Failed to attach data disk to RHEL vm whose root disk type is IDE")
+        return
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5fb2b3a0/tools/marvin/marvin/config/test_data.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/config/test_data.py b/tools/marvin/marvin/config/test_data.py
index 6b02476..bebcab9 100644
--- a/tools/marvin/marvin/config/test_data.py
+++ b/tools/marvin/marvin/config/test_data.py
@@ -765,6 +765,14 @@ test_data = {
         "format": "OVA",
         "ostype": "Windows 8 (64-bit)",
     },
+    "rhel60template": {
+        "displaytext": "Rhel60",
+        "name": "Rhel60",
+        "passwordenabled": False,
+        "url": "http://10.147.28.7/templates/Rhel/Rhel6-64bit.ova",
+        "format": "OVA",
+        "ostype": "Red Hat Enterprise Linux 6.0 (64-bit)"
+    },
     "templateregister": {
         "displaytext": "xs",
         "name": "xs",