Commit 390542a3 authored by Mike Carlin's avatar Mike Carlin Committed by Jim Harris
Browse files

spdkcli: Add support for TCP connection



Adds an option to spdkcli.py to allow connection over a tcp
via a host address and port. These options match the format
that exists in rpc.py

Signed-off-by: default avatarMike Carlin <mikefcarlin@protonmail.com>
Change-Id: I7e9e1c376546dd765ffd6f4f4db88e193e9aa0ef
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/467844


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent f66aea7f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -152,6 +152,7 @@ if [ $SPDK_RUN_FUNCTIONAL_TEST -eq 1 ]; then
	run_test suite test/rpc_client/rpc_client.sh
	run_test suite ./test/json_config/json_config.sh
	run_test suite test/json_config/alias_rpc/alias_rpc.sh
	run_test suite test/spdkcli/tcp.sh

	if [ $SPDK_TEST_BLOCKDEV -eq 1 ]; then
		run_test suite test/bdev/blockdev.sh
+6 −2
Original line number Diff line number Diff line
@@ -37,7 +37,11 @@ def main():
    add_quotes_to_shell(spdk_shell)

    parser = argparse.ArgumentParser(description="SPDK command line interface")
    parser.add_argument("-s", dest="socket", help="RPC socket path", default="/var/tmp/spdk.sock")
    parser.add_argument('-s', dest='server_addr',
                        help='RPC domain socket path or IP address', default='/var/tmp/spdk.sock')
    parser.add_argument('-p', dest='port',
                        help='RPC port number (if server_addr is IP address)',
                        default=None, type=int)
    parser.add_argument("-v", dest="verbose", help="Print request/response JSON for configuration calls",
                        default=False, action="store_true")
    parser.add_argument("commands", metavar="command", type=str, nargs="*", default="",
@@ -45,7 +49,7 @@ def main():
    args = parser.parse_args()

    try:
        client = rpc.client.JSONRPCClient(args.socket)
        client = rpc.client.JSONRPCClient(args.server_addr, port=args.port)
    except JSONRPCException as e:
        spdk_shell.log.error("%s. SPDK not running?" % e)
        sys.exit(1)
+8 −1
Original line number Diff line number Diff line
@@ -27,10 +27,17 @@ def execute_command(cmd, element=None, element_exists=False):

if __name__ == "__main__":
    socket = "/var/tmp/spdk.sock"
    port = None
    if len(sys.argv) == 3:
        socket = sys.argv[2]
    elif len(sys.argv) == 4:
        port = sys.argv[3]
    testdir = os.path.dirname(os.path.realpath(sys.argv[0]))

    if port is None:
        child = pexpect.spawn(os.path.join(testdir, "../../scripts/spdkcli.py") + " -s %s" % socket)
    else:
        child = pexpect.spawn(os.path.join(testdir, "../../scripts/spdkcli.py") + " -s %s -p %s" % (socket, port))
    child.expect(">")
    child.sendline("cd /")
    child.expect("/>")

test/spdkcli/tcp.sh

0 → 100755
+65 −0
Original line number Diff line number Diff line
#!/usr/bin/env bash

testdir=$(readlink -f $(dirname $0))
rootdir=$(readlink -f $testdir/../..)
source $rootdir/test/common/autotest_common.sh
source $rootdir/test/spdkcli/common.sh

function waitfortcplisten() {
	# $1 = process pid
	if [ -z "$1" ]; then
		exit 1
	fi

	local ipaddr=$2
	local port=$3

	echo "Waiting for process to start up and listen on TCP/IP Socket $ipaddr:$port..."
	# turn off trace for this loop
	xtrace_disable
	local ret=0
	local i
	for (( i = 40; i != 0; i-- )); do
		# if the process is no longer running, then exit the script
		#  since it means the application crashed
		if ! kill -s 0 $1; then
			echo "ERROR: process (pid: $1) is no longer running"
			ret=1
			break
		fi

		if $rootdir/scripts/rpc.py -t 1 -s "$ipaddr" -p $port rpc_get_methods &>/dev/null; then
			break
		fi

		sleep 0.5
	done

	xtrace_restore
	if (( i == 0 )); then
		echo "ERROR: timeout while waiting for process (pid: $1) to start listening on '$ipaddr:$port'"
		ret=1
	fi
	return $ret
}

IP_ADDRESS="127.0.0.1"
PORT="9998"

timing_enter spdkcli_tcp
trap 'on_error_exit;' ERR

timing_enter run_spdk_tgt_tcp
$rootdir/app/spdk_tgt/spdk_tgt -m 0x3 -p 0 -s 2048 -r $IP_ADDRESS:$PORT &
spdk_tgt_pid=$!

# This will issue a rpc request to the spdk target thus validating tcp
waitfortcplisten $spdk_tgt_pid $IP_ADDRESS $PORT

timing_exit run_spdk_tgt_tcp

killprocess $spdk_tgt_pid

timing_exit spdkcli_tcp

report_test_completion spdkcli_tcp