#!/usr/bin/env bash
#
# Test case for ejecting a BlockBackend with an NBD server attached to it
#
# Verify that the NBD server stops offering the drive when ejecting a
# BlockDriverState tree from a BlockBackend (that is, a medium from a
# drive) exposed via an NBD server.
#
# Copyright (C) 2016 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 <http://www.gnu.org/licenses/>.
#

# creator
owner=mreitz@redhat.com

seq="$(basename $0)"
echo "QA output created by $seq"

status=1	# failure is the default!

_cleanup()
{
    _cleanup_qemu
    _cleanup_test_img
    rm -f "$SOCK_DIR/nbd"
}
trap "_cleanup; exit \$status" 0 1 2 3 15

# get standard environment, filters and checks
. ./common.rc
. ./common.filter
. ./common.qemu

_supported_fmt generic
_supported_proto file fuse
_supported_os Linux

_make_test_img 64k

$QEMU_IO -c 'write -P 42 0 64k' "$TEST_IMG" | _filter_qemu_io

if test "$IMGOPTSSYNTAX" = "true"
then
    SYSEMU_DRIVE_ARG=if=none,media=cdrom,id=drv,"$TEST_IMG"
else
    SYSEMU_DRIVE_ARG=if=none,media=cdrom,id=drv,file="$TEST_IMG",driver=$IMGFMT
fi

keep_stderr=y \
_launch_qemu -drive $SYSEMU_DRIVE_ARG \
    2> >(_filter_nbd)

_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'qmp_capabilities' }" \
    'return'

_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'nbd-server-start',
       'arguments': { 'addr': { 'type': 'unix',
                                'data': { 'path': '$SOCK_DIR/nbd' }}}}" \
    'return'

_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'nbd-server-add',
       'arguments': { 'device': 'drv' }}" \
    'return'

$QEMU_IO_PROG -f raw -r -c 'read -P 42 0 64k' \
    "nbd+unix:///drv?socket=$SOCK_DIR/nbd" 2>&1 \
    | _filter_qemu_io | _filter_nbd

# The order of 'return' and the BLOCK_EXPORT_DELETED event is undefined. Just
# wait until we've twice seen one of them. Filter the 'return' line out so that
# the output is defined.
_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'eject',
       'arguments': { 'device': 'drv' }}" \
    'return\|BLOCK_EXPORT_DELETED' |
    grep -v 'return'

_send_qemu_cmd $QEMU_HANDLE '' 'return\|BLOCK_EXPORT_DELETED' |
    grep -v 'return'

$QEMU_IO_PROG -f raw -r -c close \
    "nbd+unix:///drv?socket=$SOCK_DIR/nbd" 2>&1 \
    | _filter_qemu_io | _filter_nbd

_send_qemu_cmd $QEMU_HANDLE \
    "{ 'execute': 'quit' }" \
    'return'

wait=1 _cleanup_qemu

# success, all done
echo '*** done'
rm -f $seq.full
status=0
