From 099489b207c8a1a89f1f4047b6bb129b5fce6ff9 Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Fri, 13 Sep 2019 14:52:05 -0700 Subject: [PATCH] lib/nvmf: Add nvmf_destroy_target rpc Change-Id: I048793d32dcd19a5723dedec96fade9e7a889e3b Signed-off-by: Seth Howell Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/468390 Tested-by: SPDK CI Jenkins Reviewed-by: Paul Luse Reviewed-by: Shuhei Matsumoto Reviewed-by: Alexey Marchuk Reviewed-by: Ben Walker --- doc/jsonrpc.md | 35 ++++++++++++++++++++++++++++++++++ lib/nvmf/nvmf_rpc.c | 46 +++++++++++++++++++++++++++++++++++++++++++++ scripts/rpc.py | 8 ++++++++ scripts/rpc/nvmf.py | 16 ++++++++++++++++ 4 files changed, 105 insertions(+) diff --git a/doc/jsonrpc.md b/doc/jsonrpc.md index 91ab019cf..147c90a99 100644 --- a/doc/jsonrpc.md +++ b/doc/jsonrpc.md @@ -3691,6 +3691,41 @@ Example response: } ~~~ +## nvmf_delete_target method {#rpc_nvmf_delete_target} + +Destroy the given NVMe-oF target. + +### Parameters + +Name | Optional | Type | Description +--------------------------- | -------- | ------------| ----------- +name | Required | string | Target name (must be unique to application) + +### Example + +Example request: + +~~~ +{ + "jsonrpc": "2.0", + "method": "nvmf_delete_target", + "id": 1, + "params": { + "name": "old_tgt", + } +} +~~~ + +Example response: + +~~~ +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +~~~ + ## nvmf_create_transport method {#rpc_nvmf_create_transport} Initialize an NVMe-oF transport with the given options. diff --git a/lib/nvmf/nvmf_rpc.c b/lib/nvmf/nvmf_rpc.c index 9b660eda0..ae736d9fd 100644 --- a/lib/nvmf/nvmf_rpc.c +++ b/lib/nvmf/nvmf_rpc.c @@ -1452,6 +1452,52 @@ spdk_rpc_nvmf_create_target(struct spdk_jsonrpc_request *request, } SPDK_RPC_REGISTER("nvmf_create_target", spdk_rpc_nvmf_create_target, SPDK_RPC_RUNTIME); +static const struct spdk_json_object_decoder nvmf_rpc_destroy_target_decoder[] = { + {"name", offsetof(struct nvmf_rpc_target_ctx, name), spdk_json_decode_string}, +}; + +static void +nvmf_rpc_destroy_target_done(void *ctx, int status) +{ + struct spdk_jsonrpc_request *request = ctx; + struct spdk_json_write_ctx *w; + + w = spdk_jsonrpc_begin_result(request); + spdk_json_write_bool(w, true); + spdk_jsonrpc_end_result(request, w); +} + +static void +spdk_rpc_nvmf_delete_target(struct spdk_jsonrpc_request *request, + const struct spdk_json_val *params) +{ + struct nvmf_rpc_target_ctx ctx = {0}; + struct spdk_nvmf_tgt *tgt; + + /* Decode parameters the first time to get the transport type */ + if (spdk_json_decode_object(params, nvmf_rpc_destroy_target_decoder, + SPDK_COUNTOF(nvmf_rpc_destroy_target_decoder), + &ctx)) { + SPDK_ERRLOG("spdk_json_decode_object failed\n"); + spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters"); + free(ctx.name); + return; + } + + tgt = spdk_nvmf_get_tgt(ctx.name); + + if (tgt == NULL) { + spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, + "The specified target doesn't exist, cannot delete it."); + free(ctx.name); + return; + } + + spdk_nvmf_tgt_destroy(tgt, nvmf_rpc_destroy_target_done, request); + free(ctx.name); +} +SPDK_RPC_REGISTER("nvmf_delete_target", spdk_rpc_nvmf_delete_target, SPDK_RPC_RUNTIME); + struct nvmf_rpc_create_transport_ctx { char *trtype; char *tgt_name; diff --git a/scripts/rpc.py b/scripts/rpc.py index 9e9dee122..ea713c8fe 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -1568,6 +1568,14 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse type=int, required=False) p.set_defaults(func=nvmf_create_target) + def nvmf_delete_target(args): + print_dict(rpc.nvmf.nvmf_delete_target(args.client, + name=args.name)) + + p = subparsers.add_parser('nvmf_delete_target', help='Destroy the given NVMe-oF Target') + p.add_argument('-n', '--name', help='Target name (unique to application)', type=str, required=True) + p.set_defaults(func=nvmf_delete_target) + def nvmf_create_transport(args): rpc.nvmf.nvmf_create_transport(args.client, trtype=args.trtype, diff --git a/scripts/rpc/nvmf.py b/scripts/rpc/nvmf.py index 53736f5e6..9233b8a28 100644 --- a/scripts/rpc/nvmf.py +++ b/scripts/rpc/nvmf.py @@ -54,6 +54,22 @@ def nvmf_create_target(client, return client.call("nvmf_create_target", params) +def nvmf_delete_target(client, + name): + """Destroy an NVMe-oF Target. + + Args: + name: The name of the target you wish to destroy + + Returns: + True on success or False + """ + params = {} + + params['name'] = name + return client.call("nvmf_delete_target", params) + + def nvmf_create_transport(client, trtype, tgt_name=None,