From patchwork Fri Jun 14 11:39:59 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wayne Xia X-Patchwork-Id: 251389 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 17D382C0084 for ; Fri, 14 Jun 2013 21:45:49 +1000 (EST) Received: from localhost ([::1]:46643 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UnSRv-0003Q0-1u for incoming@patchwork.ozlabs.org; Fri, 14 Jun 2013 07:45:47 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41969) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UnSOv-0007kv-Cd for qemu-devel@nongnu.org; Fri, 14 Jun 2013 07:42:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UnSOt-0006GO-PN for qemu-devel@nongnu.org; Fri, 14 Jun 2013 07:42:41 -0400 Received: from e23smtp03.au.ibm.com ([202.81.31.145]:53820) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UnSOl-0006B1-9I for qemu-devel@nongnu.org; Fri, 14 Jun 2013 07:42:39 -0400 Received: from /spool/local by e23smtp03.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 14 Jun 2013 21:33:08 +1000 Received: from d23dlp02.au.ibm.com (202.81.31.213) by e23smtp03.au.ibm.com (202.81.31.209) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 14 Jun 2013 21:33:06 +1000 Received: from d23relay04.au.ibm.com (d23relay04.au.ibm.com [9.190.234.120]) by d23dlp02.au.ibm.com (Postfix) with ESMTP id 049E52BB005E for ; Fri, 14 Jun 2013 21:42:14 +1000 (EST) Received: from d23av04.au.ibm.com (d23av04.au.ibm.com [9.190.235.139]) by d23relay04.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r5EBRbo7066008 for ; Fri, 14 Jun 2013 21:27:38 +1000 Received: from d23av04.au.ibm.com (loopback [127.0.0.1]) by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r5EBgD5C026793 for ; Fri, 14 Jun 2013 21:42:13 +1000 Received: from RH63Wenchao (wenchaox.cn.ibm.com [9.115.122.53]) by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r5EBe6Xn024253; Fri, 14 Jun 2013 21:42:11 +1000 From: Wenchao Xia To: qemu-devel@nongnu.org Date: Fri, 14 Jun 2013 19:39:59 +0800 Message-Id: <1371209999-15579-13-git-send-email-xiawenc@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1371209999-15579-1-git-send-email-xiawenc@linux.vnet.ibm.com> References: <1371209999-15579-1-git-send-email-xiawenc@linux.vnet.ibm.com> X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13061411-6102-0000-0000-000003B41B6D X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 202.81.31.145 Cc: kwolf@redhat.com, phrdina@redhat.com, famz@redhat.com, Wenchao Xia , armbru@redhat.com, lcapitulino@redhat.com, stefanha@redhat.com, pbonzini@redhat.com, dietmar@proxmox.com Subject: [Qemu-devel] [PATCH V2 12/12] qemu-iotests: add 055 internal snapshot for block device test case X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Wenchao Xia --- tests/qemu-iotests/055 | 157 ++++++++++++++++++++++++++++++++++++++++++++ tests/qemu-iotests/055.out | 5 ++ tests/qemu-iotests/group | 1 + 3 files changed, 163 insertions(+), 0 deletions(-) create mode 100755 tests/qemu-iotests/055 create mode 100644 tests/qemu-iotests/055.out diff --git a/tests/qemu-iotests/055 b/tests/qemu-iotests/055 new file mode 100755 index 0000000..7658f22 --- /dev/null +++ b/tests/qemu-iotests/055 @@ -0,0 +1,157 @@ +#!/usr/bin/env python +# +# Tests for internal snapshot. +# +# Copyright (C) 2012 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import time +import os +import iotests +from iotests import qemu_img, qemu_io + +test_drv_base_name = 'drive' + +class ImageSnapshotTestCase(iotests.QMPTestCase): + image_len = 120 * 1024 * 1024 # MB + + def __init__(self, *args): + self.expect = [] + super(ImageSnapshotTestCase, self).__init__(*args) + + def _setUp(self, test_img_base_name, image_num): + self.vm = iotests.VM() + for i in range(0, image_num): + filename = '%s%d' % (test_img_base_name, i) + img = os.path.join(iotests.test_dir, filename) + device = '%s%d' % (test_drv_base_name, i) + qemu_img('create', '-f', iotests.imgfmt, img, str(self.image_len)) + self.vm.add_drive(img) + self.expect.append({'image': img, 'device': device, + 'snapshots': [], 'snapshots_name_counter': 0}) + self.vm.launch() + + def tearDown(self): + self.vm.shutdown() + for i in range(0, len(self.expect)): + os.remove(self.expect[i]['image']) + + def createSnapshotInTransaction(self, snapshot_num): + actions = [] + for i in range(0, len(self.expect)): + num = self.expect[i]['snapshots_name_counter'] + for j in range(0, snapshot_num): + name = '%s_sn%d' % (self.expect[i]['device'], num) + num = num + 1 + self.expect[i]['snapshots'].append(name) + actions.append({ + 'type': 'blockdev-snapshot-internal-sync', + 'data': { 'device': self.expect[i]['device'], + 'name': name }, + }) + self.expect[i]['snapshots_name_counter'] = num + result = self.vm.qmp('transaction', actions = actions) + self.assert_qmp(result, 'return', {}) + + def verifySnapshotInfo(self): + expect = self.expect + result = self.vm.qmp('query-block') + for i in range(0, len(expect)): + image = None + for device in result['return']: + if device['device'] == expect[i]['device']: + image = device['inserted']['image'] + break + self.assertTrue(image != None) + self.assertTrue(len(image['snapshots']) == + len(expect[i]['snapshots'])) + for j in range(0, len(image['snapshots'])): + try: + expect[i]['snapshots'].index(image['snapshots'][j]['name']) + except: + print 'not full match, image info:\n%s\n, expect:%s\n' % \ + (str(image), str(expect)) + self.assertTrue(False) + + def deleteSnapshot(self, device, name): + result = self.vm.qmp('blockdev-snapshot-delete-internal-sync', + device = device, + name = name) + self.assert_qmp(result, 'return', {}) + expect = self.expect + sn_list_expect = None + for i in range(0, len(expect)): + if expect[i]['device'] == device : + sn_list_expect = expect[i]['snapshots'] + break + self.assertTrue(sn_list_expect != None) + try: + sn_list_expect.remove(name) + except: + print 'snapshot %s not found in expect:\n%s\n' % \ + (name, str(expect)) + self.assertTrue(False) + +class TestSingleTransaction(ImageSnapshotTestCase): + def setUp(self): + self._setUp('test_a.img', 1) + + def test_create(self): + self.createSnapshotInTransaction(1) + self.verifySnapshotInfo() + + def test_error_name(self): + actions = [{'type': 'blockdev-snapshot-internal-sync', + 'data': { 'device': self.expect[0]['device'], + 'name': '1234' }, + }] + result = self.vm.qmp('transaction', actions = actions) + self.assert_qmp(result, 'error/class', 'GenericError') + + def test_error_device(self): + actions = [{'type': 'blockdev-snapshot-internal-sync', + 'data': { 'device': 'driveerror', + 'name': 'a' }, + }] + result = self.vm.qmp('transaction', actions = actions) + self.assert_qmp(result, 'error/class', 'DeviceNotFound') + + def test_error_exist(self): + self.createSnapshotInTransaction(1) + self.verifySnapshotInfo() + actions = [{'type': 'blockdev-snapshot-internal-sync', + 'data': { 'device': self.expect[0]['device'], + 'name': self.expect[0]['snapshots'][0] }, + }] + result = self.vm.qmp('transaction', actions = actions) + self.assert_qmp(result, 'error/class', 'GenericError') + +class TestMultipleTransaction(ImageSnapshotTestCase): + def setUp(self): + self._setUp('test_b.img', 2) + + def test_create(self): + self.createSnapshotInTransaction(3) + self.verifySnapshotInfo() + + def test_delete(self): + self.createSnapshotInTransaction(3) + self.verifySnapshotInfo() + self.deleteSnapshot(self.expect[0]['device'], self.expect[0]['snapshots'][1]) + self.verifySnapshotInfo() + +if __name__ == '__main__': + iotests.main(supported_fmts=['qcow2']) diff --git a/tests/qemu-iotests/055.out b/tests/qemu-iotests/055.out new file mode 100644 index 0000000..3f8a935 --- /dev/null +++ b/tests/qemu-iotests/055.out @@ -0,0 +1,5 @@ +...... +---------------------------------------------------------------------- +Ran 6 tests + +OK diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index 387b050..e5762f9 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -61,3 +61,4 @@ 052 rw auto backing 053 rw auto 054 rw auto +055 rw auto