#!/usr/bin/env bash
# group: rw auto quick
#
# 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=hreitz@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
