Annotation of qemu/tests/qemu-iotests/030, revision 1.1

1.1     ! root        1: #!/usr/bin/env python
        !             2: #
        !             3: # Tests for image streaming.
        !             4: #
        !             5: # Copyright (C) 2012 IBM Corp.
        !             6: #
        !             7: # This program is free software; you can redistribute it and/or modify
        !             8: # it under the terms of the GNU General Public License as published by
        !             9: # the Free Software Foundation; either version 2 of the License, or
        !            10: # (at your option) any later version.
        !            11: #
        !            12: # This program is distributed in the hope that it will be useful,
        !            13: # but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            14: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            15: # GNU General Public License for more details.
        !            16: #
        !            17: # You should have received a copy of the GNU General Public License
        !            18: # along with this program.  If not, see <http://www.gnu.org/licenses/>.
        !            19: #
        !            20: 
        !            21: import os
        !            22: import iotests
        !            23: from iotests import qemu_img, qemu_io
        !            24: 
        !            25: backing_img = os.path.join(iotests.test_dir, 'backing.img')
        !            26: mid_img = os.path.join(iotests.test_dir, 'mid.img')
        !            27: test_img = os.path.join(iotests.test_dir, 'test.img')
        !            28: 
        !            29: class ImageStreamingTestCase(iotests.QMPTestCase):
        !            30:     '''Abstract base class for image streaming test cases'''
        !            31: 
        !            32:     def assert_no_active_streams(self):
        !            33:         result = self.vm.qmp('query-block-jobs')
        !            34:         self.assert_qmp(result, 'return', [])
        !            35: 
        !            36:     def cancel_and_wait(self, drive='drive0'):
        !            37:         '''Cancel a block job and wait for it to finish'''
        !            38:         result = self.vm.qmp('block-job-cancel', device=drive)
        !            39:         self.assert_qmp(result, 'return', {})
        !            40: 
        !            41:         cancelled = False
        !            42:         while not cancelled:
        !            43:             for event in self.vm.get_qmp_events(wait=True):
        !            44:                 if event['event'] == 'BLOCK_JOB_CANCELLED':
        !            45:                     self.assert_qmp(event, 'data/type', 'stream')
        !            46:                     self.assert_qmp(event, 'data/device', drive)
        !            47:                     cancelled = True
        !            48: 
        !            49:         self.assert_no_active_streams()
        !            50: 
        !            51: class TestSingleDrive(ImageStreamingTestCase):
        !            52:     image_len = 1 * 1024 * 1024 # MB
        !            53: 
        !            54:     def setUp(self):
        !            55:         qemu_img('create', backing_img, str(TestSingleDrive.image_len))
        !            56:         qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, mid_img)
        !            57:         qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % mid_img, test_img)
        !            58:         self.vm = iotests.VM().add_drive(test_img)
        !            59:         self.vm.launch()
        !            60: 
        !            61:     def tearDown(self):
        !            62:         self.vm.shutdown()
        !            63:         os.remove(test_img)
        !            64:         os.remove(mid_img)
        !            65:         os.remove(backing_img)
        !            66: 
        !            67:     def test_stream(self):
        !            68:         self.assert_no_active_streams()
        !            69: 
        !            70:         result = self.vm.qmp('block-stream', device='drive0')
        !            71:         self.assert_qmp(result, 'return', {})
        !            72: 
        !            73:         completed = False
        !            74:         while not completed:
        !            75:             for event in self.vm.get_qmp_events(wait=True):
        !            76:                 if event['event'] == 'BLOCK_JOB_COMPLETED':
        !            77:                     self.assert_qmp(event, 'data/type', 'stream')
        !            78:                     self.assert_qmp(event, 'data/device', 'drive0')
        !            79:                     self.assert_qmp(event, 'data/offset', self.image_len)
        !            80:                     self.assert_qmp(event, 'data/len', self.image_len)
        !            81:                     completed = True
        !            82: 
        !            83:         self.assert_no_active_streams()
        !            84:         self.vm.shutdown()
        !            85: 
        !            86:         self.assertEqual(qemu_io('-c', 'map', backing_img),
        !            87:                          qemu_io('-c', 'map', test_img),
        !            88:                          'image file map does not match backing file after streaming')
        !            89: 
        !            90:     def test_stream_partial(self):
        !            91:         self.assert_no_active_streams()
        !            92: 
        !            93:         result = self.vm.qmp('block-stream', device='drive0', base=mid_img)
        !            94:         self.assert_qmp(result, 'return', {})
        !            95: 
        !            96:         completed = False
        !            97:         while not completed:
        !            98:             for event in self.vm.get_qmp_events(wait=True):
        !            99:                 if event['event'] == 'BLOCK_JOB_COMPLETED':
        !           100:                     self.assert_qmp(event, 'data/type', 'stream')
        !           101:                     self.assert_qmp(event, 'data/device', 'drive0')
        !           102:                     self.assert_qmp(event, 'data/offset', self.image_len)
        !           103:                     self.assert_qmp(event, 'data/len', self.image_len)
        !           104:                     completed = True
        !           105: 
        !           106:         self.assert_no_active_streams()
        !           107:         self.vm.shutdown()
        !           108: 
        !           109:         self.assertEqual(qemu_io('-c', 'map', mid_img),
        !           110:                          qemu_io('-c', 'map', test_img),
        !           111:                          'image file map does not match backing file after streaming')
        !           112: 
        !           113:     def test_device_not_found(self):
        !           114:         result = self.vm.qmp('block-stream', device='nonexistent')
        !           115:         self.assert_qmp(result, 'error/class', 'DeviceNotFound')
        !           116: 
        !           117: class TestStreamStop(ImageStreamingTestCase):
        !           118:     image_len = 8 * 1024 * 1024 * 1024 # GB
        !           119: 
        !           120:     def setUp(self):
        !           121:         qemu_img('create', backing_img, str(TestStreamStop.image_len))
        !           122:         qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, test_img)
        !           123:         self.vm = iotests.VM().add_drive(test_img)
        !           124:         self.vm.launch()
        !           125: 
        !           126:     def tearDown(self):
        !           127:         self.vm.shutdown()
        !           128:         os.remove(test_img)
        !           129:         os.remove(backing_img)
        !           130: 
        !           131:     def test_stream_stop(self):
        !           132:         import time
        !           133: 
        !           134:         self.assert_no_active_streams()
        !           135: 
        !           136:         result = self.vm.qmp('block-stream', device='drive0')
        !           137:         self.assert_qmp(result, 'return', {})
        !           138: 
        !           139:         time.sleep(1)
        !           140:         events = self.vm.get_qmp_events(wait=False)
        !           141:         self.assertEqual(events, [], 'unexpected QMP event: %s' % events)
        !           142: 
        !           143:         self.cancel_and_wait()
        !           144: 
        !           145: class TestSetSpeed(ImageStreamingTestCase):
        !           146:     image_len = 80 * 1024 * 1024 # MB
        !           147: 
        !           148:     def setUp(self):
        !           149:         qemu_img('create', backing_img, str(TestSetSpeed.image_len))
        !           150:         qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, test_img)
        !           151:         self.vm = iotests.VM().add_drive(test_img)
        !           152:         self.vm.launch()
        !           153: 
        !           154:     def tearDown(self):
        !           155:         self.vm.shutdown()
        !           156:         os.remove(test_img)
        !           157:         os.remove(backing_img)
        !           158: 
        !           159:     # This is a short performance test which is not run by default.
        !           160:     # Invoke "IMGFMT=qed ./030 TestSetSpeed.perf_test_throughput"
        !           161:     def perf_test_throughput(self):
        !           162:         self.assert_no_active_streams()
        !           163: 
        !           164:         result = self.vm.qmp('block-stream', device='drive0')
        !           165:         self.assert_qmp(result, 'return', {})
        !           166: 
        !           167:         result = self.vm.qmp('block-job-set-speed', device='drive0', speed=8 * 1024 * 1024)
        !           168:         self.assert_qmp(result, 'return', {})
        !           169: 
        !           170:         completed = False
        !           171:         while not completed:
        !           172:             for event in self.vm.get_qmp_events(wait=True):
        !           173:                 if event['event'] == 'BLOCK_JOB_COMPLETED':
        !           174:                     self.assert_qmp(event, 'data/type', 'stream')
        !           175:                     self.assert_qmp(event, 'data/device', 'drive0')
        !           176:                     self.assert_qmp(event, 'data/offset', self.image_len)
        !           177:                     self.assert_qmp(event, 'data/len', self.image_len)
        !           178:                     completed = True
        !           179: 
        !           180:         self.assert_no_active_streams()
        !           181: 
        !           182:     def test_set_speed(self):
        !           183:         self.assert_no_active_streams()
        !           184: 
        !           185:         result = self.vm.qmp('block-stream', device='drive0')
        !           186:         self.assert_qmp(result, 'return', {})
        !           187: 
        !           188:         # Default speed is 0
        !           189:         result = self.vm.qmp('query-block-jobs')
        !           190:         self.assert_qmp(result, 'return[0]/device', 'drive0')
        !           191:         self.assert_qmp(result, 'return[0]/speed', 0)
        !           192: 
        !           193:         result = self.vm.qmp('block-job-set-speed', device='drive0', speed=8 * 1024 * 1024)
        !           194:         self.assert_qmp(result, 'return', {})
        !           195: 
        !           196:         # Ensure the speed we set was accepted
        !           197:         result = self.vm.qmp('query-block-jobs')
        !           198:         self.assert_qmp(result, 'return[0]/device', 'drive0')
        !           199:         self.assert_qmp(result, 'return[0]/speed', 8 * 1024 * 1024)
        !           200: 
        !           201:         self.cancel_and_wait()
        !           202: 
        !           203:         # Check setting speed in block-stream works
        !           204:         result = self.vm.qmp('block-stream', device='drive0', speed=4 * 1024 * 1024)
        !           205:         self.assert_qmp(result, 'return', {})
        !           206: 
        !           207:         result = self.vm.qmp('query-block-jobs')
        !           208:         self.assert_qmp(result, 'return[0]/device', 'drive0')
        !           209:         self.assert_qmp(result, 'return[0]/speed', 4 * 1024 * 1024)
        !           210: 
        !           211:         self.cancel_and_wait()
        !           212: 
        !           213:     def test_set_speed_invalid(self):
        !           214:         self.assert_no_active_streams()
        !           215: 
        !           216:         result = self.vm.qmp('block-stream', device='drive0', speed=-1)
        !           217:         self.assert_qmp(result, 'error/class', 'InvalidParameter')
        !           218:         self.assert_qmp(result, 'error/data/name', 'speed')
        !           219: 
        !           220:         self.assert_no_active_streams()
        !           221: 
        !           222:         result = self.vm.qmp('block-stream', device='drive0')
        !           223:         self.assert_qmp(result, 'return', {})
        !           224: 
        !           225:         result = self.vm.qmp('block-job-set-speed', device='drive0', speed=-1)
        !           226:         self.assert_qmp(result, 'error/class', 'InvalidParameter')
        !           227:         self.assert_qmp(result, 'error/data/name', 'speed')
        !           228: 
        !           229:         self.cancel_and_wait()
        !           230: 
        !           231: if __name__ == '__main__':
        !           232:     iotests.main(supported_fmts=['qcow2', 'qed'])

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.