xref: /spdk/test/nvmf/target/multitarget_rpc.py (revision bf30e09abe1667ae2769aa367cde39c550bcac00)
1#!/usr/bin/env python3
2#  SPDX-License-Identifier: BSD-3-Clause
3#  Copyright (C) 2019 Intel Corporation
4#  All rights reserved.
5#
6
7# Not for use in production. Please see the changelog for v19.10.
8
9from spdk.rpc.client import print_dict, JSONRPCException
10
11import logging
12import argparse
13import spdk.rpc as rpc
14import sys
15import shlex
16
17try:
18    from shlex import quote
19except ImportError:
20    from pipes import quote
21
22if __name__ == "__main__":
23    parser = argparse.ArgumentParser(
24        description='NVMe-oF RPC command line interface. NOTE: spdk/python is expected in PYTHONPATH')
25    parser.add_argument('-s', dest='server_addr',
26                        help='RPC domain socket path or IP address', default='/var/tmp/spdk.sock')
27    parser.add_argument('-p', dest='port',
28                        help='RPC port number (if server_addr is IP address)',
29                        default=5260, type=int)
30    parser.add_argument('-t', dest='timeout',
31                        help='Timeout as a floating point number expressed in seconds waiting for response. Default: 60.0',
32                        default=60.0, type=float)
33    parser.add_argument('-v', dest='verbose', action='store_const', const="INFO",
34                        help='Set verbose mode to INFO', default="ERROR")
35    parser.add_argument('--verbose', dest='verbose', choices=['DEBUG', 'INFO', 'ERROR'],
36                        help="""Set verbose level. """)
37    subparsers = parser.add_subparsers(help='RPC methods')
38
39    def nvmf_create_target(args):
40        print_dict(rpc.nvmf.nvmf_create_target(args.client,
41                                               name=args.name,
42                                               max_subsystems=args.max_subsystems))
43
44    p = subparsers.add_parser('nvmf_create_target', help='Create a new NVMe-oF target')
45    p.add_argument('-n', '--name', help='Target name (unique to application)', type=str, required=True)
46    p.add_argument('-s', '--max-subsystems', help='Max number of NVMf subsystems defaults to SPDK_NVMF_DEFAULT_MAX_SUBSYSTEMS',
47                   type=int, required=False)
48    p.set_defaults(func=nvmf_create_target)
49
50    def nvmf_delete_target(args):
51        print_dict(rpc.nvmf.nvmf_delete_target(args.client,
52                                               name=args.name))
53
54    p = subparsers.add_parser('nvmf_delete_target', help='Destroy the given NVMe-oF Target')
55    p.add_argument('-n', '--name', help='Target name (unique to application)', type=str, required=True)
56    p.set_defaults(func=nvmf_delete_target)
57
58    def nvmf_get_targets(args):
59        print_dict(rpc.nvmf.nvmf_get_targets(args.client))
60
61    p = subparsers.add_parser('nvmf_get_targets', help='Get the list of NVMe-oF Targets')
62    p.set_defaults(func=nvmf_get_targets)
63
64    def call_rpc_func(args):
65        try:
66            args.func(args)
67        except JSONRPCException as ex:
68            print(ex.message)
69            exit(1)
70
71    def execute_script(parser, client, fd):
72        for rpc_call in map(str.rstrip, fd):
73            if not rpc_call.strip():
74                continue
75            args = parser.parse_args(shlex.split(rpc_call))
76            args.client = client
77            call_rpc_func(args)
78
79    args = parser.parse_args()
80    args.client = rpc.client.JSONRPCClient(args.server_addr, args.port, args.timeout, log_level=getattr(logging, args.verbose.upper()))
81    if hasattr(args, 'func'):
82        call_rpc_func(args)
83    elif sys.stdin.isatty():
84        # No arguments and no data piped through stdin
85        parser.print_help()
86        exit(1)
87    else:
88        execute_script(parser, args.client, sys.stdin)
89