|  | #!/usr/bin/env python3 | 
|  | # group: rw quick | 
|  | # | 
|  | # Test for dumping of qcow2 image metadata | 
|  | # | 
|  | # Copyright (c) 2020 Virtuozzo International GmbH | 
|  | # | 
|  | # 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 <http://www.gnu.org/licenses/>. | 
|  | # | 
|  |  | 
|  | import iotests | 
|  | import subprocess | 
|  | from iotests import qemu_img_create, qemu_io_log, file_path, log, \ | 
|  | verify_qcow2_zstd_compression | 
|  |  | 
|  | iotests.script_initialize(supported_fmts=['qcow2'], | 
|  | unsupported_imgopts=['refcount_bits', 'compat']) | 
|  | verify_qcow2_zstd_compression() | 
|  |  | 
|  | disk = file_path('disk') | 
|  | chunk = 1024 * 1024 | 
|  |  | 
|  |  | 
|  | def create_bitmap(bitmap_number, disabled): | 
|  | granularity = 1 << (14 + bitmap_number) | 
|  | bitmap_name = 'bitmap-' + str(bitmap_number) | 
|  | args = ['bitmap', '--add', '-g', f'{granularity}', '-f', iotests.imgfmt, | 
|  | disk, bitmap_name] | 
|  | if disabled: | 
|  | args.append('--disable') | 
|  |  | 
|  | iotests.qemu_img(*args) | 
|  |  | 
|  |  | 
|  | def write_to_disk(offset, size): | 
|  | write = f'write {offset} {size}' | 
|  | qemu_io_log('-c', write, disk) | 
|  |  | 
|  |  | 
|  | def add_bitmap(num, begin, end, disabled): | 
|  | log(f'Add bitmap {num}') | 
|  | create_bitmap(num, disabled) | 
|  | for i in range(begin, end): | 
|  | write_to_disk((i) * chunk, chunk) | 
|  | log('') | 
|  |  | 
|  |  | 
|  | def test(compression_type: str, json_output: bool) -> None: | 
|  | qemu_img_create('-f', iotests.imgfmt, | 
|  | '-o', f'compression_type={compression_type}', | 
|  | disk, '10M') | 
|  | add_bitmap(1, 0, 6, False) | 
|  | add_bitmap(2, 6, 8, True) | 
|  |  | 
|  | cmd = ['./qcow2.py', disk, 'dump-header'] | 
|  | if json_output: | 
|  | cmd.append('-j') | 
|  |  | 
|  | subprocess.run(cmd) | 
|  |  | 
|  |  | 
|  | test('zlib', False) | 
|  | test('zstd', True) |