diff --git a/autotest.sh b/autotest.sh index 037fc8e1c..568a475a7 100755 --- a/autotest.sh +++ b/autotest.sh @@ -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 diff --git a/scripts/spdkcli.py b/scripts/spdkcli.py index 6e2ccd0db..0a802ac5b 100755 --- a/scripts/spdkcli.py +++ b/scripts/spdkcli.py @@ -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) diff --git a/test/spdkcli/spdkcli_job.py b/test/spdkcli/spdkcli_job.py index b3a4da9aa..ce6530a90 100755 --- a/test/spdkcli/spdkcli_job.py +++ b/test/spdkcli/spdkcli_job.py @@ -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])) - child = pexpect.spawn(os.path.join(testdir, "../../scripts/spdkcli.py") + " -s %s" % socket) + + 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("/>") diff --git a/test/spdkcli/tcp.sh b/test/spdkcli/tcp.sh new file mode 100755 index 000000000..4665ccaf3 --- /dev/null +++ b/test/spdkcli/tcp.sh @@ -0,0 +1,65 @@ +#!/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