#!/bin/bash
# SPDX-License-Identifier: GPL-3.0+
# Copyright (C) 2018 Josef Bacik
#
# NBD tests.

. common/rc

group_requires() {
	_have_root && _have_nbd
}

_have_nbd() {
	if ! _have_driver nbd; then
		return 1
	fi
	if ! _have_program nbd-server; then
		return 1
	fi
	if ! _have_program nbd-client; then
		return 1
	fi
	if ! nbd-client --help 2>&1 | grep -q -- -L; then
		SKIP_REASONS+=("nbd-client does not have -nonetlink/-L option")
		return 1
	fi
	return 0
}

_have_nbd_netlink() {
	if ! _have_nbd; then
		return 1
	fi
	if ! _have_program genl-ctrl-list; then
		return 1
	fi
	if ! genl-ctrl-list | grep -q nbd; then
		SKIP_REASONS+=("nbd does not support netlink")
		return 1
	fi
	return 0
}

_wait_for_nbd_connect() {
	for ((i = 0; i < 3; i++)); do
		sz=$(lsblk --raw --noheadings -o SIZE /dev/nbd0)
		if [ "$sz" != "0B"  ]; then
			return 0
		fi
		sleep 1
	done
	return 1
}

_wait_for_nbd_disconnect() {
	for ((i = 0; i < 3; i++)); do
		if [[ ! -e /sys/kernel/debug/nbd/nbd0/tasks ]]; then
			return 0
		fi
		sleep 1
	done
	return 1
}

_start_nbd_server() {
	local i

	truncate -s 10G "${TMPDIR}/export"
	cat > "${TMPDIR}/nbd.conf" << EOF
[generic]
allowlist=true
[export]
exportname=${TMPDIR}/export
EOF
	nbd-server -p "${TMPDIR}/nbd.pid" -C "${TMPDIR}/nbd.conf"

	# Wait for nbd-server start listening the port
	for ((i = 0; i < 100; i++)); do
		if nbd-client -l localhost &> "$FULL"; then
			break
		fi
		sleep .1
	done
}

_stop_nbd_server() {
	kill -SIGTERM "$(cat "${TMPDIR}/nbd.pid")"
	rm -f "${TMPDIR}/nbd.pid"
	rm -f "${TMPDIR}/export"
}

_start_nbd_server_netlink() {
	truncate -s 10G "${TMPDIR}/export"
	nbd-server 8000 "${TMPDIR}/export" >/dev/null 2>&1
}

_stop_nbd_server_netlink() {
	killall -SIGTERM nbd-server
	rm -f "${TMPDIR}/export"
}

_netlink_connect() {
	nbd-client localhost 8000 /dev/nbd0 >> "$FULL" 2>&1
}

_netlink_disconnect() {
	nbd-client -d /dev/nbd0 >> "$FULL" 2>&1
}
