1#!/usr/bin/env bash 2# group: rw auto quick 3# 4# Test case for ejecting a BlockBackend with an NBD server attached to it 5# 6# Verify that the NBD server stops offering the drive when ejecting a 7# BlockDriverState tree from a BlockBackend (that is, a medium from a 8# drive) exposed via an NBD server. 9# 10# Copyright (C) 2016 Red Hat, Inc. 11# 12# This program is free software; you can redistribute it and/or modify 13# it under the terms of the GNU General Public License as published by 14# the Free Software Foundation; either version 2 of the License, or 15# (at your option) any later version. 16# 17# This program is distributed in the hope that it will be useful, 18# but WITHOUT ANY WARRANTY; without even the implied warranty of 19# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20# GNU General Public License for more details. 21# 22# You should have received a copy of the GNU General Public License 23# along with this program. If not, see <http://www.gnu.org/licenses/>. 24# 25 26# creator 27owner=hreitz@redhat.com 28 29seq="$(basename $0)" 30echo "QA output created by $seq" 31 32status=1 # failure is the default! 33 34_cleanup() 35{ 36 _cleanup_qemu 37 _cleanup_test_img 38 rm -f "$SOCK_DIR/nbd" 39} 40trap "_cleanup; exit \$status" 0 1 2 3 15 41 42# get standard environment, filters and checks 43. ./common.rc 44. ./common.filter 45. ./common.qemu 46 47_supported_fmt generic 48_supported_proto file fuse 49_supported_os Linux 50 51_make_test_img 64k 52 53$QEMU_IO -c 'write -P 42 0 64k' "$TEST_IMG" | _filter_qemu_io 54 55if test "$IMGOPTSSYNTAX" = "true" 56then 57 SYSEMU_DRIVE_ARG=if=none,media=cdrom,id=drv,"$TEST_IMG" 58else 59 SYSEMU_DRIVE_ARG=if=none,media=cdrom,id=drv,file="$TEST_IMG",driver=$IMGFMT 60fi 61 62keep_stderr=y \ 63_launch_qemu -drive $SYSEMU_DRIVE_ARG \ 64 2> >(_filter_nbd) 65 66_send_qemu_cmd $QEMU_HANDLE \ 67 "{ 'execute': 'qmp_capabilities' }" \ 68 'return' 69 70_send_qemu_cmd $QEMU_HANDLE \ 71 "{ 'execute': 'nbd-server-start', 72 'arguments': { 'addr': { 'type': 'unix', 73 'data': { 'path': '$SOCK_DIR/nbd' }}}}" \ 74 'return' 75 76_send_qemu_cmd $QEMU_HANDLE \ 77 "{ 'execute': 'nbd-server-add', 78 'arguments': { 'device': 'drv' }}" \ 79 'return' 80 81$QEMU_IO_PROG -f raw -r -c 'read -P 42 0 64k' \ 82 "nbd+unix:///drv?socket=$SOCK_DIR/nbd" 2>&1 \ 83 | _filter_qemu_io | _filter_nbd 84 85# The order of 'return' and the BLOCK_EXPORT_DELETED event is undefined. Just 86# wait until we've twice seen one of them. Filter the 'return' line out so that 87# the output is defined. 88_send_qemu_cmd $QEMU_HANDLE \ 89 "{ 'execute': 'eject', 90 'arguments': { 'device': 'drv' }}" \ 91 'return\|BLOCK_EXPORT_DELETED' | 92 grep -v 'return' 93 94_send_qemu_cmd $QEMU_HANDLE '' 'return\|BLOCK_EXPORT_DELETED' | 95 grep -v 'return' 96 97$QEMU_IO_PROG -f raw -r -c close \ 98 "nbd+unix:///drv?socket=$SOCK_DIR/nbd" 2>&1 \ 99 | _filter_qemu_io | _filter_nbd 100 101_send_qemu_cmd $QEMU_HANDLE \ 102 "{ 'execute': 'quit' }" \ 103 'return' 104 105wait=1 _cleanup_qemu 106 107# success, all done 108echo '*** done' 109rm -f $seq.full 110status=0 111