From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45699) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UpBmE-00023m-W3 for qemu-devel@nongnu.org; Wed, 19 Jun 2013 02:21:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UpBmD-0008Kb-61 for qemu-devel@nongnu.org; Wed, 19 Jun 2013 02:21:54 -0400 Received: from e28smtp09.in.ibm.com ([122.248.162.9]:33902) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UpBmC-0008KV-JU for qemu-devel@nongnu.org; Wed, 19 Jun 2013 02:21:53 -0400 Received: from /spool/local by e28smtp09.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 19 Jun 2013 11:47:18 +0530 Received: from d28relay05.in.ibm.com (d28relay05.in.ibm.com [9.184.220.62]) by d28dlp01.in.ibm.com (Postfix) with ESMTP id 15D64E004F for ; Wed, 19 Jun 2013 11:51:12 +0530 (IST) Received: from d28av01.in.ibm.com (d28av01.in.ibm.com [9.184.220.63]) by d28relay05.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r5J6Lg3u17301730 for ; Wed, 19 Jun 2013 11:51:42 +0530 Received: from d28av01.in.ibm.com (loopback [127.0.0.1]) by d28av01.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r5J6LjqM023224 for ; Wed, 19 Jun 2013 06:21:45 GMT Message-ID: <51C14DEB.4050702@linux.vnet.ibm.com> Date: Wed, 19 Jun 2013 14:21:31 +0800 From: Wenchao Xia MIME-Version: 1.0 References: <1371209999-15579-1-git-send-email-xiawenc@linux.vnet.ibm.com> <1371209999-15579-13-git-send-email-xiawenc@linux.vnet.ibm.com> <20130618143212.GP7649@stefanha-thinkpad.redhat.com> In-Reply-To: <20130618143212.GP7649@stefanha-thinkpad.redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH V2 12/12] qemu-iotests: add 055 internal snapshot for block device test case List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Stefan Hajnoczi Cc: kwolf@redhat.com, phrdina@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, armbru@redhat.com, lcapitulino@redhat.com, stefanha@redhat.com, pbonzini@redhat.com, dietmar@proxmox.com 于 2013-6-18 22:32, Stefan Hajnoczi 写道: > On Fri, Jun 14, 2013 at 07:39:59PM +0800, Wenchao Xia wrote: >> Signed-off-by: Wenchao Xia >> --- >> tests/qemu-iotests/055 | 157 ++++++++++++++++++++++++++++++++++++++++++++ >> tests/qemu-iotests/055.out | 5 ++ > > drive-backup already uses 055, please name it 056 to avoid conflicts. > OK. >> 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) 2013 IBM ... > > Based on 055: > oops.... >> +# 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', {}) > > This tests the success case. Please also use the 'Abort' action to test > the error case. Is "Abort" upstreamed? If yes I will add that part. > >> + 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') > > Please check that empty names error too. > OK. -- Best Regards Wenchao Xia