xref: /qemu/tests/qemu-iotests/common.nbd (revision f8a57777)
1#!/bin/bash
2# -*- shell-script-mode -*-
3#
4# Helpers for NBD server related config
5#
6# Copyright (C) 2018 Red Hat, Inc.
7#
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20#
21
22nbd_unix_socket="${TEST_DIR}/qemu-nbd.sock"
23nbd_tcp_addr="127.0.0.1"
24nbd_pid_file="${TEST_DIR}/qemu-nbd.pid"
25
26nbd_server_stop()
27{
28    local NBD_PID
29    if [ -f "$nbd_pid_file" ]; then
30        read NBD_PID < "$nbd_pid_file"
31        rm -f "$nbd_pid_file"
32        if [ -n "$NBD_PID" ]; then
33            kill "$NBD_PID"
34        fi
35    fi
36    rm -f "$nbd_unix_socket"
37}
38
39nbd_server_wait_for_unix_socket()
40{
41    pid=$1
42
43    for ((i = 0; i < 300; i++))
44    do
45        if [ -r "$nbd_unix_socket" ]; then
46            return
47        fi
48        kill -s 0 $pid 2>/dev/null
49        if test $? != 0
50        then
51            echo "qemu-nbd unexpectedly quit"
52            exit 1
53        fi
54        sleep 0.1
55    done
56    echo "Failed in check of unix socket created by qemu-nbd"
57    exit 1
58}
59
60nbd_server_start_unix_socket()
61{
62    nbd_server_stop
63    $QEMU_NBD -v -t -k "$nbd_unix_socket" "$@" &
64    nbd_server_wait_for_unix_socket $!
65}
66
67nbd_server_set_tcp_port()
68{
69    (ss --help) >/dev/null 2>&1 || _notrun "ss utility not found, skipping test"
70
71    for ((port = 10809; port <= 10909; port++))
72    do
73        if ! ss -tln | grep -sqE ":$port\b"; then
74            nbd_tcp_port=$port
75            return
76        fi
77    done
78
79    echo "Cannot find free TCP port for nbd in range 10809-10909"
80    exit 1
81}
82
83nbd_server_wait_for_tcp_socket()
84{
85    pid=$1
86
87    for ((i = 0; i < 300; i++))
88    do
89        if ss -tln | grep -sqE ":$nbd_tcp_port\b"; then
90            return
91        fi
92        kill -s 0 $pid 2>/dev/null
93        if test $? != 0
94        then
95            echo "qemu-nbd unexpectedly quit"
96            exit 1
97        fi
98        sleep 0.1
99    done
100    echo "Failed in check of TCP socket created by qemu-nbd"
101    exit 1
102}
103
104nbd_server_start_tcp_socket()
105{
106    nbd_server_stop
107    $QEMU_NBD -v -t -b $nbd_tcp_addr -p $nbd_tcp_port "$@" &
108    nbd_server_wait_for_tcp_socket $!
109}
110