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 2015/03/04 05:21:59 UTC

git commit: updated refs/heads/volume-upload to fa7ef95

Repository: cloudstack
Updated Branches:
  refs/heads/volume-upload b16520bce -> fa7ef9581


Automated Script To Validate Browser Based Volume LifeCycle Test Scenarios


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

Branch: refs/heads/volume-upload
Commit: fa7ef95817241b56952293aeec916bc7ca2f0490
Parents: b16520b
Author: sailajamada <sa...@citrix.com>
Authored: Wed Mar 4 09:16:43 2015 +0530
Committer: sailajamada <sa...@citrix.com>
Committed: Wed Mar 4 09:16:43 2015 +0530

----------------------------------------------------------------------
 .../component/test_browse_volumes.py            | 819 +++++++++++++++++++
 1 file changed, 819 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fa7ef958/test/integration/component/test_browse_volumes.py
----------------------------------------------------------------------
diff --git a/test/integration/component/test_browse_volumes.py b/test/integration/component/test_browse_volumes.py
new file mode 100644
index 0000000..0de20e2
--- /dev/null
+++ b/test/integration/component/test_browse_volumes.py
@@ -0,0 +1,819 @@
+# 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.
+""" P1 tests for Browser Based Upload Volumes
+"""
+# Import Local Modules
+
+from nose.plugins.attrib import attr
+from marvin.cloudstackTestCase import *
+from marvin.cloudstackAPI import *
+from marvin.lib.utils import cleanup_resources, validateList
+from marvin.lib.base import (Account,
+                             ServiceOffering,
+                             VirtualMachine,
+                             Volume,
+                             Host,
+                             Iso,
+                             Configurations,
+                             DiskOffering,
+                             Domain,
+                             StoragePool)
+from marvin.lib.common import (get_domain,
+                               get_zone,
+                               get_template,
+                               get_pod,list_hosts)
+from marvin.codes import PASS,FAILED
+
+from marvin.sshClient import SshClient
+
+import requests
+
+import time
+
+import wget
+
+import random
+
+import string
+
+
+class TestBrowseUploadVolume(cloudstackTestCase):
+
+    """
+    Testing Browse Upload Volume Feature
+    """
+    @classmethod
+    def setUpClass(cls):
+
+        cls.testClient = super(TestBrowseUploadVolume, cls).getClsTestClient()
+        cls.testdata = cls.testClient.getParsedTestDataConfig()
+        cls.apiclient = cls.testClient.getApiClient()
+        cls._cleanup = []
+        cls.cleanup = []
+        cls.uploadvolumeformat="VHD"
+
+        hosts = list_hosts(
+            cls.apiclient,
+            type="Routing"
+        )
+
+        if hosts is None:
+            raise unittest.SkipTest(
+                "There are no hypervisor's available.Check listhosts response")
+        for hypervisorhost in hosts :
+                 if hypervisorhost.hypervisor == "XenServer":
+                     cls.uploadvolumeformat="VHD"
+                     break
+                 elif hypervisorhost.hypervisor== "VMware":
+                     cls.uploadvolumeformat="OVA"
+                     break
+                 elif hypervisorhost.hypervisor=="KVM":
+                     cls.uploadvolumeformat="QCOW2"
+                     break
+                 else:
+                     break
+
+        cls.uploadurl=cls.testdata["browser_upload_volume"][cls.uploadvolumeformat]["url"]
+        cls.volname=cls.testdata["browser_upload_volume"][cls.uploadvolumeformat]["diskname"]
+        cls.zone = get_zone(cls.apiclient, cls.testClient.getZoneForTests())
+        cls.domain = get_domain(cls.apiclient)
+        cls.pod = get_pod(cls.apiclient, cls.zone.id)
+
+        cls.account = Account.create(
+            cls.apiclient,
+            cls.testdata["account"],
+            domainid=cls.domain.id
+        )
+
+        cls.template = get_template(
+            cls.apiclient,
+            cls.zone.id)
+
+        if cls.template == FAILED:
+                raise unittest.SkipTest(
+                    "Check for default cent OS template readiness ")
+        cls.service_offering = ServiceOffering.create(
+            cls.apiclient,
+            cls.testdata["service_offering"]
+        )
+        cls.disk_offering = DiskOffering.create(
+            cls.apiclient,
+            cls.testdata["browser_upload_volume"]["browser_resized_disk_offering"],
+            custom=True
+        )
+        cls._cleanup = [
+            cls.account,
+            cls.service_offering,
+            cls.disk_offering
+        ]
+
+
+
+    def validate_uploaded_volume(self,up_volid,volumestate):
+
+        list_volume_response = Volume.list(
+                    self.apiclient,
+                    id=up_volid
+                )
+        self.assertNotEqual(
+                    list_volume_response,
+                    None,
+                    "Check if volume exists in ListVolumes"
+                )
+
+        self.assertEqual(
+                    list_volume_response[0].state,
+                    volumestate,
+                    "Check volume state in ListVolumes"
+                )
+
+    def browse_upload_volume(self):
+        cmd = getUploadParamsForVolume.getUploadParamsForVolumeCmd()
+        cmd.zoneid = self.zone.id
+        cmd.format = self.uploadvolumeformat
+        cmd.name=self.volname+self.account.name+(random.choice(string.ascii_uppercase))
+        cmd.account=self.account.name
+        cmd.domainid=self.domain.id
+        getuploadparamsresponce=self.apiclient.getUploadParamsForVolume(cmd)
+
+        signt=getuploadparamsresponce.signature
+        posturl=getuploadparamsresponce.postURL
+        metadata=getuploadparamsresponce.metadata
+        expiredata=getuploadparamsresponce.expires
+        #url = 'http://10.147.28.7/templates/rajani-thin-volume.vhd'
+        url=self.uploadurl
+
+        uploadfile = url.split('/')[-1]
+        r = requests.get(url, stream=True)
+        with open(uploadfile, 'wb') as f:
+            for chunk in r.iter_content(chunk_size=1024): 
+                if chunk: # filter out keep-alive new chunks
+                    f.write(chunk)
+                    f.flush()
+
+        #uploadfile='rajani-thin-volume.vhd'
+
+        #files={'file':('rajani-thin-volume.vhd',open(uploadfile,'rb'),'application/octet-stream')}
+
+        #headers={'X-signature':signt,'X-metadata':metadata,'X-expires':expiredata}
+
+        files={'file':(uploadfile,open(uploadfile,'rb'),'application/octet-stream')}
+
+        headers={'X-signature':signt,'X-metadata':metadata,'X-expires':expiredata}
+
+        results = requests.post(posturl,files=files,headers=headers,verify=False)
+        time.sleep(60)
+
+        print results.status_code
+        if results.status_code !=200: 
+            self.fail("Upload is not fine")
+
+        self.validate_uploaded_volume(getuploadparamsresponce.id,'Uploaded')
+
+        return(getuploadparamsresponce)
+
+
+    def validate_vm(self,vmdetails,vmstate):
+
+        time.sleep(120 )
+        vm_response = VirtualMachine.list(
+                self.apiclient,
+                id=vmdetails.id,
+            )
+        self.assertEqual(
+                isinstance(vm_response, list),
+                True,
+                "Check list VM response for valid list"
+            )
+
+            # Verify VM response to check whether VM deployment was successful
+        self.assertNotEqual(
+                len(vm_response),
+                0,
+                "Check VMs available in List VMs response"
+            )
+
+        deployedvm = vm_response[0]
+        self.assertEqual(
+                deployedvm.state,
+                vmstate,
+                "Check the state of VM"
+            )
+
+    def deploy_vm(self):
+            virtual_machine = VirtualMachine.create(
+                                                    self.apiclient,
+                                                    self.testdata["virtual_machine"],
+                                                    templateid=self.template.id,
+                                                    zoneid=self.zone.id,
+                                                    accountid=self.account.name,
+                                                    domainid=self.account.domainid,
+                                                    serviceofferingid=self.service_offering.id,
+                                                )
+            self.validate_vm(virtual_machine,'Running')
+            return(virtual_machine)
+
+    def attach_volume(self,vmlist,volid):
+
+        list_volume_response = Volume.list(
+                    self.apiclient,
+                    id=volid
+                )
+        print list_volume_response[0]
+        vmlist.attach_volume(
+                    self.apiclient,
+                    list_volume_response[0]
+                )
+        list_volume_response = Volume.list(
+                self.apiclient,
+                virtualmachineid=vmlist.id,
+                type='DATADISK',
+                listall=True
+            )
+        self.assertNotEqual(
+                list_volume_response,
+                None,
+                "Check if volume exists in ListVolumes")
+        self.assertEqual(
+                isinstance(list_volume_response, list),
+                True,
+                "Check list volumes response for valid list")
+        self.validate_uploaded_volume(volid,'Ready')
+
+
+    def reboot_vm(self,vmdetails):
+        vmdetails.reboot(self.apiclient)
+        self.validate_vm(vmdetails,'Running')
+
+    def stop_vm(self,vmdetails):
+        vmdetails.stop(self.apiclient)
+        self.validate_vm(vmdetails,'Stopped')
+
+    def start_vm(self,vmdetails):
+        vmdetails.start(self.apiclient)
+        self.validate_vm(vmdetails,'Running')
+
+    def vmoperations(self,vmdetails):
+        self.reboot_vm(vmdetails)
+
+        self.stop_vm(vmdetails)
+
+        self.start_vm(vmdetails)
+
+
+    def detach_volume(self,vmdetails,volid):
+        """Detach a Volume attached to a VM
+        """
+        list_volume_response = Volume.list(
+                    self.apiclient,
+                    id=volid
+                )
+        print list_volume_response[0]
+        vmdetails.detach_volume(self.apiclient,list_volume_response[0])
+
+        # Sleep to ensure the current state will reflected in other calls
+        time.sleep(self.testdata["sleep"])
+
+        list_volume_response = Volume.list(
+            self.apiclient,
+            id=volid
+        )
+        self.assertNotEqual(
+            list_volume_response,
+            None,
+            "Check if volume exists in ListVolumes"
+        )
+        self.assertEqual(
+            isinstance(list_volume_response, list),
+            True,
+            "Check list volumes response for valid list"
+        )
+        volume = list_volume_response[0]
+        self.assertEqual(
+            volume.virtualmachineid,
+            None,
+            "Check if volume state (detached) is reflected"
+        )
+
+        self.assertEqual(
+            volume.vmname,
+            None,
+            "Check if volume state (detached) is reflected"
+        )
+        return
+
+
+    def restore_vm(self,vmdetails):
+        #TODO: SIMENH: add another test the data on the restored VM.
+        """Test recover Virtual Machine
+        """
+
+        #cmd = recoverVirtualMachine.recoverVirtualMachineCmd()
+        cmd = restoreVirtualMachine.restoreVirtualMachineCmd()
+        cmd.virtualmachineid = vmdetails.id
+        self.apiclient.recoverVirtualMachine(cmd)
+
+        list_vm_response = VirtualMachine.list(
+                                            self.apiclient,
+                                            id=vmdetails.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"
+                        )
+
+        self.assertEqual(
+                            list_vm_response[0].state,
+                            "Running",
+                            "Check virtual machine is in Running state"
+                        )
+
+        return
+
+    def deletevolume(self,volumeid):
+        """Delete a Volume attached to a VM
+        """
+
+        cmd = deleteVolume.deleteVolumeCmd()
+        cmd.id = volumeid
+        self.apiclient.deleteVolume(cmd)
+
+        list_volume_response = Volume.list(
+                                            self.apiclient,
+                                            id=volumeid,
+                                            type='DATADISK'
+                                            )
+        self.assertEqual(
+                        list_volume_response,
+                        None,
+                        "Check if volume exists in ListVolumes"
+                    )
+        return
+
+
+    def download_volume(self,volumeid):
+
+        cmd = extractVolume.extractVolumeCmd()
+        cmd.id = volumeid
+        cmd.mode = "HTTP_DOWNLOAD"
+        cmd.zoneid = self.zone.id
+        extract_vol = self.apiclient.extractVolume(cmd)
+
+        try:
+            formatted_url = urllib.unquote_plus(extract_vol.url)
+            self.debug("Attempting to download volume at url %s" % formatted_url)
+            response = urllib.urlopen(formatted_url)
+            self.debug("response from volume url %s" % response.getcode())
+            fd, path = tempfile.mkstemp()
+            self.debug("Saving volume %s to path %s" %(volumeid, path))
+            os.close(fd)
+            with open(path, 'wb') as fd:
+                fd.write(response.read())
+            self.debug("Saved volume successfully")
+        except Exception:
+            self.fail(
+                "Extract Volume Failed with invalid URL %s (vol id: %s)" \
+                % (extract_vol.url, volumeid)
+            )
+
+
+
+    def resize_fail(self,volumeid):
+
+        cmd                = resizeVolume.resizeVolumeCmd()
+        cmd.id             = volumeid
+        cmd.diskofferingid = self.disk_offering.id
+        success            = False
+        try:
+            self.apiclient.resizeVolume(cmd)
+        except Exception as ex:
+            if "Volume should be in ready or allocated state before attempting a resize" in str(ex):
+                success = True
+        self.assertEqual(
+                success,
+                True,
+                "ResizeVolume - verify Uploaded State volume is handled appropriately")
+
+
+    def resize_volume(self,volumeid):
+
+        """Test resize a volume"""
+
+        self.testdata["browser_upload_volume"]["browser_resized_disk_offering"]["disksize"] = 20
+
+        disk_offering_20_GB = DiskOffering.create(
+                                    self.apiclient,
+                                    self.testdata["browser_upload_volume"]["browser_resized_disk_offering"]
+                                    )
+        self.cleanup.append(disk_offering_20_GB)
+
+        cmd= resizeVolume.resizeVolumeCmd()
+        cmd.id= volumeid
+        cmd.diskofferingid = disk_offering_20_GB.id
+
+        self.apiclient.resizeVolume(cmd)
+
+        count = 0
+        success = False
+        while count < 3:
+            list_volume_response = Volume.list(
+                                                self.apiclient,
+                                                id=volumeid,
+                                                type='DATADISK'
+                                                )
+            for vol in list_volume_response:
+                if vol.id == volumeid and int(vol.size) == (int(disk_offering_20_GB.disksize) * (1024** 3)) and vol.state == 'Ready':
+                    success = True
+            if success:
+                break
+            else:
+                time.sleep(10)
+                count += 1
+
+        self.assertEqual(
+                         success,
+                         True,
+                         "Check if the data volume resized appropriately"
+                         )
+
+        return
+
+
+    def destroy_vm(self,vmdetails):
+
+        vmdetails.delete(self.apiclient, expunge=False)
+
+        list_vm_response = VirtualMachine.list(
+                                            self.apiclient,
+                                            id=vmdetails.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"
+                        )
+
+        self.assertEqual(
+                            list_vm_response[0].state,
+                            "Destroyed",
+                            "Check virtual machine is in destroyed state"
+                        )
+        return
+
+
+    def recover_destroyed_vm(self,vmdetails):
+
+        cmd = recoverVirtualMachine.recoverVirtualMachineCmd()
+        cmd.id = vmdetails.id
+        self.apiclient.recoverVirtualMachine(cmd)
+
+        list_vm_response = VirtualMachine.list(
+                                            self.apiclient,
+                                            id=vmdetails.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"
+                        )
+
+        self.assertEqual(
+                            list_vm_response[0].state,
+                            "Stopped",
+                            "Check virtual machine is in Stopped state"
+                        )
+
+        return
+
+    def volume_snapshot(self):
+        """
+        @summary: Test to verify creation of snapshot from volume
+        and creation of template, volume from snapshot
+        """
+
+        list_volumes = Volume.list(
+            self.apiclient,
+            id=volumedetails.id
+        )
+        # Creating Snapshot from volume
+        snapshot_created = Snapshot.create(
+            self.userapiclient,
+            volumedetails.id,
+        )
+
+        self.assertIsNotNone(snapshot_created, "Snapshot not created")
+
+        self.cleanup.append(snapshot_created)
+
+        # Creating expected and actual values dictionaries
+        expected_dict = {
+            "id": volumedetails.id,
+            "intervaltype": "MANUAL",
+            "snapshottype": "MANUAL",
+            "volumetype": list_volumes[0].type,
+            "domain": self.domain.id
+        }
+        actual_dict = {
+            "id": snapshot_created.volumeid,
+            "intervaltype": snapshot_created.intervaltype,
+            "snapshottype": snapshot_created.snapshottype,
+            "volumetype": snapshot_created.volumetype,
+            "domain": snapshot_created.domainid,
+        }
+        status = self.__verify_values(
+            expected_dict,
+            actual_dict
+        )
+        self.assertEqual(
+            True,
+            status,
+            "Snapshot created from Volume details are not as expected"
+        )
+        return(snapshot_created)
+
+    def volume_snapshot_volume(self,snapshot_created):
+
+        # Creating Volume from snapshot
+        cmd = createVolume.createVolumeCmd()
+        cmd.name = "-".join([self.testdata["volume"]
+                             ["diskname"], random_gen()])
+        cmd.snapshotid = snapshot_created.id
+
+        volume_from_snapshot = Volume(
+            self.apiclient.createVolume(cmd).__dict__)
+
+        self.assertIsNotNone(
+            volume_from_snapshot,
+            "Volume creation failed from snapshot"
+        )
+
+
+        # Creating expected and actual values dictionaries
+        expected_dict = {
+            "snapshotid": snapshot_created.id,
+            "volumetype": snapshot_created.volumetype,
+            "size": self.disk_offering.disksize,
+            "accounr": self.account.name,
+            "domain": self.domain.id,
+            "storagetype": self.storagetype,
+            "zone": self.zone.id
+        }
+        actual_dict = {
+            "snapshotid": volume_from_snapshot.snapshotid,
+            "volumetype": volume_from_snapshot.type,
+            "size": volume_from_snapshot.size / (1024 * 1024 * 1024),
+            "accounr": volume_from_snapshot.account,
+            "domain": volume_from_snapshot.domainid,
+            "storagetype": volume_from_snapshot.storagetype,
+            "zone": volume_from_snapshot.zoneid,
+        }
+        status = self.__verify_values(
+            expected_dict,
+            actual_dict
+        )
+        self.assertEqual(
+            True,
+            status,
+            "Volume created from Snapshot details are not as expected"
+        )
+        return
+
+    def volume_snapshost_template(self,snapshot_created):
+        # Creating Template from Snapshot
+        list_templates_before = Template.list(
+            self.apiclient,
+            templatefilter='self')
+
+        if list_templates_before is None:
+            templates_before_size = 0
+        else:
+            templates_before_size = len(list_templates_before)
+
+        cmd = createTemplate.createTemplateCmd()
+        cmd.name = self.testdata["ostype"]
+        cmd.displaytext = self.testdata["ostype"]
+        cmd.ostypeid = self.template.ostypeid
+        cmd.snapshotid = snapshot_created.id
+        cmd.ispublic = False
+        cmd.passwordenabled = False
+
+        template_from_snapshot = Template(
+            self.apiclient.createTemplate(cmd).__dict__)
+
+        self.assertIsNotNone(
+            template_from_snapshot,
+            "Template creation failed from snapshot"
+        )
+
+        self.cleanup.append(template_from_snapshot)
+
+        # Creating expected and actual values dictionaries
+        expected_dict = {
+            "name": self.services["ostype"],
+            "ostypeid": self.template.ostypeid,
+            "type": "USER",
+            "zone": self.zone.id,
+            "domain": self.domain.id,
+            "account": self.account.name,
+            "passwordenabled": False,
+            "ispublic": False,
+            "size": self.disk_offering.disksize
+        }
+        actual_dict = {
+            "name": template_from_snapshot.name,
+            "ostypeid": template_from_snapshot.ostypeid,
+            "type": template_from_snapshot.templatetype,
+            "zone": template_from_snapshot.zoneid,
+            "domain": template_from_snapshot.domainid,
+            "account": template_from_snapshot.account,
+            "passwordenabled": template_from_snapshot.passwordenabled,
+            "ispublic": template_from_snapshot.ispublic,
+            "size": template_from_snapshot.size / (1024 * 1024 * 1024)
+        }
+        status = self.__verify_values(
+            expected_dict,
+            actual_dict
+        )
+        self.assertEqual(
+            True,
+            status,
+            "Template created from Snapshot details are not as expected"
+        )
+
+        list_templates_after = Template.list(
+            self.userapiclient,
+            templatefilter='self')
+
+        self.assertEquals(
+            templates_before_size + 1,
+            len(list_templates_after),
+            "Template creation failed from snapshot"
+        )
+        return
+
+    @attr(tags = ["advanced", "advancedns", "smoke", "basic"], required_hardware="true")
+    def test_01_Browser_volume_Life_cycle_tpath(self):
+        """
+        Test Browser_volume_Life_cycle - This includes upload volume,attach to a VM, write data ,Stop ,Start, Reboot,Reset  of a VM, detach,attach back to the VM, delete volumes  
+        """
+        try:
+
+            self.debug("========================= Test 1: Upload Browser based volume and validate ========================= ")
+            browseup_vol=self.browse_upload_volume()
+
+            self.debug("========================= Test 2: Deploy a VM , Attach Uploaded Browser based volume and validate VM Operations========================= ")
+
+            vm1details=self.deploy_vm()
+
+            self.attach_volume(vm1details,browseup_vol.id)
+
+            self.vmoperations(vm1details)
+
+            self.debug("========================= Test 3: Restore VM with Uploaded volume attached========================= ")
+
+            self.restore_vm(vm1details)
+
+            self.debug("========================= Test 4: Detach Uploaded volume and validation of VM operations after detach========================= ")
+
+            self.detach_volume(vm1details,browseup_vol.id)
+
+            self.vmoperations(vm1details)
+
+            self.debug("========================= Test 5: Deploy New VM,Attach the detached Uploaded volume and validate VM operations after attach========================= ")
+
+            vm2details=self.deploy_vm()
+
+            self.attach_volume(vm2details,browseup_vol.id)
+
+            self.vmoperations(vm2details)
+
+            self.debug("========================= Test 6: Detach Uploaded volume and resize detached uploaded volume========================= ")
+
+            self.detach_volume(vm2details,browseup_vol.id)
+
+            self.resize_volume(browseup_vol.id)
+
+            self.debug("========================= Test 7: Attach resized uploaded volume and validate VM operations========================= ")
+
+            self.attach_volume(vm2details,browseup_vol.id)
+
+            self.vmoperations(vm2details)
+
+            self.debug("========================= Test 8: Try resizing uploaded state volume and validate the error scenario========================= ")
+
+            browseup_vol2=self.browse_upload_volume()
+
+            self.resize_fail(browseup_vol2.id)
+
+            self.debug("========================= Test 9: Attach multiple uploaded volumes to a VM and validate VM operations========================= ")
+
+            browseup_vol3=self.browse_upload_volume()
+
+            self.attach_volume(vm2details,browseup_vol2.id)
+
+            self.attach_volume(vm2details,browseup_vol3.id)
+
+            self.vmoperations(vm2details)
+
+            self.debug("========================= Test 10:  Detach and delete uploaded volume========================= ")
+
+            self.detach_volume(vm2details,browseup_vol2.id)
+
+            self.deletevolume(browseup_vol2.id)
+
+            self.debug("========================= Test 11:  Detach and download uploaded volume========================= ")
+
+            self.detach_volume(vm2details,browseup_vol3.id)
+
+            self.download_volume(browseup_vol3.id)
+
+            self.debug("========================= Test 12:  Delete detached uploaded volume========================= ")
+
+            self.detach_volume(vm2details,browseup_vol3.id)
+
+            self.deletevolume(browseup_vol3.id)
+
+ 
+            self.debug("========================= Test 13:  Delete Uploaded State volume========================= ")
+
+            browseup_vol4=self.browse_upload_volume()
+
+            self.deletevolume(browseup_vol4.id)
+
+            self.debug("========================= Test 14:  Destroy VM which has Uploaded volumes attached========================= ")
+
+            vm4details=self.deploy_vm()
+            self.attach_volume(vm4details,browseup_vol4.id)
+
+            self.destroy_vm(vm4details)
+
+            self.debug("========================= Test 15:  Recover destroyed VM which has Uploaded volumes attached========================= ")
+
+            self.recover_destroyed_vm(vm4details)
+
+            self.debug("========================= Test 16:  Delete attached Uploaded volume which is in ready state========================= ")
+
+            browseup_vol5=self.browse_upload_volume()
+            self.attach_volume(vm4details,browseup_vol5.id)
+            self.deletevolume(browseup_vol5.id)
+
+            self.debug("========================= Test 17:  Create Volume Backup Snapshot uploaded volume attached to the VM========================= ")
+
+            browseup_vol6=self.browse_upload_volume()
+
+            self.attach_volume(vm2details,browseup_vol6.id)
+
+            snapshotdetails=self.volume_snapshot(browseup_vol6.id)
+
+            self.debug("========================= Test 18:  Create Volume from Backup Snapshot of attached uploaded volume========================= ")
+
+            self.volume_snapshot_volume(snapshotdetails)
+
+            self.debug("========================= Test 19:  Create template from Backup Snapshot of attached uploaded volume========================= ")
+            self.volume_snapshot_template(snapshotdetails)
+
+        except Exception as e:
+            self.fail("Exception occurred  : %s" % e)
+        return
+
+    @classmethod
+    def tearDownClass(self):
+        try:
+            self.apiclient = super(TestBrowseUploadVolume,self).getClsTestClient().getApiClient()
+            cleanup_resources(self.apiclient, self._cleanup)
+        except Exception as e:
+            raise Exception("Warning: Exception during cleanup : %s" % e)
+        return