#!/usr/bin/env python3 # # Test json:{} filenames with qemu-internal BDSs # (the one of commit, to be precise) # # Copyright (C) 2018 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 . # # Creator/Owner: Max Reitz import iotests from iotests import log, qemu_img, qemu_io_silent, filter_qmp_testfiles, \ filter_qmp_imgfmt import json # Need backing file support (for arbitrary backing formats) iotests.verify_image_format(supported_fmts=['qcow2', 'qcow', 'qed']) iotests.verify_platform(['linux']) # There are two variations of this test: # (1) We do not set filter_node_name. In that case, the commit_top # driver should not appear anywhere. # (2) We do set filter_node_name. In that case, it should appear. # # This for loop executes both. for filter_node_name in False, True: log('') log('--- filter_node_name: %s ---' % filter_node_name) log('') with iotests.FilePath('base.img') as base_img_path, \ iotests.FilePath('mid.img') as mid_img_path, \ iotests.FilePath('top.img') as top_img_path, \ iotests.VM() as vm: assert qemu_img('create', '-f', iotests.imgfmt, base_img_path, '64M') == 0 assert qemu_img('create', '-f', iotests.imgfmt, '-b', base_img_path, mid_img_path) == 0 assert qemu_img('create', '-f', iotests.imgfmt, '-b', mid_img_path, top_img_path) == 0 # Something to commit assert qemu_io_silent(mid_img_path, '-c', 'write -P 1 0 1M') == 0 vm.launch() # Change the bottom-most image's backing file (to null-co://) # to enforce json:{} filenames vm.qmp_log('blockdev-add', node_name='top', driver=iotests.imgfmt, file={ 'driver': 'file', 'filename': top_img_path }, backing={ 'node-name': 'mid', 'driver': iotests.imgfmt, 'file': { 'driver': 'file', 'filename': mid_img_path }, 'backing': { 'node-name': 'base', 'driver': iotests.imgfmt, 'file': { 'driver': 'file', 'filename': base_img_path }, 'backing': { 'driver': 'null-co' } } }, filters=[filter_qmp_testfiles, filter_qmp_imgfmt]) # As long as block-commit does not accept node names, we have to # get our mid/base filenames here mid_name = vm.node_info('mid')['image']['filename'] base_name = vm.node_info('base')['image']['filename'] assert mid_name[:5] == 'json:' assert base_name[:5] == 'json:' # Start the block job if filter_node_name: vm.qmp_log('block-commit', job_id='commit', device='top', filter_node_name='filter_node', top=mid_name, base=base_name, speed=1, filters=[filter_qmp_testfiles, filter_qmp_imgfmt]) else: vm.qmp_log('block-commit', job_id='commit', device='top', top=mid_name, base=base_name, speed=1, filters=[filter_qmp_testfiles, filter_qmp_imgfmt]) vm.qmp_log('job-pause', id='commit') # Get and parse top's json:{} filename top_name = vm.node_info('top')['image']['filename'] vm.shutdown() assert top_name[:5] == 'json:' top_options = json.loads(top_name[5:]) if filter_node_name: # This should be present and set assert top_options['backing']['driver'] == 'commit_top' # And the mid image is commit_top's backing image mid_options = top_options['backing']['backing'] else: # The mid image should appear as the immediate backing BDS # of top mid_options = top_options['backing'] assert mid_options['driver'] == iotests.imgfmt assert mid_options['file']['filename'] == mid_img_path