You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by gi...@apache.org on 2013/11/08 08:24:40 UTC
git commit: updated refs/heads/master to 3c350ab
Updated Branches:
refs/heads/master cb6d8d019 -> 3c350ab0b
CLOUDSTACK-4648: Fixed Snapshots test cases
Fixed following test cases:
1) test_01_volume_from_snapshot
2) test_03_snapshot_detachedDisk
3) test_07_template_from_snapshot
All three test cases are running successfully on XenServer but test cases (01 and 07) failing on KVM due to a common issue.
Product defect logged for this: https://issues.apache.org/jira/browse/CLOUDSTACK-5097
test_03 is running ok on KVM too, the problem was - disk was not getting detached because it was not unmounted before detaching. Added code to unmount the disk.
Signed-off-by: Girish Shilamkar <gi...@clogeny.com>
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/3c350ab0
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/3c350ab0
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/3c350ab0
Branch: refs/heads/master
Commit: 3c350ab0b8ce1687a8f7e27e9e2f8e8d0fa68c47
Parents: cb6d8d0
Author: Gaurav Aradhye <ga...@clogeny.com>
Authored: Fri Nov 8 12:48:37 2013 +0530
Committer: Girish Shilamkar <gi...@clogeny.com>
Committed: Fri Nov 8 12:54:20 2013 +0530
----------------------------------------------------------------------
test/integration/component/test_snapshots.py | 158 +++++++++++++++------
tools/marvin/marvin/integration/lib/common.py | 13 ++
2 files changed, 126 insertions(+), 45 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3c350ab0/test/integration/component/test_snapshots.py
----------------------------------------------------------------------
diff --git a/test/integration/component/test_snapshots.py b/test/integration/component/test_snapshots.py
index 1c2537c..0a82fc1 100644
--- a/test/integration/component/test_snapshots.py
+++ b/test/integration/component/test_snapshots.py
@@ -5,9 +5,9 @@
# 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
@@ -17,13 +17,35 @@
""" P1 tests for Snapshots
"""
#Import Local Modules
-from nose.plugins.attrib import attr
-from marvin.cloudstackTestCase import *
-from marvin.cloudstackAPI import *
-from marvin.integration.lib.utils import *
-from marvin.integration.lib.base import *
-from marvin.integration.lib.common import *
-from marvin.integration.lib.utils import is_snapshot_on_nfs
+from nose.plugins.attrib import attr
+from marvin.cloudstackTestCase import cloudstackTestCase, unittest
+
+from marvin.integration.lib.base import (Snapshot,
+ Template,
+ VirtualMachine,
+ Account,
+ ServiceOffering,
+ DiskOffering,
+ Volume)
+
+from marvin.integration.lib.common import (get_domain,
+ get_zone,
+ get_template,
+ list_events,
+ list_volumes,
+ list_snapshots,
+ list_templates,
+ list_virtual_machines,
+ get_hypervisor_type)
+
+from marvin.integration.lib.utils import (cleanup_resources,
+ format_volume_to_ext3,
+ random_gen,
+ is_snapshot_on_nfs)
+
+from marvin.cloudstackAPI import detachVolume
+import time
+
class Services:
@@ -104,7 +126,18 @@ class Services:
"volume": {
"diskname": "APP Data Volume",
"size": 1, # in GBs
- "diskdevice": ['/dev/xvdb', '/dev/sdb', '/dev/hdb', '/dev/vdb' ], # Data Disk
+ "xenserver": {"rootdiskdevice":"/dev/xvda",
+ "datadiskdevice_1": '/dev/xvdb',
+ "datadiskdevice_2": '/dev/xvdc', # Data Disk
+ },
+ "kvm": {"rootdiskdevice": "/dev/vda",
+ "datadiskdevice_1": "/dev/vdb",
+ "datadiskdevice_2": "/dev/vdc"
+ },
+ "vmware": {"rootdiskdevice": "/dev/hda",
+ "datadiskdevice_1": "/dev/hdb",
+ "datadiskdevice_2": "/dev/hdc"
+ }
},
"paths": {
"mount_dir": "/mnt/tmp",
@@ -139,7 +172,7 @@ class TestSnapshots(cloudstackTestCase):
cls.zone.id,
cls.services["ostype"]
)
-
+
cls.services["domainid"] = cls.domain.id
cls.services["volume"]["zoneid"] = cls.services["server_with_disk"]["zoneid"] = cls.zone.id
cls.services["server_with_disk"]["diskoffering"] = cls.disk_offering.id
@@ -174,6 +207,9 @@ class TestSnapshots(cloudstackTestCase):
mode=cls.services["mode"]
)
+ # Get Hypervisor Type
+ cls.hypervisor = (get_hypervisor_type(cls.api_client)).lower()
+
cls._cleanup = [
cls.service_offering,
cls.disk_offering,
@@ -259,15 +295,24 @@ class TestSnapshots(cloudstackTestCase):
# Validate the following
#1. Create a virtual machine and data volume
#2. Attach data volume to VM
- #3. Login to machine; create temp/test directories on data volume
+ #3. Login to machine; create temp/test directories on data volume and write some random data
#4. Snapshot the Volume
#5. Create another Volume from snapshot
- #6. Mount/Attach volume to another server
- #7. Compare data
+ #6. Mount/Attach volume to another virtual machine
+ #7. Compare data, data should match
random_data_0 = random_gen(size=100)
random_data_1 = random_gen(size=100)
+ self.debug("random_data_0 : %s" % random_data_0)
+ self.debug("random_data_1: %s" % random_data_1)
+
+ try:
+ ssh_client = self.virtual_machine.get_ssh_client()
+ except Exception as e:
+ self.fail("SSH failed for VM: %s" %
+ self.virtual_machine.ipaddress)
+
volume = Volume.create(
self.apiclient,
self.services["volume"],
@@ -285,22 +330,18 @@ class TestSnapshots(cloudstackTestCase):
(volume.id, self.virtual_machine.id))
- try:
- ssh_client = self.virtual_machine.get_ssh_client()
- except Exception as e:
- self.fail("SSH failed for VM: %s" %
- self.virtual_machine.ipaddress)
-
self.debug("Formatting volume: %s to ext3" % volume.id)
#Format partition using ext3
+ # Note that this is the second data disk partition of virtual machine as it was already containing
+ # data disk before attaching the new volume, Hence datadiskdevice_2
format_volume_to_ext3(
ssh_client,
- self.services["volume"]["diskdevice"]
+ self.services["volume"][self.hypervisor]["datadiskdevice_2"]
)
- cmds = [
+ cmds = [ "fdisk -l",
"mkdir -p %s" % self.services["paths"]["mount_dir"],
- "mount %s1 %s" % (
- self.services["volume"]["diskdevice"],
+ "mount -t ext3 %s1 %s" % (
+ self.services["volume"][self.hypervisor]["datadiskdevice_2"],
self.services["paths"]["mount_dir"]
),
"mkdir -p %s/%s/{%s,%s} " % (
@@ -323,10 +364,17 @@ class TestSnapshots(cloudstackTestCase):
self.services["paths"]["sub_lvl_dir2"],
self.services["paths"]["random_data"]
),
+ "cat %s/%s/%s/%s" % (
+ self.services["paths"]["mount_dir"],
+ self.services["paths"]["sub_dir"],
+ self.services["paths"]["sub_lvl_dir1"],
+ self.services["paths"]["random_data"]
+ )
]
for c in cmds:
self.debug("Command: %s" % c)
- ssh_client.execute(c)
+ result = ssh_client.execute(c)
+ self.debug(result)
# Unmount the Sec Storage
cmds = [
@@ -340,7 +388,7 @@ class TestSnapshots(cloudstackTestCase):
self.apiclient,
virtualmachineid=self.virtual_machine.id,
type='DATADISK',
- listall=True
+ id=volume.id
)
self.assertEqual(
@@ -365,6 +413,15 @@ class TestSnapshots(cloudstackTestCase):
account=self.account.name,
domainid=self.account.domainid
)
+
+ # Detach the volume from virtual machine
+ self.virtual_machine.detach_volume(
+ self.apiclient,
+ volume
+ )
+ self.debug("Detached volume: %s from VM: %s" %
+ (volume.id, self.virtual_machine.id))
+
self.debug("Created Volume: %s from Snapshot: %s" % (
volume_from_snapshot.id,
snapshot.id))
@@ -399,7 +456,7 @@ class TestSnapshots(cloudstackTestCase):
mode=self.services["mode"]
)
self.debug("Deployed new VM for account: %s" % self.account.name)
- self.cleanup.append(new_virtual_machine)
+ #self.cleanup.append(new_virtual_machine)
self.debug("Attaching volume: %s to VM: %s" % (
volume_from_snapshot.id,
@@ -411,21 +468,28 @@ class TestSnapshots(cloudstackTestCase):
volume_from_snapshot
)
+ # Rebooting is required so that newly attached disks are detected
+ self.debug("Rebooting : %s" % new_virtual_machine.id)
+
+ new_virtual_machine.reboot(self.apiclient)
+
try:
#Login to VM to verify test directories and files
ssh = new_virtual_machine.get_ssh_client()
- cmds = [
+ # Mount datadiskdevice_1 because this is the first data disk of the new virtual machine
+ cmds = ["fdisk -l",
"mkdir -p %s" % self.services["paths"]["mount_dir"],
- "mount %s1 %s" % (
- self.services["volume"]["diskdevice"],
+ "mount -t ext3 %s1 %s" % (
+ self.services["volume"][self.hypervisor]["datadiskdevice_1"],
self.services["paths"]["mount_dir"]
),
]
for c in cmds:
self.debug("Command: %s" % c)
- ssh.execute(c)
+ result = ssh.execute(c)
+ self.debug(result)
returned_data_0 = ssh.execute(
"cat %s/%s/%s/%s" % (
@@ -442,8 +506,12 @@ class TestSnapshots(cloudstackTestCase):
self.services["paths"]["random_data"]
))
except Exception as e:
- self.fail("SSH access failed for VM: %s" %
- new_virtual_machine.ipaddress)
+ self.fail("SSH access failed for VM: %s, Exception: %s" %
+ (new_virtual_machine.ipaddress, e))
+
+ self.debug("returned_data_0: %s" % returned_data_0[0])
+ self.debug("returned_data_1: %s" % returned_data_1[0])
+
#Verify returned data
self.assertEqual(
random_data_0,
@@ -512,7 +580,7 @@ class TestSnapshots(cloudstackTestCase):
"""
# Validate the following
# 1. login in VM and write some data on data disk(use fdisk to
- # partition datadisk,fdisk /dev/sdb, and make filesystem using
+ # partition datadisk,fdisk, and make filesystem using
# mkfs.ext3)
# 2. Detach the data disk and write some data on data disk
# 3. perform the snapshot on the detached volume
@@ -540,12 +608,12 @@ class TestSnapshots(cloudstackTestCase):
#Format partition using ext3
format_volume_to_ext3(
ssh_client,
- self.services["volume"]["diskdevice"]
+ self.services["volume"][self.hypervisor]["datadiskdevice_1"]
)
cmds = [
"mkdir -p %s" % self.services["paths"]["mount_dir"],
"mount %s1 %s" % (
- self.services["volume"]["diskdevice"],
+ self.services["volume"][self.hypervisor]["datadiskdevice_1"],
self.services["paths"]["mount_dir"]
),
"pushd %s" % self.services["paths"]["mount_dir"],
@@ -567,6 +635,7 @@ class TestSnapshots(cloudstackTestCase):
self.services["paths"]["random_data"]
),
"sync",
+ "umount %s" % (self.services["paths"]["mount_dir"]),
]
for c in cmds:
self.debug(ssh_client.execute(c))
@@ -641,7 +710,7 @@ class TestSnapshots(cloudstackTestCase):
#3. Create Template from snapshot
#4. Deploy Virtual machine using this template
#5. Login to newly created virtual machine
- #6. Compare data
+ #6. Compare data in the root disk with the one that was written on the volume, it should match
random_data_0 = random_gen(size=100)
random_data_1 = random_gen(size=100)
@@ -653,7 +722,7 @@ class TestSnapshots(cloudstackTestCase):
cmds = [
"mkdir -p %s" % self.services["paths"]["mount_dir"],
"mount %s1 %s" % (
- self.services["volume"]["diskdevice"],
+ self.services["volume"][self.hypervisor]["rootdiskdevice"],
self.services["paths"]["mount_dir"]
),
"mkdir -p %s/%s/{%s,%s} " % (
@@ -767,7 +836,7 @@ class TestSnapshots(cloudstackTestCase):
cmds = [
"mkdir -p %s" % self.services["paths"]["mount_dir"],
"mount %s1 %s" % (
- self.services["volume"]["diskdevice"],
+ self.services["volume"][self.hypervisor]["rootdiskdevice"],
self.services["paths"]["mount_dir"]
)
]
@@ -813,8 +882,8 @@ class TestSnapshots(cloudstackTestCase):
ssh_client.execute(c)
except Exception as e:
- self.fail("SSH failed for VM with IP address: %s" %
- new_virtual_machine.ipaddress)
+ self.fail("SSH failed for VM with IP address: %s, Exception: %s" %
+ (new_virtual_machine.ipaddress, e))
return
@@ -920,7 +989,7 @@ class TestCreateVMSnapshotTemplate(cloudstackTestCase):
volume = volumes[0]
# Create a snapshot from the ROOTDISK
- snapshot = Snapshot.create(self.apiclient, volumes[0].id)
+ snapshot = Snapshot.create(self.apiclient, volume.id)
self.debug("Snapshot created: ID - %s" % snapshot.id)
self.cleanup.append(snapshot)
@@ -1016,7 +1085,6 @@ class TestCreateVMSnapshotTemplate(cloudstackTestCase):
self.assertTrue(is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, snapshot_uuid))
return
-
class TestSnapshotEvents(cloudstackTestCase):
@classmethod
@@ -1087,7 +1155,7 @@ class TestSnapshotEvents(cloudstackTestCase):
except Exception as e:
raise Exception("Warning: Exception during cleanup : %s" % e)
return
-
+
@attr(speed = "slow")
@attr(tags = ["advanced", "advancedns"])
def test_05_snapshot_events(self):
@@ -1113,7 +1181,7 @@ class TestSnapshotEvents(cloudstackTestCase):
volume = volumes[0]
# Create a snapshot from the ROOTDISK
- snapshot = Snapshot.create(self.apiclient, volumes[0].id)
+ snapshot = Snapshot.create(self.apiclient, volume.id)
self.debug("Snapshot created with ID: %s" % snapshot.id)
snapshots = list_snapshots(
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3c350ab0/tools/marvin/marvin/integration/lib/common.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/integration/lib/common.py b/tools/marvin/marvin/integration/lib/common.py
index 164ef20..1386eaf 100644
--- a/tools/marvin/marvin/integration/lib/common.py
+++ b/tools/marvin/marvin/integration/lib/common.py
@@ -22,6 +22,7 @@ from marvin.cloudstackAPI import *
from marvin.remoteSSHClient import remoteSSHClient
from utils import *
from base import *
+from marvin.codes import PASS
#Import System modules
import time
@@ -198,6 +199,18 @@ def get_template(apiclient, zoneid, ostype, services=None):
ostypeid)
return
+def get_hypervisor_type(apiclient):
+
+ """Return the hypervisor type of the hosts in setup"""
+
+ hosts = list_hosts(apiclient, type='Routing', listall=True)
+
+ hosts_list_validation_result = validateList(hosts)
+
+ assert hosts_list_validation_result[0] == PASS, "host list validation failed"
+
+ return hosts_list_validation_result[1].hypervisor
+
def download_systemplates_sec_storage(server, services):
"""Download System templates on sec storage"""