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