diff options
Diffstat (limited to 'src/spdk/test/rpc_client')
-rw-r--r-- | src/spdk/test/rpc_client/.gitignore | 1 | ||||
-rw-r--r-- | src/spdk/test/rpc_client/Makefile | 56 | ||||
-rwxr-xr-x | src/spdk/test/rpc_client/rpc_client.sh | 36 | ||||
-rw-r--r-- | src/spdk/test/rpc_client/rpc_client_test.c | 118 |
4 files changed, 211 insertions, 0 deletions
diff --git a/src/spdk/test/rpc_client/.gitignore b/src/spdk/test/rpc_client/.gitignore new file mode 100644 index 00000000..e878ca3a --- /dev/null +++ b/src/spdk/test/rpc_client/.gitignore @@ -0,0 +1 @@ +rpc_client_test diff --git a/src/spdk/test/rpc_client/Makefile b/src/spdk/test/rpc_client/Makefile new file mode 100644 index 00000000..50e976a2 --- /dev/null +++ b/src/spdk/test/rpc_client/Makefile @@ -0,0 +1,56 @@ +# +# BSD LICENSE +# +# Copyright (c) Intel Corporation. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..) +include $(SPDK_ROOT_DIR)/mk/spdk.common.mk +include $(SPDK_ROOT_DIR)/mk/spdk.app.mk +include $(SPDK_ROOT_DIR)/mk/spdk.modules.mk + +APP = rpc_client_test + +C_SRCS := rpc_client_test.c + +SPDK_LIB_LIST = jsonrpc json log util + +LIBS += $(SPDK_LIB_LINKER_ARGS) $(ENV_LINKER_ARGS) + +all : $(APP) + @: + +$(APP) : $(OBJS) $(SPDK_LIB_FILES) + $(LINK_C) + +clean : + $(CLEAN_C) $(APP) + +include $(SPDK_ROOT_DIR)/mk/spdk.deps.mk diff --git a/src/spdk/test/rpc_client/rpc_client.sh b/src/spdk/test/rpc_client/rpc_client.sh new file mode 100755 index 00000000..296a6fff --- /dev/null +++ b/src/spdk/test/rpc_client/rpc_client.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +testdir=$(readlink -f $(dirname $0)) +rootdir=$(readlink -f $testdir/../..) + +set -e + +source $rootdir/test/common/autotest_common.sh + +function rpc_client_test() { + if [ $(uname -s) = Linux ]; then + local conf=$rootdir/test/bdev/bdev.conf.in + + if [ ! -e $conf ]; then + return 1 + fi + + $rootdir/test/app/bdev_svc/bdev_svc -i 0 -c ${conf} & + svc_pid=$! + echo "Process bdev_svc pid: $svc_pid" + waitforlisten $svc_pid + trap "killprocess $svc_pid" SIGINT SIGTERM EXIT + + $rootdir/test/rpc_client/rpc_client_test + + killprocess $svc_pid + fi + + return 0 +} + +timing_enter rpc_client +rpc_client_test +timing_exit rpc_client + +trap - SIGINT SIGTERM EXIT diff --git a/src/spdk/test/rpc_client/rpc_client_test.c b/src/spdk/test/rpc_client/rpc_client_test.c new file mode 100644 index 00000000..68f84713 --- /dev/null +++ b/src/spdk/test/rpc_client/rpc_client_test.c @@ -0,0 +1,118 @@ +/*- + * BSD LICENSE + * + * Copyright (c) Intel Corporation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "spdk/stdinc.h" +#include "spdk/event.h" +#include "spdk/jsonrpc.h" + +#define RPC_MAX_METHODS 200 + +static const char *g_rpcsock_addr = SPDK_DEFAULT_RPC_ADDR; +static int g_addr_family = AF_UNIX; + +#define RPC_MAX_METHODS 200 + +struct get_jsonrpc_methods_resp { + char *method_names[RPC_MAX_METHODS]; + size_t method_num; +}; + +static int +get_jsonrpc_method_json_parser(void *parser_ctx, + const struct spdk_json_val *result) +{ + struct get_jsonrpc_methods_resp *resp = parser_ctx; + + return spdk_json_decode_array(result, spdk_json_decode_string, resp->method_names, + RPC_MAX_METHODS, &resp->method_num, sizeof(char *)); +} + +static int +spdk_jsonrpc_client_check_rpc_method(struct spdk_jsonrpc_client *client, char *method_name) +{ + int rc, i; + struct get_jsonrpc_methods_resp resp = {}; + struct spdk_json_write_ctx *w; + struct spdk_jsonrpc_client_request *request; + + request = spdk_jsonrpc_client_create_request(); + if (request == NULL) { + return -ENOMEM; + } + + w = spdk_jsonrpc_begin_request(request, 1, "get_rpc_methods"); + spdk_jsonrpc_end_request(request, w); + spdk_jsonrpc_client_send_request(client, request); + spdk_jsonrpc_client_free_request(request); + + rc = spdk_jsonrpc_client_recv_response(client, get_jsonrpc_method_json_parser, &resp); + + if (rc) { + goto out; + } + + for (i = 0; i < (int)resp.method_num; i++) { + if (strcmp(method_name, resp.method_names[i]) == 0) { + rc = 0; + goto out; + } + } + + rc = -1; + +out: + for (i = 0; i < (int)resp.method_num; i++) { + SPDK_NOTICELOG("%s\n", resp.method_names[i]); + free(resp.method_names[i]); + } + + return rc; +} + +int main(int argc, char **argv) +{ + struct spdk_jsonrpc_client *client; + int rc; + char *method_name = "get_rpc_methods"; + + client = spdk_jsonrpc_client_connect(g_rpcsock_addr, g_addr_family); + if (!client) { + return EXIT_FAILURE; + } + + rc = spdk_jsonrpc_client_check_rpc_method(client, method_name); + + spdk_jsonrpc_client_close(client); + + return rc ? EXIT_FAILURE : 0; +} |