xref: /spdk/scripts/rpc.py (revision ecca55c99669c5b51c9a11ebbcfb0238cd61f28b)
1b96f97cfSPawel Wodkowski#!/usr/bin/env python3
21e92d78aSBen Walker
331c25ab3SDarek Stojaczykfrom rpc.client import print_dict, print_json, JSONRPCException
4c2b5a3f6SJim Harrisfrom rpc.helpers import deprecated_aliases
5df897ed4SDaniel Verkamp
627cc63ecSPawel Wodkowskiimport logging
71e92d78aSBen Walkerimport argparse
84dd3f4a7SBen Walkerimport rpc
909a9130eSPawel Kaminskiimport sys
1022c3befdSKarol Lateckiimport shlex
116e4ea8fdSPawel Kaminskiimport json
121e92d78aSBen Walker
13e44aef95SDaniel Verkamptry:
14e44aef95SDaniel Verkamp    from shlex import quote
15e44aef95SDaniel Verkampexcept ImportError:
16e44aef95SDaniel Verkamp    from pipes import quote
17e44aef95SDaniel Verkamp
18e44aef95SDaniel Verkamp
19e44aef95SDaniel Verkampdef print_array(a):
20e78866edSDaniel Verkamp    print(" ".join((quote(v) for v in a)))
21e44aef95SDaniel Verkamp
22e44aef95SDaniel Verkamp
234dd3f4a7SBen Walkerif __name__ == "__main__":
244dd3f4a7SBen Walker    parser = argparse.ArgumentParser(
254dd3f4a7SBen Walker        description='SPDK RPC command line interface')
264dd3f4a7SBen Walker    parser.add_argument('-s', dest='server_addr',
27e632df9dSJim Harris                        help='RPC domain socket path or IP address', default='/var/tmp/spdk.sock')
284dd3f4a7SBen Walker    parser.add_argument('-p', dest='port',
294dd3f4a7SBen Walker                        help='RPC port number (if server_addr is IP address)',
304dd3f4a7SBen Walker                        default=5260, type=int)
3114c4a428SPawel Wodkowski    parser.add_argument('-t', dest='timeout',
32e632df9dSJim Harris                        help='Timeout as a floating point number expressed in seconds waiting for response. Default: 60.0',
3314c4a428SPawel Wodkowski                        default=60.0, type=float)
3427cc63ecSPawel Wodkowski    parser.add_argument('-v', dest='verbose', action='store_const', const="INFO",
3527cc63ecSPawel Wodkowski                        help='Set verbose mode to INFO', default="ERROR")
3627cc63ecSPawel Wodkowski    parser.add_argument('--verbose', dest='verbose', choices=['DEBUG', 'INFO', 'ERROR'],
3727cc63ecSPawel Wodkowski                        help="""Set verbose level. """)
386e4ea8fdSPawel Kaminski    parser.add_argument('--dry_run', dest='dry_run', action='store_true', help="Display request and exit")
396e4ea8fdSPawel Kaminski    parser.set_defaults(dry_run=False)
40c2b5a3f6SJim Harris    subparsers = parser.add_subparsers(help='RPC methods', dest='called_rpc_name')
411e92d78aSBen Walker
42e85d4712SMaciej Wawryk    def framework_start_init(args):
43e85d4712SMaciej Wawryk        rpc.framework_start_init(args.client)
4428589dbbSShuhei Matsumoto
45e85d4712SMaciej Wawryk    p = subparsers.add_parser('framework_start_init', aliases=['start_subsystem_init'],
46e85d4712SMaciej Wawryk                              help='Start initialization of subsystems')
47e85d4712SMaciej Wawryk    p.set_defaults(func=framework_start_init)
4828589dbbSShuhei Matsumoto
49fb3918a0SMaciej Wawryk    def framework_wait_init(args):
50fb3918a0SMaciej Wawryk        rpc.framework_wait_init(args.client)
51b7f54bd6SSeth Howell
52fb3918a0SMaciej Wawryk    p = subparsers.add_parser('framework_wait_init', aliases=['wait_subsystem_init'],
53fb3918a0SMaciej Wawryk                              help='Block until subsystems have been initialized')
54fb3918a0SMaciej Wawryk    p.set_defaults(func=framework_wait_init)
55b7f54bd6SSeth Howell
566ee44c69SJim Harris    def rpc_get_methods(args):
576ee44c69SJim Harris        print_dict(rpc.rpc_get_methods(args.client,
58f60eeb6fSPawel Kaminski                                       current=args.current,
59f60eeb6fSPawel Kaminski                                       include_aliases=args.include_aliases))
60df897ed4SDaniel Verkamp
616635453eSPawel Kaminski    p = subparsers.add_parser('rpc_get_methods', aliases=['get_rpc_methods'],
626635453eSPawel Kaminski                              help='Get list of supported RPC methods')
63bf9806d5SShuhei Matsumoto    p.add_argument('-c', '--current', help='Get list of RPC methods only callable in the current state.', action='store_true')
64f60eeb6fSPawel Kaminski    p.add_argument('-i', '--include-aliases', help='include RPC aliases', action='store_true')
656ee44c69SJim Harris    p.set_defaults(func=rpc_get_methods)
66df897ed4SDaniel Verkamp
676b6dfea6SPawel Kaminski    def spdk_get_version(args):
686b6dfea6SPawel Kaminski        print_json(rpc.spdk_get_version(args.client))
6938902a5aSChunyang Hui
706b6dfea6SPawel Kaminski    p = subparsers.add_parser('spdk_get_version', aliases=['get_spdk_version'],
716b6dfea6SPawel Kaminski                              help='Get SPDK version')
726b6dfea6SPawel Kaminski    p.set_defaults(func=spdk_get_version)
7338902a5aSChunyang Hui
74df897ed4SDaniel Verkamp    def save_config(args):
759ff7313fSKarol Latecki        rpc.save_config(args.client,
7609a9130eSPawel Kaminski                        sys.stdout,
779ff7313fSKarol Latecki                        indent=args.indent)
781e92d78aSBen Walker
7955014ddfSJim Harris    p = subparsers.add_parser('save_config', help="""Write current (live) configuration of SPDK subsystems and targets to stdout.
8055014ddfSJim Harris    """)
8155014ddfSJim Harris    p.add_argument('-i', '--indent', help="""Indent level. Value less than 0 mean compact mode. Default indent level is 2.
8255014ddfSJim Harris    """, type=int, default=2)
83df897ed4SDaniel Verkamp    p.set_defaults(func=save_config)
84df897ed4SDaniel Verkamp
85df897ed4SDaniel Verkamp    def load_config(args):
86f60eeb6fSPawel Kaminski        rpc.load_config(args.client, sys.stdin,
87f60eeb6fSPawel Kaminski                        include_aliases=args.include_aliases)
8850d738b4SPawel Wodkowski
8955014ddfSJim Harris    p = subparsers.add_parser('load_config', help="""Configure SPDK subsystems and targets using JSON RPC read from stdin.""")
90f60eeb6fSPawel Kaminski    p.add_argument('-i', '--include-aliases', help='include RPC aliases', action='store_true')
91df897ed4SDaniel Verkamp    p.set_defaults(func=load_config)
9250d738b4SPawel Wodkowski
93800a1423SShuhei Matsumoto    def save_subsystem_config(args):
949ff7313fSKarol Latecki        rpc.save_subsystem_config(args.client,
9509a9130eSPawel Kaminski                                  sys.stdout,
969ff7313fSKarol Latecki                                  indent=args.indent,
979ff7313fSKarol Latecki                                  name=args.name)
98800a1423SShuhei Matsumoto
9955014ddfSJim Harris    p = subparsers.add_parser('save_subsystem_config', help="""Write current (live) configuration of SPDK subsystem to stdout.
10055014ddfSJim Harris    """)
10155014ddfSJim Harris    p.add_argument('-i', '--indent', help="""Indent level. Value less than 0 mean compact mode. Default indent level is 2.
10255014ddfSJim Harris    """, type=int, default=2)
103800a1423SShuhei Matsumoto    p.add_argument('-n', '--name', help='Name of subsystem', required=True)
104800a1423SShuhei Matsumoto    p.set_defaults(func=save_subsystem_config)
105800a1423SShuhei Matsumoto
10643c5429dSPawel Niedzwiecki    def load_subsystem_config(args):
10709a9130eSPawel Kaminski        rpc.load_subsystem_config(args.client,
10809a9130eSPawel Kaminski                                  sys.stdin)
10943c5429dSPawel Niedzwiecki
11055014ddfSJim Harris    p = subparsers.add_parser('load_subsystem_config', help="""Configure SPDK subsystem using JSON RPC read from stdin.""")
11143c5429dSPawel Niedzwiecki    p.set_defaults(func=load_subsystem_config)
11243c5429dSPawel Niedzwiecki
1134dd3f4a7SBen Walker    # app
1143402bfbdSPawel Kaminski    def spdk_kill_instance(args):
1153402bfbdSPawel Kaminski        rpc.app.spdk_kill_instance(args.client,
1164a534344SDaniel Verkamp                                   sig_name=args.sig_name)
117df897ed4SDaniel Verkamp
1183402bfbdSPawel Kaminski    p = subparsers.add_parser('spdk_kill_instance', aliases=['kill_instance'],
1193402bfbdSPawel Kaminski                              help='Send signal to instance')
1204dd3f4a7SBen Walker    p.add_argument('sig_name', help='signal will be sent to server.')
1213402bfbdSPawel Kaminski    p.set_defaults(func=spdk_kill_instance)
122df897ed4SDaniel Verkamp
123a10d0ce7SMaciej Wawryk    def framework_monitor_context_switch(args):
1244a534344SDaniel Verkamp        enabled = None
1254a534344SDaniel Verkamp        if args.enable:
1264a534344SDaniel Verkamp            enabled = True
1274a534344SDaniel Verkamp        if args.disable:
1284a534344SDaniel Verkamp            enabled = False
129a10d0ce7SMaciej Wawryk        print_dict(rpc.app.framework_monitor_context_switch(args.client,
1304a534344SDaniel Verkamp                                                            enabled=enabled))
1311e92d78aSBen Walker
132a10d0ce7SMaciej Wawryk    p = subparsers.add_parser('framework_monitor_context_switch', aliases=['context_switch_monitor'],
133a10d0ce7SMaciej Wawryk                              help='Control whether the context switch monitor is enabled')
1344dd3f4a7SBen Walker    p.add_argument('-e', '--enable', action='store_true', help='Enable context switch monitoring')
1354dd3f4a7SBen Walker    p.add_argument('-d', '--disable', action='store_true', help='Disable context switch monitoring')
136a10d0ce7SMaciej Wawryk    p.set_defaults(func=framework_monitor_context_switch)
1371e92d78aSBen Walker
1384dd3f4a7SBen Walker    # bdev
1398e052bf4SMaciej Wawryk    def bdev_set_options(args):
1408e052bf4SMaciej Wawryk        rpc.bdev.bdev_set_options(args.client,
1413090f401SJim Harris                                  bdev_io_pool_size=args.bdev_io_pool_size,
1423090f401SJim Harris                                  bdev_io_cache_size=args.bdev_io_cache_size)
1433090f401SJim Harris
1448e052bf4SMaciej Wawryk    p = subparsers.add_parser('bdev_set_options', aliases=['set_bdev_options'],
1458e052bf4SMaciej Wawryk                              help="""Set options of bdev subsystem""")
1463090f401SJim Harris    p.add_argument('-p', '--bdev-io-pool-size', help='Number of bdev_io structures in shared buffer pool', type=int)
1473090f401SJim Harris    p.add_argument('-c', '--bdev-io-cache-size', help='Maximum number of bdev_io structures cached per thread', type=int)
1488e052bf4SMaciej Wawryk    p.set_defaults(func=bdev_set_options)
1493090f401SJim Harris
1509a91a45cSMaciej Wawryk    def bdev_compress_create(args):
1519a91a45cSMaciej Wawryk        print_json(rpc.bdev.bdev_compress_create(args.client,
152db541f8eSPaul Luse                                                 base_bdev_name=args.base_bdev_name,
1538d2455caSpaul luse                                                 pm_path=args.pm_path))
1541d039ebaSPawel Kaminski
1551d039ebaSPawel Kaminski    p = subparsers.add_parser('bdev_compress_create', aliases=['construct_compress_bdev'],
156db541f8eSPaul Luse                              help='Add a compress vbdev')
157db541f8eSPaul Luse    p.add_argument('-b', '--base_bdev_name', help="Name of the base bdev")
158600341b6Spaul luse    p.add_argument('-p', '--pm_path', help="Path to persistent memory")
1599a91a45cSMaciej Wawryk    p.set_defaults(func=bdev_compress_create)
160db541f8eSPaul Luse
1619a91a45cSMaciej Wawryk    def bdev_compress_delete(args):
1629a91a45cSMaciej Wawryk        rpc.bdev.bdev_compress_delete(args.client,
163db541f8eSPaul Luse                                      name=args.name)
164db541f8eSPaul Luse
1651d039ebaSPawel Kaminski    p = subparsers.add_parser('bdev_compress_delete', aliases=['delete_compress_bdev'],
1661d039ebaSPawel Kaminski                              help='Delete a compress disk')
167db541f8eSPaul Luse    p.add_argument('name', help='compress bdev name')
1689a91a45cSMaciej Wawryk    p.set_defaults(func=bdev_compress_delete)
169db541f8eSPaul Luse
170bfda995bSpaul luse    def set_compress_pmd(args):
171bfda995bSpaul luse        rpc.bdev.set_compress_pmd(args.client,
172bfda995bSpaul luse                                  pmd=args.pmd)
173bfda995bSpaul luse    p = subparsers.add_parser('set_compress_pmd', help='Set pmd option for a compress disk')
174bfda995bSpaul luse    p.add_argument('-p', '--pmd', type=int, help='0 = auto-select, 1= QAT only, 2 = ISAL only')
175bfda995bSpaul luse    p.set_defaults(func=set_compress_pmd)
176bfda995bSpaul luse
17768e7da44Spaul luse    def bdev_compress_get_orphans(args):
17868e7da44Spaul luse        print_dict(rpc.bdev.bdev_compress_get_orphans(args.client,
17968e7da44Spaul luse                                                      name=args.name))
18068e7da44Spaul luse    p = subparsers.add_parser(
18168e7da44Spaul luse        'bdev_compress_get_orphans', help='Display list of orphaned compress bdevs.')
18268e7da44Spaul luse    p.add_argument('-b', '--name', help="Name of a comp bdev. Example: COMP_Nvme0n1", required=False)
18368e7da44Spaul luse    p.set_defaults(func=bdev_compress_get_orphans)
18468e7da44Spaul luse
18540c959cbSMaciej Wawryk    def bdev_crypto_create(args):
18640c959cbSMaciej Wawryk        print_json(rpc.bdev.bdev_crypto_create(args.client,
18751606ed4SPaul Luse                                               base_bdev_name=args.base_bdev_name,
188cafd537cSpaul luse                                               name=args.name,
18951606ed4SPaul Luse                                               crypto_pmd=args.crypto_pmd,
19051606ed4SPaul Luse                                               key=args.key))
1911d039ebaSPawel Kaminski    p = subparsers.add_parser('bdev_crypto_create', aliases=['construct_crypto_bdev'],
19251606ed4SPaul Luse                              help='Add a crypto vbdev')
19344626532SKarol Latecki    p.add_argument('base_bdev_name', help="Name of the base bdev")
19444626532SKarol Latecki    p.add_argument('name', help="Name of the crypto vbdev")
19544626532SKarol Latecki    p.add_argument('crypto_pmd', help="Name of the crypto device driver")
19644626532SKarol Latecki    p.add_argument('key', help="Key")
19740c959cbSMaciej Wawryk    p.set_defaults(func=bdev_crypto_create)
19851606ed4SPaul Luse
19940c959cbSMaciej Wawryk    def bdev_crypto_delete(args):
20040c959cbSMaciej Wawryk        rpc.bdev.bdev_crypto_delete(args.client,
20151606ed4SPaul Luse                                    name=args.name)
20251606ed4SPaul Luse
2031d039ebaSPawel Kaminski    p = subparsers.add_parser('bdev_crypto_delete', aliases=['delete_crypto_bdev'],
2041d039ebaSPawel Kaminski                              help='Delete a crypto disk')
20551606ed4SPaul Luse    p.add_argument('name', help='crypto bdev name')
20640c959cbSMaciej Wawryk    p.set_defaults(func=bdev_crypto_delete)
20751606ed4SPaul Luse
208557f8ff9SPawel Kaminski    def bdev_ocf_create(args):
209557f8ff9SPawel Kaminski        print_json(rpc.bdev.bdev_ocf_create(args.client,
21035366140SVitaliy Mysak                                            name=args.name,
21135366140SVitaliy Mysak                                            mode=args.mode,
21235366140SVitaliy Mysak                                            cache_bdev_name=args.cache_bdev_name,
21335366140SVitaliy Mysak                                            core_bdev_name=args.core_bdev_name))
214557f8ff9SPawel Kaminski    p = subparsers.add_parser('bdev_ocf_create', aliases=['construct_ocf_bdev'],
21535366140SVitaliy Mysak                              help='Add an OCF block device')
21635366140SVitaliy Mysak    p.add_argument('name', help='Name of resulting OCF bdev')
2171e0e0ea1SVitaliy Mysak    p.add_argument('mode', help='OCF cache mode', choices=['wb', 'wt', 'pt'])
21835366140SVitaliy Mysak    p.add_argument('cache_bdev_name', help='Name of underlying cache bdev')
21935366140SVitaliy Mysak    p.add_argument('core_bdev_name', help='Name of unerlying core bdev')
220557f8ff9SPawel Kaminski    p.set_defaults(func=bdev_ocf_create)
22135366140SVitaliy Mysak
222557f8ff9SPawel Kaminski    def bdev_ocf_delete(args):
223557f8ff9SPawel Kaminski        rpc.bdev.bdev_ocf_delete(args.client,
22435366140SVitaliy Mysak                                 name=args.name)
22535366140SVitaliy Mysak
226557f8ff9SPawel Kaminski    p = subparsers.add_parser('bdev_ocf_delete', aliases=['delete_ocf_bdev'],
22735366140SVitaliy Mysak                              help='Delete an OCF block device')
22835366140SVitaliy Mysak    p.add_argument('name', help='Name of OCF bdev')
229557f8ff9SPawel Kaminski    p.set_defaults(func=bdev_ocf_delete)
23035366140SVitaliy Mysak
23195482c54SPawel Kaminski    def bdev_ocf_get_stats(args):
23295482c54SPawel Kaminski        print_dict(rpc.bdev.bdev_ocf_get_stats(args.client,
23327e0190bSVitaliy Mysak                                               name=args.name))
23495482c54SPawel Kaminski    p = subparsers.add_parser('bdev_ocf_get_stats', aliases=['get_ocf_stats'],
23527e0190bSVitaliy Mysak                              help='Get statistics of chosen OCF block device')
23627e0190bSVitaliy Mysak    p.add_argument('name', help='Name of OCF bdev')
23795482c54SPawel Kaminski    p.set_defaults(func=bdev_ocf_get_stats)
23827e0190bSVitaliy Mysak
23995482c54SPawel Kaminski    def bdev_ocf_get_bdevs(args):
24095482c54SPawel Kaminski        print_dict(rpc.bdev.bdev_ocf_get_bdevs(args.client,
241bef0c6edSVitaliy Mysak                                               name=args.name))
24295482c54SPawel Kaminski    p = subparsers.add_parser('bdev_ocf_get_bdevs', aliases=['get_ocf_bdevs'],
243199080cfSVitaliy Mysak                              help='Get list of OCF devices including unregistered ones')
244bef0c6edSVitaliy Mysak    p.add_argument('name', nargs='?', default=None, help='name of OCF vbdev or name of cache device or name of core device (optional)')
24595482c54SPawel Kaminski    p.set_defaults(func=bdev_ocf_get_bdevs)
246199080cfSVitaliy Mysak
2477964f1dfSPawel Kaminski    def bdev_malloc_create(args):
2481ea97654SDaniel Verkamp        num_blocks = (args.total_size * 1024 * 1024) // args.block_size
2497964f1dfSPawel Kaminski        print_json(rpc.bdev.bdev_malloc_create(args.client,
25022637292SPawel Wodkowski                                               num_blocks=int(num_blocks),
2511ea97654SDaniel Verkamp                                               block_size=args.block_size,
2521ea97654SDaniel Verkamp                                               name=args.name,
2531ea97654SDaniel Verkamp                                               uuid=args.uuid))
2547964f1dfSPawel Kaminski    p = subparsers.add_parser('bdev_malloc_create', aliases=['construct_malloc_bdev'],
2558ac7cad4SMaciej Wawryk                              help='Create a bdev with malloc backend')
2564dd3f4a7SBen Walker    p.add_argument('-b', '--name', help="Name of the bdev")
257eca9ac03SDaniel Verkamp    p.add_argument('-u', '--uuid', help="UUID of the bdev")
2584dd3f4a7SBen Walker    p.add_argument(
25922637292SPawel Wodkowski        'total_size', help='Size of malloc bdev in MB (float > 0)', type=float)
2604dd3f4a7SBen Walker    p.add_argument('block_size', help='Block size for this bdev', type=int)
2617964f1dfSPawel Kaminski    p.set_defaults(func=bdev_malloc_create)
262df897ed4SDaniel Verkamp
26306a1b419SPawel Kaminski    def bdev_malloc_delete(args):
26406a1b419SPawel Kaminski        rpc.bdev.bdev_malloc_delete(args.client,
26559dee78bSTomasz Zawadzki                                    name=args.name)
26659dee78bSTomasz Zawadzki
26706a1b419SPawel Kaminski    p = subparsers.add_parser('bdev_malloc_delete', aliases=['delete_malloc_bdev'],
26806a1b419SPawel Kaminski                              help='Delete a malloc disk')
26959dee78bSTomasz Zawadzki    p.add_argument('name', help='malloc bdev name')
27006a1b419SPawel Kaminski    p.set_defaults(func=bdev_malloc_delete)
27159dee78bSTomasz Zawadzki
27260563dfeSPawel Kaminski    def bdev_null_create(args):
2731ea97654SDaniel Verkamp        num_blocks = (args.total_size * 1024 * 1024) // args.block_size
27460563dfeSPawel Kaminski        print_json(rpc.bdev.bdev_null_create(args.client,
2751ea97654SDaniel Verkamp                                             num_blocks=num_blocks,
2761ea97654SDaniel Verkamp                                             block_size=args.block_size,
2771ea97654SDaniel Verkamp                                             name=args.name,
2788031dfe2SEvgeniy Kochetov                                             uuid=args.uuid,
27920aeec56SEvgeniy Kochetov                                             md_size=args.md_size,
28020aeec56SEvgeniy Kochetov                                             dif_type=args.dif_type,
28120aeec56SEvgeniy Kochetov                                             dif_is_head_of_md=args.dif_is_head_of_md))
2826f01da76SDaniel Verkamp
28360563dfeSPawel Kaminski    p = subparsers.add_parser('bdev_null_create', aliases=['construct_null_bdev'],
2844dd3f4a7SBen Walker                              help='Add a bdev with null backend')
2854dd3f4a7SBen Walker    p.add_argument('name', help='Block device name')
28684918cd9SDaniel Verkamp    p.add_argument('-u', '--uuid', help='UUID of the bdev')
2874dd3f4a7SBen Walker    p.add_argument(
2884dd3f4a7SBen Walker        'total_size', help='Size of null bdev in MB (int > 0)', type=int)
2894dd3f4a7SBen Walker    p.add_argument('block_size', help='Block size for this bdev', type=int)
2908031dfe2SEvgeniy Kochetov    p.add_argument('-m', '--md-size', type=int,
2918031dfe2SEvgeniy Kochetov                   help='Metadata size for this bdev. Default 0')
29220aeec56SEvgeniy Kochetov    p.add_argument('-t', '--dif-type', type=int, choices=[0, 1, 2, 3],
29320aeec56SEvgeniy Kochetov                   help='Protection information type. Default: 0 - no protection')
29420aeec56SEvgeniy Kochetov    p.add_argument('-d', '--dif-is-head-of-md', action='store_true',
29520aeec56SEvgeniy Kochetov                   help='Protection information is in the first 8 bytes of metadata. Default: in the last 8 bytes')
29660563dfeSPawel Kaminski    p.set_defaults(func=bdev_null_create)
297df897ed4SDaniel Verkamp
29860563dfeSPawel Kaminski    def bdev_null_delete(args):
29960563dfeSPawel Kaminski        rpc.bdev.bdev_null_delete(args.client,
3002ce9836bSMaciej Szwed                                  name=args.name)
3012ce9836bSMaciej Szwed
30260563dfeSPawel Kaminski    p = subparsers.add_parser('bdev_null_delete', aliases=['delete_null_bdev'],
30360563dfeSPawel Kaminski                              help='Delete a null bdev')
3042ce9836bSMaciej Szwed    p.add_argument('name', help='null bdev name')
30560563dfeSPawel Kaminski    p.set_defaults(func=bdev_null_delete)
3062ce9836bSMaciej Szwed
307acaa079bSMaciej Wawryk    def bdev_aio_create(args):
308acaa079bSMaciej Wawryk        print_json(rpc.bdev.bdev_aio_create(args.client,
3091ea97654SDaniel Verkamp                                            filename=args.filename,
3101ea97654SDaniel Verkamp                                            name=args.name,
3111ea97654SDaniel Verkamp                                            block_size=args.block_size))
3126f01da76SDaniel Verkamp
3131d039ebaSPawel Kaminski    p = subparsers.add_parser('bdev_aio_create', aliases=['construct_aio_bdev'],
3144dd3f4a7SBen Walker                              help='Add a bdev with aio backend')
3154dd3f4a7SBen Walker    p.add_argument('filename', help='Path to device or file (ex: /dev/sda)')
3164dd3f4a7SBen Walker    p.add_argument('name', help='Block device name')
317b5f32138SDaniel Verkamp    p.add_argument('block_size', help='Block size for this bdev', type=int, nargs='?', default=0)
318acaa079bSMaciej Wawryk    p.set_defaults(func=bdev_aio_create)
319df897ed4SDaniel Verkamp
320acaa079bSMaciej Wawryk    def bdev_aio_delete(args):
321acaa079bSMaciej Wawryk        rpc.bdev.bdev_aio_delete(args.client,
32296e93bd8STomasz Zawadzki                                 name=args.name)
32396e93bd8STomasz Zawadzki
3241d039ebaSPawel Kaminski    p = subparsers.add_parser('bdev_aio_delete', aliases=['delete_aio_bdev'],
3251d039ebaSPawel Kaminski                              help='Delete an aio disk')
32696e93bd8STomasz Zawadzki    p.add_argument('name', help='aio bdev name')
327acaa079bSMaciej Wawryk    p.set_defaults(func=bdev_aio_delete)
32896e93bd8STomasz Zawadzki
32910d8b7c3SPawel Kaminski    def bdev_nvme_set_options(args):
33010d8b7c3SPawel Kaminski        rpc.bdev.bdev_nvme_set_options(args.client,
3314bef621eSPawel Wodkowski                                       action_on_timeout=args.action_on_timeout,
332e7878c7cSPawel Niedzwiecki                                       timeout_us=args.timeout_us,
3334bef621eSPawel Wodkowski                                       retry_count=args.retry_count,
3347f6fdcffSChangpeng Liu                                       arbitration_burst=args.arbitration_burst,
3357f6fdcffSChangpeng Liu                                       low_priority_weight=args.low_priority_weight,
3367f6fdcffSChangpeng Liu                                       medium_priority_weight=args.medium_priority_weight,
3377f6fdcffSChangpeng Liu                                       high_priority_weight=args.high_priority_weight,
338a741e341SBen Walker                                       nvme_adminq_poll_period_us=args.nvme_adminq_poll_period_us,
33990520634SChangpeng Liu                                       nvme_ioq_poll_period_us=args.nvme_ioq_poll_period_us,
34090520634SChangpeng Liu                                       io_queue_requests=args.io_queue_requests)
3414bef621eSPawel Wodkowski
34210d8b7c3SPawel Kaminski    p = subparsers.add_parser('bdev_nvme_set_options', aliases=['set_bdev_nvme_options'],
3434bef621eSPawel Wodkowski                              help='Set options for the bdev nvme type. This is startup command.')
3444bef621eSPawel Wodkowski    p.add_argument('-a', '--action-on-timeout',
3454bef621eSPawel Wodkowski                   help="Action to take on command time out. Valid valies are: none, reset, abort")
3464bef621eSPawel Wodkowski    p.add_argument('-t', '--timeout-us',
3474bef621eSPawel Wodkowski                   help="Timeout for each command, in microseconds. If 0, don't track timeouts.", type=int)
3484bef621eSPawel Wodkowski    p.add_argument('-n', '--retry-count',
3494bef621eSPawel Wodkowski                   help='the number of attempts per I/O when an I/O fails', type=int)
3507f6fdcffSChangpeng Liu    p.add_argument('--arbitration-burst',
3517f6fdcffSChangpeng Liu                   help='the value is expressed as a power of two', type=int)
3527f6fdcffSChangpeng Liu    p.add_argument('--low-priority-weight',
3537f6fdcffSChangpeng Liu                   help='the maximum number of commands that the controller may launch at one time from a low priority queue', type=int)
3547f6fdcffSChangpeng Liu    p.add_argument('--medium-priority-weight',
3557f6fdcffSChangpeng Liu                   help='the maximum number of commands that the controller may launch at one time from a medium priority queue', type=int)
3567f6fdcffSChangpeng Liu    p.add_argument('--high-priority-weight',
3577f6fdcffSChangpeng Liu                   help='the maximum number of commands that the controller may launch at one time from a high priority queue', type=int)
3584bef621eSPawel Wodkowski    p.add_argument('-p', '--nvme-adminq-poll-period-us',
3594bef621eSPawel Wodkowski                   help='How often the admin queue is polled for asynchronous events', type=int)
360a741e341SBen Walker    p.add_argument('-i', '--nvme-ioq-poll-period-us',
361a741e341SBen Walker                   help='How often to poll I/O queues for completions', type=int)
36290520634SChangpeng Liu    p.add_argument('-s', '--io-queue-requests',
36390520634SChangpeng Liu                   help='The number of requests allocated for each NVMe I/O queue. Default: 512', type=int)
36410d8b7c3SPawel Kaminski    p.set_defaults(func=bdev_nvme_set_options)
3654bef621eSPawel Wodkowski
36661a42c0eSPawel Kaminski    def bdev_nvme_set_hotplug(args):
36761a42c0eSPawel Kaminski        rpc.bdev.bdev_nvme_set_hotplug(args.client, enable=args.enable, period_us=args.period_us)
3685f9bdac0SPawel Wodkowski
36961a42c0eSPawel Kaminski    p = subparsers.add_parser('bdev_nvme_set_hotplug', aliases=['set_bdev_nvme_hotplug'],
3705f9bdac0SPawel Wodkowski                              help='Set hotplug options for bdev nvme type.')
3715f9bdac0SPawel Wodkowski    p.add_argument('-d', '--disable', dest='enable', default=False, action='store_false', help="Disable hotplug (default)")
3725f9bdac0SPawel Wodkowski    p.add_argument('-e', '--enable', dest='enable', action='store_true', help="Enable hotplug")
3735f9bdac0SPawel Wodkowski    p.add_argument('-r', '--period-us',
3745f9bdac0SPawel Wodkowski                   help='How often the hotplug is processed for insert and remove events', type=int)
37561a42c0eSPawel Kaminski    p.set_defaults(func=bdev_nvme_set_hotplug)
3765f9bdac0SPawel Wodkowski
377f54df840SPawel Kaminski    def bdev_nvme_attach_controller(args):
378f54df840SPawel Kaminski        print_array(rpc.bdev.bdev_nvme_attach_controller(args.client,
3791ea97654SDaniel Verkamp                                                         name=args.name,
3801ea97654SDaniel Verkamp                                                         trtype=args.trtype,
3811ea97654SDaniel Verkamp                                                         traddr=args.traddr,
3821ea97654SDaniel Verkamp                                                         adrfam=args.adrfam,
3831ea97654SDaniel Verkamp                                                         trsvcid=args.trsvcid,
384088379cfSSeth Howell                                                         subnqn=args.subnqn,
385cc7a099cSSeth Howell                                                         hostnqn=args.hostnqn,
386088379cfSSeth Howell                                                         hostaddr=args.hostaddr,
387260f9a77SShuhei Matsumoto                                                         hostsvcid=args.hostsvcid,
388260f9a77SShuhei Matsumoto                                                         prchk_reftag=args.prchk_reftag,
389260f9a77SShuhei Matsumoto                                                         prchk_guard=args.prchk_guard))
3901e92d78aSBen Walker
391f54df840SPawel Kaminski    p = subparsers.add_parser('bdev_nvme_attach_controller', aliases=['construct_nvme_bdev'],
39298187ed9SLiu Xiaodong                              help='Add bdevs with nvme backend')
39398187ed9SLiu Xiaodong    p.add_argument('-b', '--name', help="Name of the NVMe controller, prefix for each bdev name", required=True)
3944dd3f4a7SBen Walker    p.add_argument('-t', '--trtype',
3954dd3f4a7SBen Walker                   help='NVMe-oF target trtype: e.g., rdma, pcie', required=True)
3964dd3f4a7SBen Walker    p.add_argument('-a', '--traddr',
3974dd3f4a7SBen Walker                   help='NVMe-oF target address: e.g., an ip address or BDF', required=True)
3984dd3f4a7SBen Walker    p.add_argument('-f', '--adrfam',
3994dd3f4a7SBen Walker                   help='NVMe-oF target adrfam: e.g., ipv4, ipv6, ib, fc, intra_host')
4004dd3f4a7SBen Walker    p.add_argument('-s', '--trsvcid',
4014dd3f4a7SBen Walker                   help='NVMe-oF target trsvcid: e.g., a port number')
4024dd3f4a7SBen Walker    p.add_argument('-n', '--subnqn', help='NVMe-oF target subnqn')
403cc7a099cSSeth Howell    p.add_argument('-q', '--hostnqn', help='NVMe-oF host subnqn')
404088379cfSSeth Howell    p.add_argument('-i', '--hostaddr',
405088379cfSSeth Howell                   help='NVMe-oF host address: e.g., an ip address')
406088379cfSSeth Howell    p.add_argument('-c', '--hostsvcid',
407088379cfSSeth Howell                   help='NVMe-oF host svcid: e.g., a port number')
408260f9a77SShuhei Matsumoto    p.add_argument('-r', '--prchk-reftag',
409260f9a77SShuhei Matsumoto                   help='Enable checking of PI reference tag for I/O processing.', action='store_true')
410260f9a77SShuhei Matsumoto    p.add_argument('-g', '--prchk-guard',
411260f9a77SShuhei Matsumoto                   help='Enable checking of PI guard for I/O processing.', action='store_true')
412f54df840SPawel Kaminski    p.set_defaults(func=bdev_nvme_attach_controller)
413df897ed4SDaniel Verkamp
4145a2c2993SPawel Kaminski    def bdev_nvme_get_controllers(args):
4155a2c2993SPawel Kaminski        print_dict(rpc.nvme.bdev_nvme_get_controllers(args.client,
41643b335f9SLiu Xiaodong                                                      name=args.name))
41743b335f9SLiu Xiaodong
41843b335f9SLiu Xiaodong    p = subparsers.add_parser(
4195a2c2993SPawel Kaminski        'bdev_nvme_get_controllers', aliases=['get_nvme_controllers'],
4205a2c2993SPawel Kaminski        help='Display current NVMe controllers list or required NVMe controller')
42143b335f9SLiu Xiaodong    p.add_argument('-n', '--name', help="Name of the NVMe controller. Example: Nvme0", required=False)
4225a2c2993SPawel Kaminski    p.set_defaults(func=bdev_nvme_get_controllers)
42343b335f9SLiu Xiaodong
4243a56fabcSTomasz Zawadzki    def delete_nvme_controller(args):
4253a56fabcSTomasz Zawadzki        rpc.bdev.delete_nvme_controller(args.client,
4263a56fabcSTomasz Zawadzki                                        name=args.name)
4273a56fabcSTomasz Zawadzki
4283a56fabcSTomasz Zawadzki    p = subparsers.add_parser('delete_nvme_controller',
4293a56fabcSTomasz Zawadzki                              help='Delete a NVMe controller using controller name')
4303a56fabcSTomasz Zawadzki    p.add_argument('name', help="Name of the controller")
4313a56fabcSTomasz Zawadzki    p.set_defaults(func=delete_nvme_controller)
4323a56fabcSTomasz Zawadzki
4338ac7cad4SMaciej Wawryk    def bdev_rbd_create(args):
4344cfae036SPatrick Ohly        config = None
4354cfae036SPatrick Ohly        if args.config:
4364cfae036SPatrick Ohly            config = {}
4374cfae036SPatrick Ohly            for entry in args.config:
4384cfae036SPatrick Ohly                parts = entry.split('=', 1)
4394cfae036SPatrick Ohly                if len(parts) != 2:
4404cfae036SPatrick Ohly                    raise Exception('--config %s not in key=value form' % entry)
4414cfae036SPatrick Ohly                config[parts[0]] = parts[1]
4428ac7cad4SMaciej Wawryk        print_json(rpc.bdev.bdev_rbd_create(args.client,
4431ea97654SDaniel Verkamp                                            name=args.name,
4444cfae036SPatrick Ohly                                            user=args.user,
4454cfae036SPatrick Ohly                                            config=config,
4461ea97654SDaniel Verkamp                                            pool_name=args.pool_name,
4471ea97654SDaniel Verkamp                                            rbd_name=args.rbd_name,
4481ea97654SDaniel Verkamp                                            block_size=args.block_size))
4491e92d78aSBen Walker
4508ac7cad4SMaciej Wawryk    p = subparsers.add_parser('bdev_rbd_create', aliases=['construct_rbd_bdev'],
4514dd3f4a7SBen Walker                              help='Add a bdev with ceph rbd backend')
45213a05f59SPawel Wodkowski    p.add_argument('-b', '--name', help="Name of the bdev", required=False)
4534cfae036SPatrick Ohly    p.add_argument('--user', help="Ceph user name (i.e. admin, not client.admin)", required=False)
4544cfae036SPatrick Ohly    p.add_argument('--config', action='append', metavar='key=value',
4554cfae036SPatrick Ohly                   help="adds a key=value configuration option for rados_conf_set (default: rely on config file)")
4564dd3f4a7SBen Walker    p.add_argument('pool_name', help='rbd pool name')
4574dd3f4a7SBen Walker    p.add_argument('rbd_name', help='rbd image name')
4584dd3f4a7SBen Walker    p.add_argument('block_size', help='rbd block size', type=int)
4598ac7cad4SMaciej Wawryk    p.set_defaults(func=bdev_rbd_create)
460df897ed4SDaniel Verkamp
461164939aaSMaciej Wawryk    def bdev_rbd_delete(args):
462164939aaSMaciej Wawryk        rpc.bdev.bdev_rbd_delete(args.client,
4634fd967b2SMaciej Szwed                                 name=args.name)
4644fd967b2SMaciej Szwed
465164939aaSMaciej Wawryk    p = subparsers.add_parser('bdev_rbd_delete', aliases=['delete_rbd_bdev'],
466164939aaSMaciej Wawryk                              help='Delete a rbd bdev')
4674fd967b2SMaciej Szwed    p.add_argument('name', help='rbd bdev name')
468164939aaSMaciej Wawryk    p.set_defaults(func=bdev_rbd_delete)
4694fd967b2SMaciej Szwed
4703fb4a66dSSeth Howell    def bdev_delay_create(args):
47131c25ab3SDarek Stojaczyk        print_json(rpc.bdev.bdev_delay_create(args.client,
4723fb4a66dSSeth Howell                                              base_bdev_name=args.base_bdev_name,
4733fb4a66dSSeth Howell                                              name=args.name,
4743fb4a66dSSeth Howell                                              avg_read_latency=args.avg_read_latency,
4753fb4a66dSSeth Howell                                              p99_read_latency=args.nine_nine_read_latency,
4763fb4a66dSSeth Howell                                              avg_write_latency=args.avg_write_latency,
4773fb4a66dSSeth Howell                                              p99_write_latency=args.nine_nine_write_latency))
4783fb4a66dSSeth Howell
4793fb4a66dSSeth Howell    p = subparsers.add_parser('bdev_delay_create',
4803fb4a66dSSeth Howell                              help='Add a delay bdev on existing bdev')
4813fb4a66dSSeth Howell    p.add_argument('-b', '--base-bdev-name', help="Name of the existing bdev", required=True)
4823fb4a66dSSeth Howell    p.add_argument('-d', '--name', help="Name of the delay bdev", required=True)
483a1d0f799SSeth Howell    p.add_argument('-r', '--avg-read-latency',
484a1d0f799SSeth Howell                   help="Average latency to apply before completing read ops (in microseconds)", required=True, type=int)
485a1d0f799SSeth Howell    p.add_argument('-t', '--nine-nine-read-latency',
486a1d0f799SSeth Howell                   help="latency to apply to 1 in 100 read ops (in microseconds)", required=True, type=int)
487a1d0f799SSeth Howell    p.add_argument('-w', '--avg-write-latency',
488a1d0f799SSeth Howell                   help="Average latency to apply before completing write ops (in microseconds)", required=True, type=int)
489a1d0f799SSeth Howell    p.add_argument('-n', '--nine-nine-write-latency',
490a1d0f799SSeth Howell                   help="latency to apply to 1 in 100 write ops (in microseconds)", required=True, type=int)
4913fb4a66dSSeth Howell    p.set_defaults(func=bdev_delay_create)
4923fb4a66dSSeth Howell
4933fb4a66dSSeth Howell    def bdev_delay_delete(args):
4943fb4a66dSSeth Howell        rpc.bdev.bdev_delay_delete(args.client,
4953fb4a66dSSeth Howell                                   name=args.name)
4963fb4a66dSSeth Howell
4973fb4a66dSSeth Howell    p = subparsers.add_parser('bdev_delay_delete', help='Delete a delay bdev')
4983fb4a66dSSeth Howell    p.add_argument('name', help='delay bdev name')
4993fb4a66dSSeth Howell    p.set_defaults(func=bdev_delay_delete)
5003fb4a66dSSeth Howell
501d2424824SSeth Howell    def bdev_delay_update_latency(args):
502d2424824SSeth Howell        print_json(rpc.bdev.bdev_delay_update_latency(args.client,
503d2424824SSeth Howell                                                      delay_bdev_name=args.delay_bdev_name,
504d2424824SSeth Howell                                                      latency_type=args.latency_type,
505d2424824SSeth Howell                                                      latency_us=args.latency_us))
506d2424824SSeth Howell    p = subparsers.add_parser('bdev_delay_update_latency',
507d2424824SSeth Howell                              help='Update one of the latency values for a given delay bdev')
508d2424824SSeth Howell    p.add_argument('delay_bdev_name', help='The name of the given delay bdev')
509d2424824SSeth Howell    p.add_argument('latency_type', help='one of: avg_read, avg_write, p99_read, p99_write. No other values accepted.')
510a1d0f799SSeth Howell    p.add_argument('latency_us', help='new latency value in microseconds.', type=int)
511d2424824SSeth Howell    p.set_defaults(func=bdev_delay_update_latency)
512d2424824SSeth Howell
513cabb6a7dSMaciej Wawryk    def bdev_error_create(args):
514cabb6a7dSMaciej Wawryk        print_json(rpc.bdev.bdev_error_create(args.client,
515160850f0STomasz Zawadzki                                              base_name=args.base_name))
5161e92d78aSBen Walker
517cabb6a7dSMaciej Wawryk    p = subparsers.add_parser('bdev_error_create', aliases=['construct_error_bdev'],
5184dd3f4a7SBen Walker                              help='Add bdev with error injection backend')
5194dd3f4a7SBen Walker    p.add_argument('base_name', help='base bdev name')
520cabb6a7dSMaciej Wawryk    p.set_defaults(func=bdev_error_create)
521df897ed4SDaniel Verkamp
522cabb6a7dSMaciej Wawryk    def bdev_error_delete(args):
523cabb6a7dSMaciej Wawryk        rpc.bdev.bdev_error_delete(args.client,
5240847ad90STomasz Zawadzki                                   name=args.name)
5250847ad90STomasz Zawadzki
526cabb6a7dSMaciej Wawryk    p = subparsers.add_parser('bdev_error_delete', aliases=['delete_error_bdev'],
527cabb6a7dSMaciej Wawryk                              help='Delete an error bdev')
5280847ad90STomasz Zawadzki    p.add_argument('name', help='error bdev name')
529cabb6a7dSMaciej Wawryk    p.set_defaults(func=bdev_error_delete)
5300847ad90STomasz Zawadzki
5319f5cbf4cSMaciej Wawryk    def bdev_iscsi_create(args):
5329f5cbf4cSMaciej Wawryk        print_json(rpc.bdev.bdev_iscsi_create(args.client,
533fba68d61SPawel Wodkowski                                              name=args.name,
534fba68d61SPawel Wodkowski                                              url=args.url,
535160850f0STomasz Zawadzki                                              initiator_iqn=args.initiator_iqn))
536fba68d61SPawel Wodkowski
5379f5cbf4cSMaciej Wawryk    p = subparsers.add_parser('bdev_iscsi_create', aliases=['construct_iscsi_bdev'],
538fba68d61SPawel Wodkowski                              help='Add bdev with iSCSI initiator backend')
539fba68d61SPawel Wodkowski    p.add_argument('-b', '--name', help="Name of the bdev", required=True)
540fba68d61SPawel Wodkowski    p.add_argument('-i', '--initiator-iqn', help="Initiator IQN", required=True)
541fba68d61SPawel Wodkowski    p.add_argument('--url', help="iSCSI Lun URL", required=True)
5429f5cbf4cSMaciej Wawryk    p.set_defaults(func=bdev_iscsi_create)
543fba68d61SPawel Wodkowski
5449f5cbf4cSMaciej Wawryk    def bdev_iscsi_delete(args):
5459f5cbf4cSMaciej Wawryk        rpc.bdev.bdev_iscsi_delete(args.client,
5466be654aaSTomasz Zawadzki                                   name=args.name)
5476be654aaSTomasz Zawadzki
5489f5cbf4cSMaciej Wawryk    p = subparsers.add_parser('bdev_iscsi_delete', aliases=['delete_iscsi_bdev'],
5499f5cbf4cSMaciej Wawryk                              help='Delete an iSCSI bdev')
5506be654aaSTomasz Zawadzki    p.add_argument('name', help='iSCSI bdev name')
5519f5cbf4cSMaciej Wawryk    p.set_defaults(func=bdev_iscsi_delete)
5526be654aaSTomasz Zawadzki
553f2086995SPawel Kaminski    def bdev_pmem_create(args):
554f2086995SPawel Kaminski        print_json(rpc.bdev.bdev_pmem_create(args.client,
5551ea97654SDaniel Verkamp                                             pmem_file=args.pmem_file,
5561ea97654SDaniel Verkamp                                             name=args.name))
5576f01da76SDaniel Verkamp
558f2086995SPawel Kaminski    p = subparsers.add_parser('bdev_pmem_create', aliases=['construct_pmem_bdev'],
559f2086995SPawel Kaminski                              help='Add a bdev with pmem backend')
5604dd3f4a7SBen Walker    p.add_argument('pmem_file', help='Path to pmemblk pool file')
5614dd3f4a7SBen Walker    p.add_argument('-n', '--name', help='Block device name', required=True)
562f2086995SPawel Kaminski    p.set_defaults(func=bdev_pmem_create)
563df897ed4SDaniel Verkamp
564568ce213SPawel Kaminski    def bdev_pmem_delete(args):
565568ce213SPawel Kaminski        rpc.bdev.bdev_pmem_delete(args.client,
5661a0ce4deSMaciej Szwed                                  name=args.name)
5671a0ce4deSMaciej Szwed
568568ce213SPawel Kaminski    p = subparsers.add_parser('bdev_pmem_delete', aliases=['delete_pmem_bdev'],
569568ce213SPawel Kaminski                              help='Delete a pmem bdev')
5701a0ce4deSMaciej Szwed    p.add_argument('name', help='pmem bdev name')
571568ce213SPawel Kaminski    p.set_defaults(func=bdev_pmem_delete)
5721a0ce4deSMaciej Szwed
5737e875f37SPawel Kaminski    def bdev_passthru_create(args):
5747e875f37SPawel Kaminski        print_json(rpc.bdev.bdev_passthru_create(args.client,
5751ea97654SDaniel Verkamp                                                 base_bdev_name=args.base_bdev_name,
576164d7914Spaul luse                                                 name=args.name))
577cb1c88d1SGangCao
5787e875f37SPawel Kaminski    p = subparsers.add_parser('bdev_passthru_create', aliases=['construct_passthru_bdev'],
579cb1c88d1SGangCao                              help='Add a pass through bdev on existing bdev')
580cb1c88d1SGangCao    p.add_argument('-b', '--base-bdev-name', help="Name of the existing bdev", required=True)
581164d7914Spaul luse    p.add_argument('-p', '--name', help="Name of the pass through bdev", required=True)
5827e875f37SPawel Kaminski    p.set_defaults(func=bdev_passthru_create)
583cb1c88d1SGangCao
5847e875f37SPawel Kaminski    def bdev_passthru_delete(args):
5857e875f37SPawel Kaminski        rpc.bdev.bdev_passthru_delete(args.client,
586e48f0bf1SMaciej Szwed                                      name=args.name)
587e48f0bf1SMaciej Szwed
5887e875f37SPawel Kaminski    p = subparsers.add_parser('bdev_passthru_delete', aliases=['delete_passthru_bdev'],
5897e875f37SPawel Kaminski                              help='Delete a pass through bdev')
590e48f0bf1SMaciej Szwed    p.add_argument('name', help='pass through bdev name')
5917e875f37SPawel Kaminski    p.set_defaults(func=bdev_passthru_delete)
592e48f0bf1SMaciej Szwed
5932c49e910SMaciej Wawryk    def bdev_get_bdevs(args):
5942c49e910SMaciej Wawryk        print_dict(rpc.bdev.bdev_get_bdevs(args.client,
5951ea97654SDaniel Verkamp                                           name=args.name))
5961e92d78aSBen Walker
5972c49e910SMaciej Wawryk    p = subparsers.add_parser('bdev_get_bdevs', aliases=['get_bdevs'],
5982c49e910SMaciej Wawryk                              help='Display current blockdev list or required blockdev')
5994dd3f4a7SBen Walker    p.add_argument('-b', '--name', help="Name of the Blockdev. Example: Nvme0n1", required=False)
6002c49e910SMaciej Wawryk    p.set_defaults(func=bdev_get_bdevs)
601df897ed4SDaniel Verkamp
602326e68fcSMaciej Wawryk    def bdev_get_iostat(args):
603326e68fcSMaciej Wawryk        print_dict(rpc.bdev.bdev_get_iostat(args.client,
6041ea97654SDaniel Verkamp                                            name=args.name))
60564ccd4b9SYanbo Zhou
606326e68fcSMaciej Wawryk    p = subparsers.add_parser('bdev_get_iostat', aliases=['get_bdevs_iostat'],
607326e68fcSMaciej Wawryk                              help='Display current I/O statistics of all the blockdevs or required blockdev.')
60864ccd4b9SYanbo Zhou    p.add_argument('-b', '--name', help="Name of the Blockdev. Example: Nvme0n1", required=False)
609326e68fcSMaciej Wawryk    p.set_defaults(func=bdev_get_iostat)
61064ccd4b9SYanbo Zhou
611ab6ce828SMaciej Wawryk    def bdev_enable_histogram(args):
612ab6ce828SMaciej Wawryk        rpc.bdev.bdev_enable_histogram(args.client, name=args.name, enable=args.enable)
613e5e427c9SPiotr Pelplinski
614ab6ce828SMaciej Wawryk    p = subparsers.add_parser('bdev_enable_histogram', aliases=['enable_bdev_histogram'],
615ab6ce828SMaciej Wawryk                              help='Enable or disable histogram for specified bdev')
616e5e427c9SPiotr Pelplinski    p.add_argument('-e', '--enable', default=True, dest='enable', action='store_true', help='Enable histograms on specified device')
617e5e427c9SPiotr Pelplinski    p.add_argument('-d', '--disable', dest='enable', action='store_false', help='Disable histograms on specified device')
618e5e427c9SPiotr Pelplinski    p.add_argument('name', help='bdev name')
619ab6ce828SMaciej Wawryk    p.set_defaults(func=bdev_enable_histogram)
620e5e427c9SPiotr Pelplinski
62111f6b773SMaciej Wawryk    def bdev_get_histogram(args):
62211f6b773SMaciej Wawryk        print_dict(rpc.bdev.bdev_get_histogram(args.client, name=args.name))
623e5e427c9SPiotr Pelplinski
62411f6b773SMaciej Wawryk    p = subparsers.add_parser('bdev_get_histogram', aliases=['get_bdev_histogram'],
62511f6b773SMaciej Wawryk                              help='Get histogram for specified bdev')
626e5e427c9SPiotr Pelplinski    p.add_argument('name', help='bdev name')
62711f6b773SMaciej Wawryk    p.set_defaults(func=bdev_get_histogram)
628e5e427c9SPiotr Pelplinski
629a96afb8bSMaciej Wawryk    def bdev_set_qd_sampling_period(args):
630a96afb8bSMaciej Wawryk        rpc.bdev.bdev_set_qd_sampling_period(args.client,
63103987024SSeth Howell                                             name=args.name,
63203987024SSeth Howell                                             period=args.period)
63303987024SSeth Howell
634a96afb8bSMaciej Wawryk    p = subparsers.add_parser('bdev_set_qd_sampling_period', aliases=['set_bdev_qd_sampling_period'],
635a96afb8bSMaciej Wawryk                              help="Enable or disable tracking of a bdev's queue depth.")
63603987024SSeth Howell    p.add_argument('name', help='Blockdev name. Example: Malloc0')
63703987024SSeth Howell    p.add_argument('period', help='Period with which to poll the block device queue depth in microseconds.'
63803987024SSeth Howell                   ' If set to 0, polling will be disabled.',
63903987024SSeth Howell                   type=int)
640a96afb8bSMaciej Wawryk    p.set_defaults(func=bdev_set_qd_sampling_period)
64103987024SSeth Howell
642c61e14beSMaciej Wawryk    def bdev_set_qos_limit(args):
643c61e14beSMaciej Wawryk        rpc.bdev.bdev_set_qos_limit(args.client,
6441ea97654SDaniel Verkamp                                    name=args.name,
645868c28cdSGangCao                                    rw_ios_per_sec=args.rw_ios_per_sec,
64605b43152SGangCao                                    rw_mbytes_per_sec=args.rw_mbytes_per_sec,
64705b43152SGangCao                                    r_mbytes_per_sec=args.r_mbytes_per_sec,
64805b43152SGangCao                                    w_mbytes_per_sec=args.w_mbytes_per_sec)
649ffba4fdbSGangCao
650c61e14beSMaciej Wawryk    p = subparsers.add_parser('bdev_set_qos_limit', aliases=['set_bdev_qos_limit'],
651c61e14beSMaciej Wawryk                              help='Set QoS rate limit on a blockdev')
652ffba4fdbSGangCao    p.add_argument('name', help='Blockdev name to set QoS. Example: Malloc0')
653868c28cdSGangCao    p.add_argument('--rw_ios_per_sec',
654868c28cdSGangCao                   help='R/W IOs per second limit (>=10000, example: 20000). 0 means unlimited.',
655868c28cdSGangCao                   type=int, required=False)
656868c28cdSGangCao    p.add_argument('--rw_mbytes_per_sec',
657868c28cdSGangCao                   help="R/W megabytes per second limit (>=10, example: 100). 0 means unlimited.",
658868c28cdSGangCao                   type=int, required=False)
65905b43152SGangCao    p.add_argument('--r_mbytes_per_sec',
66005b43152SGangCao                   help="Read megabytes per second limit (>=10, example: 100). 0 means unlimited.",
66105b43152SGangCao                   type=int, required=False)
66205b43152SGangCao    p.add_argument('--w_mbytes_per_sec',
66305b43152SGangCao                   help="Write megabytes per second limit (>=10, example: 100). 0 means unlimited.",
66405b43152SGangCao                   type=int, required=False)
665c61e14beSMaciej Wawryk    p.set_defaults(func=bdev_set_qos_limit)
666ffba4fdbSGangCao
667cabb6a7dSMaciej Wawryk    def bdev_error_inject_error(args):
668cabb6a7dSMaciej Wawryk        rpc.bdev.bdev_error_inject_error(args.client,
6691ea97654SDaniel Verkamp                                         name=args.name,
6701ea97654SDaniel Verkamp                                         io_type=args.io_type,
6711ea97654SDaniel Verkamp                                         error_type=args.error_type,
6721ea97654SDaniel Verkamp                                         num=args.num)
6731e92d78aSBen Walker
674cabb6a7dSMaciej Wawryk    p = subparsers.add_parser('bdev_error_inject_error', aliases=['bdev_inject_error'],
675cabb6a7dSMaciej Wawryk                              help='bdev inject error')
6764dd3f4a7SBen Walker    p.add_argument('name', help="""the name of the error injection bdev""")
6774dd3f4a7SBen Walker    p.add_argument('io_type', help="""io_type: 'clear' 'read' 'write' 'unmap' 'flush' 'all'""")
6784dd3f4a7SBen Walker    p.add_argument('error_type', help="""error_type: 'failure' 'pending'""")
6794dd3f4a7SBen Walker    p.add_argument(
6804dd3f4a7SBen Walker        '-n', '--num', help='the number of commands you want to fail', type=int, default=1)
681cabb6a7dSMaciej Wawryk    p.set_defaults(func=bdev_error_inject_error)
682df897ed4SDaniel Verkamp
683b9063e4bSPawel Kaminski    def bdev_nvme_apply_firmware(args):
684b9063e4bSPawel Kaminski        print_dict(rpc.bdev.bdev_nvme_apply_firmware(args.client,
6851ea97654SDaniel Verkamp                                                     bdev_name=args.bdev_name,
6861ea97654SDaniel Verkamp                                                     filename=args.filename))
6871e92d78aSBen Walker
688b9063e4bSPawel Kaminski    p = subparsers.add_parser('apply_firmware', aliases=['apply_firmware'],
689b9063e4bSPawel Kaminski                              help='Download and commit firmware to NVMe device')
6904dd3f4a7SBen Walker    p.add_argument('filename', help='filename of the firmware to download')
6914dd3f4a7SBen Walker    p.add_argument('bdev_name', help='name of the NVMe device')
692b9063e4bSPawel Kaminski    p.set_defaults(func=bdev_nvme_apply_firmware)
6931e92d78aSBen Walker
6944dd3f4a7SBen Walker    # iSCSI
695cea4c3e5SPawel Kaminski    def iscsi_set_options(args):
696cea4c3e5SPawel Kaminski        rpc.iscsi.iscsi_set_options(
697253c61beSheluwei            args.client,
698253c61beSheluwei            auth_file=args.auth_file,
699253c61beSheluwei            node_base=args.node_base,
700253c61beSheluwei            nop_timeout=args.nop_timeout,
701253c61beSheluwei            nop_in_interval=args.nop_in_interval,
70266723f7fSShuhei Matsumoto            disable_chap=args.disable_chap,
70366723f7fSShuhei Matsumoto            require_chap=args.require_chap,
70466723f7fSShuhei Matsumoto            mutual_chap=args.mutual_chap,
70566723f7fSShuhei Matsumoto            chap_group=args.chap_group,
706253c61beSheluwei            max_sessions=args.max_sessions,
70764269787SPawel Wodkowski            max_queue_depth=args.max_queue_depth,
708253c61beSheluwei            max_connections_per_session=args.max_connections_per_session,
709253c61beSheluwei            default_time2wait=args.default_time2wait,
710253c61beSheluwei            default_time2retain=args.default_time2retain,
711d393983dSGangCao            first_burst_length=args.first_burst_length,
712253c61beSheluwei            immediate_data=args.immediate_data,
713253c61beSheluwei            error_recovery_level=args.error_recovery_level,
714af8affd1SBen Walker            allow_duplicated_isid=args.allow_duplicated_isid)
71559b3479bSShuhei Matsumoto
716cea4c3e5SPawel Kaminski    p = subparsers.add_parser('iscsi_set_options', aliases=['set_iscsi_options'],
717cea4c3e5SPawel Kaminski                              help="""Set options of iSCSI subsystem""")
718ad323b80SShuhei Matsumoto    p.add_argument('-f', '--auth-file', help='Path to CHAP shared secret file')
71959b3479bSShuhei Matsumoto    p.add_argument('-b', '--node-base', help='Prefix of the name of iSCSI target node')
72059b3479bSShuhei Matsumoto    p.add_argument('-o', '--nop-timeout', help='Timeout in seconds to nop-in request to the initiator', type=int)
72159b3479bSShuhei Matsumoto    p.add_argument('-n', '--nop-in-interval', help='Time interval in secs between nop-in requests by the target', type=int)
72266723f7fSShuhei Matsumoto    p.add_argument('-d', '--disable-chap', help="""CHAP for discovery session should be disabled.
72366723f7fSShuhei Matsumoto    *** Mutually exclusive with --require-chap""", action='store_true')
72466723f7fSShuhei Matsumoto    p.add_argument('-r', '--require-chap', help="""CHAP for discovery session should be required.
72566723f7fSShuhei Matsumoto    *** Mutually exclusive with --disable-chap""", action='store_true')
72666723f7fSShuhei Matsumoto    p.add_argument('-m', '--mutual-chap', help='CHAP for discovery session should be mutual', action='store_true')
72766723f7fSShuhei Matsumoto    p.add_argument('-g', '--chap-group', help="""Authentication group ID for discovery session.
72859b3479bSShuhei Matsumoto    *** Authentication group must be precreated ***""", type=int)
72959b3479bSShuhei Matsumoto    p.add_argument('-a', '--max-sessions', help='Maximum number of sessions in the host.', type=int)
73064269787SPawel Wodkowski    p.add_argument('-q', '--max-queue-depth', help='Max number of outstanding I/Os per queue.', type=int)
73159b3479bSShuhei Matsumoto    p.add_argument('-c', '--max-connections-per-session', help='Negotiated parameter, MaxConnections.', type=int)
73259b3479bSShuhei Matsumoto    p.add_argument('-w', '--default-time2wait', help='Negotiated parameter, DefaultTime2Wait.', type=int)
73359b3479bSShuhei Matsumoto    p.add_argument('-v', '--default-time2retain', help='Negotiated parameter, DefaultTime2Retain.', type=int)
734d393983dSGangCao    p.add_argument('-s', '--first-burst-length', help='Negotiated parameter, FirstBurstLength.', type=int)
73559b3479bSShuhei Matsumoto    p.add_argument('-i', '--immediate-data', help='Negotiated parameter, ImmediateData.', action='store_true')
73659b3479bSShuhei Matsumoto    p.add_argument('-l', '--error-recovery-level', help='Negotiated parameter, ErrorRecoveryLevel', type=int)
73759b3479bSShuhei Matsumoto    p.add_argument('-p', '--allow-duplicated-isid', help='Allow duplicated initiator session ID.', action='store_true')
738cea4c3e5SPawel Kaminski    p.set_defaults(func=iscsi_set_options)
73959b3479bSShuhei Matsumoto
740a05efe0aSPawel Kaminski    def iscsi_set_discovery_auth(args):
741a05efe0aSPawel Kaminski        rpc.iscsi.iscsi_set_discovery_auth(
7426cd1714aSShuhei Matsumoto            args.client,
7436cd1714aSShuhei Matsumoto            disable_chap=args.disable_chap,
7446cd1714aSShuhei Matsumoto            require_chap=args.require_chap,
7456cd1714aSShuhei Matsumoto            mutual_chap=args.mutual_chap,
7466cd1714aSShuhei Matsumoto            chap_group=args.chap_group)
7476cd1714aSShuhei Matsumoto
748a05efe0aSPawel Kaminski    p = subparsers.add_parser('iscsi_set_discovery_auth', aliases=['set_iscsi_discovery_auth'],
749a05efe0aSPawel Kaminski                              help="""Set CHAP authentication for discovery session.""")
7506cd1714aSShuhei Matsumoto    p.add_argument('-d', '--disable-chap', help="""CHAP for discovery session should be disabled.
7516cd1714aSShuhei Matsumoto    *** Mutually exclusive with --require-chap""", action='store_true')
7526cd1714aSShuhei Matsumoto    p.add_argument('-r', '--require-chap', help="""CHAP for discovery session should be required.
7536cd1714aSShuhei Matsumoto    *** Mutually exclusive with --disable-chap""", action='store_true')
7546cd1714aSShuhei Matsumoto    p.add_argument('-m', '--mutual-chap', help='CHAP for discovery session should be mutual', action='store_true')
7556cd1714aSShuhei Matsumoto    p.add_argument('-g', '--chap-group', help="""Authentication group ID for discovery session.
7566cd1714aSShuhei Matsumoto    *** Authentication group must be precreated ***""", type=int)
757a05efe0aSPawel Kaminski    p.set_defaults(func=iscsi_set_discovery_auth)
7586cd1714aSShuhei Matsumoto
759d9edd3afSPawel Kaminski    def iscsi_create_auth_group(args):
760dcafd5b1SShuhei Matsumoto        secrets = None
761dcafd5b1SShuhei Matsumoto        if args.secrets:
762dcafd5b1SShuhei Matsumoto            secrets = [dict(u.split(":") for u in a.split(" ")) for a in args.secrets.split(",")]
763dcafd5b1SShuhei Matsumoto
764d9edd3afSPawel Kaminski        rpc.iscsi.iscsi_create_auth_group(args.client, tag=args.tag, secrets=secrets)
765dcafd5b1SShuhei Matsumoto
766d9edd3afSPawel Kaminski    p = subparsers.add_parser('iscsi_create_auth_group', aliases=['add_iscsi_auth_group'],
767d9edd3afSPawel Kaminski                              help='Create authentication group for CHAP authentication.')
768dcafd5b1SShuhei Matsumoto    p.add_argument('tag', help='Authentication group tag (unique, integer > 0).', type=int)
769dcafd5b1SShuhei Matsumoto    p.add_argument('-c', '--secrets', help="""Comma-separated list of CHAP secrets
770dcafd5b1SShuhei Matsumoto<user:user_name secret:chap_secret muser:mutual_user_name msecret:mutual_chap_secret> enclosed in quotes.
771dcafd5b1SShuhei MatsumotoFormat: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 msecret:ms2'""", required=False)
772d9edd3afSPawel Kaminski    p.set_defaults(func=iscsi_create_auth_group)
773dcafd5b1SShuhei Matsumoto
774bcab0b3bSPawel Kaminski    def iscsi_delete_auth_group(args):
775bcab0b3bSPawel Kaminski        rpc.iscsi.iscsi_delete_auth_group(args.client, tag=args.tag)
776dcafd5b1SShuhei Matsumoto
777bcab0b3bSPawel Kaminski    p = subparsers.add_parser('iscsi_delete_auth_group', aliases=['delete_iscsi_auth_group'],
778bcab0b3bSPawel Kaminski                              help='Delete an authentication group.')
779dcafd5b1SShuhei Matsumoto    p.add_argument('tag', help='Authentication group tag', type=int)
780bcab0b3bSPawel Kaminski    p.set_defaults(func=iscsi_delete_auth_group)
781dcafd5b1SShuhei Matsumoto
7820cbf1237SPawel Kaminski    def iscsi_auth_group_add_secret(args):
7830cbf1237SPawel Kaminski        rpc.iscsi.iscsi_auth_group_add_secret(
784750e5d25SShuhei Matsumoto            args.client,
785750e5d25SShuhei Matsumoto            tag=args.tag,
786750e5d25SShuhei Matsumoto            user=args.user,
787750e5d25SShuhei Matsumoto            secret=args.secret,
788750e5d25SShuhei Matsumoto            muser=args.muser,
789750e5d25SShuhei Matsumoto            msecret=args.msecret)
790750e5d25SShuhei Matsumoto
7910cbf1237SPawel Kaminski    p = subparsers.add_parser('iscsi_auth_group_add_secret', aliases=['add_secret_to_iscsi_auth_group'],
7920cbf1237SPawel Kaminski                              help='Add a secret to an authentication group.')
793750e5d25SShuhei Matsumoto    p.add_argument('tag', help='Authentication group tag', type=int)
794750e5d25SShuhei Matsumoto    p.add_argument('-u', '--user', help='User name for one-way CHAP authentication', required=True)
795750e5d25SShuhei Matsumoto    p.add_argument('-s', '--secret', help='Secret for one-way CHAP authentication', required=True)
796750e5d25SShuhei Matsumoto    p.add_argument('-m', '--muser', help='User name for mutual CHAP authentication')
797750e5d25SShuhei Matsumoto    p.add_argument('-r', '--msecret', help='Secret for mutual CHAP authentication')
7980cbf1237SPawel Kaminski    p.set_defaults(func=iscsi_auth_group_add_secret)
799750e5d25SShuhei Matsumoto
800a25f9bf9SPawel Kaminski    def iscsi_auth_group_remove_secret(args):
801a25f9bf9SPawel Kaminski        rpc.iscsi.iscsi_auth_group_remove_secret(args.client, tag=args.tag, user=args.user)
802750e5d25SShuhei Matsumoto
803a25f9bf9SPawel Kaminski    p = subparsers.add_parser('iscsi_auth_group_remove_secret', aliases=['delete_secret_from_iscsi_auth_group'],
804a25f9bf9SPawel Kaminski                              help='Remove a secret from an authentication group.')
805750e5d25SShuhei Matsumoto    p.add_argument('tag', help='Authentication group tag', type=int)
806750e5d25SShuhei Matsumoto    p.add_argument('-u', '--user', help='User name for one-way CHAP authentication', required=True)
807a25f9bf9SPawel Kaminski    p.set_defaults(func=iscsi_auth_group_remove_secret)
808750e5d25SShuhei Matsumoto
809c1f6def9SPawel Kaminski    def iscsi_get_auth_groups(args):
810c1f6def9SPawel Kaminski        print_dict(rpc.iscsi.iscsi_get_auth_groups(args.client))
8113a08001dSShuhei Matsumoto
812c1f6def9SPawel Kaminski    p = subparsers.add_parser('iscsi_get_auth_groups', aliases=['get_iscsi_auth_groups'],
8133a08001dSShuhei Matsumoto                              help='Display current authentication group configuration')
814c1f6def9SPawel Kaminski    p.set_defaults(func=iscsi_get_auth_groups)
8153a08001dSShuhei Matsumoto
8161a6c41a9SPawel Kaminski    def iscsi_get_portal_groups(args):
8171a6c41a9SPawel Kaminski        print_dict(rpc.iscsi.iscsi_get_portal_groups(args.client))
818df897ed4SDaniel Verkamp
8194dd3f4a7SBen Walker    p = subparsers.add_parser(
8201a6c41a9SPawel Kaminski        'iscsi_get_portal_groups', aliases=['get_portal_groups'],
8211a6c41a9SPawel Kaminski        help='Display current portal group configuration')
8221a6c41a9SPawel Kaminski    p.set_defaults(func=iscsi_get_portal_groups)
823df897ed4SDaniel Verkamp
824e3366470SPawel Kaminski    def iscsi_get_initiator_groups(args):
825e3366470SPawel Kaminski        print_dict(rpc.iscsi.iscsi_get_initiator_groups(args.client))
8261e92d78aSBen Walker
827e3366470SPawel Kaminski    p = subparsers.add_parser('iscsi_get_initiator_groups',
828e3366470SPawel Kaminski                              aliases=['get_initiator_groups'],
8294dd3f4a7SBen Walker                              help='Display current initiator group configuration')
830e3366470SPawel Kaminski    p.set_defaults(func=iscsi_get_initiator_groups)
831df897ed4SDaniel Verkamp
8327d114278SPawel Kaminski    def iscsi_get_target_nodes(args):
8337d114278SPawel Kaminski        print_dict(rpc.iscsi.iscsi_get_target_nodes(args.client))
8341e92d78aSBen Walker
8357d114278SPawel Kaminski    p = subparsers.add_parser('iscsi_get_target_nodes', aliases=['get_target_nodes'],
8367d114278SPawel Kaminski                              help='Display target nodes')
8377d114278SPawel Kaminski    p.set_defaults(func=iscsi_get_target_nodes)
838df897ed4SDaniel Verkamp
839758b2f94SPawel Kaminski    def iscsi_create_target_node(args):
840253c61beSheluwei        luns = []
841253c61beSheluwei        for u in args.bdev_name_id_pairs.strip().split(" "):
842253c61beSheluwei            bdev_name, lun_id = u.split(":")
843253c61beSheluwei            luns.append({"bdev_name": bdev_name, "lun_id": int(lun_id)})
844253c61beSheluwei
845253c61beSheluwei        pg_ig_maps = []
846253c61beSheluwei        for u in args.pg_ig_mappings.strip().split(" "):
847253c61beSheluwei            pg, ig = u.split(":")
848253c61beSheluwei            pg_ig_maps.append({"pg_tag": int(pg), "ig_tag": int(ig)})
849253c61beSheluwei
850758b2f94SPawel Kaminski        rpc.iscsi.iscsi_create_target_node(
851253c61beSheluwei            args.client,
852253c61beSheluwei            luns=luns,
853253c61beSheluwei            pg_ig_maps=pg_ig_maps,
854253c61beSheluwei            name=args.name,
855253c61beSheluwei            alias_name=args.alias_name,
856253c61beSheluwei            queue_depth=args.queue_depth,
857253c61beSheluwei            chap_group=args.chap_group,
858253c61beSheluwei            disable_chap=args.disable_chap,
859253c61beSheluwei            require_chap=args.require_chap,
860253c61beSheluwei            mutual_chap=args.mutual_chap,
861253c61beSheluwei            header_digest=args.header_digest,
862253c61beSheluwei            data_digest=args.data_digest)
8631e92d78aSBen Walker
864758b2f94SPawel Kaminski    p = subparsers.add_parser('iscsi_create_target_node', aliases=['construct_target_node'],
8654dd3f4a7SBen Walker                              help='Add a target node')
8661e92d78aSBen Walker    p.add_argument('name', help='Target node name (ASCII)')
8671e92d78aSBen Walker    p.add_argument('alias_name', help='Target node alias name (ASCII)')
868583e9699SShuhei Matsumoto    p.add_argument('bdev_name_id_pairs', help="""Whitespace-separated list of <bdev name:LUN ID> pairs enclosed
869583e9699SShuhei Matsumoto    in quotes.  Format:  'bdev_name0:id0 bdev_name1:id1' etc
8701e92d78aSBen Walker    Example: 'Malloc0:0 Malloc1:1 Malloc5:2'
871583e9699SShuhei Matsumoto    *** The bdevs must pre-exist ***
8721e92d78aSBen Walker    *** LUN0 (id = 0) is required ***
8734dd3f4a7SBen Walker    *** bdevs names cannot contain space or colon characters ***""")
8741e92d78aSBen Walker    p.add_argument('pg_ig_mappings', help="""List of (Portal_Group_Tag:Initiator_Group_Tag) mappings
8751e92d78aSBen Walker    Whitespace separated, quoted, mapping defined with colon
8761e92d78aSBen Walker    separated list of "tags" (int > 0)
8771e92d78aSBen Walker    Example: '1:1 2:2 2:1'
8781e92d78aSBen Walker    *** The Portal/Initiator Groups must be precreated ***""")
8791e92d78aSBen Walker    p.add_argument('queue_depth', help='Desired target queue depth', type=int)
88036fc9b2dSShuhei Matsumoto    p.add_argument('-g', '--chap-group', help="""Authentication group ID for this target node.
88136fc9b2dSShuhei Matsumoto    *** Authentication group must be precreated ***""", type=int, default=0)
88236fc9b2dSShuhei Matsumoto    p.add_argument('-d', '--disable-chap', help="""CHAP authentication should be disabled for this target node.
88336fc9b2dSShuhei Matsumoto    *** Mutually exclusive with --require-chap ***""", action='store_true')
88436fc9b2dSShuhei Matsumoto    p.add_argument('-r', '--require-chap', help="""CHAP authentication should be required for this target node.
88536fc9b2dSShuhei Matsumoto    *** Mutually exclusive with --disable-chap ***""", action='store_true')
8864dd3f4a7SBen Walker    p.add_argument(
88736fc9b2dSShuhei Matsumoto        '-m', '--mutual-chap', help='CHAP authentication should be mutual/bidirectional.', action='store_true')
888b94ba1eeSShuhei Matsumoto    p.add_argument('-H', '--header-digest',
889b94ba1eeSShuhei Matsumoto                   help='Header Digest should be required for this target node.', action='store_true')
890b94ba1eeSShuhei Matsumoto    p.add_argument('-D', '--data-digest',
891b94ba1eeSShuhei Matsumoto                   help='Data Digest should be required for this target node.', action='store_true')
892758b2f94SPawel Kaminski    p.set_defaults(func=iscsi_create_target_node)
893df897ed4SDaniel Verkamp
89480494e3fSPawel Kaminski    def iscsi_target_node_add_lun(args):
89580494e3fSPawel Kaminski        rpc.iscsi.iscsi_target_node_add_lun(
896253c61beSheluwei            args.client,
897253c61beSheluwei            name=args.name,
898253c61beSheluwei            bdev_name=args.bdev_name,
899253c61beSheluwei            lun_id=args.lun_id)
900f0456914SShuhei Matsumoto
90180494e3fSPawel Kaminski    p = subparsers.add_parser('iscsi_target_node_add_lun', aliases=['target_node_add_lun'],
90280494e3fSPawel Kaminski                              help='Add LUN to the target node')
903f0456914SShuhei Matsumoto    p.add_argument('name', help='Target node name (ASCII)')
904f0456914SShuhei Matsumoto    p.add_argument('bdev_name', help="""bdev name enclosed in quotes.
905f0456914SShuhei Matsumoto    *** bdev name cannot contain space or colon characters ***""")
906f0456914SShuhei Matsumoto    p.add_argument('-i', dest='lun_id', help="""LUN ID (integer >= 0)
907f0456914SShuhei Matsumoto    *** If LUN ID is omitted or -1, the lowest free one is assigned ***""", type=int, required=False)
90880494e3fSPawel Kaminski    p.set_defaults(func=iscsi_target_node_add_lun)
909df897ed4SDaniel Verkamp
910032a8b1cSPawel Kaminski    def iscsi_target_node_set_auth(args):
911032a8b1cSPawel Kaminski        rpc.iscsi.iscsi_target_node_set_auth(
912844735c9SShuhei Matsumoto            args.client,
913844735c9SShuhei Matsumoto            name=args.name,
914844735c9SShuhei Matsumoto            chap_group=args.chap_group,
915844735c9SShuhei Matsumoto            disable_chap=args.disable_chap,
916844735c9SShuhei Matsumoto            require_chap=args.require_chap,
917844735c9SShuhei Matsumoto            mutual_chap=args.mutual_chap)
918844735c9SShuhei Matsumoto
919032a8b1cSPawel Kaminski    p = subparsers.add_parser('iscsi_target_node_set_auth', aliases=['set_iscsi_target_node_auth'],
920032a8b1cSPawel Kaminski                              help='Set CHAP authentication for the target node')
921844735c9SShuhei Matsumoto    p.add_argument('name', help='Target node name (ASCII)')
922844735c9SShuhei Matsumoto    p.add_argument('-g', '--chap-group', help="""Authentication group ID for this target node.
923844735c9SShuhei Matsumoto    *** Authentication group must be precreated ***""", type=int, default=0)
924844735c9SShuhei Matsumoto    p.add_argument('-d', '--disable-chap', help="""CHAP authentication should be disabled for this target node.
925844735c9SShuhei Matsumoto    *** Mutually exclusive with --require-chap ***""", action='store_true')
926844735c9SShuhei Matsumoto    p.add_argument('-r', '--require-chap', help="""CHAP authentication should be required for this target node.
927844735c9SShuhei Matsumoto    *** Mutually exclusive with --disable-chap ***""", action='store_true')
928844735c9SShuhei Matsumoto    p.add_argument('-m', '--mutual-chap', help='CHAP authentication should be mutual/bidirectional.',
929844735c9SShuhei Matsumoto                   action='store_true')
930032a8b1cSPawel Kaminski    p.set_defaults(func=iscsi_target_node_set_auth)
931844735c9SShuhei Matsumoto
932a1c9546fSPawel Kaminski    def iscsi_target_node_add_pg_ig_maps(args):
933253c61beSheluwei        pg_ig_maps = []
934253c61beSheluwei        for u in args.pg_ig_mappings.strip().split(" "):
935253c61beSheluwei            pg, ig = u.split(":")
936253c61beSheluwei            pg_ig_maps.append({"pg_tag": int(pg), "ig_tag": int(ig)})
937a1c9546fSPawel Kaminski        rpc.iscsi.iscsi_target_node_add_pg_ig_maps(
938253c61beSheluwei            args.client,
939253c61beSheluwei            pg_ig_maps=pg_ig_maps,
940253c61beSheluwei            name=args.name)
9417e5ec29aSShuhei Matsumoto
942a1c9546fSPawel Kaminski    p = subparsers.add_parser('iscsi_target_node_add_pg_ig_maps',
943a1c9546fSPawel Kaminski                              aliases=['add_pg_ig_maps'],
944a1c9546fSPawel Kaminski                              help='Add PG-IG maps to the target node')
9457e5ec29aSShuhei Matsumoto    p.add_argument('name', help='Target node name (ASCII)')
9467e5ec29aSShuhei Matsumoto    p.add_argument('pg_ig_mappings', help="""List of (Portal_Group_Tag:Initiator_Group_Tag) mappings
9477e5ec29aSShuhei Matsumoto    Whitespace separated, quoted, mapping defined with colon
9487e5ec29aSShuhei Matsumoto    separated list of "tags" (int > 0)
9497e5ec29aSShuhei Matsumoto    Example: '1:1 2:2 2:1'
9507e5ec29aSShuhei Matsumoto    *** The Portal/Initiator Groups must be precreated ***""")
951a1c9546fSPawel Kaminski    p.set_defaults(func=iscsi_target_node_add_pg_ig_maps)
952df897ed4SDaniel Verkamp
953655b64daSPawel Kaminski    def iscsi_target_node_remove_pg_ig_maps(args):
954253c61beSheluwei        pg_ig_maps = []
955253c61beSheluwei        for u in args.pg_ig_mappings.strip().split(" "):
956253c61beSheluwei            pg, ig = u.split(":")
957253c61beSheluwei            pg_ig_maps.append({"pg_tag": int(pg), "ig_tag": int(ig)})
958655b64daSPawel Kaminski        rpc.iscsi.iscsi_target_node_remove_pg_ig_maps(
959253c61beSheluwei            args.client, pg_ig_maps=pg_ig_maps, name=args.name)
9607e5ec29aSShuhei Matsumoto
961655b64daSPawel Kaminski    p = subparsers.add_parser('iscsi_target_node_remove_pg_ig_maps',
962655b64daSPawel Kaminski                              aliases=['delete_pg_ig_maps'],
963655b64daSPawel Kaminski                              help='Delete PG-IG maps from the target node')
9647e5ec29aSShuhei Matsumoto    p.add_argument('name', help='Target node name (ASCII)')
9657e5ec29aSShuhei Matsumoto    p.add_argument('pg_ig_mappings', help="""List of (Portal_Group_Tag:Initiator_Group_Tag) mappings
9667e5ec29aSShuhei Matsumoto    Whitespace separated, quoted, mapping defined with colon
9677e5ec29aSShuhei Matsumoto    separated list of "tags" (int > 0)
9687e5ec29aSShuhei Matsumoto    Example: '1:1 2:2 2:1'
9697e5ec29aSShuhei Matsumoto    *** The Portal/Initiator Groups must be precreated ***""")
970655b64daSPawel Kaminski    p.set_defaults(func=iscsi_target_node_remove_pg_ig_maps)
971df897ed4SDaniel Verkamp
9720f4b3490SPawel Kaminski    def iscsi_create_portal_group(args):
973253c61beSheluwei        portals = []
974c781fdeeSShuhei Matsumoto        for p in args.portal_list.strip().split(' '):
975253c61beSheluwei            ip, separator, port_cpumask = p.rpartition(':')
976253c61beSheluwei            split_port_cpumask = port_cpumask.split('@')
977253c61beSheluwei            if len(split_port_cpumask) == 1:
978253c61beSheluwei                port = port_cpumask
979253c61beSheluwei                portals.append({'host': ip, 'port': port})
980253c61beSheluwei            else:
981253c61beSheluwei                port = split_port_cpumask[0]
982253c61beSheluwei                cpumask = split_port_cpumask[1]
98339e850d1SBen Walker                portals.append({'host': ip, 'port': port})
98439e850d1SBen Walker                print("WARNING: Specifying a portal group with a CPU mask is no longer supported. Ignoring it.")
9850f4b3490SPawel Kaminski        rpc.iscsi.iscsi_create_portal_group(
986253c61beSheluwei            args.client,
987253c61beSheluwei            portals=portals,
988253c61beSheluwei            tag=args.tag)
9897e5ec29aSShuhei Matsumoto
9900f4b3490SPawel Kaminski    p = subparsers.add_parser('iscsi_create_portal_group', aliases=['add_portal_group'],
9910f4b3490SPawel Kaminski                              help='Add a portal group')
9924dd3f4a7SBen Walker    p.add_argument(
9934dd3f4a7SBen Walker        'tag', help='Portal group tag (unique, integer > 0)', type=int)
99439e850d1SBen Walker    p.add_argument('portal_list', help="""List of portals in host:port format, separated by whitespace
99539e850d1SBen Walker    Example: '192.168.100.100:3260 192.168.100.100:3261 192.168.100.100:3262""")
9960f4b3490SPawel Kaminski    p.set_defaults(func=iscsi_create_portal_group)
997df897ed4SDaniel Verkamp
99894dd4b9aSPawel Kaminski    def iscsi_create_initiator_group(args):
999253c61beSheluwei        initiators = []
1000253c61beSheluwei        netmasks = []
1001253c61beSheluwei        for i in args.initiator_list.strip().split(' '):
1002253c61beSheluwei            initiators.append(i)
1003253c61beSheluwei        for n in args.netmask_list.strip().split(' '):
1004253c61beSheluwei            netmasks.append(n)
100594dd4b9aSPawel Kaminski        rpc.iscsi.iscsi_create_initiator_group(
1006253c61beSheluwei            args.client,
1007253c61beSheluwei            tag=args.tag,
1008253c61beSheluwei            initiators=initiators,
1009253c61beSheluwei            netmasks=netmasks)
10107e5ec29aSShuhei Matsumoto
101194dd4b9aSPawel Kaminski    p = subparsers.add_parser('iscsi_create_initiator_group', aliases=['add_initiator_group'],
10124dd3f4a7SBen Walker                              help='Add an initiator group')
10134dd3f4a7SBen Walker    p.add_argument(
10144dd3f4a7SBen Walker        'tag', help='Initiator group tag (unique, integer > 0)', type=int)
10154dd3f4a7SBen Walker    p.add_argument('initiator_list', help="""Whitespace-separated list of initiator hostnames or IP addresses,
10164dd3f4a7SBen Walker    enclosed in quotes.  Example: 'ANY' or '127.0.0.1 192.168.200.100'""")
10174dd3f4a7SBen Walker    p.add_argument('netmask_list', help="""Whitespace-separated list of initiator netmasks enclosed in quotes.
10184dd3f4a7SBen Walker    Example: '255.255.0.0 255.248.0.0' etc""")
101994dd4b9aSPawel Kaminski    p.set_defaults(func=iscsi_create_initiator_group)
1020df897ed4SDaniel Verkamp
1021a7d07920SPawel Kaminski    def iscsi_initiator_group_add_initiators(args):
1022253c61beSheluwei        initiators = None
1023253c61beSheluwei        netmasks = None
1024253c61beSheluwei        if args.initiator_list:
1025253c61beSheluwei            initiators = []
1026253c61beSheluwei            for i in args.initiator_list.strip().split(' '):
1027253c61beSheluwei                initiators.append(i)
1028253c61beSheluwei        if args.netmask_list:
1029253c61beSheluwei            netmasks = []
1030253c61beSheluwei            for n in args.netmask_list.strip().split(' '):
1031253c61beSheluwei                netmasks.append(n)
1032a7d07920SPawel Kaminski        rpc.iscsi.iscsi_initiator_group_add_initiators(
1033253c61beSheluwei            args.client,
1034253c61beSheluwei            tag=args.tag,
1035253c61beSheluwei            initiators=initiators,
1036253c61beSheluwei            netmasks=netmasks)
10371e92d78aSBen Walker
1038a7d07920SPawel Kaminski    p = subparsers.add_parser('iscsi_initiator_group_add_initiators',
1039a7d07920SPawel Kaminski                              aliases=['add_initiators_to_initiator_group'],
10402982a74dSShuhei Matsumoto                              help='Add initiators to an existing initiator group')
10412982a74dSShuhei Matsumoto    p.add_argument(
10422982a74dSShuhei Matsumoto        'tag', help='Initiator group tag (unique, integer > 0)', type=int)
10432982a74dSShuhei Matsumoto    p.add_argument('-n', dest='initiator_list', help="""Whitespace-separated list of initiator hostnames or IP addresses,
10442982a74dSShuhei Matsumoto    enclosed in quotes.  This parameter can be omitted.  Example: 'ANY' or '127.0.0.1 192.168.200.100'""", required=False)
10452982a74dSShuhei Matsumoto    p.add_argument('-m', dest='netmask_list', help="""Whitespace-separated list of initiator netmasks enclosed in quotes.
10462982a74dSShuhei Matsumoto    This parameter can be omitted.  Example: '255.255.0.0 255.248.0.0' etc""", required=False)
1047a7d07920SPawel Kaminski    p.set_defaults(func=iscsi_initiator_group_add_initiators)
1048df897ed4SDaniel Verkamp
10490fbba82dSPawel Kaminski    def iscsi_initiator_group_remove_initiators(args):
1050253c61beSheluwei        initiators = None
1051253c61beSheluwei        netmasks = None
1052253c61beSheluwei        if args.initiator_list:
1053253c61beSheluwei            initiators = []
1054253c61beSheluwei            for i in args.initiator_list.strip().split(' '):
1055253c61beSheluwei                initiators.append(i)
1056253c61beSheluwei        if args.netmask_list:
1057253c61beSheluwei            netmasks = []
1058253c61beSheluwei            for n in args.netmask_list.strip().split(' '):
1059253c61beSheluwei                netmasks.append(n)
10600fbba82dSPawel Kaminski        rpc.iscsi.iscsi_initiator_group_remove_initiators(
1061253c61beSheluwei            args.client,
1062253c61beSheluwei            tag=args.tag,
1063253c61beSheluwei            initiators=initiators,
1064253c61beSheluwei            netmasks=netmasks)
10652982a74dSShuhei Matsumoto
10660fbba82dSPawel Kaminski    p = subparsers.add_parser('iscsi_initiator_group_remove_initiators',
10670fbba82dSPawel Kaminski                              aliases=['delete_initiators_from_initiator_group'],
10682982a74dSShuhei Matsumoto                              help='Delete initiators from an existing initiator group')
10692982a74dSShuhei Matsumoto    p.add_argument(
10702982a74dSShuhei Matsumoto        'tag', help='Initiator group tag (unique, integer > 0)', type=int)
10712982a74dSShuhei Matsumoto    p.add_argument('-n', dest='initiator_list', help="""Whitespace-separated list of initiator hostnames or IP addresses,
10722982a74dSShuhei Matsumoto    enclosed in quotes.  This parameter can be omitted.  Example: 'ANY' or '127.0.0.1 192.168.200.100'""", required=False)
10732982a74dSShuhei Matsumoto    p.add_argument('-m', dest='netmask_list', help="""Whitespace-separated list of initiator netmasks enclosed in quotes.
10742982a74dSShuhei Matsumoto    This parameter can be omitted.  Example: '255.255.0.0 255.248.0.0' etc""", required=False)
10750fbba82dSPawel Kaminski    p.set_defaults(func=iscsi_initiator_group_remove_initiators)
1076df897ed4SDaniel Verkamp
1077df897ed4SDaniel Verkamp    def delete_target_node(args):
1078253c61beSheluwei        rpc.iscsi.delete_target_node(
1079253c61beSheluwei            args.client, target_node_name=args.target_node_name)
10802982a74dSShuhei Matsumoto
10814dd3f4a7SBen Walker    p = subparsers.add_parser('delete_target_node',
10824dd3f4a7SBen Walker                              help='Delete a target node')
10834dd3f4a7SBen Walker    p.add_argument('target_node_name',
10844dd3f4a7SBen Walker                   help='Target node name to be deleted. Example: iqn.2016-06.io.spdk:disk1.')
1085df897ed4SDaniel Verkamp    p.set_defaults(func=delete_target_node)
1086df897ed4SDaniel Verkamp
10874bb8a88cSPawel Kaminski    def iscsi_delete_portal_group(args):
10884bb8a88cSPawel Kaminski        rpc.iscsi.iscsi_delete_portal_group(args.client, tag=args.tag)
10891e92d78aSBen Walker
10904bb8a88cSPawel Kaminski    p = subparsers.add_parser('iscsi_delete_portal_group',
10914bb8a88cSPawel Kaminski                              aliases=['delete_portal_group'],
10924dd3f4a7SBen Walker                              help='Delete a portal group')
10934dd3f4a7SBen Walker    p.add_argument(
10944dd3f4a7SBen Walker        'tag', help='Portal group tag (unique, integer > 0)', type=int)
10954bb8a88cSPawel Kaminski    p.set_defaults(func=iscsi_delete_portal_group)
1096df897ed4SDaniel Verkamp
10977eedb271SPawel Kaminski    def iscsi_delete_initiator_group(args):
10987eedb271SPawel Kaminski        rpc.iscsi.iscsi_delete_initiator_group(args.client, tag=args.tag)
10991e92d78aSBen Walker
11007eedb271SPawel Kaminski    p = subparsers.add_parser('iscsi_delete_initiator_group',
11017eedb271SPawel Kaminski                              aliases=['delete_initiator_group'],
11024dd3f4a7SBen Walker                              help='Delete an initiator group')
11034dd3f4a7SBen Walker    p.add_argument(
11044dd3f4a7SBen Walker        'tag', help='Initiator group tag (unique, integer > 0)', type=int)
11057eedb271SPawel Kaminski    p.set_defaults(func=iscsi_delete_initiator_group)
1106df897ed4SDaniel Verkamp
11071aa8e4e5SShuhei Matsumoto    def iscsi_portal_group_set_auth(args):
11081aa8e4e5SShuhei Matsumoto        rpc.iscsi.iscsi_portal_group_set_auth(
11091aa8e4e5SShuhei Matsumoto            args.client,
11101aa8e4e5SShuhei Matsumoto            tag=args.tag,
11111aa8e4e5SShuhei Matsumoto            chap_group=args.chap_group,
11121aa8e4e5SShuhei Matsumoto            disable_chap=args.disable_chap,
11131aa8e4e5SShuhei Matsumoto            require_chap=args.require_chap,
11141aa8e4e5SShuhei Matsumoto            mutual_chap=args.mutual_chap)
11151aa8e4e5SShuhei Matsumoto
11161aa8e4e5SShuhei Matsumoto    p = subparsers.add_parser('iscsi_portal_group_set_auth',
11171aa8e4e5SShuhei Matsumoto                              help='Set CHAP authentication for discovery sessions specific for the portal group')
11181aa8e4e5SShuhei Matsumoto    p.add_argument('tag', help='Portal group tag (unique, integer > 0)', type=int)
11191aa8e4e5SShuhei Matsumoto    p.add_argument('-g', '--chap-group', help="""Authentication group ID for this portal group.
11201aa8e4e5SShuhei Matsumoto    *** Authentication group must be precreated ***""", type=int, default=0)
11211aa8e4e5SShuhei Matsumoto    p.add_argument('-d', '--disable-chap', help="""CHAP authentication should be disabled for this portal group.
11221aa8e4e5SShuhei Matsumoto    *** Mutually exclusive with --require-chap ***""", action='store_true')
11231aa8e4e5SShuhei Matsumoto    p.add_argument('-r', '--require-chap', help="""CHAP authentication should be required for this portal group.
11241aa8e4e5SShuhei Matsumoto    *** Mutually exclusive with --disable-chap ***""", action='store_true')
11251aa8e4e5SShuhei Matsumoto    p.add_argument('-m', '--mutual-chap', help='CHAP authentication should be mutual/bidirectional.',
11261aa8e4e5SShuhei Matsumoto                   action='store_true')
11271aa8e4e5SShuhei Matsumoto    p.set_defaults(func=iscsi_portal_group_set_auth)
11281aa8e4e5SShuhei Matsumoto
11296d779941SPawel Kaminski    def iscsi_get_connections(args):
11306d779941SPawel Kaminski        print_dict(rpc.iscsi.iscsi_get_connections(args.client))
11311887183fSTomasz Zawadzki
11326d779941SPawel Kaminski    p = subparsers.add_parser('iscsi_get_connections', aliases=['get_iscsi_connections'],
11334dd3f4a7SBen Walker                              help='Display iSCSI connections')
11346d779941SPawel Kaminski    p.set_defaults(func=iscsi_get_connections)
1135df897ed4SDaniel Verkamp
113661f4433cSPawel Kaminski    def iscsi_get_options(args):
113761f4433cSPawel Kaminski        print_dict(rpc.iscsi.iscsi_get_options(args.client))
11381887183fSTomasz Zawadzki
113961f4433cSPawel Kaminski    p = subparsers.add_parser('iscsi_get_options', aliases=['get_iscsi_global_params'],
114061f4433cSPawel Kaminski                              help='Display iSCSI global parameters')
114161f4433cSPawel Kaminski    p.set_defaults(func=iscsi_get_options)
1142df897ed4SDaniel Verkamp
1143df897ed4SDaniel Verkamp    def get_scsi_devices(args):
1144253c61beSheluwei        print_dict(rpc.iscsi.get_scsi_devices(args.client))
11451887183fSTomasz Zawadzki
11464dd3f4a7SBen Walker    p = subparsers.add_parser('get_scsi_devices', help='Display SCSI devices')
1147df897ed4SDaniel Verkamp    p.set_defaults(func=get_scsi_devices)
11481887183fSTomasz Zawadzki
1149ae0aae15SLiu Xiaodong    # trace
1150dd29bd7eSPawel Kaminski    def trace_enable_tpoint_group(args):
1151dd29bd7eSPawel Kaminski        rpc.trace.trace_enable_tpoint_group(args.client, name=args.name)
1152ae0aae15SLiu Xiaodong
1153dd29bd7eSPawel Kaminski    p = subparsers.add_parser('trace_enable_tpoint_group', aliases=['enable_tpoint_group'],
1154dd29bd7eSPawel Kaminski                              help='enable trace on a specific tpoint group')
1155ae0aae15SLiu Xiaodong    p.add_argument(
1156ae0aae15SLiu Xiaodong        'name', help="""trace group name we want to enable in tpoint_group_mask.
1157ae0aae15SLiu Xiaodong        (for example "bdev" for bdev trace group, "all" for all trace groups).""")
1158dd29bd7eSPawel Kaminski    p.set_defaults(func=trace_enable_tpoint_group)
1159ae0aae15SLiu Xiaodong
1160*ecca55c9SPawel Kaminski    def trace_disable_tpoint_group(args):
1161*ecca55c9SPawel Kaminski        rpc.trace.trace_disable_tpoint_group(args.client, name=args.name)
1162ae0aae15SLiu Xiaodong
1163*ecca55c9SPawel Kaminski    p = subparsers.add_parser('trace_disable_tpoint_group', aliases=['disable_tpoint_group'],
1164*ecca55c9SPawel Kaminski                              help='disable trace on a specific tpoint group')
1165ae0aae15SLiu Xiaodong    p.add_argument(
1166ae0aae15SLiu Xiaodong        'name', help="""trace group name we want to disable in tpoint_group_mask.
1167ae0aae15SLiu Xiaodong        (for example "bdev" for bdev trace group, "all" for all trace groups).""")
1168*ecca55c9SPawel Kaminski    p.set_defaults(func=trace_disable_tpoint_group)
1169ae0aae15SLiu Xiaodong
1170ae0aae15SLiu Xiaodong    def get_tpoint_group_mask(args):
1171ae0aae15SLiu Xiaodong        print_dict(rpc.trace.get_tpoint_group_mask(args.client))
1172ae0aae15SLiu Xiaodong
1173ae0aae15SLiu Xiaodong    p = subparsers.add_parser('get_tpoint_group_mask', help='get trace point group mask')
1174ae0aae15SLiu Xiaodong    p.set_defaults(func=get_tpoint_group_mask)
1175ae0aae15SLiu Xiaodong
11764dd3f4a7SBen Walker    # log
11778dc50d2dSMaciej Wawryk    def log_set_flag(args):
11788dc50d2dSMaciej Wawryk        rpc.log.log_set_flag(args.client, flag=args.flag)
1179870b0e5bSJim Harris
11808dc50d2dSMaciej Wawryk    p = subparsers.add_parser('log_set_flag', help='set log flag', aliases=['set_log_flag'])
1181870b0e5bSJim Harris    p.add_argument(
1182870b0e5bSJim Harris        'flag', help='log flag we want to set. (for example "nvme").')
11838dc50d2dSMaciej Wawryk    p.set_defaults(func=log_set_flag)
1184870b0e5bSJim Harris
1185b8fffddeSMaciej Wawryk    def log_clear_flag(args):
1186b8fffddeSMaciej Wawryk        rpc.log.log_clear_flag(args.client, flag=args.flag)
1187870b0e5bSJim Harris
1188b8fffddeSMaciej Wawryk    p = subparsers.add_parser('log_clear_flag', help='clear log flag', aliases=['clear_log_flag'])
1189870b0e5bSJim Harris    p.add_argument(
1190870b0e5bSJim Harris        'flag', help='log flag we want to clear. (for example "nvme").')
1191b8fffddeSMaciej Wawryk    p.set_defaults(func=log_clear_flag)
1192870b0e5bSJim Harris
1193416310d5SMaciej Wawryk    def log_get_flags(args):
1194416310d5SMaciej Wawryk        print_dict(rpc.log.log_get_flags(args.client))
1195870b0e5bSJim Harris
1196416310d5SMaciej Wawryk    p = subparsers.add_parser('log_get_flags', help='get log flags', aliases=['get_log_flags'])
1197416310d5SMaciej Wawryk    p.set_defaults(func=log_get_flags)
1198870b0e5bSJim Harris
11992fd47b7dSMaciej Wawryk    def log_set_level(args):
12002fd47b7dSMaciej Wawryk        rpc.log.log_set_level(args.client, level=args.level)
12011887183fSTomasz Zawadzki
12022fd47b7dSMaciej Wawryk    p = subparsers.add_parser('log_set_level', aliases=['set_log_level'],
12032fd47b7dSMaciej Wawryk                              help='set log level')
12044dd3f4a7SBen Walker    p.add_argument('level', help='log level we want to set. (for example "DEBUG").')
12052fd47b7dSMaciej Wawryk    p.set_defaults(func=log_set_level)
1206df897ed4SDaniel Verkamp
1207ba735b42SMaciej Wawryk    def log_get_level(args):
1208ba735b42SMaciej Wawryk        print_dict(rpc.log.log_get_level(args.client))
12091887183fSTomasz Zawadzki
1210ba735b42SMaciej Wawryk    p = subparsers.add_parser('log_get_level', aliases=['get_log_level'],
1211ba735b42SMaciej Wawryk                              help='get log level')
1212ba735b42SMaciej Wawryk    p.set_defaults(func=log_get_level)
1213df897ed4SDaniel Verkamp
121495bfca6cSMaciej Wawryk    def log_set_print_level(args):
121595bfca6cSMaciej Wawryk        rpc.log.log_set_print_level(args.client, level=args.level)
12161887183fSTomasz Zawadzki
121795bfca6cSMaciej Wawryk    p = subparsers.add_parser('log_set_print_level', aliases=['set_log_print_level'],
121895bfca6cSMaciej Wawryk                              help='set log print level')
12194dd3f4a7SBen Walker    p.add_argument('level', help='log print level we want to set. (for example "DEBUG").')
122095bfca6cSMaciej Wawryk    p.set_defaults(func=log_set_print_level)
1221df897ed4SDaniel Verkamp
12227c073fc7SMaciej Wawryk    def log_get_print_level(args):
12237c073fc7SMaciej Wawryk        print_dict(rpc.log.log_get_print_level(args.client))
1224fca11f15SPiotr Pelplinski
12257c073fc7SMaciej Wawryk    p = subparsers.add_parser('log_get_print_level', aliases=['get_log_print_level'],
12267c073fc7SMaciej Wawryk                              help='get log print level')
12277c073fc7SMaciej Wawryk    p.set_defaults(func=log_get_print_level)
1228fca11f15SPiotr Pelplinski
12294dd3f4a7SBen Walker    # lvol
1230de756853SMaciej Wawryk    def bdev_lvol_create_lvstore(args):
1231de756853SMaciej Wawryk        print_json(rpc.lvol.bdev_lvol_create_lvstore(args.client,
12327d45cfc3SDaniel Verkamp                                                     bdev_name=args.bdev_name,
12337d45cfc3SDaniel Verkamp                                                     lvs_name=args.lvs_name,
1234ca87060dSTomasz Zawadzki                                                     cluster_sz=args.cluster_sz,
1235ca87060dSTomasz Zawadzki                                                     clear_method=args.clear_method))
1236df897ed4SDaniel Verkamp
1237de756853SMaciej Wawryk    p = subparsers.add_parser('bdev_lvol_create_lvstore', aliases=['construct_lvol_store'],
1238de756853SMaciej Wawryk                              help='Add logical volume store on base bdev')
1239511adde0SPiotr Pelplinski    p.add_argument('bdev_name', help='base bdev name')
1240511adde0SPiotr Pelplinski    p.add_argument('lvs_name', help='name for lvol store')
12419f6f73d4STomasz Zawadzki    p.add_argument('-c', '--cluster-sz', help='size of cluster (in bytes)', type=int, required=False)
1242ca87060dSTomasz Zawadzki    p.add_argument('--clear-method', help="""Change clear method for data region.
1243ca87060dSTomasz Zawadzki        Available: none, unmap, write_zeroes""", required=False)
1244de756853SMaciej Wawryk    p.set_defaults(func=bdev_lvol_create_lvstore)
1245df897ed4SDaniel Verkamp
124690e4ae5dSMaciej Wawryk    def bdev_lvol_rename_lvstore(args):
124790e4ae5dSMaciej Wawryk        rpc.lvol.bdev_lvol_rename_lvstore(args.client,
12487d45cfc3SDaniel Verkamp                                          old_name=args.old_name,
12497d45cfc3SDaniel Verkamp                                          new_name=args.new_name)
125027f44662STomasz Zawadzki
125190e4ae5dSMaciej Wawryk    p = subparsers.add_parser('bdev_lvol_rename_lvstore', aliases=['rename_lvol_store'],
125290e4ae5dSMaciej Wawryk                              help='Change logical volume store name')
1253f5e590c8SSebastian Basierski    p.add_argument('old_name', help='old name')
1254f5e590c8SSebastian Basierski    p.add_argument('new_name', help='new name')
125590e4ae5dSMaciej Wawryk    p.set_defaults(func=bdev_lvol_rename_lvstore)
1256df897ed4SDaniel Verkamp
1257c57cd922SMaciej Wawryk    def bdev_lvol_create(args):
1258c57cd922SMaciej Wawryk        print_json(rpc.lvol.bdev_lvol_create(args.client,
12597d45cfc3SDaniel Verkamp                                             lvol_name=args.lvol_name,
12607d45cfc3SDaniel Verkamp                                             size=args.size * 1024 * 1024,
12617d45cfc3SDaniel Verkamp                                             thin_provision=args.thin_provision,
1262adb39585SMaciej Szwed                                             clear_method=args.clear_method,
12637d45cfc3SDaniel Verkamp                                             uuid=args.uuid,
12647d45cfc3SDaniel Verkamp                                             lvs_name=args.lvs_name))
1265f5e590c8SSebastian Basierski
1266c57cd922SMaciej Wawryk    p = subparsers.add_parser('bdev_lvol_create', aliases=['construct_lvol_bdev'],
1267c57cd922SMaciej Wawryk                              help='Add a bdev with an logical volume backend')
1268511adde0SPiotr Pelplinski    p.add_argument('-u', '--uuid', help='lvol store UUID', required=False)
12693ac5d089SDaniel Verkamp    p.add_argument('-l', '--lvs-name', help='lvol store name', required=False)
12709ed6beddSMaciej Szwed    p.add_argument('-t', '--thin-provision', action='store_true', help='create lvol bdev as thin provisioned')
1271adb39585SMaciej Szwed    p.add_argument('-c', '--clear-method', help="""Change default data clusters clear method.
1272adb39585SMaciej Szwed        Available: none, unmap, write_zeroes""", required=False)
1273511adde0SPiotr Pelplinski    p.add_argument('lvol_name', help='name for this lvol')
127427f44662STomasz Zawadzki    p.add_argument('size', help='size in MiB for this bdev', type=int)
1275c57cd922SMaciej Wawryk    p.set_defaults(func=bdev_lvol_create)
1276df897ed4SDaniel Verkamp
1277f5cf8ea1SMaciej Wawryk    def bdev_lvol_snapshot(args):
1278f5cf8ea1SMaciej Wawryk        print_json(rpc.lvol.bdev_lvol_snapshot(args.client,
12797d45cfc3SDaniel Verkamp                                               lvol_name=args.lvol_name,
1280160850f0STomasz Zawadzki                                               snapshot_name=args.snapshot_name))
128197934c52STomasz Zawadzki
1282f5cf8ea1SMaciej Wawryk    p = subparsers.add_parser('bdev_lvol_snapshot', aliases=['snapshot_lvol_bdev'],
1283f5cf8ea1SMaciej Wawryk                              help='Create a snapshot of an lvol bdev')
128497934c52STomasz Zawadzki    p.add_argument('lvol_name', help='lvol bdev name')
128597934c52STomasz Zawadzki    p.add_argument('snapshot_name', help='lvol snapshot name')
1286f5cf8ea1SMaciej Wawryk    p.set_defaults(func=bdev_lvol_snapshot)
128797934c52STomasz Zawadzki
1288827b2667SMaciej Wawryk    def bdev_lvol_clone(args):
1289827b2667SMaciej Wawryk        print_json(rpc.lvol.bdev_lvol_clone(args.client,
12907d45cfc3SDaniel Verkamp                                            snapshot_name=args.snapshot_name,
1291160850f0STomasz Zawadzki                                            clone_name=args.clone_name))
129297934c52STomasz Zawadzki
1293827b2667SMaciej Wawryk    p = subparsers.add_parser('bdev_lvol_clone', aliases=['clone_lvol_bdev'],
1294827b2667SMaciej Wawryk                              help='Create a clone of an lvol snapshot')
129597934c52STomasz Zawadzki    p.add_argument('snapshot_name', help='lvol snapshot name')
129697934c52STomasz Zawadzki    p.add_argument('clone_name', help='lvol clone name')
1297827b2667SMaciej Wawryk    p.set_defaults(func=bdev_lvol_clone)
129897934c52STomasz Zawadzki
12990ce883ceSMaciej Wawryk    def bdev_lvol_rename(args):
13000ce883ceSMaciej Wawryk        rpc.lvol.bdev_lvol_rename(args.client,
13017d45cfc3SDaniel Verkamp                                  old_name=args.old_name,
13027d45cfc3SDaniel Verkamp                                  new_name=args.new_name)
130327f44662STomasz Zawadzki
13040ce883ceSMaciej Wawryk    p = subparsers.add_parser('bdev_lvol_rename', aliases=['rename_lvol_bdev'],
13050ce883ceSMaciej Wawryk                              help='Change lvol bdev name')
1306526cd580SSebastian Basierski    p.add_argument('old_name', help='lvol bdev name')
1307526cd580SSebastian Basierski    p.add_argument('new_name', help='new lvol name')
13080ce883ceSMaciej Wawryk    p.set_defaults(func=bdev_lvol_rename)
1309526cd580SSebastian Basierski
13107a294f4cSMaciej Wawryk    def bdev_lvol_inflate(args):
13117a294f4cSMaciej Wawryk        rpc.lvol.bdev_lvol_inflate(args.client,
1312fda8596eSMaciej Szwed                                   name=args.name)
1313fda8596eSMaciej Szwed
13147a294f4cSMaciej Wawryk    p = subparsers.add_parser('bdev_lvol_inflate', aliases=['inflate_lvol_bdev'],
13157a294f4cSMaciej Wawryk                              help='Make thin provisioned lvol a thick provisioned lvol')
1316fda8596eSMaciej Szwed    p.add_argument('name', help='lvol bdev name')
13177a294f4cSMaciej Wawryk    p.set_defaults(func=bdev_lvol_inflate)
1318fda8596eSMaciej Szwed
1319975efa2aSMaciej Wawryk    def bdev_lvol_decouple_parent(args):
1320975efa2aSMaciej Wawryk        rpc.lvol.bdev_lvol_decouple_parent(args.client,
1321635a1aa8STomasz Kulasek                                           name=args.name)
1322635a1aa8STomasz Kulasek
1323975efa2aSMaciej Wawryk    p = subparsers.add_parser('bdev_lvol_decouple_parent', aliases=['decouple_parent_lvol_bdev'],
1324975efa2aSMaciej Wawryk                              help='Decouple parent of lvol')
1325635a1aa8STomasz Kulasek    p.add_argument('name', help='lvol bdev name')
1326975efa2aSMaciej Wawryk    p.set_defaults(func=bdev_lvol_decouple_parent)
1327635a1aa8STomasz Kulasek
1328c2d85bb2SMaciej Wawryk    def bdev_lvol_resize(args):
1329c2d85bb2SMaciej Wawryk        rpc.lvol.bdev_lvol_resize(args.client,
13307d45cfc3SDaniel Verkamp                                  name=args.name,
13317d45cfc3SDaniel Verkamp                                  size=args.size * 1024 * 1024)
13327552707eSSlawomir Mrozowicz
1333c2d85bb2SMaciej Wawryk    p = subparsers.add_parser('bdev_lvol_resize', aliases=['resize_lvol_bdev'],
1334c2d85bb2SMaciej Wawryk                              help='Resize existing lvol bdev')
13357552707eSSlawomir Mrozowicz    p.add_argument('name', help='lvol bdev name')
13367552707eSSlawomir Mrozowicz    p.add_argument('size', help='new size in MiB for this bdev', type=int)
1337c2d85bb2SMaciej Wawryk    p.set_defaults(func=bdev_lvol_resize)
1338df897ed4SDaniel Verkamp
1339b7ad0bd0SMaciej Wawryk    def bdev_lvol_set_read_only(args):
1340b7ad0bd0SMaciej Wawryk        rpc.lvol.bdev_lvol_set_read_only(args.client,
13413bb815aeSTomasz Zawadzki                                         name=args.name)
13423bb815aeSTomasz Zawadzki
1343b7ad0bd0SMaciej Wawryk    p = subparsers.add_parser('bdev_lvol_set_read_only', aliases=['set_read_only_lvol_bdev'],
1344b7ad0bd0SMaciej Wawryk                              help='Mark lvol bdev as read only')
13453bb815aeSTomasz Zawadzki    p.add_argument('name', help='lvol bdev name')
1346b7ad0bd0SMaciej Wawryk    p.set_defaults(func=bdev_lvol_set_read_only)
13473bb815aeSTomasz Zawadzki
1348b5fdf4ecSMaciej Wawryk    def bdev_lvol_delete(args):
1349b5fdf4ecSMaciej Wawryk        rpc.lvol.bdev_lvol_delete(args.client,
1350f9d52c9eSDaniel Verkamp                                  name=args.name)
1351f9d52c9eSDaniel Verkamp
1352b5fdf4ecSMaciej Wawryk    p = subparsers.add_parser('bdev_lvol_delete', aliases=['destroy_lvol_bdev'],
1353b5fdf4ecSMaciej Wawryk                              help='Destroy a logical volume')
1354f9d52c9eSDaniel Verkamp    p.add_argument('name', help='lvol bdev name')
1355b5fdf4ecSMaciej Wawryk    p.set_defaults(func=bdev_lvol_delete)
1356f9d52c9eSDaniel Verkamp
13574c049618SMaciej Wawryk    def bdev_lvol_delete_lvstore(args):
13584c049618SMaciej Wawryk        rpc.lvol.bdev_lvol_delete_lvstore(args.client,
13597d45cfc3SDaniel Verkamp                                          uuid=args.uuid,
13607d45cfc3SDaniel Verkamp                                          lvs_name=args.lvs_name)
136127f44662STomasz Zawadzki
13624c049618SMaciej Wawryk    p = subparsers.add_parser('bdev_lvol_delete_lvstore', aliases=['destroy_lvol_store'],
13634c049618SMaciej Wawryk                              help='Destroy an logical volume store')
1364511adde0SPiotr Pelplinski    p.add_argument('-u', '--uuid', help='lvol store UUID', required=False)
13653ac5d089SDaniel Verkamp    p.add_argument('-l', '--lvs-name', help='lvol store name', required=False)
13664c049618SMaciej Wawryk    p.set_defaults(func=bdev_lvol_delete_lvstore)
1367df897ed4SDaniel Verkamp
13680b3f378fSMaciej Wawryk    def bdev_lvol_get_lvstores(args):
13690b3f378fSMaciej Wawryk        print_dict(rpc.lvol.bdev_lvol_get_lvstores(args.client,
13707d45cfc3SDaniel Verkamp                                                   uuid=args.uuid,
13717d45cfc3SDaniel Verkamp                                                   lvs_name=args.lvs_name))
1372e21aede9STomasz Zawadzki
13730b3f378fSMaciej Wawryk    p = subparsers.add_parser('bdev_lvol_get_lvstores', aliases=['get_lvol_stores'],
13740b3f378fSMaciej Wawryk                              help='Display current logical volume store list')
13759856fe06STomasz Zawadzki    p.add_argument('-u', '--uuid', help='lvol store UUID', required=False)
13763ac5d089SDaniel Verkamp    p.add_argument('-l', '--lvs-name', help='lvol store name', required=False)
13770b3f378fSMaciej Wawryk    p.set_defaults(func=bdev_lvol_get_lvstores)
1378e21aede9STomasz Zawadzki
1379b9477173SMaciej Wawryk    def bdev_raid_get_bdevs(args):
1380b9477173SMaciej Wawryk        print_array(rpc.bdev.bdev_raid_get_bdevs(args.client,
138141586b0fSKunal Sablok                                                 category=args.category))
138241586b0fSKunal Sablok
1383b9477173SMaciej Wawryk    p = subparsers.add_parser('bdev_raid_get_bdevs', aliases=['get_raid_bdevs'],
1384b9477173SMaciej Wawryk                              help="""This is used to list all the raid bdev names based on the input category
138541586b0fSKunal Sablok    requested. Category should be one of 'all', 'online', 'configuring' or 'offline'. 'all' means all the raid bdevs whether
138641586b0fSKunal Sablok    they are online or configuring or offline. 'online' is the raid bdev which is registered with bdev layer. 'configuring'
138741586b0fSKunal Sablok    is the raid bdev which does not have full configuration discovered yet. 'offline' is the raid bdev which is not registered
138841586b0fSKunal Sablok    with bdev as of now and it has encountered any error or user has requested to offline the raid bdev""")
138941586b0fSKunal Sablok    p.add_argument('category', help='all or online or configuring or offline')
1390b9477173SMaciej Wawryk    p.set_defaults(func=bdev_raid_get_bdevs)
139141586b0fSKunal Sablok
1392f0731534SMaciej Wawryk    def bdev_raid_create(args):
139341586b0fSKunal Sablok        base_bdevs = []
139441586b0fSKunal Sablok        for u in args.base_bdevs.strip().split(" "):
139541586b0fSKunal Sablok            base_bdevs.append(u)
139641586b0fSKunal Sablok
1397f0731534SMaciej Wawryk        rpc.bdev.bdev_raid_create(args.client,
139841586b0fSKunal Sablok                                  name=args.name,
139941586b0fSKunal Sablok                                  strip_size=args.strip_size,
14008a1acca6Spaul luse                                  strip_size_kb=args.strip_size_kb,
140141586b0fSKunal Sablok                                  raid_level=args.raid_level,
140241586b0fSKunal Sablok                                  base_bdevs=base_bdevs)
1403f0731534SMaciej Wawryk    p = subparsers.add_parser('bdev_raid_create', aliases=['construct_raid_bdev'],
1404f0731534SMaciej Wawryk                              help='Create new raid bdev')
140541586b0fSKunal Sablok    p.add_argument('-n', '--name', help='raid bdev name', required=True)
14068a1acca6Spaul luse    p.add_argument('-s', '--strip-size', help='strip size in KB (deprecated)', type=int)
14078a1acca6Spaul luse    p.add_argument('-z', '--strip-size_kb', help='strip size in KB', type=int)
140841586b0fSKunal Sablok    p.add_argument('-r', '--raid-level', help='raid level, only raid level 0 is supported', type=int, required=True)
140941586b0fSKunal Sablok    p.add_argument('-b', '--base-bdevs', help='base bdevs name, whitespace separated list in quotes', required=True)
1410f0731534SMaciej Wawryk    p.set_defaults(func=bdev_raid_create)
141141586b0fSKunal Sablok
141227d8ca2cSMaciej Wawryk    def bdev_raid_delete(args):
141327d8ca2cSMaciej Wawryk        rpc.bdev.bdev_raid_delete(args.client,
141441586b0fSKunal Sablok                                  name=args.name)
141527d8ca2cSMaciej Wawryk    p = subparsers.add_parser('bdev_raid_delete', aliases=['destroy_raid_bdev'],
141627d8ca2cSMaciej Wawryk                              help='Delete existing raid bdev')
141741586b0fSKunal Sablok    p.add_argument('name', help='raid bdev name')
141827d8ca2cSMaciej Wawryk    p.set_defaults(func=bdev_raid_delete)
141941586b0fSKunal Sablok
1420a5dbccf0SPawel Wodkowski    # split
1421a1bda4e1SMaciej Wawryk    def bdev_split_create(args):
1422a1bda4e1SMaciej Wawryk        print_array(rpc.bdev.bdev_split_create(args.client,
14231ea97654SDaniel Verkamp                                               base_bdev=args.base_bdev,
14241ea97654SDaniel Verkamp                                               split_count=args.split_count,
14251ea97654SDaniel Verkamp                                               split_size_mb=args.split_size_mb))
1426a5dbccf0SPawel Wodkowski
1427a1bda4e1SMaciej Wawryk    p = subparsers.add_parser('bdev_split_create', aliases=['construct_split_vbdev'],
1428a1bda4e1SMaciej Wawryk                              help="""Add given disk name to split config. If bdev with base_name
1429a5dbccf0SPawel Wodkowski    name exist the split bdevs will be created right away, if not split bdevs will be created when base bdev became
1430a5dbccf0SPawel Wodkowski    available (during examination process).""")
1431a5dbccf0SPawel Wodkowski    p.add_argument('base_bdev', help='base bdev name')
14323ac5d089SDaniel Verkamp    p.add_argument('-s', '--split-size-mb', help='size in MiB for each bdev', type=int, default=0)
1433a5dbccf0SPawel Wodkowski    p.add_argument('split_count', help="""Optional - number of split bdevs to create. Total size * split_count must not
1434a5dbccf0SPawel Wodkowski    exceed the base bdev size.""", type=int)
1435a1bda4e1SMaciej Wawryk    p.set_defaults(func=bdev_split_create)
1436a5dbccf0SPawel Wodkowski
14377df830a8SMaciej Wawryk    def bdev_split_delete(args):
14387df830a8SMaciej Wawryk        rpc.bdev.bdev_split_delete(args.client,
14391ea97654SDaniel Verkamp                                   base_bdev=args.base_bdev)
1440a5dbccf0SPawel Wodkowski
14417df830a8SMaciej Wawryk    p = subparsers.add_parser('bdev_split_delete', aliases=['destruct_split_vbdev'],
14427df830a8SMaciej Wawryk                              help="""Delete split config with all created splits.""")
1443a5dbccf0SPawel Wodkowski    p.add_argument('base_bdev', help='base bdev name')
14447df830a8SMaciej Wawryk    p.set_defaults(func=bdev_split_delete)
1445a5dbccf0SPawel Wodkowski
14467c233adeSWojciech Malikowski    # ftl
1447cd115ecfSMateusz Kozlowski    ftl_valid_limits = ('crit', 'high', 'low', 'start')
1448cd115ecfSMateusz Kozlowski
1449ee3403b5SPawel Kaminski    def bdev_ftl_create(args):
1450cd115ecfSMateusz Kozlowski        def parse_limits(limits, arg_dict, key_suffix=''):
1451cd115ecfSMateusz Kozlowski            for limit in limits.split(','):
1452cd115ecfSMateusz Kozlowski                key, value = limit.split(':', 1)
1453cd115ecfSMateusz Kozlowski                if key in ftl_valid_limits:
1454cd115ecfSMateusz Kozlowski                    arg_dict['limit_' + key + key_suffix] = int(value)
1455cd115ecfSMateusz Kozlowski                else:
1456cd115ecfSMateusz Kozlowski                    raise ValueError('Limit {} is not supported'.format(key))
1457cd115ecfSMateusz Kozlowski
1458cd115ecfSMateusz Kozlowski        arg_limits = {}
1459cd115ecfSMateusz Kozlowski        if args.limit_threshold:
1460cd115ecfSMateusz Kozlowski            parse_limits(args.limit_threshold, arg_limits, '_threshold')
1461cd115ecfSMateusz Kozlowski
1462cd115ecfSMateusz Kozlowski        if args.limit:
1463cd115ecfSMateusz Kozlowski            parse_limits(args.limit, arg_limits)
1464cd115ecfSMateusz Kozlowski
1465ee3403b5SPawel Kaminski        print_dict(rpc.bdev.bdev_ftl_create(args.client,
14667c233adeSWojciech Malikowski                                            name=args.name,
14677c233adeSWojciech Malikowski                                            trtype=args.trtype,
14687c233adeSWojciech Malikowski                                            traddr=args.traddr,
14697c233adeSWojciech Malikowski                                            punits=args.punits,
1470a0cb5e9dSKonrad Sztyber                                            uuid=args.uuid,
147142fe2e9bSMateusz Kozlowski                                            cache=args.cache,
1472cd115ecfSMateusz Kozlowski                                            allow_open_bands=args.allow_open_bands,
1473cd115ecfSMateusz Kozlowski                                            overprovisioning=args.overprovisioning,
1474cd115ecfSMateusz Kozlowski                                            **arg_limits))
14757c233adeSWojciech Malikowski
1476ee3403b5SPawel Kaminski    p = subparsers.add_parser('bdev_ftl_create', aliases=['construct_ftl_bdev'],
14777c233adeSWojciech Malikowski                              help='Add FTL bdev')
14787c233adeSWojciech Malikowski    p.add_argument('-b', '--name', help="Name of the bdev", required=True)
14797c233adeSWojciech Malikowski    p.add_argument('-t', '--trtype',
14807c233adeSWojciech Malikowski                   help='NVMe target trtype: e.g., pcie', default='pcie')
14817c233adeSWojciech Malikowski    p.add_argument('-a', '--traddr',
14827c233adeSWojciech Malikowski                   help='NVMe target address: e.g., an ip address or BDF', required=True)
14837c233adeSWojciech Malikowski    p.add_argument('-l', '--punits', help='Parallel unit range in the form of start-end: e.g. 4-8',
14847c233adeSWojciech Malikowski                   required=True)
14857c233adeSWojciech Malikowski    p.add_argument('-u', '--uuid', help='UUID of restored bdev (not applicable when creating new '
14867c233adeSWojciech Malikowski                   'instance): e.g. b286d19a-0059-4709-abcd-9f7732b1567d (optional)')
1487a0cb5e9dSKonrad Sztyber    p.add_argument('-c', '--cache', help='Name of the bdev to be used as a write buffer cache (optional)')
148842fe2e9bSMateusz Kozlowski    p.add_argument('-o', '--allow_open_bands', help='Restoring after dirty shutdown without cache will'
148942fe2e9bSMateusz Kozlowski                   ' result in partial data recovery, instead of error', action='store_true')
1490cd115ecfSMateusz Kozlowski    p.add_argument('--overprovisioning', help='Percentage of device used for relocation, not exposed'
1491cd115ecfSMateusz Kozlowski                   ' to user (optional)', type=int)
1492cd115ecfSMateusz Kozlowski
1493cd115ecfSMateusz Kozlowski    limits = p.add_argument_group('Defrag limits', 'Configures defrag limits and thresholds for'
1494cd115ecfSMateusz Kozlowski                                  ' levels ' + str(ftl_valid_limits)[1:-1])
1495cd115ecfSMateusz Kozlowski    limits.add_argument('--limit', help='Percentage of allowed user versus internal writes at given'
1496cd115ecfSMateusz Kozlowski                        ' levels, e.g. crit:0,high:20,low:80')
1497cd115ecfSMateusz Kozlowski    limits.add_argument('--limit-threshold', help='Number of free bands triggering a given level of'
1498cd115ecfSMateusz Kozlowski                        ' write limiting e.g. crit:1,high:2,low:3,start:4')
1499ee3403b5SPawel Kaminski    p.set_defaults(func=bdev_ftl_create)
15007c233adeSWojciech Malikowski
1501ee3403b5SPawel Kaminski    def bdev_ftl_delete(args):
1502ee3403b5SPawel Kaminski        print_dict(rpc.bdev.bdev_ftl_delete(args.client, name=args.name))
15037c233adeSWojciech Malikowski
1504ee3403b5SPawel Kaminski    p = subparsers.add_parser('bdev_ftl_delete', aliases=['delete_ftl_bdev'],
1505ee3403b5SPawel Kaminski                              help='Delete FTL bdev')
15067c233adeSWojciech Malikowski    p.add_argument('-b', '--name', help="Name of the bdev", required=True)
1507ee3403b5SPawel Kaminski    p.set_defaults(func=bdev_ftl_delete)
15087c233adeSWojciech Malikowski
1509825ae66bSWojciech Malikowski    # vmd
1510825ae66bSWojciech Malikowski    def enable_vmd(args):
1511825ae66bSWojciech Malikowski        print_dict(rpc.vmd.enable_vmd(args.client))
1512825ae66bSWojciech Malikowski
1513825ae66bSWojciech Malikowski    p = subparsers.add_parser('enable_vmd', help='Enable VMD enumeration')
1514825ae66bSWojciech Malikowski    p.set_defaults(func=enable_vmd)
1515825ae66bSWojciech Malikowski
15164dd3f4a7SBen Walker    # nbd
15170a993323SPawel Kaminski    def nbd_start_disk(args):
15180a993323SPawel Kaminski        print(rpc.nbd.nbd_start_disk(args.client,
151985f316b1SDaniel Verkamp                                     bdev_name=args.bdev_name,
15205eb33f0aSDaniel Verkamp                                     nbd_device=args.nbd_device))
1521df897ed4SDaniel Verkamp
15220a993323SPawel Kaminski    p = subparsers.add_parser('nbd_start_disk', aliases=['start_nbd_disk'],
1523793d34e5Spaul luse                              help='Export a bdev as an nbd disk')
15244dd3f4a7SBen Walker    p.add_argument('bdev_name', help='Blockdev name to be exported. Example: Malloc0.')
1525efdd6edbSXiaodong Liu    p.add_argument('nbd_device', help='Nbd device name to be assigned. Example: /dev/nbd0.', nargs='?')
15260a993323SPawel Kaminski    p.set_defaults(func=nbd_start_disk)
1527df897ed4SDaniel Verkamp
1528d242f5a0SPawel Kaminski    def nbd_stop_disk(args):
1529d242f5a0SPawel Kaminski        rpc.nbd.nbd_stop_disk(args.client,
153085f316b1SDaniel Verkamp                              nbd_device=args.nbd_device)
1531e21aede9STomasz Zawadzki
1532d242f5a0SPawel Kaminski    p = subparsers.add_parser('nbd_stop_disk', aliases=['stop_nbd_disk'],
1533793d34e5Spaul luse                              help='Stop an nbd disk')
15344dd3f4a7SBen Walker    p.add_argument('nbd_device', help='Nbd device name to be stopped. Example: /dev/nbd0.')
1535d242f5a0SPawel Kaminski    p.set_defaults(func=nbd_stop_disk)
1536df897ed4SDaniel Verkamp
15375456a430SPawel Kaminski    def nbd_get_disks(args):
15385456a430SPawel Kaminski        print_dict(rpc.nbd.nbd_get_disks(args.client,
153985f316b1SDaniel Verkamp                                         nbd_device=args.nbd_device))
15401e92d78aSBen Walker
15415456a430SPawel Kaminski    p = subparsers.add_parser('nbd_get_disks', aliases=['get_nbd_disks'],
15425456a430SPawel Kaminski                              help='Display full or specified nbd device list')
15433ac5d089SDaniel Verkamp    p.add_argument('-n', '--nbd-device', help="Path of the nbd device. Example: /dev/nbd0", required=False)
15445456a430SPawel Kaminski    p.set_defaults(func=nbd_get_disks)
15451e92d78aSBen Walker
15464dd3f4a7SBen Walker    # net
1547b72455c8SPawel Kaminski    def net_interface_add_ip_address(args):
1548b72455c8SPawel Kaminski        rpc.net.net_interface_add_ip_address(args.client, ifc_index=args.ifc_index, ip_addr=args.ip_addr)
1549df897ed4SDaniel Verkamp
1550b72455c8SPawel Kaminski    p = subparsers.add_parser('net_interface_add_ip_address', aliases=['add_ip_address'],
1551b72455c8SPawel Kaminski                              help='Add IP address')
15521e92d78aSBen Walker    p.add_argument('ifc_index', help='ifc index of the nic device.', type=int)
15531e92d78aSBen Walker    p.add_argument('ip_addr', help='ip address will be added.')
1554b72455c8SPawel Kaminski    p.set_defaults(func=net_interface_add_ip_address)
1555df897ed4SDaniel Verkamp
155689bb6b0eSPawel Kaminski    def net_interface_delete_ip_address(args):
155789bb6b0eSPawel Kaminski        rpc.net.net_interface_delete_ip_address(args.client, ifc_index=args.ifc_index, ip_addr=args.ip_addr)
15581e92d78aSBen Walker
155989bb6b0eSPawel Kaminski    p = subparsers.add_parser('net_interface_delete_ip_address', aliases=['delete_ip_address'],
156089bb6b0eSPawel Kaminski                              help='Delete IP address')
15611e92d78aSBen Walker    p.add_argument('ifc_index', help='ifc index of the nic device.', type=int)
15621e92d78aSBen Walker    p.add_argument('ip_addr', help='ip address will be deleted.')
156389bb6b0eSPawel Kaminski    p.set_defaults(func=net_interface_delete_ip_address)
1564df897ed4SDaniel Verkamp
15654d62a7ccSPawel Kaminski    def net_get_interfaces(args):
15664d62a7ccSPawel Kaminski        print_dict(rpc.net.net_get_interfaces(args.client))
15671e92d78aSBen Walker
15684dd3f4a7SBen Walker    p = subparsers.add_parser(
15694d62a7ccSPawel Kaminski        'net_get_interfaces', aliases=['get_interfaces'], help='Display current interface list')
15704d62a7ccSPawel Kaminski    p.set_defaults(func=net_get_interfaces)
15711e92d78aSBen Walker
15724dd3f4a7SBen Walker    # NVMe-oF
1573a1a8585cSMaciej Wawryk    def nvmf_set_max_subsystems(args):
1574a1a8585cSMaciej Wawryk        rpc.nvmf.nvmf_set_max_subsystems(args.client,
1575962ba4e8SSeth Howell                                         max_subsystems=args.max_subsystems)
1576962ba4e8SSeth Howell
1577a1a8585cSMaciej Wawryk    p = subparsers.add_parser('nvmf_set_max_subsystems', aliases=['set_nvmf_target_max_subsystems'],
1578a1a8585cSMaciej Wawryk                              help='Set the maximum number of NVMf target subsystems')
1579962ba4e8SSeth Howell    p.add_argument('-x', '--max-subsystems', help='Max number of NVMf subsystems', type=int, required=True)
1580a1a8585cSMaciej Wawryk    p.set_defaults(func=nvmf_set_max_subsystems)
1581962ba4e8SSeth Howell
158293d6b7beSMaciej Wawryk    def nvmf_set_config(args):
158393d6b7beSMaciej Wawryk        rpc.nvmf.nvmf_set_config(args.client,
15841f3f1605SAvinash M N                                 acceptor_poll_rate=args.acceptor_poll_rate,
15851f3f1605SAvinash M N                                 conn_sched=args.conn_sched)
158646a3d50bSShuhei Matsumoto
158793d6b7beSMaciej Wawryk    p = subparsers.add_parser('nvmf_set_config', aliases=['set_nvmf_target_config'],
158893d6b7beSMaciej Wawryk                              help='Set NVMf target config')
15895d645299SShuhei Matsumoto    p.add_argument('-r', '--acceptor-poll-rate', help='Polling interval of the acceptor for incoming connections (usec)', type=int)
15901f3f1605SAvinash M N    p.add_argument('-s', '--conn-sched', help="""'roundrobin' - Schedule the incoming connections from any host
15911f3f1605SAvinash M N    on the cores in a round robin manner (Default). 'hostip' - Schedule all the incoming connections from a
15921f3f1605SAvinash M N    specific host IP on to the same core. Connections from different IP will be assigned to cores in a round
15934739f623SZiye Yang    robin manner. 'transport' - Schedule the connection according to the transport characteristics.""")
159493d6b7beSMaciej Wawryk    p.set_defaults(func=nvmf_set_config)
159546a3d50bSShuhei Matsumoto
1596183d81d0SJohn Barnard    def nvmf_create_transport(args):
1597183d81d0SJohn Barnard        rpc.nvmf.nvmf_create_transport(args.client,
1598183d81d0SJohn Barnard                                       trtype=args.trtype,
1599f8433aadSSeth Howell                                       tgt_name=args.tgt_name,
1600183d81d0SJohn Barnard                                       max_queue_depth=args.max_queue_depth,
1601183d81d0SJohn Barnard                                       max_qpairs_per_ctrlr=args.max_qpairs_per_ctrlr,
1602183d81d0SJohn Barnard                                       in_capsule_data_size=args.in_capsule_data_size,
1603183d81d0SJohn Barnard                                       max_io_size=args.max_io_size,
1604183d81d0SJohn Barnard                                       io_unit_size=args.io_unit_size,
160558f16244SZiye Yang                                       max_aq_depth=args.max_aq_depth,
16062740f268SSeth Howell                                       num_shared_buffers=args.num_shared_buffers,
1607ed0b611fSEvgeniy Kochetov                                       buf_cache_size=args.buf_cache_size,
1608350e429aSSeth Howell                                       max_srq_depth=args.max_srq_depth,
16096629202cSOr Gerlitz                                       no_srq=args.no_srq,
1610390cffb6SShuhei Matsumoto                                       c2h_success=args.c2h_success,
16116ad6a113SZiye Yang                                       dif_insert_or_strip=args.dif_insert_or_strip,
16126ad6a113SZiye Yang                                       sock_priority=args.sock_priority)
1613183d81d0SJohn Barnard
1614183d81d0SJohn Barnard    p = subparsers.add_parser('nvmf_create_transport', help='Create NVMf transport')
1615183d81d0SJohn Barnard    p.add_argument('-t', '--trtype', help='Transport type (ex. RDMA)', type=str, required=True)
1616f8433aadSSeth Howell    p.add_argument('-g', '--tgt_name', help='The name of the parent NVMe-oF target (optional)', type=str)
1617183d81d0SJohn Barnard    p.add_argument('-q', '--max-queue-depth', help='Max number of outstanding I/O per queue', type=int)
1618183d81d0SJohn Barnard    p.add_argument('-p', '--max-qpairs-per-ctrlr', help='Max number of SQ and CQ per controller', type=int)
1619183d81d0SJohn Barnard    p.add_argument('-c', '--in-capsule-data-size', help='Max number of in-capsule data size', type=int)
1620183d81d0SJohn Barnard    p.add_argument('-i', '--max-io-size', help='Max I/O size (bytes)', type=int)
1621183d81d0SJohn Barnard    p.add_argument('-u', '--io-unit-size', help='I/O unit size (bytes)', type=int)
1622183d81d0SJohn Barnard    p.add_argument('-a', '--max-aq-depth', help='Max number of admin cmds per AQ', type=int)
162358f16244SZiye Yang    p.add_argument('-n', '--num-shared-buffers', help='The number of pooled data buffers available to the transport', type=int)
1624ad272579SBen Walker    p.add_argument('-b', '--buf-cache-size', help='The number of shared buffers to reserve for each poll group', type=int)
1625ed0b611fSEvgeniy Kochetov    p.add_argument('-s', '--max-srq-depth', help='Max number of outstanding I/O per SRQ. Relevant only for RDMA transport', type=int)
1626350e429aSSeth Howell    p.add_argument('-r', '--no-srq', action='store_true', help='Disable per-thread shared receive queue. Relevant only for RDMA transport')
1627e2c0d9a2SSeth Howell    p.add_argument('-o', '--c2h-success', action='store_false', help='Disable C2H success optimization. Relevant only for TCP transport')
1628390cffb6SShuhei Matsumoto    p.add_argument('-f', '--dif-insert-or-strip', action='store_true', help='Enable DIF insert/strip. Relevant only for TCP transport')
16296ad6a113SZiye Yang    p.add_argument('-y', '--sock-priority', help='The sock priority of the tcp connection. Relevant only for TCP transport', type=int)
1630183d81d0SJohn Barnard    p.set_defaults(func=nvmf_create_transport)
1631183d81d0SJohn Barnard
16320772af4dSMaciej Wawryk    def nvmf_get_transports(args):
16330772af4dSMaciej Wawryk        print_dict(rpc.nvmf.nvmf_get_transports(args.client, tgt_name=args.tgt_name))
1634c89b7bacSSeth Howell
16350772af4dSMaciej Wawryk    p = subparsers.add_parser('nvmf_get_transports', aliases=['get_nvmf_transports'],
1636c89b7bacSSeth Howell                              help='Display nvmf transports')
1637f8433aadSSeth Howell    p.add_argument('-t', '--tgt_name', help='The name of the parent NVMe-oF target (optional)', type=str)
16380772af4dSMaciej Wawryk    p.set_defaults(func=nvmf_get_transports)
1639c89b7bacSSeth Howell
164080a0c5beSMaciej Wawryk    def nvmf_get_subsystems(args):
164180a0c5beSMaciej Wawryk        print_dict(rpc.nvmf.nvmf_get_subsystems(args.client, tgt_name=args.tgt_name))
1642df897ed4SDaniel Verkamp
164380a0c5beSMaciej Wawryk    p = subparsers.add_parser('nvmf_get_subsystems', aliases=['get_nvmf_subsystems'],
16444dd3f4a7SBen Walker                              help='Display nvmf subsystems')
1645f8433aadSSeth Howell    p.add_argument('-t', '--tgt_name', help='The name of the parent NVMe-oF target (optional)', type=str)
164680a0c5beSMaciej Wawryk    p.set_defaults(func=nvmf_get_subsystems)
1647df897ed4SDaniel Verkamp
16487538af70SMaciej Wawryk    def nvmf_create_subsystem(args):
16497538af70SMaciej Wawryk        rpc.nvmf.nvmf_create_subsystem(args.client,
1650aedac1a8SBen Walker                                       nqn=args.nqn,
1651f8433aadSSeth Howell                                       tgt_name=args.tgt_name,
1652aedac1a8SBen Walker                                       serial_number=args.serial_number,
165314032a98SGregory Shapiro                                       model_number=args.model_number,
1654aedac1a8SBen Walker                                       allow_any_host=args.allow_any_host,
1655aedac1a8SBen Walker                                       max_namespaces=args.max_namespaces)
1656aedac1a8SBen Walker
16577538af70SMaciej Wawryk    p = subparsers.add_parser('nvmf_create_subsystem', aliases=['nvmf_subsystem_create'],
16587538af70SMaciej Wawryk                              help='Create an NVMe-oF subsystem')
1659aedac1a8SBen Walker    p.add_argument('nqn', help='Subsystem NQN (ASCII)')
1660f8433aadSSeth Howell    p.add_argument('-t', '--tgt_name', help='The name of the parent NVMe-oF target (optional)', type=str)
1661aedac1a8SBen Walker    p.add_argument("-s", "--serial-number", help="""
1662aedac1a8SBen Walker    Format:  'sn' etc
16632eacfd87SBen Walker    Example: 'SPDK00000000000001'""", default='00000000000000000000')
166414032a98SGregory Shapiro    p.add_argument("-d", "--model-number", help="""
166514032a98SGregory Shapiro    Format:  'mn' etc
166614032a98SGregory Shapiro    Example: 'SPDK Controller'""", default='SPDK bdev Controller')
1667aedac1a8SBen Walker    p.add_argument("-a", "--allow-any-host", action='store_true', help="Allow any host to connect (don't enforce host NQN whitelist)")
1668aedac1a8SBen Walker    p.add_argument("-m", "--max-namespaces", help="Maximum number of namespaces allowed",
1669aedac1a8SBen Walker                   type=int, default=0)
16707538af70SMaciej Wawryk    p.set_defaults(func=nvmf_create_subsystem)
1671aedac1a8SBen Walker
167219baaa9aSMaciej Wawryk    def nvmf_delete_subsystem(args):
167319baaa9aSMaciej Wawryk        rpc.nvmf.nvmf_delete_subsystem(args.client,
1674f8433aadSSeth Howell                                       nqn=args.subsystem_nqn,
1675f8433aadSSeth Howell                                       tgt_name=args.tgt_name)
1676d20b90b2SCunyin Chang
167719baaa9aSMaciej Wawryk    p = subparsers.add_parser('nvmf_delete_subsystem', aliases=['delete_nvmf_subsystem'],
16784dd3f4a7SBen Walker                              help='Delete a nvmf subsystem')
16794dd3f4a7SBen Walker    p.add_argument('subsystem_nqn',
16804dd3f4a7SBen Walker                   help='subsystem nqn to be deleted. Example: nqn.2016-06.io.spdk:cnode1.')
1681f8433aadSSeth Howell    p.add_argument('-t', '--tgt_name', help='The name of the parent NVMe-oF target (optional)', type=str)
168219baaa9aSMaciej Wawryk    p.set_defaults(func=nvmf_delete_subsystem)
1683df897ed4SDaniel Verkamp
1684df897ed4SDaniel Verkamp    def nvmf_subsystem_add_listener(args):
1685aceeb8cdSheluwei        rpc.nvmf.nvmf_subsystem_add_listener(args.client,
1686aceeb8cdSheluwei                                             nqn=args.nqn,
1687aceeb8cdSheluwei                                             trtype=args.trtype,
1688aceeb8cdSheluwei                                             traddr=args.traddr,
1689f8433aadSSeth Howell                                             tgt_name=args.tgt_name,
1690aceeb8cdSheluwei                                             adrfam=args.adrfam,
1691aceeb8cdSheluwei                                             trsvcid=args.trsvcid)
1692d20b90b2SCunyin Chang
16936336217eSBen Walker    p = subparsers.add_parser('nvmf_subsystem_add_listener', help='Add a listener to an NVMe-oF subsystem')
16946336217eSBen Walker    p.add_argument('nqn', help='NVMe-oF subsystem NQN')
16956336217eSBen Walker    p.add_argument('-t', '--trtype', help='NVMe-oF transport type: e.g., rdma', required=True)
16966336217eSBen Walker    p.add_argument('-a', '--traddr', help='NVMe-oF transport address: e.g., an ip address', required=True)
1697f8433aadSSeth Howell    p.add_argument('-p', '--tgt_name', help='The name of the parent NVMe-oF target (optional)', type=str)
16986336217eSBen Walker    p.add_argument('-f', '--adrfam', help='NVMe-oF transport adrfam: e.g., ipv4, ipv6, ib, fc, intra_host')
16996336217eSBen Walker    p.add_argument('-s', '--trsvcid', help='NVMe-oF transport service id: e.g., a port number')
1700df897ed4SDaniel Verkamp    p.set_defaults(func=nvmf_subsystem_add_listener)
1701df897ed4SDaniel Verkamp
1702df897ed4SDaniel Verkamp    def nvmf_subsystem_remove_listener(args):
1703aceeb8cdSheluwei        rpc.nvmf.nvmf_subsystem_remove_listener(args.client,
1704aceeb8cdSheluwei                                                nqn=args.nqn,
1705aceeb8cdSheluwei                                                trtype=args.trtype,
1706aceeb8cdSheluwei                                                traddr=args.traddr,
1707f8433aadSSeth Howell                                                tgt_name=args.tgt_name,
1708aceeb8cdSheluwei                                                adrfam=args.adrfam,
1709aceeb8cdSheluwei                                                trsvcid=args.trsvcid)
17106336217eSBen Walker
1711a1ee1187Sparam    p = subparsers.add_parser('nvmf_subsystem_remove_listener', help='Remove a listener from an NVMe-oF subsystem')
1712a1ee1187Sparam    p.add_argument('nqn', help='NVMe-oF subsystem NQN')
1713a1ee1187Sparam    p.add_argument('-t', '--trtype', help='NVMe-oF transport type: e.g., rdma', required=True)
1714a1ee1187Sparam    p.add_argument('-a', '--traddr', help='NVMe-oF transport address: e.g., an ip address', required=True)
1715f8433aadSSeth Howell    p.add_argument('-p', '--tgt_name', help='The name of the parent NVMe-oF target (optional)', type=str)
1716a1ee1187Sparam    p.add_argument('-f', '--adrfam', help='NVMe-oF transport adrfam: e.g., ipv4, ipv6, ib, fc, intra_host')
1717a1ee1187Sparam    p.add_argument('-s', '--trsvcid', help='NVMe-oF transport service id: e.g., a port number')
1718df897ed4SDaniel Verkamp    p.set_defaults(func=nvmf_subsystem_remove_listener)
1719df897ed4SDaniel Verkamp
1720df897ed4SDaniel Verkamp    def nvmf_subsystem_add_ns(args):
1721aceeb8cdSheluwei        rpc.nvmf.nvmf_subsystem_add_ns(args.client,
1722aceeb8cdSheluwei                                       nqn=args.nqn,
1723aceeb8cdSheluwei                                       bdev_name=args.bdev_name,
1724f8433aadSSeth Howell                                       tgt_name=args.tgt_name,
17255317a9f7SChangpeng Liu                                       ptpl_file=args.ptpl_file,
1726aceeb8cdSheluwei                                       nsid=args.nsid,
1727aceeb8cdSheluwei                                       nguid=args.nguid,
1728aceeb8cdSheluwei                                       eui64=args.eui64,
1729aceeb8cdSheluwei                                       uuid=args.uuid)
1730a1ee1187Sparam
173147b17299SBen Walker    p = subparsers.add_parser('nvmf_subsystem_add_ns', help='Add a namespace to an NVMe-oF subsystem')
173247b17299SBen Walker    p.add_argument('nqn', help='NVMe-oF subsystem NQN')
173347b17299SBen Walker    p.add_argument('bdev_name', help='The name of the bdev that will back this namespace')
1734f8433aadSSeth Howell    p.add_argument('-t', '--tgt_name', help='The name of the parent NVMe-oF target (optional)', type=str)
17355317a9f7SChangpeng Liu    p.add_argument('-p', '--ptpl-file', help='The persistent reservation storage location (optional)', type=str)
173647b17299SBen Walker    p.add_argument('-n', '--nsid', help='The requested NSID (optional)', type=int)
17371023ca7bSDaniel Verkamp    p.add_argument('-g', '--nguid', help='Namespace globally unique identifier (optional)')
17381023ca7bSDaniel Verkamp    p.add_argument('-e', '--eui64', help='Namespace EUI-64 identifier (optional)')
173957ae6bf6SDaniel Verkamp    p.add_argument('-u', '--uuid', help='Namespace UUID (optional)')
1740df897ed4SDaniel Verkamp    p.set_defaults(func=nvmf_subsystem_add_ns)
1741df897ed4SDaniel Verkamp
1742df897ed4SDaniel Verkamp    def nvmf_subsystem_remove_ns(args):
1743aceeb8cdSheluwei        rpc.nvmf.nvmf_subsystem_remove_ns(args.client,
1744aceeb8cdSheluwei                                          nqn=args.nqn,
1745f8433aadSSeth Howell                                          nsid=args.nsid,
1746f8433aadSSeth Howell                                          tgt_name=args.tgt_name)
174747b17299SBen Walker
1748d9321520SChangpeng Liu    p = subparsers.add_parser('nvmf_subsystem_remove_ns', help='Remove a namespace to an NVMe-oF subsystem')
1749d9321520SChangpeng Liu    p.add_argument('nqn', help='NVMe-oF subsystem NQN')
1750d9321520SChangpeng Liu    p.add_argument('nsid', help='The requested NSID', type=int)
1751f8433aadSSeth Howell    p.add_argument('-t', '--tgt_name', help='The name of the parent NVMe-oF target (optional)', type=str)
1752df897ed4SDaniel Verkamp    p.set_defaults(func=nvmf_subsystem_remove_ns)
1753df897ed4SDaniel Verkamp
1754df897ed4SDaniel Verkamp    def nvmf_subsystem_add_host(args):
1755aceeb8cdSheluwei        rpc.nvmf.nvmf_subsystem_add_host(args.client,
1756aceeb8cdSheluwei                                         nqn=args.nqn,
1757f8433aadSSeth Howell                                         host=args.host,
1758f8433aadSSeth Howell                                         tgt_name=args.tgt_name)
1759d9321520SChangpeng Liu
17606285e36eSBen Walker    p = subparsers.add_parser('nvmf_subsystem_add_host', help='Add a host to an NVMe-oF subsystem')
17616285e36eSBen Walker    p.add_argument('nqn', help='NVMe-oF subsystem NQN')
17626285e36eSBen Walker    p.add_argument('host', help='Host NQN to allow')
1763f8433aadSSeth Howell    p.add_argument('-t', '--tgt_name', help='The name of the parent NVMe-oF target (optional)', type=str)
1764df897ed4SDaniel Verkamp    p.set_defaults(func=nvmf_subsystem_add_host)
1765df897ed4SDaniel Verkamp
1766df897ed4SDaniel Verkamp    def nvmf_subsystem_remove_host(args):
1767aceeb8cdSheluwei        rpc.nvmf.nvmf_subsystem_remove_host(args.client,
1768aceeb8cdSheluwei                                            nqn=args.nqn,
1769f8433aadSSeth Howell                                            host=args.host,
1770f8433aadSSeth Howell                                            tgt_name=args.tgt_name)
17716285e36eSBen Walker
17726285e36eSBen Walker    p = subparsers.add_parser('nvmf_subsystem_remove_host', help='Remove a host from an NVMe-oF subsystem')
17736285e36eSBen Walker    p.add_argument('nqn', help='NVMe-oF subsystem NQN')
17746285e36eSBen Walker    p.add_argument('host', help='Host NQN to remove')
1775f8433aadSSeth Howell    p.add_argument('-t', '--tgt_name', help='The name of the parent NVMe-oF target (optional)', type=str)
1776df897ed4SDaniel Verkamp    p.set_defaults(func=nvmf_subsystem_remove_host)
1777df897ed4SDaniel Verkamp
1778df897ed4SDaniel Verkamp    def nvmf_subsystem_allow_any_host(args):
1779aceeb8cdSheluwei        rpc.nvmf.nvmf_subsystem_allow_any_host(args.client,
1780aceeb8cdSheluwei                                               nqn=args.nqn,
1781f8433aadSSeth Howell                                               disable=args.disable,
1782f8433aadSSeth Howell                                               tgt_name=args.tgt_name)
17836285e36eSBen Walker
17846285e36eSBen Walker    p = subparsers.add_parser('nvmf_subsystem_allow_any_host', help='Allow any host to connect to the subsystem')
17856285e36eSBen Walker    p.add_argument('nqn', help='NVMe-oF subsystem NQN')
17866285e36eSBen Walker    p.add_argument('-e', '--enable', action='store_true', help='Enable allowing any host')
17876285e36eSBen Walker    p.add_argument('-d', '--disable', action='store_true', help='Disable allowing any host')
1788f8433aadSSeth Howell    p.add_argument('-t', '--tgt_name', help='The name of the parent NVMe-oF target (optional)', type=str)
1789df897ed4SDaniel Verkamp    p.set_defaults(func=nvmf_subsystem_allow_any_host)
17906285e36eSBen Walker
1791fca6ff8fSEvgeniy Kochetov    def nvmf_get_stats(args):
1792f8433aadSSeth Howell        print_dict(rpc.nvmf.nvmf_get_stats(args.client, tgt_name=args.tgt_name))
1793fca6ff8fSEvgeniy Kochetov
1794fca6ff8fSEvgeniy Kochetov    p = subparsers.add_parser(
1795fca6ff8fSEvgeniy Kochetov        'nvmf_get_stats', help='Display current statistics for NVMf subsystem')
1796f8433aadSSeth Howell    p.add_argument('-t', '--tgt_name', help='The name of the parent NVMe-oF target (optional)', type=str)
1797fca6ff8fSEvgeniy Kochetov    p.set_defaults(func=nvmf_get_stats)
1798fca6ff8fSEvgeniy Kochetov
17994dd3f4a7SBen Walker    # pmem
18005d89d50eSPawel Kaminski    def bdev_pmem_create_pool(args):
18015e9dbb5eSKarol Latecki        num_blocks = int((args.total_size * 1024 * 1024) / args.block_size)
18025d89d50eSPawel Kaminski        rpc.pmem.bdev_pmem_create_pool(args.client,
18035e9dbb5eSKarol Latecki                                       pmem_file=args.pmem_file,
18045e9dbb5eSKarol Latecki                                       num_blocks=num_blocks,
18055e9dbb5eSKarol Latecki                                       block_size=args.block_size)
1806df897ed4SDaniel Verkamp
18075d89d50eSPawel Kaminski    p = subparsers.add_parser('bdev_pmem_create_pool', aliases=['create_pmem_pool'],
18085d89d50eSPawel Kaminski                              help='Create pmem pool')
18094dd3f4a7SBen Walker    p.add_argument('pmem_file', help='Path to pmemblk pool file')
18104dd3f4a7SBen Walker    p.add_argument('total_size', help='Size of malloc bdev in MB (int > 0)', type=int)
18114dd3f4a7SBen Walker    p.add_argument('block_size', help='Block size for this pmem pool', type=int)
18125d89d50eSPawel Kaminski    p.set_defaults(func=bdev_pmem_create_pool)
1813df897ed4SDaniel Verkamp
1814a6aeb969SPawel Kaminski    def bdev_pmem_get_pool_info(args):
1815a6aeb969SPawel Kaminski        print_dict(rpc.pmem.bdev_pmem_get_pool_info(args.client,
18165e9dbb5eSKarol Latecki                                                    pmem_file=args.pmem_file))
18171e92d78aSBen Walker
1818a6aeb969SPawel Kaminski    p = subparsers.add_parser('bdev_pmem_get_pool_info', aliases=['pmem_pool_info'],
1819a6aeb969SPawel Kaminski                              help='Display pmem pool info and check consistency')
18204dd3f4a7SBen Walker    p.add_argument('pmem_file', help='Path to pmemblk pool file')
1821a6aeb969SPawel Kaminski    p.set_defaults(func=bdev_pmem_get_pool_info)
1822df897ed4SDaniel Verkamp
18236c425deaSPawel Kaminski    def bdev_pmem_delete_pool(args):
18246c425deaSPawel Kaminski        rpc.pmem.bdev_pmem_delete_pool(args.client,
18255e9dbb5eSKarol Latecki                                       pmem_file=args.pmem_file)
182632b4ab71SCunyin Chang
18276c425deaSPawel Kaminski    p = subparsers.add_parser('bdev_pmem_delete_pool', aliases=['delete_pmem_pool'],
18286c425deaSPawel Kaminski                              help='Delete pmem pool')
18294dd3f4a7SBen Walker    p.add_argument('pmem_file', help='Path to pmemblk pool file')
18306c425deaSPawel Kaminski    p.set_defaults(func=bdev_pmem_delete_pool)
183132b4ab71SCunyin Chang
1832ba1859edSPawel Wodkowski    # subsystem
18338710b600SMaciej Wawryk    def framework_get_subsystems(args):
18348710b600SMaciej Wawryk        print_dict(rpc.subsystem.framework_get_subsystems(args.client))
1835df897ed4SDaniel Verkamp
18368710b600SMaciej Wawryk    p = subparsers.add_parser('framework_get_subsystems', aliases=['get_subsystems'],
18378710b600SMaciej Wawryk                              help="""Print subsystems array in initialization order. Each subsystem
1838ba1859edSPawel Wodkowski    entry contain (unsorted) array of subsystems it depends on.""")
18398710b600SMaciej Wawryk    p.set_defaults(func=framework_get_subsystems)
1840df897ed4SDaniel Verkamp
1841378ad60bSMaciej Wawryk    def framework_get_config(args):
1842378ad60bSMaciej Wawryk        print_dict(rpc.subsystem.framework_get_config(args.client, args.name))
1843ba1859edSPawel Wodkowski
1844378ad60bSMaciej Wawryk    p = subparsers.add_parser('framework_get_config', aliases=['get_subsystem_config'],
1845378ad60bSMaciej Wawryk                              help="""Print subsystem configuration""")
1846bd4ecea5SPawel Wodkowski    p.add_argument('name', help='Name of subsystem to query')
1847378ad60bSMaciej Wawryk    p.set_defaults(func=framework_get_config)
1848bd4ecea5SPawel Wodkowski
18494dd3f4a7SBen Walker    # vhost
1850df897ed4SDaniel Verkamp    def set_vhost_controller_coalescing(args):
185125c11b8eSKarol Latecki        rpc.vhost.set_vhost_controller_coalescing(args.client,
185225c11b8eSKarol Latecki                                                  ctrlr=args.ctrlr,
185325c11b8eSKarol Latecki                                                  delay_base_us=args.delay_base_us,
185425c11b8eSKarol Latecki                                                  iops_threshold=args.iops_threshold)
1855df897ed4SDaniel Verkamp
1856ff1863f4SPawel Wodkowski    p = subparsers.add_parser('set_vhost_controller_coalescing', help='Set vhost controller coalescing')
1857ff1863f4SPawel Wodkowski    p.add_argument('ctrlr', help='controller name')
1858ff1863f4SPawel Wodkowski    p.add_argument('delay_base_us', help='Base delay time', type=int)
1859ff1863f4SPawel Wodkowski    p.add_argument('iops_threshold', help='IOPS threshold when coalescing is enabled', type=int)
1860df897ed4SDaniel Verkamp    p.set_defaults(func=set_vhost_controller_coalescing)
1861df897ed4SDaniel Verkamp
1862df897ed4SDaniel Verkamp    def construct_vhost_scsi_controller(args):
186325c11b8eSKarol Latecki        rpc.vhost.construct_vhost_scsi_controller(args.client,
186425c11b8eSKarol Latecki                                                  ctrlr=args.ctrlr,
186525c11b8eSKarol Latecki                                                  cpumask=args.cpumask)
1866ff1863f4SPawel Wodkowski
18674dd3f4a7SBen Walker    p = subparsers.add_parser(
18684dd3f4a7SBen Walker        'construct_vhost_scsi_controller', help='Add new vhost controller')
18691dbf53eeSPiotr Pelplinski    p.add_argument('ctrlr', help='controller name')
18701dbf53eeSPiotr Pelplinski    p.add_argument('--cpumask', help='cpu mask for this controller')
1871df897ed4SDaniel Verkamp    p.set_defaults(func=construct_vhost_scsi_controller)
1872df897ed4SDaniel Verkamp
1873df897ed4SDaniel Verkamp    def add_vhost_scsi_lun(args):
187431c25ab3SDarek Stojaczyk        print_json(rpc.vhost.add_vhost_scsi_lun(args.client,
187525c11b8eSKarol Latecki                                                ctrlr=args.ctrlr,
187625c11b8eSKarol Latecki                                                scsi_target_num=args.scsi_target_num,
187748834f0dSPawel Wodkowski                                                bdev_name=args.bdev_name))
18787dce704cSPawel Wodkowski
18794dd3f4a7SBen Walker    p = subparsers.add_parser('add_vhost_scsi_lun',
18804dd3f4a7SBen Walker                              help='Add lun to vhost controller')
18817dce704cSPawel Wodkowski    p.add_argument('ctrlr', help='conntroller name where add lun')
18820709cc48SSebastian Basierski    p.add_argument('scsi_target_num', help='scsi_target_num', type=int)
1883583e9699SShuhei Matsumoto    p.add_argument('bdev_name', help='bdev name')
1884df897ed4SDaniel Verkamp    p.set_defaults(func=add_vhost_scsi_lun)
1885df897ed4SDaniel Verkamp
1886df897ed4SDaniel Verkamp    def remove_vhost_scsi_target(args):
188725c11b8eSKarol Latecki        rpc.vhost.remove_vhost_scsi_target(args.client,
188825c11b8eSKarol Latecki                                           ctrlr=args.ctrlr,
188925c11b8eSKarol Latecki                                           scsi_target_num=args.scsi_target_num)
1890679e2831SDariusz Stojaczyk
18910709cc48SSebastian Basierski    p = subparsers.add_parser('remove_vhost_scsi_target', help='Remove target from vhost controller')
18920709cc48SSebastian Basierski    p.add_argument('ctrlr', help='controller name to remove target from')
18930709cc48SSebastian Basierski    p.add_argument('scsi_target_num', help='scsi_target_num', type=int)
1894df897ed4SDaniel Verkamp    p.set_defaults(func=remove_vhost_scsi_target)
1895df897ed4SDaniel Verkamp
1896df897ed4SDaniel Verkamp    def construct_vhost_blk_controller(args):
189725c11b8eSKarol Latecki        rpc.vhost.construct_vhost_blk_controller(args.client,
189825c11b8eSKarol Latecki                                                 ctrlr=args.ctrlr,
189925c11b8eSKarol Latecki                                                 dev_name=args.dev_name,
190025c11b8eSKarol Latecki                                                 cpumask=args.cpumask,
190125c11b8eSKarol Latecki                                                 readonly=args.readonly)
1902ff88449dSPawel Niedzwiecki
1903ff88449dSPawel Niedzwiecki    p = subparsers.add_parser('construct_vhost_blk_controller', help='Add a new vhost block controller')
1904ff88449dSPawel Niedzwiecki    p.add_argument('ctrlr', help='controller name')
1905ff88449dSPawel Niedzwiecki    p.add_argument('dev_name', help='device name')
1906ff88449dSPawel Niedzwiecki    p.add_argument('--cpumask', help='cpu mask for this controller')
1907a264d9d2SPawel Niedzwiecki    p.add_argument("-r", "--readonly", action='store_true', help='Set controller as read-only')
1908df897ed4SDaniel Verkamp    p.set_defaults(func=construct_vhost_blk_controller)
1909df897ed4SDaniel Verkamp
1910ef4a5bc9SChangpeng Liu    def construct_vhost_nvme_controller(args):
191125c11b8eSKarol Latecki        rpc.vhost.construct_vhost_nvme_controller(args.client,
191225c11b8eSKarol Latecki                                                  ctrlr=args.ctrlr,
191325c11b8eSKarol Latecki                                                  io_queues=args.io_queues,
191425c11b8eSKarol Latecki                                                  cpumask=args.cpumask)
1915ef4a5bc9SChangpeng Liu
1916ef4a5bc9SChangpeng Liu    p = subparsers.add_parser('construct_vhost_nvme_controller', help='Add new vhost controller')
1917ef4a5bc9SChangpeng Liu    p.add_argument('ctrlr', help='controller name')
1918ef4a5bc9SChangpeng Liu    p.add_argument('io_queues', help='number of IO queues for the controller', type=int)
1919ef4a5bc9SChangpeng Liu    p.add_argument('--cpumask', help='cpu mask for this controller')
1920ef4a5bc9SChangpeng Liu    p.set_defaults(func=construct_vhost_nvme_controller)
1921ef4a5bc9SChangpeng Liu
1922ef4a5bc9SChangpeng Liu    def add_vhost_nvme_ns(args):
192325c11b8eSKarol Latecki        rpc.vhost.add_vhost_nvme_ns(args.client,
192425c11b8eSKarol Latecki                                    ctrlr=args.ctrlr,
192525c11b8eSKarol Latecki                                    bdev_name=args.bdev_name)
1926ef4a5bc9SChangpeng Liu
1927ef4a5bc9SChangpeng Liu    p = subparsers.add_parser('add_vhost_nvme_ns', help='Add a Namespace to vhost controller')
1928ef4a5bc9SChangpeng Liu    p.add_argument('ctrlr', help='conntroller name where add a Namespace')
1929ef4a5bc9SChangpeng Liu    p.add_argument('bdev_name', help='block device name for a new Namespace')
1930ef4a5bc9SChangpeng Liu    p.set_defaults(func=add_vhost_nvme_ns)
1931ef4a5bc9SChangpeng Liu
1932df897ed4SDaniel Verkamp    def get_vhost_controllers(args):
193374a28c19Swuzhouhui        print_dict(rpc.vhost.get_vhost_controllers(args.client, args.name))
1934ff88449dSPawel Niedzwiecki
193574a28c19Swuzhouhui    p = subparsers.add_parser('get_vhost_controllers', help='List all or specific vhost controller(s)')
193674a28c19Swuzhouhui    p.add_argument('-n', '--name', help="Name of vhost controller", required=False)
1937df897ed4SDaniel Verkamp    p.set_defaults(func=get_vhost_controllers)
1938df897ed4SDaniel Verkamp
1939df897ed4SDaniel Verkamp    def remove_vhost_controller(args):
194025c11b8eSKarol Latecki        rpc.vhost.remove_vhost_controller(args.client,
194125c11b8eSKarol Latecki                                          ctrlr=args.ctrlr)
1942c63d9de4SPawel Niedzwiecki
1943c63d9de4SPawel Niedzwiecki    p = subparsers.add_parser('remove_vhost_controller', help='Remove a vhost controller')
1944c63d9de4SPawel Niedzwiecki    p.add_argument('ctrlr', help='controller name')
1945df897ed4SDaniel Verkamp    p.set_defaults(func=remove_vhost_controller)
1946df897ed4SDaniel Verkamp
19472aed03f0SMaciej Wawryk    def bdev_virtio_attach_controller(args):
19482aed03f0SMaciej Wawryk        print_array(rpc.vhost.bdev_virtio_attach_controller(args.client,
194900054fc6SKarol Latecki                                                            name=args.name,
195025c11b8eSKarol Latecki                                                            trtype=args.trtype,
195125c11b8eSKarol Latecki                                                            traddr=args.traddr,
195225c11b8eSKarol Latecki                                                            dev_type=args.dev_type,
195325c11b8eSKarol Latecki                                                            vq_count=args.vq_count,
195425c11b8eSKarol Latecki                                                            vq_size=args.vq_size))
19551a6dac40SPawel Wodkowski
19562aed03f0SMaciej Wawryk    p = subparsers.add_parser('bdev_virtio_attach_controller', aliases=['construct_virtio_dev'],
19572aed03f0SMaciej Wawryk                              help="""Attach virtio controller using provided
19582aed03f0SMaciej Wawryk    transport type and device type. This will also create bdevs for any block devices connected to the
19592aed03f0SMaciej Wawryk    controller (for example, SCSI devices for a virtio-scsi controller).
19602aed03f0SMaciej Wawryk    Result is array of added bdevs.""")
19611a6dac40SPawel Wodkowski    p.add_argument('name', help="Use this name as base for new created bdevs")
19621a6dac40SPawel Wodkowski    p.add_argument('-t', '--trtype',
19631a6dac40SPawel Wodkowski                   help='Virtio target transport type: pci or user', required=True)
19641a6dac40SPawel Wodkowski    p.add_argument('-a', '--traddr',
19651a6dac40SPawel Wodkowski                   help='Transport type specific target address: e.g. UNIX domain socket path or BDF', required=True)
19661a6dac40SPawel Wodkowski    p.add_argument('-d', '--dev-type',
19671a6dac40SPawel Wodkowski                   help='Device type: blk or scsi', required=True)
19681a6dac40SPawel Wodkowski    p.add_argument('--vq-count', help='Number of virtual queues to be used.', type=int)
19691a6dac40SPawel Wodkowski    p.add_argument('--vq-size', help='Size of each queue', type=int)
19702aed03f0SMaciej Wawryk    p.set_defaults(func=bdev_virtio_attach_controller)
19711a6dac40SPawel Wodkowski
1972c2a4f329SMaciej Wawryk    def bdev_virtio_scsi_get_devices(args):
1973c2a4f329SMaciej Wawryk        print_dict(rpc.vhost.bdev_virtio_scsi_get_devices(args.client))
1974b3518196SDariusz Stojaczyk
1975c2a4f329SMaciej Wawryk    p = subparsers.add_parser('bdev_virtio_scsi_get_devices', aliases=['get_virtio_scsi_devs'],
1976c2a4f329SMaciej Wawryk                              help='List all Virtio-SCSI devices.')
1977c2a4f329SMaciej Wawryk    p.set_defaults(func=bdev_virtio_scsi_get_devices)
1978b3518196SDariusz Stojaczyk
1979c1b87b3dSMaciej Wawryk    def bdev_virtio_detach_controller(args):
1980c1b87b3dSMaciej Wawryk        rpc.vhost.bdev_virtio_detach_controller(args.client,
198143fe3667STomasz Zawadzki                                                name=args.name)
198243fe3667STomasz Zawadzki
1983c1b87b3dSMaciej Wawryk    p = subparsers.add_parser('bdev_virtio_detach_controller', aliases=['remove_virtio_bdev'],
1984c1b87b3dSMaciej Wawryk                              help="""Remove a Virtio device
198543fe3667STomasz Zawadzki    This will delete all bdevs exposed by this device""")
198643fe3667STomasz Zawadzki    p.add_argument('name', help='Virtio device name. E.g. VirtioUser0')
1987c1b87b3dSMaciej Wawryk    p.set_defaults(func=bdev_virtio_detach_controller)
198843fe3667STomasz Zawadzki
1989ce2e6828SShuhei Matsumoto    # ioat
199044c859e3SMaciej Wawryk    def ioat_scan_copy_engine(args):
1991ce2e6828SShuhei Matsumoto        pci_whitelist = []
1992ce2e6828SShuhei Matsumoto        if args.pci_whitelist:
1993ce2e6828SShuhei Matsumoto            for w in args.pci_whitelist.strip().split(" "):
1994ce2e6828SShuhei Matsumoto                pci_whitelist.append(w)
199544c859e3SMaciej Wawryk        rpc.ioat.ioat_scan_copy_engine(args.client, pci_whitelist)
1996ce2e6828SShuhei Matsumoto
199744c859e3SMaciej Wawryk    p = subparsers.add_parser('ioat_scan_copy_engine', aliases=['scan_ioat_copy_engine'],
199844c859e3SMaciej Wawryk                              help='Set scan and enable IOAT copy engine offload.')
1999ce2e6828SShuhei Matsumoto    p.add_argument('-w', '--pci-whitelist', help="""Whitespace-separated list of PCI addresses in
2000ce2e6828SShuhei Matsumoto    domain:bus:device.function format or domain.bus.device.function format""")
200144c859e3SMaciej Wawryk    p.set_defaults(func=ioat_scan_copy_engine)
2002ce2e6828SShuhei Matsumoto
2003b318d5f0SPawel Kaminski    # bdev_nvme_send_cmd
2004b318d5f0SPawel Kaminski    def bdev_nvme_send_cmd(args):
2005b318d5f0SPawel Kaminski        print_dict(rpc.nvme.bdev_nvme_send_cmd(args.client,
2006e66ea624SLiu Xiaodong                                               name=args.nvme_name,
2007e66ea624SLiu Xiaodong                                               cmd_type=args.cmd_type,
2008e66ea624SLiu Xiaodong                                               data_direction=args.data_direction,
2009e66ea624SLiu Xiaodong                                               cmdbuf=args.cmdbuf,
2010e66ea624SLiu Xiaodong                                               data=args.data,
2011e66ea624SLiu Xiaodong                                               metadata=args.metadata,
2012e66ea624SLiu Xiaodong                                               data_len=args.data_length,
2013e66ea624SLiu Xiaodong                                               metadata_len=args.metadata_length,
2014e66ea624SLiu Xiaodong                                               timeout_ms=args.timeout_ms))
2015e66ea624SLiu Xiaodong
2016b318d5f0SPawel Kaminski    p = subparsers.add_parser('bdev_nvme_send_cmd', aliases=['send_nvme_cmd'],
2017b318d5f0SPawel Kaminski                              help='NVMe passthrough cmd.')
2018e66ea624SLiu Xiaodong    p.add_argument('-n', '--nvme-name', help="""Name of the operating NVMe controller""")
2019e66ea624SLiu Xiaodong    p.add_argument('-t', '--cmd-type', help="""Type of nvme cmd. Valid values are: admin, io""")
2020e66ea624SLiu Xiaodong    p.add_argument('-r', '--data-direction', help="""Direction of data transfer. Valid values are: c2h, h2c""")
2021e66ea624SLiu Xiaodong    p.add_argument('-c', '--cmdbuf', help="""NVMe command encoded by base64 urlsafe""")
2022e66ea624SLiu Xiaodong    p.add_argument('-d', '--data', help="""Data transferring to controller from host, encoded by base64 urlsafe""")
2023e66ea624SLiu Xiaodong    p.add_argument('-m', '--metadata', help="""Metadata transferring to controller from host, encoded by base64 urlsafe""")
2024e66ea624SLiu Xiaodong    p.add_argument('-D', '--data-length', help="""Data length required to transfer from controller to host""", type=int)
2025e66ea624SLiu Xiaodong    p.add_argument('-M', '--metadata-length', help="""Metadata length required to transfer from controller to host""", type=int)
2026e66ea624SLiu Xiaodong    p.add_argument('-T', '--timeout-ms',
2027e66ea624SLiu Xiaodong                   help="""Command execution timeout value, in milliseconds,  if 0, don't track timeout""", type=int, default=0)
2028b318d5f0SPawel Kaminski    p.set_defaults(func=bdev_nvme_send_cmd)
2029e66ea624SLiu Xiaodong
20302cccea55SPawel Wodkowski    # Notifications
2031c7174d9eSMaciej Wawryk    def notify_get_types(args):
2032c7174d9eSMaciej Wawryk        print_dict(rpc.notify.notify_get_types(args.client))
20332cccea55SPawel Wodkowski
2034c7174d9eSMaciej Wawryk    p = subparsers.add_parser('notify_get_types', aliases=['get_notification_types'],
2035c7174d9eSMaciej Wawryk                              help='List available notifications that user can subscribe to.')
2036c7174d9eSMaciej Wawryk    p.set_defaults(func=notify_get_types)
20372cccea55SPawel Wodkowski
203885ab05d3SMaciej Wawryk    def notify_get_notifications(args):
203985ab05d3SMaciej Wawryk        ret = rpc.notify.notify_get_notifications(args.client,
20402cccea55SPawel Wodkowski                                                  id=args.id,
20412cccea55SPawel Wodkowski                                                  max=args.max)
20422cccea55SPawel Wodkowski        print_dict(ret)
20432cccea55SPawel Wodkowski
204485ab05d3SMaciej Wawryk    p = subparsers.add_parser('notify_get_notifications', aliases=['get_notifications'],
204585ab05d3SMaciej Wawryk                              help='Get notifications')
20462cccea55SPawel Wodkowski    p.add_argument('-i', '--id', help="""First ID to start fetching from""", type=int)
20472cccea55SPawel Wodkowski    p.add_argument('-n', '--max', help="""Maximum number of notifications to return in response""", type=int)
204885ab05d3SMaciej Wawryk    p.set_defaults(func=notify_get_notifications)
20492cccea55SPawel Wodkowski
20507535cdbdSEvgeniy Kochetov    def thread_get_stats(args):
20517535cdbdSEvgeniy Kochetov        print_dict(rpc.app.thread_get_stats(args.client))
20527535cdbdSEvgeniy Kochetov
20537535cdbdSEvgeniy Kochetov    p = subparsers.add_parser(
20547535cdbdSEvgeniy Kochetov        'thread_get_stats', help='Display current statistics of all the threads')
20557535cdbdSEvgeniy Kochetov    p.set_defaults(func=thread_get_stats)
20567535cdbdSEvgeniy Kochetov
2057c2b5a3f6SJim Harris    def check_called_name(name):
2058c2b5a3f6SJim Harris        if name in deprecated_aliases:
2059c2b5a3f6SJim Harris            print("{} is deprecated, use {} instead.".format(name, deprecated_aliases[name]), file=sys.stderr)
2060c2b5a3f6SJim Harris
2061c47d6541SDarek Stojaczyk    class dry_run_client:
20626e4ea8fdSPawel Kaminski        def call(self, method, params=None):
20636e4ea8fdSPawel Kaminski            print("Request:\n" + json.dumps({"method": method, "params": params}, indent=2))
20646e4ea8fdSPawel Kaminski
2065c47d6541SDarek Stojaczyk    def null_print(arg):
20666e4ea8fdSPawel Kaminski        pass
20676e4ea8fdSPawel Kaminski
20686895f0f2SJim Harris    def call_rpc_func(args):
2069f7cb69cbSPawel Wodkowski        args.func(args)
2070c2b5a3f6SJim Harris        check_called_name(args.called_rpc_name)
20716895f0f2SJim Harris
2072363fe506SJim Harris    def execute_script(parser, client, fd):
20733bf82af8SPawel Kaminski        executed_rpc = ""
2074363fe506SJim Harris        for rpc_call in map(str.rstrip, fd):
2075caec8928SJim Harris            if not rpc_call.strip():
2076caec8928SJim Harris                continue
20773bf82af8SPawel Kaminski            executed_rpc = "\n".join([executed_rpc, rpc_call])
207822c3befdSKarol Latecki            args = parser.parse_args(shlex.split(rpc_call))
2079363fe506SJim Harris            args.client = client
20803bf82af8SPawel Kaminski            try:
2081363fe506SJim Harris                call_rpc_func(args)
20823bf82af8SPawel Kaminski            except JSONRPCException as ex:
20833bf82af8SPawel Kaminski                print("Exception:")
20843bf82af8SPawel Kaminski                print(executed_rpc.strip() + " <<<")
20853bf82af8SPawel Kaminski                print(ex.message)
20863bf82af8SPawel Kaminski                exit(1)
2087363fe506SJim Harris
20886895f0f2SJim Harris    args = parser.parse_args()
20896e4ea8fdSPawel Kaminski    if args.dry_run:
2090c47d6541SDarek Stojaczyk        args.client = dry_run_client()
2091c47d6541SDarek Stojaczyk        print_dict = null_print
2092c47d6541SDarek Stojaczyk        print_json = null_print
2093c47d6541SDarek Stojaczyk        print_array = null_print
20946e4ea8fdSPawel Kaminski    else:
20956895f0f2SJim Harris        args.client = rpc.client.JSONRPCClient(args.server_addr, args.port, args.timeout, log_level=getattr(logging, args.verbose.upper()))
2096363fe506SJim Harris    if hasattr(args, 'func'):
2097535654f8SKarol Latecki        try:
20986895f0f2SJim Harris            call_rpc_func(args)
2099535654f8SKarol Latecki        except JSONRPCException as ex:
2100535654f8SKarol Latecki            print(ex)
2101535654f8SKarol Latecki            exit(1)
2102ac0824b2SJim Harris    elif sys.stdin.isatty():
2103ac0824b2SJim Harris        # No arguments and no data piped through stdin
2104ac0824b2SJim Harris        parser.print_help()
2105ac0824b2SJim Harris        exit(1)
2106363fe506SJim Harris    else:
2107363fe506SJim Harris        execute_script(parser, args.client, sys.stdin)
2108