1#!/usr/bin/env python 2# 3# Test VPC and file image creation 4# 5# Copyright (C) 2019 Red Hat, Inc. 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 21import iotests 22from iotests import imgfmt 23 24 25def blockdev_create(vm, options): 26 result = vm.qmp_log('blockdev-create', job_id='job0', options=options, 27 filters=[iotests.filter_qmp_testfiles]) 28 29 if 'return' in result: 30 assert result['return'] == {} 31 vm.run_job('job0') 32 33 34# Successful image creation (defaults) 35def implicit_defaults(vm, file_path): 36 iotests.log("=== Successful image creation (defaults) ===") 37 iotests.log("") 38 39 # 8 heads, 964 cyls/head, 17 secs/cyl 40 # (Close to 64 MB) 41 size = 8 * 964 * 17 * 512 42 43 blockdev_create(vm, { 'driver': imgfmt, 44 'file': 'protocol-node', 45 'size': size }) 46 47 48# Successful image creation (explicit defaults) 49def explicit_defaults(vm, file_path): 50 iotests.log("=== Successful image creation (explicit defaults) ===") 51 iotests.log("") 52 53 # 16 heads, 964 cyls/head, 17 secs/cyl 54 # (Close to 128 MB) 55 size = 16 * 964 * 17 * 512 56 57 blockdev_create(vm, { 'driver': imgfmt, 58 'file': 'protocol-node', 59 'size': size, 60 'subformat': 'dynamic', 61 'force-size': False }) 62 63 64# Successful image creation (non-default options) 65def non_defaults(vm, file_path): 66 iotests.log("=== Successful image creation (non-default options) ===") 67 iotests.log("") 68 69 # Not representable in CHS (fine with force-size=True) 70 size = 1048576 71 72 blockdev_create(vm, { 'driver': imgfmt, 73 'file': 'protocol-node', 74 'size': size, 75 'subformat': 'fixed', 76 'force-size': True }) 77 78 79# Size not representable in CHS with force-size=False 80def non_chs_size_without_force(vm, file_path): 81 iotests.log("=== Size not representable in CHS ===") 82 iotests.log("") 83 84 # Not representable in CHS (will not work with force-size=False) 85 size = 1048576 86 87 blockdev_create(vm, { 'driver': imgfmt, 88 'file': 'protocol-node', 89 'size': size, 90 'force-size': False }) 91 92 93# Zero size 94def zero_size(vm, file_path): 95 iotests.log("=== Zero size===") 96 iotests.log("") 97 98 blockdev_create(vm, { 'driver': imgfmt, 99 'file': 'protocol-node', 100 'size': 0 }) 101 102 103# Maximum CHS size 104def maximum_chs_size(vm, file_path): 105 iotests.log("=== Maximum CHS size===") 106 iotests.log("") 107 108 blockdev_create(vm, { 'driver': imgfmt, 109 'file': 'protocol-node', 110 'size': 16 * 65535 * 255 * 512 }) 111 112 113# Actual maximum size 114def maximum_size(vm, file_path): 115 iotests.log("=== Actual maximum size===") 116 iotests.log("") 117 118 blockdev_create(vm, { 'driver': imgfmt, 119 'file': 'protocol-node', 120 'size': 0xff000000 * 512, 121 'force-size': True }) 122 123 124def main(): 125 for test_func in [implicit_defaults, explicit_defaults, non_defaults, 126 non_chs_size_without_force, zero_size, maximum_chs_size, 127 maximum_size]: 128 129 with iotests.FilePath('t.vpc') as file_path, \ 130 iotests.VM() as vm: 131 132 vm.launch() 133 134 iotests.log('--- Creating empty file ---') 135 blockdev_create(vm, { 'driver': 'file', 136 'filename': file_path, 137 'size': 0 }) 138 139 vm.qmp_log('blockdev-add', driver='file', filename=file_path, 140 node_name='protocol-node', 141 filters=[iotests.filter_qmp_testfiles]) 142 iotests.log('') 143 144 print_info = test_func(vm, file_path) 145 iotests.log('') 146 147 vm.shutdown() 148 iotests.img_info_log(file_path) 149 150 151iotests.script_main(main, 152 supported_fmts=['vpc'], 153 supported_protocols=['file']) 154