xref: /spdk/scripts/rpc.py (revision 000ee408e7b98f542766011bff0b51bdd7a378a2)
1b96f97cfSPawel Wodkowski#!/usr/bin/env python3
21e92d78aSBen Walker
327cc63ecSPawel Wodkowskiimport logging
41e92d78aSBen Walkerimport argparse
5b0bac20aSMaciej Szwedimport importlib
67610bc38SKonrad Sztyberimport os
709a9130eSPawel Kaminskiimport sys
822c3befdSKarol Lateckiimport shlex
96e4ea8fdSPawel Kaminskiimport json
101e92d78aSBen Walker
11e44aef95SDaniel Verkamptry:
12e44aef95SDaniel Verkamp    from shlex import quote
13e44aef95SDaniel Verkampexcept ImportError:
14e44aef95SDaniel Verkamp    from pipes import quote
15e44aef95SDaniel Verkamp
167610bc38SKonrad Sztybersys.path.append(os.path.dirname(__file__) + '/../python')
177610bc38SKonrad Sztyber
187610bc38SKonrad Sztyberimport spdk.rpc as rpc  # noqa
197610bc38SKonrad Sztyberfrom spdk.rpc.client import print_dict, print_json, JSONRPCException  # noqa
207610bc38SKonrad Sztyberfrom spdk.rpc.helpers import deprecated_aliases  # noqa
217610bc38SKonrad Sztyber
22e44aef95SDaniel Verkamp
23e44aef95SDaniel Verkampdef print_array(a):
24e78866edSDaniel Verkamp    print(" ".join((quote(v) for v in a)))
25e44aef95SDaniel Verkamp
26e44aef95SDaniel Verkamp
274dd3f4a7SBen Walkerif __name__ == "__main__":
284dd3f4a7SBen Walker    parser = argparse.ArgumentParser(
290d105d4fSTomasz Zawadzki        description='SPDK RPC command line interface', usage='%(prog)s [options]')
304dd3f4a7SBen Walker    parser.add_argument('-s', dest='server_addr',
31e632df9dSJim Harris                        help='RPC domain socket path or IP address', default='/var/tmp/spdk.sock')
324dd3f4a7SBen Walker    parser.add_argument('-p', dest='port',
334dd3f4a7SBen Walker                        help='RPC port number (if server_addr is IP address)',
344dd3f4a7SBen Walker                        default=5260, type=int)
3514c4a428SPawel Wodkowski    parser.add_argument('-t', dest='timeout',
36e632df9dSJim Harris                        help='Timeout as a floating point number expressed in seconds waiting for response. Default: 60.0',
3714c4a428SPawel Wodkowski                        default=60.0, type=float)
3800b52bf5SDarek Stojaczyk    parser.add_argument('-r', dest='conn_retries',
3900b52bf5SDarek Stojaczyk                        help='Retry connecting to the RPC server N times with 0.2s interval. Default: 0',
4000b52bf5SDarek Stojaczyk                        default=0, type=int)
4127cc63ecSPawel Wodkowski    parser.add_argument('-v', dest='verbose', action='store_const', const="INFO",
4227cc63ecSPawel Wodkowski                        help='Set verbose mode to INFO', default="ERROR")
4327cc63ecSPawel Wodkowski    parser.add_argument('--verbose', dest='verbose', choices=['DEBUG', 'INFO', 'ERROR'],
4427cc63ecSPawel Wodkowski                        help="""Set verbose level. """)
457a372bbeSJim Harris    parser.add_argument('--dry-run', dest='dry_run', action='store_true', help="Display request and exit")
466e4ea8fdSPawel Kaminski    parser.set_defaults(dry_run=False)
478b98cdb6SDarek Stojaczyk    parser.add_argument('--server', dest='is_server', action='store_true',
488b98cdb6SDarek Stojaczyk                        help="Start listening on stdin, parse each line as a regular rpc.py execution and create \
498b98cdb6SDarek Stojaczyk                                a separate connection for each command. Each command's output ends with either \
508b98cdb6SDarek Stojaczyk                                **STATUS=0 if the command succeeded or **STATUS=1 if it failed. --server is meant \
518b98cdb6SDarek Stojaczyk                                to be used in conjunction with bash coproc, where stdin and stdout are connected to \
528b98cdb6SDarek Stojaczyk                                pipes and can be used as a faster way to send RPC commands. If enabled, rpc.py \
538b98cdb6SDarek Stojaczyk                                must be executed without any other parameters.")
548b98cdb6SDarek Stojaczyk    parser.set_defaults(is_server=False)
55b0bac20aSMaciej Szwed    parser.add_argument('--plugin', dest='rpc_plugin', help='Module name of plugin with additional RPC commands')
56519d7209STomasz Zawadzki    subparsers = parser.add_subparsers(help='RPC methods', dest='called_rpc_name', metavar='')
571e92d78aSBen Walker
58e85d4712SMaciej Wawryk    def framework_start_init(args):
59e85d4712SMaciej Wawryk        rpc.framework_start_init(args.client)
6028589dbbSShuhei Matsumoto
61e85d4712SMaciej Wawryk    p = subparsers.add_parser('framework_start_init', aliases=['start_subsystem_init'],
62e85d4712SMaciej Wawryk                              help='Start initialization of subsystems')
63e85d4712SMaciej Wawryk    p.set_defaults(func=framework_start_init)
6428589dbbSShuhei Matsumoto
65fb3918a0SMaciej Wawryk    def framework_wait_init(args):
66fb3918a0SMaciej Wawryk        rpc.framework_wait_init(args.client)
67b7f54bd6SSeth Howell
68fb3918a0SMaciej Wawryk    p = subparsers.add_parser('framework_wait_init', aliases=['wait_subsystem_init'],
69fb3918a0SMaciej Wawryk                              help='Block until subsystems have been initialized')
70fb3918a0SMaciej Wawryk    p.set_defaults(func=framework_wait_init)
71b7f54bd6SSeth Howell
726ee44c69SJim Harris    def rpc_get_methods(args):
736ee44c69SJim Harris        print_dict(rpc.rpc_get_methods(args.client,
74f60eeb6fSPawel Kaminski                                       current=args.current,
75f60eeb6fSPawel Kaminski                                       include_aliases=args.include_aliases))
76df897ed4SDaniel Verkamp
776635453eSPawel Kaminski    p = subparsers.add_parser('rpc_get_methods', aliases=['get_rpc_methods'],
786635453eSPawel Kaminski                              help='Get list of supported RPC methods')
79bf9806d5SShuhei Matsumoto    p.add_argument('-c', '--current', help='Get list of RPC methods only callable in the current state.', action='store_true')
80f60eeb6fSPawel Kaminski    p.add_argument('-i', '--include-aliases', help='include RPC aliases', action='store_true')
816ee44c69SJim Harris    p.set_defaults(func=rpc_get_methods)
82df897ed4SDaniel Verkamp
836b6dfea6SPawel Kaminski    def spdk_get_version(args):
846b6dfea6SPawel Kaminski        print_json(rpc.spdk_get_version(args.client))
8538902a5aSChunyang Hui
866b6dfea6SPawel Kaminski    p = subparsers.add_parser('spdk_get_version', aliases=['get_spdk_version'],
876b6dfea6SPawel Kaminski                              help='Get SPDK version')
886b6dfea6SPawel Kaminski    p.set_defaults(func=spdk_get_version)
8938902a5aSChunyang Hui
90df897ed4SDaniel Verkamp    def save_config(args):
919ff7313fSKarol Latecki        rpc.save_config(args.client,
9209a9130eSPawel Kaminski                        sys.stdout,
939ff7313fSKarol Latecki                        indent=args.indent)
941e92d78aSBen Walker
9555014ddfSJim Harris    p = subparsers.add_parser('save_config', help="""Write current (live) configuration of SPDK subsystems and targets to stdout.
9655014ddfSJim Harris    """)
9755014ddfSJim Harris    p.add_argument('-i', '--indent', help="""Indent level. Value less than 0 mean compact mode. Default indent level is 2.
9855014ddfSJim Harris    """, type=int, default=2)
99df897ed4SDaniel Verkamp    p.set_defaults(func=save_config)
100df897ed4SDaniel Verkamp
101df897ed4SDaniel Verkamp    def load_config(args):
102871214e2SMichal Berger        rpc.load_config(args.client, args.json_conf,
103f60eeb6fSPawel Kaminski                        include_aliases=args.include_aliases)
10450d738b4SPawel Wodkowski
105871214e2SMichal Berger    p = subparsers.add_parser('load_config', help="""Configure SPDK subsystems and targets using JSON RPC.""")
106f60eeb6fSPawel Kaminski    p.add_argument('-i', '--include-aliases', help='include RPC aliases', action='store_true')
1077a372bbeSJim Harris    p.add_argument('-j', '--json-conf', help='Valid JSON configuration', default=sys.stdin)
108df897ed4SDaniel Verkamp    p.set_defaults(func=load_config)
10950d738b4SPawel Wodkowski
110800a1423SShuhei Matsumoto    def save_subsystem_config(args):
1119ff7313fSKarol Latecki        rpc.save_subsystem_config(args.client,
11209a9130eSPawel Kaminski                                  sys.stdout,
1139ff7313fSKarol Latecki                                  indent=args.indent,
1149ff7313fSKarol Latecki                                  name=args.name)
115800a1423SShuhei Matsumoto
11655014ddfSJim Harris    p = subparsers.add_parser('save_subsystem_config', help="""Write current (live) configuration of SPDK subsystem to stdout.
11755014ddfSJim Harris    """)
11855014ddfSJim Harris    p.add_argument('-i', '--indent', help="""Indent level. Value less than 0 mean compact mode. Default indent level is 2.
11955014ddfSJim Harris    """, type=int, default=2)
120800a1423SShuhei Matsumoto    p.add_argument('-n', '--name', help='Name of subsystem', required=True)
121800a1423SShuhei Matsumoto    p.set_defaults(func=save_subsystem_config)
122800a1423SShuhei Matsumoto
12343c5429dSPawel Niedzwiecki    def load_subsystem_config(args):
12409a9130eSPawel Kaminski        rpc.load_subsystem_config(args.client,
125871214e2SMichal Berger                                  args.json_conf)
12643c5429dSPawel Niedzwiecki
127871214e2SMichal Berger    p = subparsers.add_parser('load_subsystem_config', help="""Configure SPDK subsystem using JSON RPC.""")
1287a372bbeSJim Harris    p.add_argument('-j', '--json-conf', help='Valid JSON configuration', default=sys.stdin)
12943c5429dSPawel Niedzwiecki    p.set_defaults(func=load_subsystem_config)
13043c5429dSPawel Niedzwiecki
1314dd3f4a7SBen Walker    # app
1323402bfbdSPawel Kaminski    def spdk_kill_instance(args):
1333402bfbdSPawel Kaminski        rpc.app.spdk_kill_instance(args.client,
1344a534344SDaniel Verkamp                                   sig_name=args.sig_name)
135df897ed4SDaniel Verkamp
136*000ee408Swanghailiangx    p = subparsers.add_parser('spdk_kill_instance', help='Send signal to instance')
1374dd3f4a7SBen Walker    p.add_argument('sig_name', help='signal will be sent to server.')
1383402bfbdSPawel Kaminski    p.set_defaults(func=spdk_kill_instance)
139df897ed4SDaniel Verkamp
140a10d0ce7SMaciej Wawryk    def framework_monitor_context_switch(args):
1414a534344SDaniel Verkamp        enabled = None
1424a534344SDaniel Verkamp        if args.enable:
1434a534344SDaniel Verkamp            enabled = True
1444a534344SDaniel Verkamp        if args.disable:
1454a534344SDaniel Verkamp            enabled = False
146a10d0ce7SMaciej Wawryk        print_dict(rpc.app.framework_monitor_context_switch(args.client,
1474a534344SDaniel Verkamp                                                            enabled=enabled))
1481e92d78aSBen Walker
149*000ee408Swanghailiangx    p = subparsers.add_parser('framework_monitor_context_switch',
150a10d0ce7SMaciej Wawryk                              help='Control whether the context switch monitor is enabled')
1514dd3f4a7SBen Walker    p.add_argument('-e', '--enable', action='store_true', help='Enable context switch monitoring')
1524dd3f4a7SBen Walker    p.add_argument('-d', '--disable', action='store_true', help='Disable context switch monitoring')
153a10d0ce7SMaciej Wawryk    p.set_defaults(func=framework_monitor_context_switch)
1541e92d78aSBen Walker
155876fdf2aSShuhei Matsumoto    def framework_get_reactors(args):
156876fdf2aSShuhei Matsumoto        print_dict(rpc.app.framework_get_reactors(args.client))
157876fdf2aSShuhei Matsumoto
158876fdf2aSShuhei Matsumoto    p = subparsers.add_parser(
159876fdf2aSShuhei Matsumoto        'framework_get_reactors', help='Display list of all reactors')
160876fdf2aSShuhei Matsumoto    p.set_defaults(func=framework_get_reactors)
161876fdf2aSShuhei Matsumoto
162a2596f4dSVitaliy Mysak    def framework_set_scheduler(args):
163a2596f4dSVitaliy Mysak        rpc.app.framework_set_scheduler(args.client,
1646e3346dfSMaciej Szwed                                        name=args.name,
165ca8e6d23SKrzysztof Karas                                        period=args.period,
166ca8e6d23SKrzysztof Karas                                        load_limit=args.load_limit,
167ca8e6d23SKrzysztof Karas                                        core_limit=args.core_limit,
168ca8e6d23SKrzysztof Karas                                        core_busy=args.core_busy)
169a2596f4dSVitaliy Mysak
170a2596f4dSVitaliy Mysak    p = subparsers.add_parser(
1716e3346dfSMaciej Szwed        'framework_set_scheduler', help='Select thread scheduler that will be activated and its period (experimental)')
172a2596f4dSVitaliy Mysak    p.add_argument('name', help="Name of a scheduler")
1736e3346dfSMaciej Szwed    p.add_argument('-p', '--period', help="Scheduler period in microseconds", type=int)
174ca8e6d23SKrzysztof Karas    p.add_argument('--load-limit', help="Scheduler load limit. Reserved for dynamic scheduler", type=int, required=False)
175ca8e6d23SKrzysztof Karas    p.add_argument('--core-limit', help="Scheduler core limit. Reserved for dynamic scheduler", type=int, required=False)
176ca8e6d23SKrzysztof Karas    p.add_argument('--core-busy', help="Scheduler core busy limit. Reserved for dynamic schedler", type=int, required=False)
177a2596f4dSVitaliy Mysak    p.set_defaults(func=framework_set_scheduler)
178a2596f4dSVitaliy Mysak
179abf52d7dSKrzysztof Karas    def framework_get_scheduler(args):
180abf52d7dSKrzysztof Karas        print_dict(rpc.app.framework_get_scheduler(args.client))
181abf52d7dSKrzysztof Karas
182abf52d7dSKrzysztof Karas    p = subparsers.add_parser(
183abf52d7dSKrzysztof Karas        'framework_get_scheduler', help='Display currently set scheduler and its properties.')
184abf52d7dSKrzysztof Karas    p.set_defaults(func=framework_get_scheduler)
185abf52d7dSKrzysztof Karas
1864dd3f4a7SBen Walker    # bdev
1878e052bf4SMaciej Wawryk    def bdev_set_options(args):
1888e052bf4SMaciej Wawryk        rpc.bdev.bdev_set_options(args.client,
1893090f401SJim Harris                                  bdev_io_pool_size=args.bdev_io_pool_size,
190240b243aSyupeng                                  bdev_io_cache_size=args.bdev_io_cache_size,
191f420b9efSZiye Yang                                  bdev_auto_examine=args.bdev_auto_examine,
192f420b9efSZiye Yang                                  small_buf_pool_size=args.small_buf_pool_size,
193f420b9efSZiye Yang                                  large_buf_pool_size=args.large_buf_pool_size)
1943090f401SJim Harris
19547bc5870SJim Harris    p = subparsers.add_parser('bdev_set_options',
1968e052bf4SMaciej Wawryk                              help="""Set options of bdev subsystem""")
1973090f401SJim Harris    p.add_argument('-p', '--bdev-io-pool-size', help='Number of bdev_io structures in shared buffer pool', type=int)
1983090f401SJim Harris    p.add_argument('-c', '--bdev-io-cache-size', help='Maximum number of bdev_io structures cached per thread', type=int)
199f420b9efSZiye Yang    p.add_argument('-s', '--small-buf-pool-size', help='Maximum number of small buf (i.e., 8KB) pool size', type=int)
200f420b9efSZiye Yang    p.add_argument('-l', '--large-buf-pool-size', help='Maximum number of large buf (i.e., 64KB) pool size', type=int)
201240b243aSyupeng    group = p.add_mutually_exclusive_group()
202240b243aSyupeng    group.add_argument('-e', '--enable-auto-examine', dest='bdev_auto_examine', help='Allow to auto examine', action='store_true')
203240b243aSyupeng    group.add_argument('-d', '--disable-auto-examine', dest='bdev_auto_examine', help='Not allow to auto examine', action='store_false')
204240b243aSyupeng    p.set_defaults(bdev_auto_examine=True)
2058e052bf4SMaciej Wawryk    p.set_defaults(func=bdev_set_options)
2063090f401SJim Harris
2072d30df9bSyupeng    def bdev_examine(args):
2082d30df9bSyupeng        rpc.bdev.bdev_examine(args.client,
2092d30df9bSyupeng                              name=args.name)
2102d30df9bSyupeng
2112d30df9bSyupeng    p = subparsers.add_parser('bdev_examine',
2122d30df9bSyupeng                              help="""examine a bdev if it exists, or will examine it after it is created""")
2132d30df9bSyupeng    p.add_argument('-b', '--name', help='Name or alias of the bdev')
2142d30df9bSyupeng    p.set_defaults(func=bdev_examine)
2152d30df9bSyupeng
21677b6f4bcSTomasz Zawadzki    def bdev_wait_for_examine(args):
21777b6f4bcSTomasz Zawadzki        rpc.bdev.bdev_wait_for_examine(args.client)
21877b6f4bcSTomasz Zawadzki
21977b6f4bcSTomasz Zawadzki    p = subparsers.add_parser('bdev_wait_for_examine',
22077b6f4bcSTomasz Zawadzki                              help="""Report when all bdevs have been examined""")
22177b6f4bcSTomasz Zawadzki    p.set_defaults(func=bdev_wait_for_examine)
22277b6f4bcSTomasz Zawadzki
2239a91a45cSMaciej Wawryk    def bdev_compress_create(args):
2249a91a45cSMaciej Wawryk        print_json(rpc.bdev.bdev_compress_create(args.client,
225db541f8eSPaul Luse                                                 base_bdev_name=args.base_bdev_name,
22662b3b171Spaul luse                                                 pm_path=args.pm_path,
22762b3b171Spaul luse                                                 lb_size=args.lb_size))
2281d039ebaSPawel Kaminski
2297aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_compress_create', help='Add a compress vbdev')
2307a372bbeSJim Harris    p.add_argument('-b', '--base-bdev-name', help="Name of the base bdev")
2317a372bbeSJim Harris    p.add_argument('-p', '--pm-path', help="Path to persistent memory")
2327a372bbeSJim Harris    p.add_argument('-l', '--lb-size', help="Compressed vol logical block size (optional, if used must be 512 or 4096)", type=int, default=0)
2339a91a45cSMaciej Wawryk    p.set_defaults(func=bdev_compress_create)
234db541f8eSPaul Luse
2359a91a45cSMaciej Wawryk    def bdev_compress_delete(args):
2369a91a45cSMaciej Wawryk        rpc.bdev.bdev_compress_delete(args.client,
237db541f8eSPaul Luse                                      name=args.name)
238db541f8eSPaul Luse
2397aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_compress_delete', help='Delete a compress disk')
240db541f8eSPaul Luse    p.add_argument('name', help='compress bdev name')
2419a91a45cSMaciej Wawryk    p.set_defaults(func=bdev_compress_delete)
242db541f8eSPaul Luse
2432b29a2b1Spaul luse    def bdev_compress_set_pmd(args):
2442b29a2b1Spaul luse        rpc.bdev.bdev_compress_set_pmd(args.client,
245bfda995bSpaul luse                                       pmd=args.pmd)
2467aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_compress_set_pmd', help='Set pmd option for a compress disk')
24741714ffaSAlexey Marchuk    p.add_argument('-p', '--pmd', type=int, help='0 = auto-select, 1= QAT only, 2 = ISAL only, 3 = mlx5_pci only')
2482b29a2b1Spaul luse    p.set_defaults(func=bdev_compress_set_pmd)
249bfda995bSpaul luse
25068e7da44Spaul luse    def bdev_compress_get_orphans(args):
25168e7da44Spaul luse        print_dict(rpc.bdev.bdev_compress_get_orphans(args.client,
25268e7da44Spaul luse                                                      name=args.name))
25368e7da44Spaul luse    p = subparsers.add_parser(
25468e7da44Spaul luse        'bdev_compress_get_orphans', help='Display list of orphaned compress bdevs.')
25568e7da44Spaul luse    p.add_argument('-b', '--name', help="Name of a comp bdev. Example: COMP_Nvme0n1", required=False)
25668e7da44Spaul luse    p.set_defaults(func=bdev_compress_get_orphans)
25768e7da44Spaul luse
25840c959cbSMaciej Wawryk    def bdev_crypto_create(args):
25940c959cbSMaciej Wawryk        print_json(rpc.bdev.bdev_crypto_create(args.client,
26051606ed4SPaul Luse                                               base_bdev_name=args.base_bdev_name,
261cafd537cSpaul luse                                               name=args.name,
26251606ed4SPaul Luse                                               crypto_pmd=args.crypto_pmd,
263f070b78cSpaul luse                                               key=args.key,
264f070b78cSpaul luse                                               cipher=args.cipher,
265f070b78cSpaul luse                                               key2=args.key2))
2667aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_crypto_create', help='Add a crypto vbdev')
26744626532SKarol Latecki    p.add_argument('base_bdev_name', help="Name of the base bdev")
26844626532SKarol Latecki    p.add_argument('name', help="Name of the crypto vbdev")
26944626532SKarol Latecki    p.add_argument('crypto_pmd', help="Name of the crypto device driver")
27044626532SKarol Latecki    p.add_argument('key', help="Key")
271f070b78cSpaul luse    p.add_argument('-c', '--cipher', help="cipher to use, AES_CBC or AES_XTS (QAT only)", default="AES_CBC")
272f070b78cSpaul luse    p.add_argument('-k2', '--key2', help="2nd key for cipher AET_XTS", default=None)
27340c959cbSMaciej Wawryk    p.set_defaults(func=bdev_crypto_create)
27451606ed4SPaul Luse
27540c959cbSMaciej Wawryk    def bdev_crypto_delete(args):
27640c959cbSMaciej Wawryk        rpc.bdev.bdev_crypto_delete(args.client,
27751606ed4SPaul Luse                                    name=args.name)
27851606ed4SPaul Luse
2797aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_crypto_delete', help='Delete a crypto disk')
28051606ed4SPaul Luse    p.add_argument('name', help='crypto bdev name')
28140c959cbSMaciej Wawryk    p.set_defaults(func=bdev_crypto_delete)
28251606ed4SPaul Luse
283557f8ff9SPawel Kaminski    def bdev_ocf_create(args):
284557f8ff9SPawel Kaminski        print_json(rpc.bdev.bdev_ocf_create(args.client,
28535366140SVitaliy Mysak                                            name=args.name,
28635366140SVitaliy Mysak                                            mode=args.mode,
2874d91b4efSrafalste                                            cache_line_size=args.cache_line_size,
28835366140SVitaliy Mysak                                            cache_bdev_name=args.cache_bdev_name,
28935366140SVitaliy Mysak                                            core_bdev_name=args.core_bdev_name))
2907aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_ocf_create', help='Add an OCF block device')
29135366140SVitaliy Mysak    p.add_argument('name', help='Name of resulting OCF bdev')
29220894340SMarcin Dziegielewski    p.add_argument('mode', help='OCF cache mode', choices=['wb', 'wt', 'pt', 'wa', 'wi', 'wo'])
2934d91b4efSrafalste    p.add_argument(
2944d91b4efSrafalste        '--cache-line-size',
2954d91b4efSrafalste        help='OCF cache line size. The unit is KiB',
2964d91b4efSrafalste        type=int,
2974d91b4efSrafalste        choices=[4, 8, 16, 32, 64],
2984d91b4efSrafalste        required=False,
2994d91b4efSrafalste        default=0,
3004d91b4efSrafalste    )
30135366140SVitaliy Mysak    p.add_argument('cache_bdev_name', help='Name of underlying cache bdev')
3021ff3715dSJosh Soref    p.add_argument('core_bdev_name', help='Name of underlying core bdev')
303557f8ff9SPawel Kaminski    p.set_defaults(func=bdev_ocf_create)
30435366140SVitaliy Mysak
305557f8ff9SPawel Kaminski    def bdev_ocf_delete(args):
306557f8ff9SPawel Kaminski        rpc.bdev.bdev_ocf_delete(args.client,
30735366140SVitaliy Mysak                                 name=args.name)
30835366140SVitaliy Mysak
3097aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_ocf_delete', help='Delete an OCF block device')
31035366140SVitaliy Mysak    p.add_argument('name', help='Name of OCF bdev')
311557f8ff9SPawel Kaminski    p.set_defaults(func=bdev_ocf_delete)
31235366140SVitaliy Mysak
31395482c54SPawel Kaminski    def bdev_ocf_get_stats(args):
31495482c54SPawel Kaminski        print_dict(rpc.bdev.bdev_ocf_get_stats(args.client,
31527e0190bSVitaliy Mysak                                               name=args.name))
3167aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_ocf_get_stats', help='Get statistics of chosen OCF block device')
31727e0190bSVitaliy Mysak    p.add_argument('name', help='Name of OCF bdev')
31895482c54SPawel Kaminski    p.set_defaults(func=bdev_ocf_get_stats)
31927e0190bSVitaliy Mysak
32095482c54SPawel Kaminski    def bdev_ocf_get_bdevs(args):
32195482c54SPawel Kaminski        print_dict(rpc.bdev.bdev_ocf_get_bdevs(args.client,
322bef0c6edSVitaliy Mysak                                               name=args.name))
3237aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_ocf_get_bdevs', help='Get list of OCF devices including unregistered ones')
324bef0c6edSVitaliy Mysak    p.add_argument('name', nargs='?', default=None, help='name of OCF vbdev or name of cache device or name of core device (optional)')
32595482c54SPawel Kaminski    p.set_defaults(func=bdev_ocf_get_bdevs)
326199080cfSVitaliy Mysak
3275bdaec63SRafal Stefanowski    def bdev_ocf_set_cache_mode(args):
3285bdaec63SRafal Stefanowski        print_json(rpc.bdev.bdev_ocf_set_cache_mode(args.client,
3295bdaec63SRafal Stefanowski                                                    name=args.name,
3305bdaec63SRafal Stefanowski                                                    mode=args.mode))
3315bdaec63SRafal Stefanowski    p = subparsers.add_parser('bdev_ocf_set_cache_mode',
3325bdaec63SRafal Stefanowski                              help='Set cache mode of OCF block device')
3335bdaec63SRafal Stefanowski    p.add_argument('name', help='Name of OCF bdev')
3345bdaec63SRafal Stefanowski    p.add_argument('mode', help='OCF cache mode', choices=['wb', 'wt', 'pt', 'wa', 'wi', 'wo'])
3355bdaec63SRafal Stefanowski    p.set_defaults(func=bdev_ocf_set_cache_mode)
3365bdaec63SRafal Stefanowski
337494b1ba8SRafal Stefanowski    def bdev_ocf_set_seqcutoff(args):
338494b1ba8SRafal Stefanowski        rpc.bdev.bdev_ocf_set_seqcutoff(args.client,
339494b1ba8SRafal Stefanowski                                        name=args.name,
340494b1ba8SRafal Stefanowski                                        policy=args.policy,
341494b1ba8SRafal Stefanowski                                        threshold=args.threshold,
342494b1ba8SRafal Stefanowski                                        promotion_count=args.promotion_count)
343494b1ba8SRafal Stefanowski    p = subparsers.add_parser('bdev_ocf_set_seqcutoff',
344494b1ba8SRafal Stefanowski                              help='Set sequential cutoff parameters on all cores for the given OCF cache device')
345494b1ba8SRafal Stefanowski    p.add_argument('name', help='Name of OCF cache bdev')
346494b1ba8SRafal Stefanowski    p.add_argument('-t', '--threshold', type=int,
347494b1ba8SRafal Stefanowski                   help='Activation threshold [KiB]')
348494b1ba8SRafal Stefanowski    p.add_argument('-c', '--promotion-count', type=int,
349494b1ba8SRafal Stefanowski                   help='Promotion request count')
350494b1ba8SRafal Stefanowski    p.add_argument('-p', '--policy', choices=['always', 'full', 'never'], required=True,
351494b1ba8SRafal Stefanowski                   help='Sequential cutoff policy')
352494b1ba8SRafal Stefanowski    p.set_defaults(func=bdev_ocf_set_seqcutoff)
353494b1ba8SRafal Stefanowski
3547964f1dfSPawel Kaminski    def bdev_malloc_create(args):
3551ea97654SDaniel Verkamp        num_blocks = (args.total_size * 1024 * 1024) // args.block_size
3567964f1dfSPawel Kaminski        print_json(rpc.bdev.bdev_malloc_create(args.client,
35722637292SPawel Wodkowski                                               num_blocks=int(num_blocks),
3581ea97654SDaniel Verkamp                                               block_size=args.block_size,
3591ea97654SDaniel Verkamp                                               name=args.name,
3605e1e850bSAlexey Marchuk                                               uuid=args.uuid,
3615e1e850bSAlexey Marchuk                                               optimal_io_boundary=args.optimal_io_boundary))
362c77f17a5Swanghailiangx    p = subparsers.add_parser('bdev_malloc_create', help='Create a bdev with malloc backend')
3634dd3f4a7SBen Walker    p.add_argument('-b', '--name', help="Name of the bdev")
364eca9ac03SDaniel Verkamp    p.add_argument('-u', '--uuid', help="UUID of the bdev")
3654dd3f4a7SBen Walker    p.add_argument(
36622637292SPawel Wodkowski        'total_size', help='Size of malloc bdev in MB (float > 0)', type=float)
3674dd3f4a7SBen Walker    p.add_argument('block_size', help='Block size for this bdev', type=int)
3685e1e850bSAlexey Marchuk    p.add_argument('-o', '--optimal-io-boundary', help="""Split on optimal IO boundary, in number of
3695e1e850bSAlexey Marchuk    blocks, default 0 (disabled)""", type=int)
3707964f1dfSPawel Kaminski    p.set_defaults(func=bdev_malloc_create)
371df897ed4SDaniel Verkamp
37206a1b419SPawel Kaminski    def bdev_malloc_delete(args):
37306a1b419SPawel Kaminski        rpc.bdev.bdev_malloc_delete(args.client,
37459dee78bSTomasz Zawadzki                                    name=args.name)
37559dee78bSTomasz Zawadzki
376c77f17a5Swanghailiangx    p = subparsers.add_parser('bdev_malloc_delete', help='Delete a malloc disk')
37759dee78bSTomasz Zawadzki    p.add_argument('name', help='malloc bdev name')
37806a1b419SPawel Kaminski    p.set_defaults(func=bdev_malloc_delete)
37959dee78bSTomasz Zawadzki
38060563dfeSPawel Kaminski    def bdev_null_create(args):
3811ea97654SDaniel Verkamp        num_blocks = (args.total_size * 1024 * 1024) // args.block_size
3827ff4e2afSKarol Latecki        if args.dif_type and not args.md_size:
3837ff4e2afSKarol Latecki            print("ERROR: --md-size must be > 0 when --dif-type is > 0")
3847ff4e2afSKarol Latecki            exit(1)
38560563dfeSPawel Kaminski        print_json(rpc.bdev.bdev_null_create(args.client,
3861ea97654SDaniel Verkamp                                             num_blocks=num_blocks,
3871ea97654SDaniel Verkamp                                             block_size=args.block_size,
3881ea97654SDaniel Verkamp                                             name=args.name,
3898031dfe2SEvgeniy Kochetov                                             uuid=args.uuid,
39020aeec56SEvgeniy Kochetov                                             md_size=args.md_size,
39120aeec56SEvgeniy Kochetov                                             dif_type=args.dif_type,
39220aeec56SEvgeniy Kochetov                                             dif_is_head_of_md=args.dif_is_head_of_md))
3936f01da76SDaniel Verkamp
394c77f17a5Swanghailiangx    p = subparsers.add_parser('bdev_null_create', help='Add a bdev with null backend')
3954dd3f4a7SBen Walker    p.add_argument('name', help='Block device name')
39684918cd9SDaniel Verkamp    p.add_argument('-u', '--uuid', help='UUID of the bdev')
3977ff4e2afSKarol Latecki    p.add_argument('total_size', help='Size of null bdev in MB (int > 0). Includes only data blocks.', type=int)
3987ff4e2afSKarol Latecki    p.add_argument('block_size', help='Block size for this bdev.'
3997ff4e2afSKarol Latecki                                      'Should be a sum of block size and metadata size if --md-size is used.', type=int)
4008031dfe2SEvgeniy Kochetov    p.add_argument('-m', '--md-size', type=int,
4017ff4e2afSKarol Latecki                   help='Metadata size for this bdev. Default=0.')
4027ff4e2afSKarol Latecki    p.add_argument('-t', '--dif-type', type=int, default=0, choices=[0, 1, 2, 3],
4037ff4e2afSKarol Latecki                   help='Protection information type. Parameter --md-size needs'
4047ff4e2afSKarol Latecki                        'to be set along --dif-type. Default=0 - no protection.')
40520aeec56SEvgeniy Kochetov    p.add_argument('-d', '--dif-is-head-of-md', action='store_true',
4067ff4e2afSKarol Latecki                   help='Protection information is in the first 8 bytes of metadata. Default=false.')
40760563dfeSPawel Kaminski    p.set_defaults(func=bdev_null_create)
408df897ed4SDaniel Verkamp
40960563dfeSPawel Kaminski    def bdev_null_delete(args):
41060563dfeSPawel Kaminski        rpc.bdev.bdev_null_delete(args.client,
4112ce9836bSMaciej Szwed                                  name=args.name)
4122ce9836bSMaciej Szwed
413c77f17a5Swanghailiangx    p = subparsers.add_parser('bdev_null_delete', help='Delete a null bdev')
4142ce9836bSMaciej Szwed    p.add_argument('name', help='null bdev name')
41560563dfeSPawel Kaminski    p.set_defaults(func=bdev_null_delete)
4162ce9836bSMaciej Szwed
417d0657f32SJin Yu    def bdev_null_resize(args):
418d0657f32SJin Yu        print_json(rpc.bdev.bdev_null_resize(args.client,
419d0657f32SJin Yu                                             name=args.name,
420d0657f32SJin Yu                                             new_size=int(args.new_size)))
421d0657f32SJin Yu
422d0657f32SJin Yu    p = subparsers.add_parser('bdev_null_resize',
423d0657f32SJin Yu                              help='Resize a null bdev')
424d0657f32SJin Yu    p.add_argument('name', help='null bdev name')
425d0657f32SJin Yu    p.add_argument('new_size', help='new bdev size for resize operation. The unit is MiB')
426d0657f32SJin Yu    p.set_defaults(func=bdev_null_resize)
427d0657f32SJin Yu
428acaa079bSMaciej Wawryk    def bdev_aio_create(args):
429acaa079bSMaciej Wawryk        print_json(rpc.bdev.bdev_aio_create(args.client,
4301ea97654SDaniel Verkamp                                            filename=args.filename,
4311ea97654SDaniel Verkamp                                            name=args.name,
4321ea97654SDaniel Verkamp                                            block_size=args.block_size))
4336f01da76SDaniel Verkamp
4347aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_aio_create', help='Add a bdev with aio backend')
4354dd3f4a7SBen Walker    p.add_argument('filename', help='Path to device or file (ex: /dev/sda)')
4364dd3f4a7SBen Walker    p.add_argument('name', help='Block device name')
437b5f32138SDaniel Verkamp    p.add_argument('block_size', help='Block size for this bdev', type=int, nargs='?', default=0)
438acaa079bSMaciej Wawryk    p.set_defaults(func=bdev_aio_create)
439df897ed4SDaniel Verkamp
440b635d19aSshuochen0311    def bdev_aio_rescan(args):
441b635d19aSshuochen0311        print_json(rpc.bdev.bdev_aio_rescan(args.client,
442b635d19aSshuochen0311                                            name=args.name))
443b635d19aSshuochen0311
444b635d19aSshuochen0311    p = subparsers.add_parser('bdev_aio_rescan', help='Rescan a bdev size with aio backend')
445b635d19aSshuochen0311    p.add_argument('name', help='Block device name')
446b635d19aSshuochen0311    p.set_defaults(func=bdev_aio_rescan)
447b635d19aSshuochen0311
448acaa079bSMaciej Wawryk    def bdev_aio_delete(args):
449acaa079bSMaciej Wawryk        rpc.bdev.bdev_aio_delete(args.client,
45096e93bd8STomasz Zawadzki                                 name=args.name)
45196e93bd8STomasz Zawadzki
4527aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_aio_delete', help='Delete an aio disk')
45396e93bd8STomasz Zawadzki    p.add_argument('name', help='aio bdev name')
454acaa079bSMaciej Wawryk    p.set_defaults(func=bdev_aio_delete)
45596e93bd8STomasz Zawadzki
456c8b6a884SJohn Kariuki    def bdev_uring_create(args):
457c8b6a884SJohn Kariuki        print_json(rpc.bdev.bdev_uring_create(args.client,
458c8b6a884SJohn Kariuki                                              filename=args.filename,
459ec2ba7aaSYao Liu                                              name=args.name,
460ec2ba7aaSYao Liu                                              block_size=args.block_size))
461c8b6a884SJohn Kariuki
462c8b6a884SJohn Kariuki    p = subparsers.add_parser('bdev_uring_create', help='Create a bdev with io_uring backend')
463c8b6a884SJohn Kariuki    p.add_argument('filename', help='Path to device or file (ex: /dev/nvme0n1)')
464ff93f0f9SYao Liu    p.add_argument('name', help='bdev name')
465ec2ba7aaSYao Liu    p.add_argument('block_size', help='Block size for this bdev', type=int, nargs='?', default=0)
466c8b6a884SJohn Kariuki    p.set_defaults(func=bdev_uring_create)
467c8b6a884SJohn Kariuki
468c8b6a884SJohn Kariuki    def bdev_uring_delete(args):
469c8b6a884SJohn Kariuki        rpc.bdev.bdev_uring_delete(args.client,
470c8b6a884SJohn Kariuki                                   name=args.name)
471c8b6a884SJohn Kariuki
472c8b6a884SJohn Kariuki    p = subparsers.add_parser('bdev_uring_delete', help='Delete a uring bdev')
473c8b6a884SJohn Kariuki    p.add_argument('name', help='uring bdev name')
474c8b6a884SJohn Kariuki    p.set_defaults(func=bdev_uring_delete)
475c8b6a884SJohn Kariuki
47610d8b7c3SPawel Kaminski    def bdev_nvme_set_options(args):
47710d8b7c3SPawel Kaminski        rpc.bdev.bdev_nvme_set_options(args.client,
4784bef621eSPawel Wodkowski                                       action_on_timeout=args.action_on_timeout,
479e7878c7cSPawel Niedzwiecki                                       timeout_us=args.timeout_us,
48067fbfdd8SMatt Dumm                                       timeout_admin_us=args.timeout_admin_us,
48146a34859SJin Yu                                       keep_alive_timeout_ms=args.keep_alive_timeout_ms,
4824bef621eSPawel Wodkowski                                       retry_count=args.retry_count,
4837f6fdcffSChangpeng Liu                                       arbitration_burst=args.arbitration_burst,
4847f6fdcffSChangpeng Liu                                       low_priority_weight=args.low_priority_weight,
4857f6fdcffSChangpeng Liu                                       medium_priority_weight=args.medium_priority_weight,
4867f6fdcffSChangpeng Liu                                       high_priority_weight=args.high_priority_weight,
487a741e341SBen Walker                                       nvme_adminq_poll_period_us=args.nvme_adminq_poll_period_us,
48890520634SChangpeng Liu                                       nvme_ioq_poll_period_us=args.nvme_ioq_poll_period_us,
489542be879SEvgeniy Kochetov                                       io_queue_requests=args.io_queue_requests,
4904495bda4SShuhei Matsumoto                                       delay_cmd_submit=args.delay_cmd_submit,
49143adb646SShuhei Matsumoto                                       transport_retry_count=args.transport_retry_count,
4922ccaf2acSAlexey Marchuk                                       bdev_retry_count=args.bdev_retry_count,
4930fba8dc8SShuhei Matsumoto                                       transport_ack_timeout=args.transport_ack_timeout,
4940fba8dc8SShuhei Matsumoto                                       ctrlr_loss_timeout_sec=args.ctrlr_loss_timeout_sec,
4950fba8dc8SShuhei Matsumoto                                       reconnect_delay_sec=args.reconnect_delay_sec,
49600d46b80SShuhei Matsumoto                                       fast_io_fail_timeout_sec=args.fast_io_fail_timeout_sec,
49700d46b80SShuhei Matsumoto                                       disable_auto_failback=args.disable_auto_failback)
4984bef621eSPawel Wodkowski
4997aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_nvme_set_options',
5004bef621eSPawel Wodkowski                              help='Set options for the bdev nvme type. This is startup command.')
5014bef621eSPawel Wodkowski    p.add_argument('-a', '--action-on-timeout',
5021ff3715dSJosh Soref                   help="Action to take on command time out. Valid values are: none, reset, abort")
5034bef621eSPawel Wodkowski    p.add_argument('-t', '--timeout-us',
5044bef621eSPawel Wodkowski                   help="Timeout for each command, in microseconds. If 0, don't track timeouts.", type=int)
50567fbfdd8SMatt Dumm    p.add_argument('--timeout-admin-us',
50667fbfdd8SMatt Dumm                   help="Timeout for each admin command, in microseconds. If 0, treat same as io timeouts.", type=int)
50746a34859SJin Yu    p.add_argument('-k', '--keep-alive-timeout-ms',
50846a34859SJin Yu                   help="Keep alive timeout period in millisecond. If 0, disable keep-alive.", type=int)
5094bef621eSPawel Wodkowski    p.add_argument('-n', '--retry-count',
5104495bda4SShuhei Matsumoto                   help='the number of attempts per I/O when an I/O fails. (deprecated, please use --transport-retry-count.)', type=int)
5117f6fdcffSChangpeng Liu    p.add_argument('--arbitration-burst',
5127f6fdcffSChangpeng Liu                   help='the value is expressed as a power of two', type=int)
5137f6fdcffSChangpeng Liu    p.add_argument('--low-priority-weight',
5147f6fdcffSChangpeng Liu                   help='the maximum number of commands that the controller may launch at one time from a low priority queue', type=int)
5157f6fdcffSChangpeng Liu    p.add_argument('--medium-priority-weight',
5167f6fdcffSChangpeng Liu                   help='the maximum number of commands that the controller may launch at one time from a medium priority queue', type=int)
5177f6fdcffSChangpeng Liu    p.add_argument('--high-priority-weight',
5187f6fdcffSChangpeng Liu                   help='the maximum number of commands that the controller may launch at one time from a high priority queue', type=int)
5194bef621eSPawel Wodkowski    p.add_argument('-p', '--nvme-adminq-poll-period-us',
5204bef621eSPawel Wodkowski                   help='How often the admin queue is polled for asynchronous events', type=int)
521a741e341SBen Walker    p.add_argument('-i', '--nvme-ioq-poll-period-us',
522a741e341SBen Walker                   help='How often to poll I/O queues for completions', type=int)
52390520634SChangpeng Liu    p.add_argument('-s', '--io-queue-requests',
52490520634SChangpeng Liu                   help='The number of requests allocated for each NVMe I/O queue. Default: 512', type=int)
525542be879SEvgeniy Kochetov    p.add_argument('-d', '--disable-delay-cmd-submit',
526542be879SEvgeniy Kochetov                   help='Disable delaying NVMe command submission, i.e. no batching of multiple commands',
527542be879SEvgeniy Kochetov                   action='store_false', dest='delay_cmd_submit', default=True)
5284495bda4SShuhei Matsumoto    p.add_argument('-c', '--transport-retry-count',
5294495bda4SShuhei Matsumoto                   help='the number of attempts per I/O in the transport layer when an I/O fails.', type=int)
53043adb646SShuhei Matsumoto    p.add_argument('-r', '--bdev-retry-count',
53143adb646SShuhei Matsumoto                   help='the number of attempts per I/O in the bdev layer when an I/O fails. -1 means infinite retries.', type=int)
5322ccaf2acSAlexey Marchuk    p.add_argument('-e', '--transport-ack-timeout',
53331db7b13Szhangduan                   help="""Time to wait ack until packet retransmission for RDMA or until closes connection for TCP.
5342ccaf2acSAlexey Marchuk                   Range 0-31 where 0 is driver-specific default value.""", type=int)
5350fba8dc8SShuhei Matsumoto    p.add_argument('-l', '--ctrlr-loss-timeout-sec',
5360fba8dc8SShuhei Matsumoto                   help="""Time to wait until ctrlr is reconnected before deleting ctrlr.
5370fba8dc8SShuhei Matsumoto                   -1 means infinite reconnect retries. 0 means no reconnect retry.
5380fba8dc8SShuhei Matsumoto                   If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero.
5390fba8dc8SShuhei Matsumoto                   If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than
5400fba8dc8SShuhei Matsumoto                   reconnect_delay_sec.
5410fba8dc8SShuhei Matsumoto                   This can be overridden by bdev_nvme_attach_controller.""",
5420fba8dc8SShuhei Matsumoto                   type=int)
5430fba8dc8SShuhei Matsumoto    p.add_argument('-o', '--reconnect-delay-sec',
5440fba8dc8SShuhei Matsumoto                   help="""Time to delay a reconnect retry.
5450fba8dc8SShuhei Matsumoto                   If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero.
5460fba8dc8SShuhei Matsumoto                   If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero.
5470fba8dc8SShuhei Matsumoto                   If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_delay_sec has to be non-zero and
5480fba8dc8SShuhei Matsumoto                   less than ctrlr_loss_timeout_sec.
5490fba8dc8SShuhei Matsumoto                   This can be overridden by bdev_nvme_attach_controller.""",
5500fba8dc8SShuhei Matsumoto                   type=int)
5510fba8dc8SShuhei Matsumoto    p.add_argument('-u', '--fast-io-fail-timeout-sec',
5520fba8dc8SShuhei Matsumoto                   help="""Time to wait until ctrlr is reconnected before failing I/O to ctrlr.
5530fba8dc8SShuhei Matsumoto                   0 means no such timeout.
5540fba8dc8SShuhei Matsumoto                   If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and
5550fba8dc8SShuhei Matsumoto                   less than ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1.
5560fba8dc8SShuhei Matsumoto                   This can be overridden by bdev_nvme_attach_controller.""",
5570fba8dc8SShuhei Matsumoto                   type=int)
55800d46b80SShuhei Matsumoto    p.add_argument('-f', '--disable-auto-failback',
55900d46b80SShuhei Matsumoto                   help="""Disable automatic failback. bdev_nvme_set_preferred_path can be used to do manual failback.
56000d46b80SShuhei Matsumoto                   By default, immediately failback to the preferred I/O path if it restored.""",
56100d46b80SShuhei Matsumoto                   action='store_true')
56243adb646SShuhei Matsumoto
56310d8b7c3SPawel Kaminski    p.set_defaults(func=bdev_nvme_set_options)
5644bef621eSPawel Wodkowski
56561a42c0eSPawel Kaminski    def bdev_nvme_set_hotplug(args):
56661a42c0eSPawel Kaminski        rpc.bdev.bdev_nvme_set_hotplug(args.client, enable=args.enable, period_us=args.period_us)
5675f9bdac0SPawel Wodkowski
5687aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_nvme_set_hotplug', help='Set hotplug options for bdev nvme type.')
5695f9bdac0SPawel Wodkowski    p.add_argument('-d', '--disable', dest='enable', default=False, action='store_false', help="Disable hotplug (default)")
5705f9bdac0SPawel Wodkowski    p.add_argument('-e', '--enable', dest='enable', action='store_true', help="Enable hotplug")
5715f9bdac0SPawel Wodkowski    p.add_argument('-r', '--period-us',
5725f9bdac0SPawel Wodkowski                   help='How often the hotplug is processed for insert and remove events', type=int)
57361a42c0eSPawel Kaminski    p.set_defaults(func=bdev_nvme_set_hotplug)
5745f9bdac0SPawel Wodkowski
575f54df840SPawel Kaminski    def bdev_nvme_attach_controller(args):
576f54df840SPawel Kaminski        print_array(rpc.bdev.bdev_nvme_attach_controller(args.client,
5771ea97654SDaniel Verkamp                                                         name=args.name,
5781ea97654SDaniel Verkamp                                                         trtype=args.trtype,
5791ea97654SDaniel Verkamp                                                         traddr=args.traddr,
5801ea97654SDaniel Verkamp                                                         adrfam=args.adrfam,
5811ea97654SDaniel Verkamp                                                         trsvcid=args.trsvcid,
58294345a0aSZiye Yang                                                         priority=args.priority,
583088379cfSSeth Howell                                                         subnqn=args.subnqn,
584cc7a099cSSeth Howell                                                         hostnqn=args.hostnqn,
585088379cfSSeth Howell                                                         hostaddr=args.hostaddr,
586260f9a77SShuhei Matsumoto                                                         hostsvcid=args.hostsvcid,
587260f9a77SShuhei Matsumoto                                                         prchk_reftag=args.prchk_reftag,
58805aeb9dbSAlexey Marchuk                                                         prchk_guard=args.prchk_guard,
58905aeb9dbSAlexey Marchuk                                                         hdgst=args.hdgst,
590d1e67b8bSJim Harris                                                         ddgst=args.ddgst,
591a24d5490SBen Walker                                                         fabrics_timeout=args.fabrics_timeout,
592d39cbc13SAdam Aronov                                                         multipath=args.multipath,
593ae4e54fdSShuhei Matsumoto                                                         num_io_queues=args.num_io_queues,
594ae4e54fdSShuhei Matsumoto                                                         ctrlr_loss_timeout_sec=args.ctrlr_loss_timeout_sec,
59580e81273SShuhei Matsumoto                                                         reconnect_delay_sec=args.reconnect_delay_sec,
59680e81273SShuhei Matsumoto                                                         fast_io_fail_timeout_sec=args.fast_io_fail_timeout_sec))
5971e92d78aSBen Walker
5987aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_nvme_attach_controller', help='Add bdevs with nvme backend')
59998187ed9SLiu Xiaodong    p.add_argument('-b', '--name', help="Name of the NVMe controller, prefix for each bdev name", required=True)
6004dd3f4a7SBen Walker    p.add_argument('-t', '--trtype',
6014dd3f4a7SBen Walker                   help='NVMe-oF target trtype: e.g., rdma, pcie', required=True)
6024dd3f4a7SBen Walker    p.add_argument('-a', '--traddr',
6034dd3f4a7SBen Walker                   help='NVMe-oF target address: e.g., an ip address or BDF', required=True)
6044dd3f4a7SBen Walker    p.add_argument('-f', '--adrfam',
6054dd3f4a7SBen Walker                   help='NVMe-oF target adrfam: e.g., ipv4, ipv6, ib, fc, intra_host')
6064dd3f4a7SBen Walker    p.add_argument('-s', '--trsvcid',
6074dd3f4a7SBen Walker                   help='NVMe-oF target trsvcid: e.g., a port number')
60894345a0aSZiye Yang    p.add_argument('-p', '--priority',
60994345a0aSZiye Yang                   help='NVMe-oF connection priority: e.g., a priority number')
6104dd3f4a7SBen Walker    p.add_argument('-n', '--subnqn', help='NVMe-oF target subnqn')
611cc7a099cSSeth Howell    p.add_argument('-q', '--hostnqn', help='NVMe-oF host subnqn')
612088379cfSSeth Howell    p.add_argument('-i', '--hostaddr',
613088379cfSSeth Howell                   help='NVMe-oF host address: e.g., an ip address')
614088379cfSSeth Howell    p.add_argument('-c', '--hostsvcid',
615088379cfSSeth Howell                   help='NVMe-oF host svcid: e.g., a port number')
616260f9a77SShuhei Matsumoto    p.add_argument('-r', '--prchk-reftag',
617260f9a77SShuhei Matsumoto                   help='Enable checking of PI reference tag for I/O processing.', action='store_true')
618260f9a77SShuhei Matsumoto    p.add_argument('-g', '--prchk-guard',
619260f9a77SShuhei Matsumoto                   help='Enable checking of PI guard for I/O processing.', action='store_true')
62005aeb9dbSAlexey Marchuk    p.add_argument('-e', '--hdgst',
62105aeb9dbSAlexey Marchuk                   help='Enable TCP header digest.', action='store_true')
62205aeb9dbSAlexey Marchuk    p.add_argument('-d', '--ddgst',
62305aeb9dbSAlexey Marchuk                   help='Enable TCP data digest.', action='store_true')
624d1e67b8bSJim Harris    p.add_argument('--fabrics-timeout', type=int, help='Fabrics connect timeout in microseconds')
62585c77ec1SShuhei Matsumoto    p.add_argument('-x', '--multipath', help='Set multipath behavior (disable, failover, multipath)')
626d39cbc13SAdam Aronov    p.add_argument('--num-io-queues', type=int, help='Set the number of IO queues to request during initialization.')
627ae4e54fdSShuhei Matsumoto    p.add_argument('-l', '--ctrlr-loss-timeout-sec',
628ae4e54fdSShuhei Matsumoto                   help="""Time to wait until ctrlr is reconnected before deleting ctrlr.
629ae4e54fdSShuhei Matsumoto                   -1 means infinite reconnect retries. 0 means no reconnect retry.
630ae4e54fdSShuhei Matsumoto                   If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero.
631ae4e54fdSShuhei Matsumoto                   If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than
632ae4e54fdSShuhei Matsumoto                   reconnect_delay_sec.""",
633ae4e54fdSShuhei Matsumoto                   type=int)
634ae4e54fdSShuhei Matsumoto    p.add_argument('-o', '--reconnect-delay-sec',
635ae4e54fdSShuhei Matsumoto                   help="""Time to delay a reconnect retry.
636ae4e54fdSShuhei Matsumoto                   If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero.
637ae4e54fdSShuhei Matsumoto                   If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero.
638ae4e54fdSShuhei Matsumoto                   If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_delay_sec has to be non-zero and
639ae4e54fdSShuhei Matsumoto                   less than ctrlr_loss_timeout_sec.""",
640ae4e54fdSShuhei Matsumoto                   type=int)
64180e81273SShuhei Matsumoto    p.add_argument('-u', '--fast-io-fail-timeout-sec',
64280e81273SShuhei Matsumoto                   help="""Time to wait until ctrlr is reconnected before failing I/O to ctrlr.
64380e81273SShuhei Matsumoto                   0 means no such timeout.
64480e81273SShuhei Matsumoto                   If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and
64580e81273SShuhei Matsumoto                   less than ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1.""",
64680e81273SShuhei Matsumoto                   type=int)
647f54df840SPawel Kaminski    p.set_defaults(func=bdev_nvme_attach_controller)
648df897ed4SDaniel Verkamp
6495a2c2993SPawel Kaminski    def bdev_nvme_get_controllers(args):
6505a2c2993SPawel Kaminski        print_dict(rpc.nvme.bdev_nvme_get_controllers(args.client,
65143b335f9SLiu Xiaodong                                                      name=args.name))
65243b335f9SLiu Xiaodong
65343b335f9SLiu Xiaodong    p = subparsers.add_parser(
6547aa92ad5Swanghailiangx        'bdev_nvme_get_controllers', help='Display current NVMe controllers list or required NVMe controller')
65543b335f9SLiu Xiaodong    p.add_argument('-n', '--name', help="Name of the NVMe controller. Example: Nvme0", required=False)
6565a2c2993SPawel Kaminski    p.set_defaults(func=bdev_nvme_get_controllers)
65743b335f9SLiu Xiaodong
65831e77a73SPawel Kaminski    def bdev_nvme_detach_controller(args):
65931e77a73SPawel Kaminski        rpc.bdev.bdev_nvme_detach_controller(args.client,
6608bff48f6SSeth Howell                                             name=args.name,
6618bff48f6SSeth Howell                                             trtype=args.trtype,
6628bff48f6SSeth Howell                                             traddr=args.traddr,
6638bff48f6SSeth Howell                                             adrfam=args.adrfam,
6648bff48f6SSeth Howell                                             trsvcid=args.trsvcid,
665b098640fSBen Walker                                             subnqn=args.subnqn,
666b098640fSBen Walker                                             hostaddr=args.hostaddr,
667b098640fSBen Walker                                             hostsvcid=args.hostsvcid)
6683a56fabcSTomasz Zawadzki
6697aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_nvme_detach_controller',
67031e77a73SPawel Kaminski                              help='Detach an NVMe controller and delete any associated bdevs')
6713a56fabcSTomasz Zawadzki    p.add_argument('name', help="Name of the controller")
6728bff48f6SSeth Howell    p.add_argument('-t', '--trtype',
6738bff48f6SSeth Howell                   help='NVMe-oF target trtype: e.g., rdma, pcie')
6748bff48f6SSeth Howell    p.add_argument('-a', '--traddr',
6758bff48f6SSeth Howell                   help='NVMe-oF target address: e.g., an ip address or BDF')
6768bff48f6SSeth Howell    p.add_argument('-f', '--adrfam',
6778bff48f6SSeth Howell                   help='NVMe-oF target adrfam: e.g., ipv4, ipv6, ib, fc, intra_host')
6788bff48f6SSeth Howell    p.add_argument('-s', '--trsvcid',
6798bff48f6SSeth Howell                   help='NVMe-oF target trsvcid: e.g., a port number')
6808bff48f6SSeth Howell    p.add_argument('-n', '--subnqn', help='NVMe-oF target subnqn')
681b098640fSBen Walker    p.add_argument('-i', '--hostaddr',
682b098640fSBen Walker                   help='NVMe-oF host address: e.g., an ip address')
683b098640fSBen Walker    p.add_argument('-c', '--hostsvcid',
684b098640fSBen Walker                   help='NVMe-oF host svcid: e.g., a port number')
68531e77a73SPawel Kaminski    p.set_defaults(func=bdev_nvme_detach_controller)
6863a56fabcSTomasz Zawadzki
687153f03cfSJonathan Teh    def bdev_nvme_reset_controller(args):
688153f03cfSJonathan Teh        rpc.bdev.bdev_nvme_reset_controller(args.client, name=args.name)
689153f03cfSJonathan Teh
690153f03cfSJonathan Teh    p = subparsers.add_parser('bdev_nvme_reset_controller',
691153f03cfSJonathan Teh                              help='Reset an NVMe controller')
692153f03cfSJonathan Teh    p.add_argument('name', help="Name of the NVMe controller")
693153f03cfSJonathan Teh    p.set_defaults(func=bdev_nvme_reset_controller)
694153f03cfSJonathan Teh
695b68f2eebSJim Harris    def bdev_nvme_start_discovery(args):
696b68f2eebSJim Harris        rpc.bdev.bdev_nvme_start_discovery(args.client,
697b68f2eebSJim Harris                                           name=args.name,
698b68f2eebSJim Harris                                           trtype=args.trtype,
699b68f2eebSJim Harris                                           traddr=args.traddr,
700b68f2eebSJim Harris                                           adrfam=args.adrfam,
701b68f2eebSJim Harris                                           trsvcid=args.trsvcid,
70213cffc5eSJim Harris                                           hostnqn=args.hostnqn,
7030bd7ace8SJim Harris                                           wait_for_attach=args.wait_for_attach,
704e5f9e822SKonrad Sztyber                                           attach_timeout_ms=args.attach_timeout_ms,
70513cffc5eSJim Harris                                           ctrlr_loss_timeout_sec=args.ctrlr_loss_timeout_sec,
70613cffc5eSJim Harris                                           reconnect_delay_sec=args.reconnect_delay_sec,
70713cffc5eSJim Harris                                           fast_io_fail_timeout_sec=args.fast_io_fail_timeout_sec)
708b68f2eebSJim Harris
709b68f2eebSJim Harris    p = subparsers.add_parser('bdev_nvme_start_discovery', help='Start automatic discovery')
710b68f2eebSJim Harris    p.add_argument('-b', '--name', help="Name of the NVMe controller prefix for each bdev name", required=True)
711b68f2eebSJim Harris    p.add_argument('-t', '--trtype',
712b68f2eebSJim Harris                   help='NVMe-oF target trtype: e.g., rdma, pcie', required=True)
713b68f2eebSJim Harris    p.add_argument('-a', '--traddr',
714b68f2eebSJim Harris                   help='NVMe-oF target address: e.g., an ip address or BDF', required=True)
715b68f2eebSJim Harris    p.add_argument('-f', '--adrfam',
716b68f2eebSJim Harris                   help='NVMe-oF target adrfam: e.g., ipv4, ipv6, ib, fc, intra_host')
717b68f2eebSJim Harris    p.add_argument('-s', '--trsvcid',
718b68f2eebSJim Harris                   help='NVMe-oF target trsvcid: e.g., a port number')
719b68f2eebSJim Harris    p.add_argument('-q', '--hostnqn', help='NVMe-oF host subnqn')
7200bd7ace8SJim Harris    p.add_argument('-w', '--wait-for-attach', action='store_true',
7210bd7ace8SJim Harris                   help='Do not complete RPC until all discovered NVM subsystems are attached')
722e5f9e822SKonrad Sztyber    p.add_argument('-T', '--attach-timeout-ms', type=int, required=False,
723e5f9e822SKonrad Sztyber                   help="""Time to wait until the discovery and all discovered NVM subsystems
724e5f9e822SKonrad Sztyber                        are attached (default: 0, meaning wait indefinitely).  Automatically
725e5f9e822SKonrad Sztyber                        selects the --wait-for-attach option.""")
72613cffc5eSJim Harris    p.add_argument('-l', '--ctrlr-loss-timeout-sec',
72713cffc5eSJim Harris                   help="""Time to wait until ctrlr is reconnected before deleting ctrlr.
72813cffc5eSJim Harris                   -1 means infinite reconnect retries. 0 means no reconnect retry.
72913cffc5eSJim Harris                   If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero.
73013cffc5eSJim Harris                   If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than
73113cffc5eSJim Harris                   reconnect_delay_sec.""",
73213cffc5eSJim Harris                   type=int)
73313cffc5eSJim Harris    p.add_argument('-o', '--reconnect-delay-sec',
73413cffc5eSJim Harris                   help="""Time to delay a reconnect retry.
73513cffc5eSJim Harris                   If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero.
73613cffc5eSJim Harris                   If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero.
73713cffc5eSJim Harris                   If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_delay_sec has to be non-zero and
73813cffc5eSJim Harris                   less than ctrlr_loss_timeout_sec.""",
73913cffc5eSJim Harris                   type=int)
74013cffc5eSJim Harris    p.add_argument('-u', '--fast-io-fail-timeout-sec',
74113cffc5eSJim Harris                   help="""Time to wait until ctrlr is reconnected before failing I/O to ctrlr.
74213cffc5eSJim Harris                   0 means no such timeout.
74313cffc5eSJim Harris                   If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and
74413cffc5eSJim Harris                   less than ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1.""",
74513cffc5eSJim Harris                   type=int)
746b68f2eebSJim Harris    p.set_defaults(func=bdev_nvme_start_discovery)
747b68f2eebSJim Harris
748932ee64bSJim Harris    def bdev_nvme_stop_discovery(args):
749932ee64bSJim Harris        rpc.bdev.bdev_nvme_stop_discovery(args.client, name=args.name)
750932ee64bSJim Harris
751932ee64bSJim Harris    p = subparsers.add_parser('bdev_nvme_stop_discovery', help='Stop automatic discovery')
752932ee64bSJim Harris    p.add_argument('-b', '--name', help="Name of the service to stop", required=True)
753932ee64bSJim Harris    p.set_defaults(func=bdev_nvme_stop_discovery)
754932ee64bSJim Harris
755f331ae16SKonrad Sztyber    def bdev_nvme_get_discovery_info(args):
756f331ae16SKonrad Sztyber        print_dict(rpc.bdev.bdev_nvme_get_discovery_info(args.client))
757f331ae16SKonrad Sztyber
758f331ae16SKonrad Sztyber    p = subparsers.add_parser('bdev_nvme_get_discovery_info', help='Get information about the automatic discovery')
759f331ae16SKonrad Sztyber    p.set_defaults(func=bdev_nvme_get_discovery_info)
760f331ae16SKonrad Sztyber
7612a6a6448SShuhei Matsumoto    def bdev_nvme_get_io_paths(args):
7622a6a6448SShuhei Matsumoto        print_dict(rpc.bdev.bdev_nvme_get_io_paths(args.client, name=args.name))
7632a6a6448SShuhei Matsumoto
7642a6a6448SShuhei Matsumoto    p = subparsers.add_parser('bdev_nvme_get_io_paths', help='Display active I/O paths')
7652a6a6448SShuhei Matsumoto    p.add_argument('-n', '--name', help="Name of the NVMe bdev", required=False)
7662a6a6448SShuhei Matsumoto    p.set_defaults(func=bdev_nvme_get_io_paths)
7672a6a6448SShuhei Matsumoto
76822b77a3cSShuhei Matsumoto    def bdev_nvme_set_preferred_path(args):
76922b77a3cSShuhei Matsumoto        rpc.bdev.bdev_nvme_set_preferred_path(args.client,
77022b77a3cSShuhei Matsumoto                                              name=args.name,
77122b77a3cSShuhei Matsumoto                                              cntlid=args.cntlid)
77222b77a3cSShuhei Matsumoto
77322b77a3cSShuhei Matsumoto    p = subparsers.add_parser('bdev_nvme_set_preferred_path',
77422b77a3cSShuhei Matsumoto                              help="""Set the preferred I/O path for an NVMe bdev when in multipath mode""")
77522b77a3cSShuhei Matsumoto    p.add_argument('-b', '--name', help='Name of the NVMe bdev', required=True)
77622b77a3cSShuhei Matsumoto    p.add_argument('-c', '--cntlid', help='NVMe-oF controller ID', type=int, required=True)
77722b77a3cSShuhei Matsumoto    p.set_defaults(func=bdev_nvme_set_preferred_path)
77822b77a3cSShuhei Matsumoto
7798f9b9775SShuhei Matsumoto    def bdev_nvme_set_multipath_policy(args):
7808f9b9775SShuhei Matsumoto        rpc.bdev.bdev_nvme_set_multipath_policy(args.client,
7818f9b9775SShuhei Matsumoto                                                name=args.name,
7828f9b9775SShuhei Matsumoto                                                policy=args.policy)
7838f9b9775SShuhei Matsumoto
7848f9b9775SShuhei Matsumoto    p = subparsers.add_parser('bdev_nvme_set_multipath_policy',
7858f9b9775SShuhei Matsumoto                              help="""Set multipath policy of the NVMe bdev""")
7868f9b9775SShuhei Matsumoto    p.add_argument('-b', '--name', help='Name of the NVMe bdev', required=True)
7878f9b9775SShuhei Matsumoto    p.add_argument('-p', '--policy', help='Multipath policy (active_passive or active_active)', required=True)
7888f9b9775SShuhei Matsumoto    p.set_defaults(func=bdev_nvme_set_multipath_policy)
7898f9b9775SShuhei Matsumoto
79074906b01STomasz Kulasek    def bdev_nvme_cuse_register(args):
79174906b01STomasz Kulasek        rpc.bdev.bdev_nvme_cuse_register(args.client,
792b7b45bc7STomasz Kulasek                                         name=args.name)
79374906b01STomasz Kulasek
79474906b01STomasz Kulasek    p = subparsers.add_parser('bdev_nvme_cuse_register',
79574906b01STomasz Kulasek                              help='Register CUSE devices on NVMe controller')
79674906b01STomasz Kulasek    p.add_argument('-n', '--name',
79774906b01STomasz Kulasek                   help='Name of the NVMe controller. Example: Nvme0', required=True)
79874906b01STomasz Kulasek    p.set_defaults(func=bdev_nvme_cuse_register)
79974906b01STomasz Kulasek
80074906b01STomasz Kulasek    def bdev_nvme_cuse_unregister(args):
80174906b01STomasz Kulasek        rpc.bdev.bdev_nvme_cuse_unregister(args.client,
80274906b01STomasz Kulasek                                           name=args.name)
80374906b01STomasz Kulasek
80474906b01STomasz Kulasek    p = subparsers.add_parser('bdev_nvme_cuse_unregister',
80574906b01STomasz Kulasek                              help='Unregister CUSE devices on NVMe controller')
80674906b01STomasz Kulasek    p.add_argument('-n', '--name',
80774906b01STomasz Kulasek                   help='Name of the NVMe controller. Example: Nvme0', required=True)
80874906b01STomasz Kulasek    p.set_defaults(func=bdev_nvme_cuse_unregister)
80974906b01STomasz Kulasek
810195be29eSMateusz Kozlowski    def bdev_zone_block_create(args):
811195be29eSMateusz Kozlowski        print_json(rpc.bdev.bdev_zone_block_create(args.client,
812195be29eSMateusz Kozlowski                                                   name=args.name,
813195be29eSMateusz Kozlowski                                                   base_bdev=args.base_bdev,
814195be29eSMateusz Kozlowski                                                   zone_capacity=args.zone_capacity,
815195be29eSMateusz Kozlowski                                                   optimal_open_zones=args.optimal_open_zones))
816195be29eSMateusz Kozlowski
817195be29eSMateusz Kozlowski    p = subparsers.add_parser('bdev_zone_block_create',
818195be29eSMateusz Kozlowski                              help='Create virtual zone namespace device with block device backend')
819195be29eSMateusz Kozlowski    p.add_argument('-b', '--name', help="Name of the zone device", required=True)
820195be29eSMateusz Kozlowski    p.add_argument('-n', '--base-bdev', help='Name of underlying, non-zoned bdev', required=True)
821195be29eSMateusz Kozlowski    p.add_argument('-z', '--zone-capacity', help='Surfaced zone capacity in blocks', type=int, required=True)
822195be29eSMateusz Kozlowski    p.add_argument('-o', '--optimal-open-zones', help='Number of zones required to reach optimal write speed', type=int, required=True)
823195be29eSMateusz Kozlowski    p.set_defaults(func=bdev_zone_block_create)
824195be29eSMateusz Kozlowski
825195be29eSMateusz Kozlowski    def bdev_zone_block_delete(args):
826195be29eSMateusz Kozlowski        rpc.bdev.bdev_zone_block_delete(args.client,
827195be29eSMateusz Kozlowski                                        name=args.name)
828195be29eSMateusz Kozlowski
829195be29eSMateusz Kozlowski    p = subparsers.add_parser('bdev_zone_block_delete', help='Delete a virtual zone namespace device')
830195be29eSMateusz Kozlowski    p.add_argument('name', help='Virtual zone bdev name')
831195be29eSMateusz Kozlowski    p.set_defaults(func=bdev_zone_block_delete)
832195be29eSMateusz Kozlowski
833e18eaee2SZiye Yang    def bdev_rbd_register_cluster(args):
834e18eaee2SZiye Yang        config_param = None
835e18eaee2SZiye Yang        if args.config_param:
836e18eaee2SZiye Yang            config_param = {}
837b4269996SAllen Zhu            for entry in args.config_param:
838e18eaee2SZiye Yang                parts = entry.split('=', 1)
839e18eaee2SZiye Yang                if len(parts) != 2:
840e18eaee2SZiye Yang                    raise Exception('--config %s not in key=value form' % entry)
841e18eaee2SZiye Yang                config_param[parts[0]] = parts[1]
842e18eaee2SZiye Yang        print_json(rpc.bdev.bdev_rbd_register_cluster(args.client,
843e18eaee2SZiye Yang                                                      name=args.name,
844e18eaee2SZiye Yang                                                      user=args.user,
845e18eaee2SZiye Yang                                                      config_param=config_param,
84620c8a3b8STan Long                                                      config_file=args.config_file,
84720c8a3b8STan Long                                                      key_file=args.key_file))
848e18eaee2SZiye Yang
849e18eaee2SZiye Yang    p = subparsers.add_parser('bdev_rbd_register_cluster',
850e18eaee2SZiye Yang                              help='Add a Rados cluster with ceph rbd backend')
851e18eaee2SZiye Yang    p.add_argument('name', help="Name of the Rados cluster only known to rbd bdev")
852e18eaee2SZiye Yang    p.add_argument('--user', help="Ceph user name (i.e. admin, not client.admin)", required=False)
8537a372bbeSJim Harris    p.add_argument('--config-param', action='append', metavar='key=value',
854e18eaee2SZiye Yang                   help="adds a key=value configuration option for rados_conf_set (default: rely on config file)")
8557a372bbeSJim Harris    p.add_argument('--config-file', help="The file path of the Rados configuration file", required=False)
85620c8a3b8STan Long    p.add_argument('--key-file', help="The file path of the Rados keyring file", required=False)
857e18eaee2SZiye Yang    p.set_defaults(func=bdev_rbd_register_cluster)
858e18eaee2SZiye Yang
859e18eaee2SZiye Yang    def bdev_rbd_unregister_cluster(args):
860e18eaee2SZiye Yang        rpc.bdev.bdev_rbd_unregister_cluster(args.client, name=args.name)
861e18eaee2SZiye Yang
862e18eaee2SZiye Yang    p = subparsers.add_parser('bdev_rbd_unregister_cluster',
863e18eaee2SZiye Yang                              help='Unregister a Rados cluster object')
864e18eaee2SZiye Yang    p.add_argument('name', help='Name of the Rados Cluster only known to rbd bdev')
865e18eaee2SZiye Yang    p.set_defaults(func=bdev_rbd_unregister_cluster)
866e18eaee2SZiye Yang
867c3cf9ec2SZiye Yang    def bdev_rbd_get_clusters_info(args):
868c3cf9ec2SZiye Yang        print_json(rpc.bdev.bdev_rbd_get_clusters_info(args.client, name=args.name))
869c3cf9ec2SZiye Yang
870c3cf9ec2SZiye Yang    p = subparsers.add_parser('bdev_rbd_get_clusters_info',
871c3cf9ec2SZiye Yang                              help='Display registered Rados Cluster names and related info')
872c3cf9ec2SZiye Yang    p.add_argument('-b', '--name', help="Name of the registered Rados Cluster Name. Example: Cluster1", required=False)
873c3cf9ec2SZiye Yang    p.set_defaults(func=bdev_rbd_get_clusters_info)
874c3cf9ec2SZiye Yang
8758ac7cad4SMaciej Wawryk    def bdev_rbd_create(args):
8764cfae036SPatrick Ohly        config = None
8774cfae036SPatrick Ohly        if args.config:
8784cfae036SPatrick Ohly            config = {}
8794cfae036SPatrick Ohly            for entry in args.config:
8804cfae036SPatrick Ohly                parts = entry.split('=', 1)
8814cfae036SPatrick Ohly                if len(parts) != 2:
8824cfae036SPatrick Ohly                    raise Exception('--config %s not in key=value form' % entry)
8834cfae036SPatrick Ohly                config[parts[0]] = parts[1]
8848ac7cad4SMaciej Wawryk        print_json(rpc.bdev.bdev_rbd_create(args.client,
8851ea97654SDaniel Verkamp                                            name=args.name,
8864cfae036SPatrick Ohly                                            user=args.user,
8874cfae036SPatrick Ohly                                            config=config,
8881ea97654SDaniel Verkamp                                            pool_name=args.pool_name,
8891ea97654SDaniel Verkamp                                            rbd_name=args.rbd_name,
8905c016026SZiye Yang                                            block_size=args.block_size,
8918a154b2cStanlong                                            cluster_name=args.cluster_name,
8928a154b2cStanlong                                            uuid=args.uuid))
8931e92d78aSBen Walker
8947aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_rbd_create', help='Add a bdev with ceph rbd backend')
89513a05f59SPawel Wodkowski    p.add_argument('-b', '--name', help="Name of the bdev", required=False)
8964cfae036SPatrick Ohly    p.add_argument('--user', help="Ceph user name (i.e. admin, not client.admin)", required=False)
8974cfae036SPatrick Ohly    p.add_argument('--config', action='append', metavar='key=value',
8984cfae036SPatrick Ohly                   help="adds a key=value configuration option for rados_conf_set (default: rely on config file)")
8994dd3f4a7SBen Walker    p.add_argument('pool_name', help='rbd pool name')
9004dd3f4a7SBen Walker    p.add_argument('rbd_name', help='rbd image name')
9014dd3f4a7SBen Walker    p.add_argument('block_size', help='rbd block size', type=int)
9027a372bbeSJim Harris    p.add_argument('-c', '--cluster-name', help="cluster name to identify the Rados cluster", required=False)
9038a154b2cStanlong    p.add_argument('-u', '--uuid', help="UUID of the bdev")
9048ac7cad4SMaciej Wawryk    p.set_defaults(func=bdev_rbd_create)
905df897ed4SDaniel Verkamp
906164939aaSMaciej Wawryk    def bdev_rbd_delete(args):
907164939aaSMaciej Wawryk        rpc.bdev.bdev_rbd_delete(args.client,
9084fd967b2SMaciej Szwed                                 name=args.name)
9094fd967b2SMaciej Szwed
9107aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_rbd_delete', help='Delete a rbd bdev')
9114fd967b2SMaciej Szwed    p.add_argument('name', help='rbd bdev name')
912164939aaSMaciej Wawryk    p.set_defaults(func=bdev_rbd_delete)
9134fd967b2SMaciej Szwed
9146a29c6a9SLiang Yan    def bdev_rbd_resize(args):
9156a29c6a9SLiang Yan        print_json(rpc.bdev.bdev_rbd_resize(args.client,
9166a29c6a9SLiang Yan                                            name=args.name,
9176a29c6a9SLiang Yan                                            new_size=int(args.new_size)))
9186a29c6a9SLiang Yan
9196a29c6a9SLiang Yan    p = subparsers.add_parser('bdev_rbd_resize',
9206a29c6a9SLiang Yan                              help='Resize a rbd bdev')
9216a29c6a9SLiang Yan    p.add_argument('name', help='rbd bdev name')
9226a29c6a9SLiang Yan    p.add_argument('new_size', help='new bdev size for resize operation. The unit is MiB')
9236a29c6a9SLiang Yan    p.set_defaults(func=bdev_rbd_resize)
9246a29c6a9SLiang Yan
9253fb4a66dSSeth Howell    def bdev_delay_create(args):
92631c25ab3SDarek Stojaczyk        print_json(rpc.bdev.bdev_delay_create(args.client,
9273fb4a66dSSeth Howell                                              base_bdev_name=args.base_bdev_name,
9283fb4a66dSSeth Howell                                              name=args.name,
9293fb4a66dSSeth Howell                                              avg_read_latency=args.avg_read_latency,
9303fb4a66dSSeth Howell                                              p99_read_latency=args.nine_nine_read_latency,
9313fb4a66dSSeth Howell                                              avg_write_latency=args.avg_write_latency,
9323fb4a66dSSeth Howell                                              p99_write_latency=args.nine_nine_write_latency))
9333fb4a66dSSeth Howell
9343fb4a66dSSeth Howell    p = subparsers.add_parser('bdev_delay_create',
9353fb4a66dSSeth Howell                              help='Add a delay bdev on existing bdev')
9363fb4a66dSSeth Howell    p.add_argument('-b', '--base-bdev-name', help="Name of the existing bdev", required=True)
9373fb4a66dSSeth Howell    p.add_argument('-d', '--name', help="Name of the delay bdev", required=True)
938a1d0f799SSeth Howell    p.add_argument('-r', '--avg-read-latency',
939a1d0f799SSeth Howell                   help="Average latency to apply before completing read ops (in microseconds)", required=True, type=int)
940a1d0f799SSeth Howell    p.add_argument('-t', '--nine-nine-read-latency',
941a1d0f799SSeth Howell                   help="latency to apply to 1 in 100 read ops (in microseconds)", required=True, type=int)
942a1d0f799SSeth Howell    p.add_argument('-w', '--avg-write-latency',
943a1d0f799SSeth Howell                   help="Average latency to apply before completing write ops (in microseconds)", required=True, type=int)
944a1d0f799SSeth Howell    p.add_argument('-n', '--nine-nine-write-latency',
945a1d0f799SSeth Howell                   help="latency to apply to 1 in 100 write ops (in microseconds)", required=True, type=int)
9463fb4a66dSSeth Howell    p.set_defaults(func=bdev_delay_create)
9473fb4a66dSSeth Howell
9483fb4a66dSSeth Howell    def bdev_delay_delete(args):
9493fb4a66dSSeth Howell        rpc.bdev.bdev_delay_delete(args.client,
9503fb4a66dSSeth Howell                                   name=args.name)
9513fb4a66dSSeth Howell
9523fb4a66dSSeth Howell    p = subparsers.add_parser('bdev_delay_delete', help='Delete a delay bdev')
9533fb4a66dSSeth Howell    p.add_argument('name', help='delay bdev name')
9543fb4a66dSSeth Howell    p.set_defaults(func=bdev_delay_delete)
9553fb4a66dSSeth Howell
956d2424824SSeth Howell    def bdev_delay_update_latency(args):
957d2424824SSeth Howell        print_json(rpc.bdev.bdev_delay_update_latency(args.client,
958d2424824SSeth Howell                                                      delay_bdev_name=args.delay_bdev_name,
959d2424824SSeth Howell                                                      latency_type=args.latency_type,
960d2424824SSeth Howell                                                      latency_us=args.latency_us))
961d2424824SSeth Howell    p = subparsers.add_parser('bdev_delay_update_latency',
962d2424824SSeth Howell                              help='Update one of the latency values for a given delay bdev')
963d2424824SSeth Howell    p.add_argument('delay_bdev_name', help='The name of the given delay bdev')
964d2424824SSeth Howell    p.add_argument('latency_type', help='one of: avg_read, avg_write, p99_read, p99_write. No other values accepted.')
965a1d0f799SSeth Howell    p.add_argument('latency_us', help='new latency value in microseconds.', type=int)
966d2424824SSeth Howell    p.set_defaults(func=bdev_delay_update_latency)
967d2424824SSeth Howell
968cabb6a7dSMaciej Wawryk    def bdev_error_create(args):
969cabb6a7dSMaciej Wawryk        print_json(rpc.bdev.bdev_error_create(args.client,
970160850f0STomasz Zawadzki                                              base_name=args.base_name))
9711e92d78aSBen Walker
9727aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_error_create', help='Add bdev with error injection backend')
9734dd3f4a7SBen Walker    p.add_argument('base_name', help='base bdev name')
974cabb6a7dSMaciej Wawryk    p.set_defaults(func=bdev_error_create)
975df897ed4SDaniel Verkamp
976cabb6a7dSMaciej Wawryk    def bdev_error_delete(args):
977cabb6a7dSMaciej Wawryk        rpc.bdev.bdev_error_delete(args.client,
9780847ad90STomasz Zawadzki                                   name=args.name)
9790847ad90STomasz Zawadzki
9807aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_error_delete', help='Delete an error bdev')
9810847ad90STomasz Zawadzki    p.add_argument('name', help='error bdev name')
982cabb6a7dSMaciej Wawryk    p.set_defaults(func=bdev_error_delete)
9830847ad90STomasz Zawadzki
9849f5cbf4cSMaciej Wawryk    def bdev_iscsi_create(args):
9859f5cbf4cSMaciej Wawryk        print_json(rpc.bdev.bdev_iscsi_create(args.client,
986fba68d61SPawel Wodkowski                                              name=args.name,
987fba68d61SPawel Wodkowski                                              url=args.url,
988160850f0STomasz Zawadzki                                              initiator_iqn=args.initiator_iqn))
989fba68d61SPawel Wodkowski
9903ac967baSwanghailiangx    p = subparsers.add_parser('bdev_iscsi_create',
991fba68d61SPawel Wodkowski                              help='Add bdev with iSCSI initiator backend')
992fba68d61SPawel Wodkowski    p.add_argument('-b', '--name', help="Name of the bdev", required=True)
993fba68d61SPawel Wodkowski    p.add_argument('-i', '--initiator-iqn', help="Initiator IQN", required=True)
994fba68d61SPawel Wodkowski    p.add_argument('--url', help="iSCSI Lun URL", required=True)
9959f5cbf4cSMaciej Wawryk    p.set_defaults(func=bdev_iscsi_create)
996fba68d61SPawel Wodkowski
9979f5cbf4cSMaciej Wawryk    def bdev_iscsi_delete(args):
9989f5cbf4cSMaciej Wawryk        rpc.bdev.bdev_iscsi_delete(args.client,
9996be654aaSTomasz Zawadzki                                   name=args.name)
10006be654aaSTomasz Zawadzki
10013ac967baSwanghailiangx    p = subparsers.add_parser('bdev_iscsi_delete', help='Delete an iSCSI bdev')
10026be654aaSTomasz Zawadzki    p.add_argument('name', help='iSCSI bdev name')
10039f5cbf4cSMaciej Wawryk    p.set_defaults(func=bdev_iscsi_delete)
10046be654aaSTomasz Zawadzki
1005f2086995SPawel Kaminski    def bdev_pmem_create(args):
1006f2086995SPawel Kaminski        print_json(rpc.bdev.bdev_pmem_create(args.client,
10071ea97654SDaniel Verkamp                                             pmem_file=args.pmem_file,
10081ea97654SDaniel Verkamp                                             name=args.name))
10096f01da76SDaniel Verkamp
10107aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_pmem_create', help='Add a bdev with pmem backend')
10114dd3f4a7SBen Walker    p.add_argument('pmem_file', help='Path to pmemblk pool file')
10124dd3f4a7SBen Walker    p.add_argument('-n', '--name', help='Block device name', required=True)
1013f2086995SPawel Kaminski    p.set_defaults(func=bdev_pmem_create)
1014df897ed4SDaniel Verkamp
1015568ce213SPawel Kaminski    def bdev_pmem_delete(args):
1016568ce213SPawel Kaminski        rpc.bdev.bdev_pmem_delete(args.client,
10171a0ce4deSMaciej Szwed                                  name=args.name)
10181a0ce4deSMaciej Szwed
10197aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_pmem_delete', help='Delete a pmem bdev')
10201a0ce4deSMaciej Szwed    p.add_argument('name', help='pmem bdev name')
1021568ce213SPawel Kaminski    p.set_defaults(func=bdev_pmem_delete)
10221a0ce4deSMaciej Szwed
10237e875f37SPawel Kaminski    def bdev_passthru_create(args):
10247e875f37SPawel Kaminski        print_json(rpc.bdev.bdev_passthru_create(args.client,
10251ea97654SDaniel Verkamp                                                 base_bdev_name=args.base_bdev_name,
1026164d7914Spaul luse                                                 name=args.name))
1027cb1c88d1SGangCao
10287aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_passthru_create', help='Add a pass through bdev on existing bdev')
1029cb1c88d1SGangCao    p.add_argument('-b', '--base-bdev-name', help="Name of the existing bdev", required=True)
1030164d7914Spaul luse    p.add_argument('-p', '--name', help="Name of the pass through bdev", required=True)
10317e875f37SPawel Kaminski    p.set_defaults(func=bdev_passthru_create)
1032cb1c88d1SGangCao
10337e875f37SPawel Kaminski    def bdev_passthru_delete(args):
10347e875f37SPawel Kaminski        rpc.bdev.bdev_passthru_delete(args.client,
1035e48f0bf1SMaciej Szwed                                      name=args.name)
1036e48f0bf1SMaciej Szwed
10377aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_passthru_delete', help='Delete a pass through bdev')
1038e48f0bf1SMaciej Szwed    p.add_argument('name', help='pass through bdev name')
10397e875f37SPawel Kaminski    p.set_defaults(func=bdev_passthru_delete)
1040e48f0bf1SMaciej Szwed
10412c49e910SMaciej Wawryk    def bdev_get_bdevs(args):
10422c49e910SMaciej Wawryk        print_dict(rpc.bdev.bdev_get_bdevs(args.client,
1043fa649869SKonrad Sztyber                                           name=args.name, timeout=args.timeout_ms))
10441e92d78aSBen Walker
104547bc5870SJim Harris    p = subparsers.add_parser('bdev_get_bdevs',
10462c49e910SMaciej Wawryk                              help='Display current blockdev list or required blockdev')
10474dd3f4a7SBen Walker    p.add_argument('-b', '--name', help="Name of the Blockdev. Example: Nvme0n1", required=False)
1048fa649869SKonrad Sztyber    p.add_argument('-t', '--timeout-ms', help="""Time in ms to wait for the bdev to appear (only used
1049fa649869SKonrad Sztyber    with the -b|--name option). The default timeout is 0, meaning the RPC returns immediately
1050fa649869SKonrad Sztyber    whether the bdev exists or not.""",
1051fa649869SKonrad Sztyber                   type=int, required=False)
10522c49e910SMaciej Wawryk    p.set_defaults(func=bdev_get_bdevs)
1053df897ed4SDaniel Verkamp
1054326e68fcSMaciej Wawryk    def bdev_get_iostat(args):
1055326e68fcSMaciej Wawryk        print_dict(rpc.bdev.bdev_get_iostat(args.client,
10561ea97654SDaniel Verkamp                                            name=args.name))
105764ccd4b9SYanbo Zhou
105847bc5870SJim Harris    p = subparsers.add_parser('bdev_get_iostat',
1059326e68fcSMaciej Wawryk                              help='Display current I/O statistics of all the blockdevs or required blockdev.')
106064ccd4b9SYanbo Zhou    p.add_argument('-b', '--name', help="Name of the Blockdev. Example: Nvme0n1", required=False)
1061326e68fcSMaciej Wawryk    p.set_defaults(func=bdev_get_iostat)
106264ccd4b9SYanbo Zhou
1063ab6ce828SMaciej Wawryk    def bdev_enable_histogram(args):
1064ab6ce828SMaciej Wawryk        rpc.bdev.bdev_enable_histogram(args.client, name=args.name, enable=args.enable)
1065e5e427c9SPiotr Pelplinski
106647bc5870SJim Harris    p = subparsers.add_parser('bdev_enable_histogram',
1067ab6ce828SMaciej Wawryk                              help='Enable or disable histogram for specified bdev')
1068e5e427c9SPiotr Pelplinski    p.add_argument('-e', '--enable', default=True, dest='enable', action='store_true', help='Enable histograms on specified device')
1069e5e427c9SPiotr Pelplinski    p.add_argument('-d', '--disable', dest='enable', action='store_false', help='Disable histograms on specified device')
1070e5e427c9SPiotr Pelplinski    p.add_argument('name', help='bdev name')
1071ab6ce828SMaciej Wawryk    p.set_defaults(func=bdev_enable_histogram)
1072e5e427c9SPiotr Pelplinski
107311f6b773SMaciej Wawryk    def bdev_get_histogram(args):
107411f6b773SMaciej Wawryk        print_dict(rpc.bdev.bdev_get_histogram(args.client, name=args.name))
1075e5e427c9SPiotr Pelplinski
107647bc5870SJim Harris    p = subparsers.add_parser('bdev_get_histogram',
107711f6b773SMaciej Wawryk                              help='Get histogram for specified bdev')
1078e5e427c9SPiotr Pelplinski    p.add_argument('name', help='bdev name')
107911f6b773SMaciej Wawryk    p.set_defaults(func=bdev_get_histogram)
1080e5e427c9SPiotr Pelplinski
1081a96afb8bSMaciej Wawryk    def bdev_set_qd_sampling_period(args):
1082a96afb8bSMaciej Wawryk        rpc.bdev.bdev_set_qd_sampling_period(args.client,
108303987024SSeth Howell                                             name=args.name,
108403987024SSeth Howell                                             period=args.period)
108503987024SSeth Howell
108647bc5870SJim Harris    p = subparsers.add_parser('bdev_set_qd_sampling_period',
1087a96afb8bSMaciej Wawryk                              help="Enable or disable tracking of a bdev's queue depth.")
108803987024SSeth Howell    p.add_argument('name', help='Blockdev name. Example: Malloc0')
108903987024SSeth Howell    p.add_argument('period', help='Period with which to poll the block device queue depth in microseconds.'
109003987024SSeth Howell                   ' If set to 0, polling will be disabled.',
109103987024SSeth Howell                   type=int)
1092a96afb8bSMaciej Wawryk    p.set_defaults(func=bdev_set_qd_sampling_period)
109303987024SSeth Howell
1094c61e14beSMaciej Wawryk    def bdev_set_qos_limit(args):
1095c61e14beSMaciej Wawryk        rpc.bdev.bdev_set_qos_limit(args.client,
10961ea97654SDaniel Verkamp                                    name=args.name,
1097868c28cdSGangCao                                    rw_ios_per_sec=args.rw_ios_per_sec,
109805b43152SGangCao                                    rw_mbytes_per_sec=args.rw_mbytes_per_sec,
109905b43152SGangCao                                    r_mbytes_per_sec=args.r_mbytes_per_sec,
110005b43152SGangCao                                    w_mbytes_per_sec=args.w_mbytes_per_sec)
1101ffba4fdbSGangCao
110247bc5870SJim Harris    p = subparsers.add_parser('bdev_set_qos_limit',
1103c61e14beSMaciej Wawryk                              help='Set QoS rate limit on a blockdev')
1104ffba4fdbSGangCao    p.add_argument('name', help='Blockdev name to set QoS. Example: Malloc0')
11057a372bbeSJim Harris    p.add_argument('--rw-ios-per-sec',
1106dd3d5800SJimboLuCN                   help='R/W IOs per second limit (>=1000, example: 20000). 0 means unlimited.',
1107868c28cdSGangCao                   type=int, required=False)
11087a372bbeSJim Harris    p.add_argument('--rw-mbytes-per-sec',
1109868c28cdSGangCao                   help="R/W megabytes per second limit (>=10, example: 100). 0 means unlimited.",
1110868c28cdSGangCao                   type=int, required=False)
11117a372bbeSJim Harris    p.add_argument('--r-mbytes-per-sec',
111205b43152SGangCao                   help="Read megabytes per second limit (>=10, example: 100). 0 means unlimited.",
111305b43152SGangCao                   type=int, required=False)
11147a372bbeSJim Harris    p.add_argument('--w-mbytes-per-sec',
111505b43152SGangCao                   help="Write megabytes per second limit (>=10, example: 100). 0 means unlimited.",
111605b43152SGangCao                   type=int, required=False)
1117c61e14beSMaciej Wawryk    p.set_defaults(func=bdev_set_qos_limit)
1118ffba4fdbSGangCao
1119cabb6a7dSMaciej Wawryk    def bdev_error_inject_error(args):
1120cabb6a7dSMaciej Wawryk        rpc.bdev.bdev_error_inject_error(args.client,
11211ea97654SDaniel Verkamp                                         name=args.name,
11221ea97654SDaniel Verkamp                                         io_type=args.io_type,
11231ea97654SDaniel Verkamp                                         error_type=args.error_type,
11241ea97654SDaniel Verkamp                                         num=args.num)
11251e92d78aSBen Walker
11267aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_error_inject_error', help='bdev inject error')
11274dd3f4a7SBen Walker    p.add_argument('name', help="""the name of the error injection bdev""")
11284dd3f4a7SBen Walker    p.add_argument('io_type', help="""io_type: 'clear' 'read' 'write' 'unmap' 'flush' 'all'""")
11294dd3f4a7SBen Walker    p.add_argument('error_type', help="""error_type: 'failure' 'pending'""")
11304dd3f4a7SBen Walker    p.add_argument(
11314dd3f4a7SBen Walker        '-n', '--num', help='the number of commands you want to fail', type=int, default=1)
1132cabb6a7dSMaciej Wawryk    p.set_defaults(func=bdev_error_inject_error)
1133df897ed4SDaniel Verkamp
1134b9063e4bSPawel Kaminski    def bdev_nvme_apply_firmware(args):
1135b9063e4bSPawel Kaminski        print_dict(rpc.bdev.bdev_nvme_apply_firmware(args.client,
11361ea97654SDaniel Verkamp                                                     bdev_name=args.bdev_name,
11371ea97654SDaniel Verkamp                                                     filename=args.filename))
11381e92d78aSBen Walker
11397aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_nvme_apply_firmware', help='Download and commit firmware to NVMe device')
11404dd3f4a7SBen Walker    p.add_argument('filename', help='filename of the firmware to download')
11414dd3f4a7SBen Walker    p.add_argument('bdev_name', help='name of the NVMe device')
1142b9063e4bSPawel Kaminski    p.set_defaults(func=bdev_nvme_apply_firmware)
11431e92d78aSBen Walker
11445c33437bSAlexey Marchuk    def bdev_nvme_get_transport_statistics(args):
11455c33437bSAlexey Marchuk        print_dict(rpc.bdev.bdev_nvme_get_transport_statistics(args.client))
11465c33437bSAlexey Marchuk
11475c33437bSAlexey Marchuk    p = subparsers.add_parser('bdev_nvme_get_transport_statistics',
11485c33437bSAlexey Marchuk                              help='Get bdev_nvme poll group transport statistics')
11495c33437bSAlexey Marchuk    p.set_defaults(func=bdev_nvme_get_transport_statistics)
11505c33437bSAlexey Marchuk
115149ffdc18SWindYu    def bdev_nvme_get_controller_health_info(args):
115249ffdc18SWindYu        print_dict(rpc.bdev.bdev_nvme_get_controller_health_info(args.client,
115349ffdc18SWindYu                                                                 name=args.name))
115449ffdc18SWindYu
115549ffdc18SWindYu    p = subparsers.add_parser('bdev_nvme_get_controller_health_info',
115649ffdc18SWindYu                              help='Display health log of the required NVMe bdev controller.')
115749ffdc18SWindYu    p.add_argument('-c', '--name', help="Name of the NVMe bdev controller. Example: Nvme0", required=True)
115849ffdc18SWindYu    p.set_defaults(func=bdev_nvme_get_controller_health_info)
115949ffdc18SWindYu
11604dd3f4a7SBen Walker    # iSCSI
1161cea4c3e5SPawel Kaminski    def iscsi_set_options(args):
1162cea4c3e5SPawel Kaminski        rpc.iscsi.iscsi_set_options(
1163253c61beSheluwei            args.client,
1164253c61beSheluwei            auth_file=args.auth_file,
1165253c61beSheluwei            node_base=args.node_base,
1166253c61beSheluwei            nop_timeout=args.nop_timeout,
1167253c61beSheluwei            nop_in_interval=args.nop_in_interval,
116866723f7fSShuhei Matsumoto            disable_chap=args.disable_chap,
116966723f7fSShuhei Matsumoto            require_chap=args.require_chap,
117066723f7fSShuhei Matsumoto            mutual_chap=args.mutual_chap,
117166723f7fSShuhei Matsumoto            chap_group=args.chap_group,
1172253c61beSheluwei            max_sessions=args.max_sessions,
117364269787SPawel Wodkowski            max_queue_depth=args.max_queue_depth,
1174253c61beSheluwei            max_connections_per_session=args.max_connections_per_session,
1175253c61beSheluwei            default_time2wait=args.default_time2wait,
1176253c61beSheluwei            default_time2retain=args.default_time2retain,
1177d393983dSGangCao            first_burst_length=args.first_burst_length,
1178253c61beSheluwei            immediate_data=args.immediate_data,
1179253c61beSheluwei            error_recovery_level=args.error_recovery_level,
11805aaf754fSShuhei Matsumoto            allow_duplicated_isid=args.allow_duplicated_isid,
118105cd6977SShuhei Matsumoto            max_large_datain_per_connection=args.max_large_datain_per_connection,
118211d76e8cSShuhei Matsumoto            max_r2t_per_connection=args.max_r2t_per_connection,
118311d76e8cSShuhei Matsumoto            pdu_pool_size=args.pdu_pool_size,
118411d76e8cSShuhei Matsumoto            immediate_data_pool_size=args.immediate_data_pool_size,
118511d76e8cSShuhei Matsumoto            data_out_pool_size=args.data_out_pool_size)
118659b3479bSShuhei Matsumoto
1187febe9002SJim Harris    p = subparsers.add_parser('iscsi_set_options',
1188cea4c3e5SPawel Kaminski                              help="""Set options of iSCSI subsystem""")
1189ad323b80SShuhei Matsumoto    p.add_argument('-f', '--auth-file', help='Path to CHAP shared secret file')
119059b3479bSShuhei Matsumoto    p.add_argument('-b', '--node-base', help='Prefix of the name of iSCSI target node')
119159b3479bSShuhei Matsumoto    p.add_argument('-o', '--nop-timeout', help='Timeout in seconds to nop-in request to the initiator', type=int)
119259b3479bSShuhei Matsumoto    p.add_argument('-n', '--nop-in-interval', help='Time interval in secs between nop-in requests by the target', type=int)
119366723f7fSShuhei Matsumoto    p.add_argument('-d', '--disable-chap', help="""CHAP for discovery session should be disabled.
119466723f7fSShuhei Matsumoto    *** Mutually exclusive with --require-chap""", action='store_true')
119566723f7fSShuhei Matsumoto    p.add_argument('-r', '--require-chap', help="""CHAP for discovery session should be required.
119666723f7fSShuhei Matsumoto    *** Mutually exclusive with --disable-chap""", action='store_true')
119766723f7fSShuhei Matsumoto    p.add_argument('-m', '--mutual-chap', help='CHAP for discovery session should be mutual', action='store_true')
119866723f7fSShuhei Matsumoto    p.add_argument('-g', '--chap-group', help="""Authentication group ID for discovery session.
119959b3479bSShuhei Matsumoto    *** Authentication group must be precreated ***""", type=int)
120059b3479bSShuhei Matsumoto    p.add_argument('-a', '--max-sessions', help='Maximum number of sessions in the host.', type=int)
120164269787SPawel Wodkowski    p.add_argument('-q', '--max-queue-depth', help='Max number of outstanding I/Os per queue.', type=int)
120259b3479bSShuhei Matsumoto    p.add_argument('-c', '--max-connections-per-session', help='Negotiated parameter, MaxConnections.', type=int)
120359b3479bSShuhei Matsumoto    p.add_argument('-w', '--default-time2wait', help='Negotiated parameter, DefaultTime2Wait.', type=int)
120459b3479bSShuhei Matsumoto    p.add_argument('-v', '--default-time2retain', help='Negotiated parameter, DefaultTime2Retain.', type=int)
1205d393983dSGangCao    p.add_argument('-s', '--first-burst-length', help='Negotiated parameter, FirstBurstLength.', type=int)
120659b3479bSShuhei Matsumoto    p.add_argument('-i', '--immediate-data', help='Negotiated parameter, ImmediateData.', action='store_true')
120759b3479bSShuhei Matsumoto    p.add_argument('-l', '--error-recovery-level', help='Negotiated parameter, ErrorRecoveryLevel', type=int)
120859b3479bSShuhei Matsumoto    p.add_argument('-p', '--allow-duplicated-isid', help='Allow duplicated initiator session ID.', action='store_true')
12095aaf754fSShuhei Matsumoto    p.add_argument('-x', '--max-large-datain-per-connection', help='Max number of outstanding split read I/Os per connection', type=int)
121005cd6977SShuhei Matsumoto    p.add_argument('-k', '--max-r2t-per-connection', help='Max number of outstanding R2Ts per connection', type=int)
121111d76e8cSShuhei Matsumoto    p.add_argument('-u', '--pdu-pool-size', help='Number of PDUs in the pool', type=int)
12127a372bbeSJim Harris    p.add_argument('-j', '--immediate-data-pool-size', help='Number of immediate data buffers in the pool', type=int)
121311d76e8cSShuhei Matsumoto    p.add_argument('-z', '--data-out-pool-size', help='Number of data out buffers in the pool', type=int)
1214cea4c3e5SPawel Kaminski    p.set_defaults(func=iscsi_set_options)
121559b3479bSShuhei Matsumoto
1216a05efe0aSPawel Kaminski    def iscsi_set_discovery_auth(args):
1217a05efe0aSPawel Kaminski        rpc.iscsi.iscsi_set_discovery_auth(
12186cd1714aSShuhei Matsumoto            args.client,
12196cd1714aSShuhei Matsumoto            disable_chap=args.disable_chap,
12206cd1714aSShuhei Matsumoto            require_chap=args.require_chap,
12216cd1714aSShuhei Matsumoto            mutual_chap=args.mutual_chap,
12226cd1714aSShuhei Matsumoto            chap_group=args.chap_group)
12236cd1714aSShuhei Matsumoto
1224febe9002SJim Harris    p = subparsers.add_parser('iscsi_set_discovery_auth',
1225a05efe0aSPawel Kaminski                              help="""Set CHAP authentication for discovery session.""")
12266cd1714aSShuhei Matsumoto    p.add_argument('-d', '--disable-chap', help="""CHAP for discovery session should be disabled.
12276cd1714aSShuhei Matsumoto    *** Mutually exclusive with --require-chap""", action='store_true')
12286cd1714aSShuhei Matsumoto    p.add_argument('-r', '--require-chap', help="""CHAP for discovery session should be required.
12296cd1714aSShuhei Matsumoto    *** Mutually exclusive with --disable-chap""", action='store_true')
12306cd1714aSShuhei Matsumoto    p.add_argument('-m', '--mutual-chap', help='CHAP for discovery session should be mutual', action='store_true')
12316cd1714aSShuhei Matsumoto    p.add_argument('-g', '--chap-group', help="""Authentication group ID for discovery session.
12326cd1714aSShuhei Matsumoto    *** Authentication group must be precreated ***""", type=int)
1233a05efe0aSPawel Kaminski    p.set_defaults(func=iscsi_set_discovery_auth)
12346cd1714aSShuhei Matsumoto
1235d9edd3afSPawel Kaminski    def iscsi_create_auth_group(args):
1236dcafd5b1SShuhei Matsumoto        secrets = None
1237dcafd5b1SShuhei Matsumoto        if args.secrets:
1238dcafd5b1SShuhei Matsumoto            secrets = [dict(u.split(":") for u in a.split(" ")) for a in args.secrets.split(",")]
1239dcafd5b1SShuhei Matsumoto
1240d9edd3afSPawel Kaminski        rpc.iscsi.iscsi_create_auth_group(args.client, tag=args.tag, secrets=secrets)
1241dcafd5b1SShuhei Matsumoto
1242febe9002SJim Harris    p = subparsers.add_parser('iscsi_create_auth_group',
1243d9edd3afSPawel Kaminski                              help='Create authentication group for CHAP authentication.')
1244dcafd5b1SShuhei Matsumoto    p.add_argument('tag', help='Authentication group tag (unique, integer > 0).', type=int)
1245dcafd5b1SShuhei Matsumoto    p.add_argument('-c', '--secrets', help="""Comma-separated list of CHAP secrets
1246dcafd5b1SShuhei Matsumoto<user:user_name secret:chap_secret muser:mutual_user_name msecret:mutual_chap_secret> enclosed in quotes.
1247dcafd5b1SShuhei MatsumotoFormat: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 msecret:ms2'""", required=False)
1248d9edd3afSPawel Kaminski    p.set_defaults(func=iscsi_create_auth_group)
1249dcafd5b1SShuhei Matsumoto
1250bcab0b3bSPawel Kaminski    def iscsi_delete_auth_group(args):
1251bcab0b3bSPawel Kaminski        rpc.iscsi.iscsi_delete_auth_group(args.client, tag=args.tag)
1252dcafd5b1SShuhei Matsumoto
1253febe9002SJim Harris    p = subparsers.add_parser('iscsi_delete_auth_group',
1254bcab0b3bSPawel Kaminski                              help='Delete an authentication group.')
1255dcafd5b1SShuhei Matsumoto    p.add_argument('tag', help='Authentication group tag', type=int)
1256bcab0b3bSPawel Kaminski    p.set_defaults(func=iscsi_delete_auth_group)
1257dcafd5b1SShuhei Matsumoto
12580cbf1237SPawel Kaminski    def iscsi_auth_group_add_secret(args):
12590cbf1237SPawel Kaminski        rpc.iscsi.iscsi_auth_group_add_secret(
1260750e5d25SShuhei Matsumoto            args.client,
1261750e5d25SShuhei Matsumoto            tag=args.tag,
1262750e5d25SShuhei Matsumoto            user=args.user,
1263750e5d25SShuhei Matsumoto            secret=args.secret,
1264750e5d25SShuhei Matsumoto            muser=args.muser,
1265750e5d25SShuhei Matsumoto            msecret=args.msecret)
1266750e5d25SShuhei Matsumoto
1267febe9002SJim Harris    p = subparsers.add_parser('iscsi_auth_group_add_secret',
12680cbf1237SPawel Kaminski                              help='Add a secret to an authentication group.')
1269750e5d25SShuhei Matsumoto    p.add_argument('tag', help='Authentication group tag', type=int)
1270750e5d25SShuhei Matsumoto    p.add_argument('-u', '--user', help='User name for one-way CHAP authentication', required=True)
1271750e5d25SShuhei Matsumoto    p.add_argument('-s', '--secret', help='Secret for one-way CHAP authentication', required=True)
1272750e5d25SShuhei Matsumoto    p.add_argument('-m', '--muser', help='User name for mutual CHAP authentication')
1273750e5d25SShuhei Matsumoto    p.add_argument('-r', '--msecret', help='Secret for mutual CHAP authentication')
12740cbf1237SPawel Kaminski    p.set_defaults(func=iscsi_auth_group_add_secret)
1275750e5d25SShuhei Matsumoto
1276a25f9bf9SPawel Kaminski    def iscsi_auth_group_remove_secret(args):
1277a25f9bf9SPawel Kaminski        rpc.iscsi.iscsi_auth_group_remove_secret(args.client, tag=args.tag, user=args.user)
1278750e5d25SShuhei Matsumoto
1279febe9002SJim Harris    p = subparsers.add_parser('iscsi_auth_group_remove_secret',
1280a25f9bf9SPawel Kaminski                              help='Remove a secret from an authentication group.')
1281750e5d25SShuhei Matsumoto    p.add_argument('tag', help='Authentication group tag', type=int)
1282750e5d25SShuhei Matsumoto    p.add_argument('-u', '--user', help='User name for one-way CHAP authentication', required=True)
1283a25f9bf9SPawel Kaminski    p.set_defaults(func=iscsi_auth_group_remove_secret)
1284750e5d25SShuhei Matsumoto
1285c1f6def9SPawel Kaminski    def iscsi_get_auth_groups(args):
1286c1f6def9SPawel Kaminski        print_dict(rpc.iscsi.iscsi_get_auth_groups(args.client))
12873a08001dSShuhei Matsumoto
1288febe9002SJim Harris    p = subparsers.add_parser('iscsi_get_auth_groups',
12893a08001dSShuhei Matsumoto                              help='Display current authentication group configuration')
1290c1f6def9SPawel Kaminski    p.set_defaults(func=iscsi_get_auth_groups)
12913a08001dSShuhei Matsumoto
12921a6c41a9SPawel Kaminski    def iscsi_get_portal_groups(args):
12931a6c41a9SPawel Kaminski        print_dict(rpc.iscsi.iscsi_get_portal_groups(args.client))
1294df897ed4SDaniel Verkamp
1295febe9002SJim Harris    p = subparsers.add_parser('iscsi_get_portal_groups', help='Display current portal group configuration')
12961a6c41a9SPawel Kaminski    p.set_defaults(func=iscsi_get_portal_groups)
1297df897ed4SDaniel Verkamp
1298e3366470SPawel Kaminski    def iscsi_get_initiator_groups(args):
1299e3366470SPawel Kaminski        print_dict(rpc.iscsi.iscsi_get_initiator_groups(args.client))
13001e92d78aSBen Walker
1301e3366470SPawel Kaminski    p = subparsers.add_parser('iscsi_get_initiator_groups',
13024dd3f4a7SBen Walker                              help='Display current initiator group configuration')
1303e3366470SPawel Kaminski    p.set_defaults(func=iscsi_get_initiator_groups)
1304df897ed4SDaniel Verkamp
13057d114278SPawel Kaminski    def iscsi_get_target_nodes(args):
13067d114278SPawel Kaminski        print_dict(rpc.iscsi.iscsi_get_target_nodes(args.client))
13071e92d78aSBen Walker
1308febe9002SJim Harris    p = subparsers.add_parser('iscsi_get_target_nodes', help='Display target nodes')
13097d114278SPawel Kaminski    p.set_defaults(func=iscsi_get_target_nodes)
1310df897ed4SDaniel Verkamp
1311758b2f94SPawel Kaminski    def iscsi_create_target_node(args):
1312253c61beSheluwei        luns = []
1313253c61beSheluwei        for u in args.bdev_name_id_pairs.strip().split(" "):
1314253c61beSheluwei            bdev_name, lun_id = u.split(":")
1315253c61beSheluwei            luns.append({"bdev_name": bdev_name, "lun_id": int(lun_id)})
1316253c61beSheluwei
1317253c61beSheluwei        pg_ig_maps = []
1318253c61beSheluwei        for u in args.pg_ig_mappings.strip().split(" "):
1319253c61beSheluwei            pg, ig = u.split(":")
1320253c61beSheluwei            pg_ig_maps.append({"pg_tag": int(pg), "ig_tag": int(ig)})
1321253c61beSheluwei
1322758b2f94SPawel Kaminski        rpc.iscsi.iscsi_create_target_node(
1323253c61beSheluwei            args.client,
1324253c61beSheluwei            luns=luns,
1325253c61beSheluwei            pg_ig_maps=pg_ig_maps,
1326253c61beSheluwei            name=args.name,
1327253c61beSheluwei            alias_name=args.alias_name,
1328253c61beSheluwei            queue_depth=args.queue_depth,
1329253c61beSheluwei            chap_group=args.chap_group,
1330253c61beSheluwei            disable_chap=args.disable_chap,
1331253c61beSheluwei            require_chap=args.require_chap,
1332253c61beSheluwei            mutual_chap=args.mutual_chap,
1333253c61beSheluwei            header_digest=args.header_digest,
1334253c61beSheluwei            data_digest=args.data_digest)
13351e92d78aSBen Walker
1336febe9002SJim Harris    p = subparsers.add_parser('iscsi_create_target_node', help='Add a target node')
13371e92d78aSBen Walker    p.add_argument('name', help='Target node name (ASCII)')
13381e92d78aSBen Walker    p.add_argument('alias_name', help='Target node alias name (ASCII)')
1339583e9699SShuhei Matsumoto    p.add_argument('bdev_name_id_pairs', help="""Whitespace-separated list of <bdev name:LUN ID> pairs enclosed
1340583e9699SShuhei Matsumoto    in quotes.  Format:  'bdev_name0:id0 bdev_name1:id1' etc
13411e92d78aSBen Walker    Example: 'Malloc0:0 Malloc1:1 Malloc5:2'
1342583e9699SShuhei Matsumoto    *** The bdevs must pre-exist ***
13431e92d78aSBen Walker    *** LUN0 (id = 0) is required ***
13444dd3f4a7SBen Walker    *** bdevs names cannot contain space or colon characters ***""")
13451e92d78aSBen Walker    p.add_argument('pg_ig_mappings', help="""List of (Portal_Group_Tag:Initiator_Group_Tag) mappings
13461e92d78aSBen Walker    Whitespace separated, quoted, mapping defined with colon
13471e92d78aSBen Walker    separated list of "tags" (int > 0)
13481e92d78aSBen Walker    Example: '1:1 2:2 2:1'
13491e92d78aSBen Walker    *** The Portal/Initiator Groups must be precreated ***""")
13501e92d78aSBen Walker    p.add_argument('queue_depth', help='Desired target queue depth', type=int)
135136fc9b2dSShuhei Matsumoto    p.add_argument('-g', '--chap-group', help="""Authentication group ID for this target node.
135236fc9b2dSShuhei Matsumoto    *** Authentication group must be precreated ***""", type=int, default=0)
135336fc9b2dSShuhei Matsumoto    p.add_argument('-d', '--disable-chap', help="""CHAP authentication should be disabled for this target node.
135436fc9b2dSShuhei Matsumoto    *** Mutually exclusive with --require-chap ***""", action='store_true')
135536fc9b2dSShuhei Matsumoto    p.add_argument('-r', '--require-chap', help="""CHAP authentication should be required for this target node.
135636fc9b2dSShuhei Matsumoto    *** Mutually exclusive with --disable-chap ***""", action='store_true')
13574dd3f4a7SBen Walker    p.add_argument(
135836fc9b2dSShuhei Matsumoto        '-m', '--mutual-chap', help='CHAP authentication should be mutual/bidirectional.', action='store_true')
1359b94ba1eeSShuhei Matsumoto    p.add_argument('-H', '--header-digest',
1360b94ba1eeSShuhei Matsumoto                   help='Header Digest should be required for this target node.', action='store_true')
1361b94ba1eeSShuhei Matsumoto    p.add_argument('-D', '--data-digest',
1362b94ba1eeSShuhei Matsumoto                   help='Data Digest should be required for this target node.', action='store_true')
1363758b2f94SPawel Kaminski    p.set_defaults(func=iscsi_create_target_node)
1364df897ed4SDaniel Verkamp
136580494e3fSPawel Kaminski    def iscsi_target_node_add_lun(args):
136680494e3fSPawel Kaminski        rpc.iscsi.iscsi_target_node_add_lun(
1367253c61beSheluwei            args.client,
1368253c61beSheluwei            name=args.name,
1369253c61beSheluwei            bdev_name=args.bdev_name,
1370253c61beSheluwei            lun_id=args.lun_id)
1371f0456914SShuhei Matsumoto
1372febe9002SJim Harris    p = subparsers.add_parser('iscsi_target_node_add_lun',
137380494e3fSPawel Kaminski                              help='Add LUN to the target node')
1374f0456914SShuhei Matsumoto    p.add_argument('name', help='Target node name (ASCII)')
1375f0456914SShuhei Matsumoto    p.add_argument('bdev_name', help="""bdev name enclosed in quotes.
1376f0456914SShuhei Matsumoto    *** bdev name cannot contain space or colon characters ***""")
1377f0456914SShuhei Matsumoto    p.add_argument('-i', dest='lun_id', help="""LUN ID (integer >= 0)
1378f0456914SShuhei Matsumoto    *** If LUN ID is omitted or -1, the lowest free one is assigned ***""", type=int, required=False)
137980494e3fSPawel Kaminski    p.set_defaults(func=iscsi_target_node_add_lun)
1380df897ed4SDaniel Verkamp
1381032a8b1cSPawel Kaminski    def iscsi_target_node_set_auth(args):
1382032a8b1cSPawel Kaminski        rpc.iscsi.iscsi_target_node_set_auth(
1383844735c9SShuhei Matsumoto            args.client,
1384844735c9SShuhei Matsumoto            name=args.name,
1385844735c9SShuhei Matsumoto            chap_group=args.chap_group,
1386844735c9SShuhei Matsumoto            disable_chap=args.disable_chap,
1387844735c9SShuhei Matsumoto            require_chap=args.require_chap,
1388844735c9SShuhei Matsumoto            mutual_chap=args.mutual_chap)
1389844735c9SShuhei Matsumoto
1390febe9002SJim Harris    p = subparsers.add_parser('iscsi_target_node_set_auth',
1391032a8b1cSPawel Kaminski                              help='Set CHAP authentication for the target node')
1392844735c9SShuhei Matsumoto    p.add_argument('name', help='Target node name (ASCII)')
1393844735c9SShuhei Matsumoto    p.add_argument('-g', '--chap-group', help="""Authentication group ID for this target node.
1394844735c9SShuhei Matsumoto    *** Authentication group must be precreated ***""", type=int, default=0)
1395844735c9SShuhei Matsumoto    p.add_argument('-d', '--disable-chap', help="""CHAP authentication should be disabled for this target node.
1396844735c9SShuhei Matsumoto    *** Mutually exclusive with --require-chap ***""", action='store_true')
1397844735c9SShuhei Matsumoto    p.add_argument('-r', '--require-chap', help="""CHAP authentication should be required for this target node.
1398844735c9SShuhei Matsumoto    *** Mutually exclusive with --disable-chap ***""", action='store_true')
1399844735c9SShuhei Matsumoto    p.add_argument('-m', '--mutual-chap', help='CHAP authentication should be mutual/bidirectional.',
1400844735c9SShuhei Matsumoto                   action='store_true')
1401032a8b1cSPawel Kaminski    p.set_defaults(func=iscsi_target_node_set_auth)
1402844735c9SShuhei Matsumoto
1403a1c9546fSPawel Kaminski    def iscsi_target_node_add_pg_ig_maps(args):
1404253c61beSheluwei        pg_ig_maps = []
1405253c61beSheluwei        for u in args.pg_ig_mappings.strip().split(" "):
1406253c61beSheluwei            pg, ig = u.split(":")
1407253c61beSheluwei            pg_ig_maps.append({"pg_tag": int(pg), "ig_tag": int(ig)})
1408a1c9546fSPawel Kaminski        rpc.iscsi.iscsi_target_node_add_pg_ig_maps(
1409253c61beSheluwei            args.client,
1410253c61beSheluwei            pg_ig_maps=pg_ig_maps,
1411253c61beSheluwei            name=args.name)
14127e5ec29aSShuhei Matsumoto
1413a1c9546fSPawel Kaminski    p = subparsers.add_parser('iscsi_target_node_add_pg_ig_maps',
1414a1c9546fSPawel Kaminski                              help='Add PG-IG maps to the target node')
14157e5ec29aSShuhei Matsumoto    p.add_argument('name', help='Target node name (ASCII)')
14167e5ec29aSShuhei Matsumoto    p.add_argument('pg_ig_mappings', help="""List of (Portal_Group_Tag:Initiator_Group_Tag) mappings
14177e5ec29aSShuhei Matsumoto    Whitespace separated, quoted, mapping defined with colon
14187e5ec29aSShuhei Matsumoto    separated list of "tags" (int > 0)
14197e5ec29aSShuhei Matsumoto    Example: '1:1 2:2 2:1'
14207e5ec29aSShuhei Matsumoto    *** The Portal/Initiator Groups must be precreated ***""")
1421a1c9546fSPawel Kaminski    p.set_defaults(func=iscsi_target_node_add_pg_ig_maps)
1422df897ed4SDaniel Verkamp
1423655b64daSPawel Kaminski    def iscsi_target_node_remove_pg_ig_maps(args):
1424253c61beSheluwei        pg_ig_maps = []
1425253c61beSheluwei        for u in args.pg_ig_mappings.strip().split(" "):
1426253c61beSheluwei            pg, ig = u.split(":")
1427253c61beSheluwei            pg_ig_maps.append({"pg_tag": int(pg), "ig_tag": int(ig)})
1428655b64daSPawel Kaminski        rpc.iscsi.iscsi_target_node_remove_pg_ig_maps(
1429253c61beSheluwei            args.client, pg_ig_maps=pg_ig_maps, name=args.name)
14307e5ec29aSShuhei Matsumoto
1431655b64daSPawel Kaminski    p = subparsers.add_parser('iscsi_target_node_remove_pg_ig_maps',
1432655b64daSPawel Kaminski                              help='Delete PG-IG maps from the target node')
14337e5ec29aSShuhei Matsumoto    p.add_argument('name', help='Target node name (ASCII)')
14347e5ec29aSShuhei Matsumoto    p.add_argument('pg_ig_mappings', help="""List of (Portal_Group_Tag:Initiator_Group_Tag) mappings
14357e5ec29aSShuhei Matsumoto    Whitespace separated, quoted, mapping defined with colon
14367e5ec29aSShuhei Matsumoto    separated list of "tags" (int > 0)
14377e5ec29aSShuhei Matsumoto    Example: '1:1 2:2 2:1'
14387e5ec29aSShuhei Matsumoto    *** The Portal/Initiator Groups must be precreated ***""")
1439655b64daSPawel Kaminski    p.set_defaults(func=iscsi_target_node_remove_pg_ig_maps)
1440df897ed4SDaniel Verkamp
14414ea19788SShuhei Matsumoto    def iscsi_target_node_set_redirect(args):
14424ea19788SShuhei Matsumoto        rpc.iscsi.iscsi_target_node_set_redirect(
14434ea19788SShuhei Matsumoto            args.client,
14444ea19788SShuhei Matsumoto            name=args.name,
14454ea19788SShuhei Matsumoto            pg_tag=args.pg_tag,
14464ea19788SShuhei Matsumoto            redirect_host=args.redirect_host,
14474ea19788SShuhei Matsumoto            redirect_port=args.redirect_port)
14484ea19788SShuhei Matsumoto
14494ea19788SShuhei Matsumoto    p = subparsers.add_parser('iscsi_target_node_set_redirect',
14508cf5581fSShuhei Matsumoto                              help="""Update redirect portal of the public portal group for the target node.
14514ea19788SShuhei Matsumoto    Omit redirect host and port to clear previously set redirect settings.""")
14524ea19788SShuhei Matsumoto    p.add_argument('name', help='Target node name (ASCII)')
14534ea19788SShuhei Matsumoto    p.add_argument('pg_tag', help='Portal group tag (unique, integer > 0)', type=int)
14547a372bbeSJim Harris    p.add_argument('-a', '--redirect-host', help='Numeric IP address for redirect portal', required=False)
14557a372bbeSJim Harris    p.add_argument('-p', '--redirect-port', help='Numeric TCP port for redirect portal', required=False)
14564ea19788SShuhei Matsumoto    p.set_defaults(func=iscsi_target_node_set_redirect)
14574ea19788SShuhei Matsumoto
1458e97fd6c9SShuhei Matsumoto    def iscsi_target_node_request_logout(args):
1459e97fd6c9SShuhei Matsumoto        rpc.iscsi.iscsi_target_node_request_logout(
1460e97fd6c9SShuhei Matsumoto            args.client,
1461e97fd6c9SShuhei Matsumoto            name=args.name,
1462e97fd6c9SShuhei Matsumoto            pg_tag=args.pg_tag)
1463e97fd6c9SShuhei Matsumoto
1464e97fd6c9SShuhei Matsumoto    p = subparsers.add_parser('iscsi_target_node_request_logout',
1465e97fd6c9SShuhei Matsumoto                              help="""For the target node, request connections whose portal group tag
1466e97fd6c9SShuhei Matsumoto    match to logout, or request all connections if portal group tag is omitted.""")
1467e97fd6c9SShuhei Matsumoto    p.add_argument('name', help='Target node name (ASCII)')
1468e97fd6c9SShuhei Matsumoto    p.add_argument('-t', '--pg-tag', help='Portal group tag (unique, integer > 0)', type=int, required=False)
1469e97fd6c9SShuhei Matsumoto    p.set_defaults(func=iscsi_target_node_request_logout)
1470e97fd6c9SShuhei Matsumoto
14710f4b3490SPawel Kaminski    def iscsi_create_portal_group(args):
1472253c61beSheluwei        portals = []
1473c781fdeeSShuhei Matsumoto        for p in args.portal_list.strip().split(' '):
1474253c61beSheluwei            ip, separator, port_cpumask = p.rpartition(':')
1475253c61beSheluwei            split_port_cpumask = port_cpumask.split('@')
1476253c61beSheluwei            if len(split_port_cpumask) == 1:
1477253c61beSheluwei                port = port_cpumask
1478253c61beSheluwei                portals.append({'host': ip, 'port': port})
1479253c61beSheluwei            else:
1480253c61beSheluwei                port = split_port_cpumask[0]
1481253c61beSheluwei                cpumask = split_port_cpumask[1]
148239e850d1SBen Walker                portals.append({'host': ip, 'port': port})
148339e850d1SBen Walker                print("WARNING: Specifying a portal group with a CPU mask is no longer supported. Ignoring it.")
14840f4b3490SPawel Kaminski        rpc.iscsi.iscsi_create_portal_group(
1485253c61beSheluwei            args.client,
1486253c61beSheluwei            portals=portals,
148710d62184SShuhei Matsumoto            tag=args.tag,
1488d4ad1f9cSShuhei Matsumoto            private=args.private,
1489d4ad1f9cSShuhei Matsumoto            wait=args.wait)
14907e5ec29aSShuhei Matsumoto
1491febe9002SJim Harris    p = subparsers.add_parser('iscsi_create_portal_group',
14920f4b3490SPawel Kaminski                              help='Add a portal group')
14934dd3f4a7SBen Walker    p.add_argument(
14944dd3f4a7SBen Walker        'tag', help='Portal group tag (unique, integer > 0)', type=int)
149539e850d1SBen Walker    p.add_argument('portal_list', help="""List of portals in host:port format, separated by whitespace
149639e850d1SBen Walker    Example: '192.168.100.100:3260 192.168.100.100:3261 192.168.100.100:3262""")
149710d62184SShuhei Matsumoto    p.add_argument('-p', '--private', help="""Public (false) or private (true) portal group.
149810d62184SShuhei Matsumoto    Private portal groups do not have their portals returned by a discovery session. A public
149910d62184SShuhei Matsumoto    portal group may optionally specify a redirect portal for non-discovery logins. This redirect
150010d62184SShuhei Matsumoto    portal must be from a private portal group.""", action='store_true')
1501d4ad1f9cSShuhei Matsumoto    p.add_argument('-w', '--wait', help="""Do not listening on portals until it is started explicitly.
1502d4ad1f9cSShuhei Matsumoto    One major iSCSI initiator may not retry login once it failed. Hence for such initiator, listening
1503d4ad1f9cSShuhei Matsumoto    on portals should be allowed after all associated target nodes are created.""", action='store_true')
15040f4b3490SPawel Kaminski    p.set_defaults(func=iscsi_create_portal_group)
1505df897ed4SDaniel Verkamp
1506024d2865SShuhei Matsumoto    def iscsi_start_portal_group(args):
1507024d2865SShuhei Matsumoto        rpc.iscsi.iscsi_start_portal_group(args.client, tag=args.tag)
1508024d2865SShuhei Matsumoto
1509024d2865SShuhei Matsumoto    p = subparsers.add_parser('iscsi_start_portal_group',
1510024d2865SShuhei Matsumoto                              help='Start listening on portals if it is not started yet.')
1511024d2865SShuhei Matsumoto    p.add_argument(
1512024d2865SShuhei Matsumoto        'tag', help='Portal group tag (unique, integer > 0)', type=int)
1513024d2865SShuhei Matsumoto    p.set_defaults(func=iscsi_start_portal_group)
1514024d2865SShuhei Matsumoto
151594dd4b9aSPawel Kaminski    def iscsi_create_initiator_group(args):
1516253c61beSheluwei        initiators = []
1517253c61beSheluwei        netmasks = []
1518253c61beSheluwei        for i in args.initiator_list.strip().split(' '):
1519253c61beSheluwei            initiators.append(i)
1520253c61beSheluwei        for n in args.netmask_list.strip().split(' '):
1521253c61beSheluwei            netmasks.append(n)
152294dd4b9aSPawel Kaminski        rpc.iscsi.iscsi_create_initiator_group(
1523253c61beSheluwei            args.client,
1524253c61beSheluwei            tag=args.tag,
1525253c61beSheluwei            initiators=initiators,
1526253c61beSheluwei            netmasks=netmasks)
15277e5ec29aSShuhei Matsumoto
1528febe9002SJim Harris    p = subparsers.add_parser('iscsi_create_initiator_group',
15294dd3f4a7SBen Walker                              help='Add an initiator group')
15304dd3f4a7SBen Walker    p.add_argument(
15314dd3f4a7SBen Walker        'tag', help='Initiator group tag (unique, integer > 0)', type=int)
15324dd3f4a7SBen Walker    p.add_argument('initiator_list', help="""Whitespace-separated list of initiator hostnames or IP addresses,
1533cf8a9bf2SShuhei Matsumoto    enclosed in quotes.  Example: 'ANY' or 'iqn.2016-06.io.spdk:host1 iqn.2016-06.io.spdk:host2'""")
15344dd3f4a7SBen Walker    p.add_argument('netmask_list', help="""Whitespace-separated list of initiator netmasks enclosed in quotes.
15354dd3f4a7SBen Walker    Example: '255.255.0.0 255.248.0.0' etc""")
153694dd4b9aSPawel Kaminski    p.set_defaults(func=iscsi_create_initiator_group)
1537df897ed4SDaniel Verkamp
1538a7d07920SPawel Kaminski    def iscsi_initiator_group_add_initiators(args):
1539253c61beSheluwei        initiators = None
1540253c61beSheluwei        netmasks = None
1541253c61beSheluwei        if args.initiator_list:
1542253c61beSheluwei            initiators = []
1543253c61beSheluwei            for i in args.initiator_list.strip().split(' '):
1544253c61beSheluwei                initiators.append(i)
1545253c61beSheluwei        if args.netmask_list:
1546253c61beSheluwei            netmasks = []
1547253c61beSheluwei            for n in args.netmask_list.strip().split(' '):
1548253c61beSheluwei                netmasks.append(n)
1549a7d07920SPawel Kaminski        rpc.iscsi.iscsi_initiator_group_add_initiators(
1550253c61beSheluwei            args.client,
1551253c61beSheluwei            tag=args.tag,
1552253c61beSheluwei            initiators=initiators,
1553253c61beSheluwei            netmasks=netmasks)
15541e92d78aSBen Walker
1555a7d07920SPawel Kaminski    p = subparsers.add_parser('iscsi_initiator_group_add_initiators',
15562982a74dSShuhei Matsumoto                              help='Add initiators to an existing initiator group')
15572982a74dSShuhei Matsumoto    p.add_argument(
15582982a74dSShuhei Matsumoto        'tag', help='Initiator group tag (unique, integer > 0)', type=int)
15592982a74dSShuhei Matsumoto    p.add_argument('-n', dest='initiator_list', help="""Whitespace-separated list of initiator hostnames or IP addresses,
1560cf8a9bf2SShuhei Matsumoto    enclosed in quotes.  This parameter can be omitted.  Example: 'ANY' or
1561cf8a9bf2SShuhei Matsumoto    'iqn.2016-06.io.spdk:host1 iqn.2016-06.io.spdk:host2'""", required=False)
15622982a74dSShuhei Matsumoto    p.add_argument('-m', dest='netmask_list', help="""Whitespace-separated list of initiator netmasks enclosed in quotes.
15632982a74dSShuhei Matsumoto    This parameter can be omitted.  Example: '255.255.0.0 255.248.0.0' etc""", required=False)
1564a7d07920SPawel Kaminski    p.set_defaults(func=iscsi_initiator_group_add_initiators)
1565df897ed4SDaniel Verkamp
15660fbba82dSPawel Kaminski    def iscsi_initiator_group_remove_initiators(args):
1567253c61beSheluwei        initiators = None
1568253c61beSheluwei        netmasks = None
1569253c61beSheluwei        if args.initiator_list:
1570253c61beSheluwei            initiators = []
1571253c61beSheluwei            for i in args.initiator_list.strip().split(' '):
1572253c61beSheluwei                initiators.append(i)
1573253c61beSheluwei        if args.netmask_list:
1574253c61beSheluwei            netmasks = []
1575253c61beSheluwei            for n in args.netmask_list.strip().split(' '):
1576253c61beSheluwei                netmasks.append(n)
15770fbba82dSPawel Kaminski        rpc.iscsi.iscsi_initiator_group_remove_initiators(
1578253c61beSheluwei            args.client,
1579253c61beSheluwei            tag=args.tag,
1580253c61beSheluwei            initiators=initiators,
1581253c61beSheluwei            netmasks=netmasks)
15822982a74dSShuhei Matsumoto
15830fbba82dSPawel Kaminski    p = subparsers.add_parser('iscsi_initiator_group_remove_initiators',
15842982a74dSShuhei Matsumoto                              help='Delete initiators from an existing initiator group')
15852982a74dSShuhei Matsumoto    p.add_argument(
15862982a74dSShuhei Matsumoto        'tag', help='Initiator group tag (unique, integer > 0)', type=int)
15872982a74dSShuhei Matsumoto    p.add_argument('-n', dest='initiator_list', help="""Whitespace-separated list of initiator hostnames or IP addresses,
1588cf8a9bf2SShuhei Matsumoto    enclosed in quotes.  This parameter can be omitted.  Example: 'ANY' or
1589cf8a9bf2SShuhei Matsumoto    'iqn.2016-06.io.spdk:host1 iqn.2016-06.io.spdk:host2'""", required=False)
15902982a74dSShuhei Matsumoto    p.add_argument('-m', dest='netmask_list', help="""Whitespace-separated list of initiator netmasks enclosed in quotes.
15912982a74dSShuhei Matsumoto    This parameter can be omitted.  Example: '255.255.0.0 255.248.0.0' etc""", required=False)
15920fbba82dSPawel Kaminski    p.set_defaults(func=iscsi_initiator_group_remove_initiators)
1593df897ed4SDaniel Verkamp
1594a5a296dcSPawel Kaminski    def iscsi_delete_target_node(args):
1595a5a296dcSPawel Kaminski        rpc.iscsi.iscsi_delete_target_node(
1596253c61beSheluwei            args.client, target_node_name=args.target_node_name)
15972982a74dSShuhei Matsumoto
1598febe9002SJim Harris    p = subparsers.add_parser('iscsi_delete_target_node',
15994dd3f4a7SBen Walker                              help='Delete a target node')
16004dd3f4a7SBen Walker    p.add_argument('target_node_name',
16014dd3f4a7SBen Walker                   help='Target node name to be deleted. Example: iqn.2016-06.io.spdk:disk1.')
1602a5a296dcSPawel Kaminski    p.set_defaults(func=iscsi_delete_target_node)
1603df897ed4SDaniel Verkamp
16044bb8a88cSPawel Kaminski    def iscsi_delete_portal_group(args):
16054bb8a88cSPawel Kaminski        rpc.iscsi.iscsi_delete_portal_group(args.client, tag=args.tag)
16061e92d78aSBen Walker
16074bb8a88cSPawel Kaminski    p = subparsers.add_parser('iscsi_delete_portal_group',
16084dd3f4a7SBen Walker                              help='Delete a portal group')
16094dd3f4a7SBen Walker    p.add_argument(
16104dd3f4a7SBen Walker        'tag', help='Portal group tag (unique, integer > 0)', type=int)
16114bb8a88cSPawel Kaminski    p.set_defaults(func=iscsi_delete_portal_group)
1612df897ed4SDaniel Verkamp
16137eedb271SPawel Kaminski    def iscsi_delete_initiator_group(args):
16147eedb271SPawel Kaminski        rpc.iscsi.iscsi_delete_initiator_group(args.client, tag=args.tag)
16151e92d78aSBen Walker
16167eedb271SPawel Kaminski    p = subparsers.add_parser('iscsi_delete_initiator_group',
16174dd3f4a7SBen Walker                              help='Delete an initiator group')
16184dd3f4a7SBen Walker    p.add_argument(
16194dd3f4a7SBen Walker        'tag', help='Initiator group tag (unique, integer > 0)', type=int)
16207eedb271SPawel Kaminski    p.set_defaults(func=iscsi_delete_initiator_group)
1621df897ed4SDaniel Verkamp
16221aa8e4e5SShuhei Matsumoto    def iscsi_portal_group_set_auth(args):
16231aa8e4e5SShuhei Matsumoto        rpc.iscsi.iscsi_portal_group_set_auth(
16241aa8e4e5SShuhei Matsumoto            args.client,
16251aa8e4e5SShuhei Matsumoto            tag=args.tag,
16261aa8e4e5SShuhei Matsumoto            chap_group=args.chap_group,
16271aa8e4e5SShuhei Matsumoto            disable_chap=args.disable_chap,
16281aa8e4e5SShuhei Matsumoto            require_chap=args.require_chap,
16291aa8e4e5SShuhei Matsumoto            mutual_chap=args.mutual_chap)
16301aa8e4e5SShuhei Matsumoto
16311aa8e4e5SShuhei Matsumoto    p = subparsers.add_parser('iscsi_portal_group_set_auth',
16321aa8e4e5SShuhei Matsumoto                              help='Set CHAP authentication for discovery sessions specific for the portal group')
16331aa8e4e5SShuhei Matsumoto    p.add_argument('tag', help='Portal group tag (unique, integer > 0)', type=int)
16341aa8e4e5SShuhei Matsumoto    p.add_argument('-g', '--chap-group', help="""Authentication group ID for this portal group.
16351aa8e4e5SShuhei Matsumoto    *** Authentication group must be precreated ***""", type=int, default=0)
16361aa8e4e5SShuhei Matsumoto    p.add_argument('-d', '--disable-chap', help="""CHAP authentication should be disabled for this portal group.
16371aa8e4e5SShuhei Matsumoto    *** Mutually exclusive with --require-chap ***""", action='store_true')
16381aa8e4e5SShuhei Matsumoto    p.add_argument('-r', '--require-chap', help="""CHAP authentication should be required for this portal group.
16391aa8e4e5SShuhei Matsumoto    *** Mutually exclusive with --disable-chap ***""", action='store_true')
16401aa8e4e5SShuhei Matsumoto    p.add_argument('-m', '--mutual-chap', help='CHAP authentication should be mutual/bidirectional.',
16411aa8e4e5SShuhei Matsumoto                   action='store_true')
16421aa8e4e5SShuhei Matsumoto    p.set_defaults(func=iscsi_portal_group_set_auth)
16431aa8e4e5SShuhei Matsumoto
16446d779941SPawel Kaminski    def iscsi_get_connections(args):
16456d779941SPawel Kaminski        print_dict(rpc.iscsi.iscsi_get_connections(args.client))
16461887183fSTomasz Zawadzki
1647febe9002SJim Harris    p = subparsers.add_parser('iscsi_get_connections',
16484dd3f4a7SBen Walker                              help='Display iSCSI connections')
16496d779941SPawel Kaminski    p.set_defaults(func=iscsi_get_connections)
1650df897ed4SDaniel Verkamp
165161f4433cSPawel Kaminski    def iscsi_get_options(args):
165261f4433cSPawel Kaminski        print_dict(rpc.iscsi.iscsi_get_options(args.client))
16531887183fSTomasz Zawadzki
1654febe9002SJim Harris    p = subparsers.add_parser('iscsi_get_options',
165561f4433cSPawel Kaminski                              help='Display iSCSI global parameters')
165661f4433cSPawel Kaminski    p.set_defaults(func=iscsi_get_options)
1657df897ed4SDaniel Verkamp
1658617f17d8SPawel Kaminski    def scsi_get_devices(args):
1659617f17d8SPawel Kaminski        print_dict(rpc.iscsi.scsi_get_devices(args.client))
16601887183fSTomasz Zawadzki
1661febe9002SJim Harris    p = subparsers.add_parser('scsi_get_devices', help='Display SCSI devices')
1662617f17d8SPawel Kaminski    p.set_defaults(func=scsi_get_devices)
16631887183fSTomasz Zawadzki
1664ae0aae15SLiu Xiaodong    # trace
1665dd29bd7eSPawel Kaminski    def trace_enable_tpoint_group(args):
1666dd29bd7eSPawel Kaminski        rpc.trace.trace_enable_tpoint_group(args.client, name=args.name)
1667ae0aae15SLiu Xiaodong
1668dd29bd7eSPawel Kaminski    p = subparsers.add_parser('trace_enable_tpoint_group', aliases=['enable_tpoint_group'],
1669dd29bd7eSPawel Kaminski                              help='enable trace on a specific tpoint group')
1670ae0aae15SLiu Xiaodong    p.add_argument(
1671ae0aae15SLiu Xiaodong        'name', help="""trace group name we want to enable in tpoint_group_mask.
1672ae0aae15SLiu Xiaodong        (for example "bdev" for bdev trace group, "all" for all trace groups).""")
1673dd29bd7eSPawel Kaminski    p.set_defaults(func=trace_enable_tpoint_group)
1674ae0aae15SLiu Xiaodong
1675ecca55c9SPawel Kaminski    def trace_disable_tpoint_group(args):
1676ecca55c9SPawel Kaminski        rpc.trace.trace_disable_tpoint_group(args.client, name=args.name)
1677ae0aae15SLiu Xiaodong
1678ecca55c9SPawel Kaminski    p = subparsers.add_parser('trace_disable_tpoint_group', aliases=['disable_tpoint_group'],
1679ecca55c9SPawel Kaminski                              help='disable trace on a specific tpoint group')
1680ae0aae15SLiu Xiaodong    p.add_argument(
1681ae0aae15SLiu Xiaodong        'name', help="""trace group name we want to disable in tpoint_group_mask.
1682ae0aae15SLiu Xiaodong        (for example "bdev" for bdev trace group, "all" for all trace groups).""")
1683ecca55c9SPawel Kaminski    p.set_defaults(func=trace_disable_tpoint_group)
1684ae0aae15SLiu Xiaodong
1685aa499efdSKrzysztof Karas    def trace_set_tpoint_mask(args):
1686aa499efdSKrzysztof Karas        rpc.trace.trace_set_tpoint_mask(args.client, name=args.name, tpoint_mask=args.tpoint_mask)
1687aa499efdSKrzysztof Karas
1688aa499efdSKrzysztof Karas    p = subparsers.add_parser('trace_set_tpoint_mask',
1689aa499efdSKrzysztof Karas                              help='enable tracepoint mask on a specific tpoint group')
1690aa499efdSKrzysztof Karas    p.add_argument(
1691aa499efdSKrzysztof Karas        'name', help="""trace group name we want to enable in tpoint_group_mask.
1692aa499efdSKrzysztof Karas        (for example "bdev" for bdev trace group)""")
1693aa499efdSKrzysztof Karas    p.add_argument(
1694aa499efdSKrzysztof Karas        'tpoint_mask', help="""tracepoints to be enabled inside a given trace group.
1695aa499efdSKrzysztof Karas        (for example value of "0x3" will enable only the first two tpoints in this group)""",
1696aa499efdSKrzysztof Karas        type=lambda m: int(m, 16))
1697aa499efdSKrzysztof Karas    p.set_defaults(func=trace_set_tpoint_mask)
1698aa499efdSKrzysztof Karas
1699aa499efdSKrzysztof Karas    def trace_clear_tpoint_mask(args):
1700aa499efdSKrzysztof Karas        rpc.trace.trace_clear_tpoint_mask(args.client, name=args.name, tpoint_mask=args.tpoint_mask)
1701aa499efdSKrzysztof Karas
1702aa499efdSKrzysztof Karas    p = subparsers.add_parser('trace_clear_tpoint_mask',
1703aa499efdSKrzysztof Karas                              help='disable tracepoint mask on a specific tpoint group')
1704aa499efdSKrzysztof Karas    p.add_argument(
1705aa499efdSKrzysztof Karas        'name', help="""trace group name we want to disable in tpoint_group_mask.
1706aa499efdSKrzysztof Karas        (for example "bdev" for bdev trace group)""")
1707aa499efdSKrzysztof Karas    p.add_argument(
1708aa499efdSKrzysztof Karas        'tpoint_mask', help="""tracepoints to be disabled inside a given trace group.
1709aa499efdSKrzysztof Karas        (for example value of "0x3" will disable the first two tpoints in this group)""",
1710aa499efdSKrzysztof Karas        type=lambda m: int(m, 16))
1711aa499efdSKrzysztof Karas    p.set_defaults(func=trace_clear_tpoint_mask)
1712aa499efdSKrzysztof Karas
17133650a733SPawel Kaminski    def trace_get_tpoint_group_mask(args):
17143650a733SPawel Kaminski        print_dict(rpc.trace.trace_get_tpoint_group_mask(args.client))
1715ae0aae15SLiu Xiaodong
17163650a733SPawel Kaminski    p = subparsers.add_parser('trace_get_tpoint_group_mask', aliases=['get_tpoint_group_mask'],
17173650a733SPawel Kaminski                              help='get trace point group mask')
17183650a733SPawel Kaminski    p.set_defaults(func=trace_get_tpoint_group_mask)
1719ae0aae15SLiu Xiaodong
17204dd3f4a7SBen Walker    # log
17218dc50d2dSMaciej Wawryk    def log_set_flag(args):
17228dc50d2dSMaciej Wawryk        rpc.log.log_set_flag(args.client, flag=args.flag)
1723870b0e5bSJim Harris
1724d8d29ec0Swanghailiangx    p = subparsers.add_parser('log_set_flag', help='set log flag')
1725870b0e5bSJim Harris    p.add_argument(
1726870b0e5bSJim Harris        'flag', help='log flag we want to set. (for example "nvme").')
17278dc50d2dSMaciej Wawryk    p.set_defaults(func=log_set_flag)
1728870b0e5bSJim Harris
1729b8fffddeSMaciej Wawryk    def log_clear_flag(args):
1730b8fffddeSMaciej Wawryk        rpc.log.log_clear_flag(args.client, flag=args.flag)
1731870b0e5bSJim Harris
1732d8d29ec0Swanghailiangx    p = subparsers.add_parser('log_clear_flag', help='clear log flag')
1733870b0e5bSJim Harris    p.add_argument(
1734870b0e5bSJim Harris        'flag', help='log flag we want to clear. (for example "nvme").')
1735b8fffddeSMaciej Wawryk    p.set_defaults(func=log_clear_flag)
1736870b0e5bSJim Harris
1737416310d5SMaciej Wawryk    def log_get_flags(args):
1738416310d5SMaciej Wawryk        print_dict(rpc.log.log_get_flags(args.client))
1739870b0e5bSJim Harris
1740d8d29ec0Swanghailiangx    p = subparsers.add_parser('log_get_flags', help='get log flags')
1741416310d5SMaciej Wawryk    p.set_defaults(func=log_get_flags)
1742870b0e5bSJim Harris
17432fd47b7dSMaciej Wawryk    def log_set_level(args):
17442fd47b7dSMaciej Wawryk        rpc.log.log_set_level(args.client, level=args.level)
17451887183fSTomasz Zawadzki
1746d8d29ec0Swanghailiangx    p = subparsers.add_parser('log_set_level', help='set log level')
17474dd3f4a7SBen Walker    p.add_argument('level', help='log level we want to set. (for example "DEBUG").')
17482fd47b7dSMaciej Wawryk    p.set_defaults(func=log_set_level)
1749df897ed4SDaniel Verkamp
1750ba735b42SMaciej Wawryk    def log_get_level(args):
1751ba735b42SMaciej Wawryk        print_dict(rpc.log.log_get_level(args.client))
17521887183fSTomasz Zawadzki
1753d8d29ec0Swanghailiangx    p = subparsers.add_parser('log_get_level', help='get log level')
1754ba735b42SMaciej Wawryk    p.set_defaults(func=log_get_level)
1755df897ed4SDaniel Verkamp
175695bfca6cSMaciej Wawryk    def log_set_print_level(args):
175795bfca6cSMaciej Wawryk        rpc.log.log_set_print_level(args.client, level=args.level)
17581887183fSTomasz Zawadzki
1759d8d29ec0Swanghailiangx    p = subparsers.add_parser('log_set_print_level', help='set log print level')
17604dd3f4a7SBen Walker    p.add_argument('level', help='log print level we want to set. (for example "DEBUG").')
176195bfca6cSMaciej Wawryk    p.set_defaults(func=log_set_print_level)
1762df897ed4SDaniel Verkamp
17637c073fc7SMaciej Wawryk    def log_get_print_level(args):
17647c073fc7SMaciej Wawryk        print_dict(rpc.log.log_get_print_level(args.client))
1765fca11f15SPiotr Pelplinski
1766d8d29ec0Swanghailiangx    p = subparsers.add_parser('log_get_print_level', help='get log print level')
17677c073fc7SMaciej Wawryk    p.set_defaults(func=log_get_print_level)
1768fca11f15SPiotr Pelplinski
17694dd3f4a7SBen Walker    # lvol
1770de756853SMaciej Wawryk    def bdev_lvol_create_lvstore(args):
1771de756853SMaciej Wawryk        print_json(rpc.lvol.bdev_lvol_create_lvstore(args.client,
17727d45cfc3SDaniel Verkamp                                                     bdev_name=args.bdev_name,
17737d45cfc3SDaniel Verkamp                                                     lvs_name=args.lvs_name,
1774ca87060dSTomasz Zawadzki                                                     cluster_sz=args.cluster_sz,
1775ca87060dSTomasz Zawadzki                                                     clear_method=args.clear_method))
1776df897ed4SDaniel Verkamp
17777aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_lvol_create_lvstore', help='Add logical volume store on base bdev')
1778511adde0SPiotr Pelplinski    p.add_argument('bdev_name', help='base bdev name')
1779511adde0SPiotr Pelplinski    p.add_argument('lvs_name', help='name for lvol store')
17809f6f73d4STomasz Zawadzki    p.add_argument('-c', '--cluster-sz', help='size of cluster (in bytes)', type=int, required=False)
1781ca87060dSTomasz Zawadzki    p.add_argument('--clear-method', help="""Change clear method for data region.
1782ca87060dSTomasz Zawadzki        Available: none, unmap, write_zeroes""", required=False)
1783de756853SMaciej Wawryk    p.set_defaults(func=bdev_lvol_create_lvstore)
1784df897ed4SDaniel Verkamp
178590e4ae5dSMaciej Wawryk    def bdev_lvol_rename_lvstore(args):
178690e4ae5dSMaciej Wawryk        rpc.lvol.bdev_lvol_rename_lvstore(args.client,
17877d45cfc3SDaniel Verkamp                                          old_name=args.old_name,
17887d45cfc3SDaniel Verkamp                                          new_name=args.new_name)
178927f44662STomasz Zawadzki
17907aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_lvol_rename_lvstore', help='Change logical volume store name')
1791f5e590c8SSebastian Basierski    p.add_argument('old_name', help='old name')
1792f5e590c8SSebastian Basierski    p.add_argument('new_name', help='new name')
179390e4ae5dSMaciej Wawryk    p.set_defaults(func=bdev_lvol_rename_lvstore)
1794df897ed4SDaniel Verkamp
1795c57cd922SMaciej Wawryk    def bdev_lvol_create(args):
1796c57cd922SMaciej Wawryk        print_json(rpc.lvol.bdev_lvol_create(args.client,
17977d45cfc3SDaniel Verkamp                                             lvol_name=args.lvol_name,
17987d45cfc3SDaniel Verkamp                                             size=args.size * 1024 * 1024,
17997d45cfc3SDaniel Verkamp                                             thin_provision=args.thin_provision,
1800adb39585SMaciej Szwed                                             clear_method=args.clear_method,
18017d45cfc3SDaniel Verkamp                                             uuid=args.uuid,
18027d45cfc3SDaniel Verkamp                                             lvs_name=args.lvs_name))
1803f5e590c8SSebastian Basierski
18047aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_lvol_create', help='Add a bdev with an logical volume backend')
1805511adde0SPiotr Pelplinski    p.add_argument('-u', '--uuid', help='lvol store UUID', required=False)
18063ac5d089SDaniel Verkamp    p.add_argument('-l', '--lvs-name', help='lvol store name', required=False)
18079ed6beddSMaciej Szwed    p.add_argument('-t', '--thin-provision', action='store_true', help='create lvol bdev as thin provisioned')
1808adb39585SMaciej Szwed    p.add_argument('-c', '--clear-method', help="""Change default data clusters clear method.
1809adb39585SMaciej Szwed        Available: none, unmap, write_zeroes""", required=False)
1810511adde0SPiotr Pelplinski    p.add_argument('lvol_name', help='name for this lvol')
181127f44662STomasz Zawadzki    p.add_argument('size', help='size in MiB for this bdev', type=int)
1812c57cd922SMaciej Wawryk    p.set_defaults(func=bdev_lvol_create)
1813df897ed4SDaniel Verkamp
1814f5cf8ea1SMaciej Wawryk    def bdev_lvol_snapshot(args):
1815f5cf8ea1SMaciej Wawryk        print_json(rpc.lvol.bdev_lvol_snapshot(args.client,
18167d45cfc3SDaniel Verkamp                                               lvol_name=args.lvol_name,
1817160850f0STomasz Zawadzki                                               snapshot_name=args.snapshot_name))
181897934c52STomasz Zawadzki
18197aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_lvol_snapshot', help='Create a snapshot of an lvol bdev')
182097934c52STomasz Zawadzki    p.add_argument('lvol_name', help='lvol bdev name')
182197934c52STomasz Zawadzki    p.add_argument('snapshot_name', help='lvol snapshot name')
1822f5cf8ea1SMaciej Wawryk    p.set_defaults(func=bdev_lvol_snapshot)
182397934c52STomasz Zawadzki
1824827b2667SMaciej Wawryk    def bdev_lvol_clone(args):
1825827b2667SMaciej Wawryk        print_json(rpc.lvol.bdev_lvol_clone(args.client,
18267d45cfc3SDaniel Verkamp                                            snapshot_name=args.snapshot_name,
1827160850f0STomasz Zawadzki                                            clone_name=args.clone_name))
182897934c52STomasz Zawadzki
18297aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_lvol_clone', help='Create a clone of an lvol snapshot')
183097934c52STomasz Zawadzki    p.add_argument('snapshot_name', help='lvol snapshot name')
183197934c52STomasz Zawadzki    p.add_argument('clone_name', help='lvol clone name')
1832827b2667SMaciej Wawryk    p.set_defaults(func=bdev_lvol_clone)
183397934c52STomasz Zawadzki
18340ce883ceSMaciej Wawryk    def bdev_lvol_rename(args):
18350ce883ceSMaciej Wawryk        rpc.lvol.bdev_lvol_rename(args.client,
18367d45cfc3SDaniel Verkamp                                  old_name=args.old_name,
18377d45cfc3SDaniel Verkamp                                  new_name=args.new_name)
183827f44662STomasz Zawadzki
18397aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_lvol_rename', help='Change lvol bdev name')
1840526cd580SSebastian Basierski    p.add_argument('old_name', help='lvol bdev name')
1841526cd580SSebastian Basierski    p.add_argument('new_name', help='new lvol name')
18420ce883ceSMaciej Wawryk    p.set_defaults(func=bdev_lvol_rename)
1843526cd580SSebastian Basierski
18447a294f4cSMaciej Wawryk    def bdev_lvol_inflate(args):
18457a294f4cSMaciej Wawryk        rpc.lvol.bdev_lvol_inflate(args.client,
1846fda8596eSMaciej Szwed                                   name=args.name)
1847fda8596eSMaciej Szwed
18487aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_lvol_inflate', help='Make thin provisioned lvol a thick provisioned lvol')
1849fda8596eSMaciej Szwed    p.add_argument('name', help='lvol bdev name')
18507a294f4cSMaciej Wawryk    p.set_defaults(func=bdev_lvol_inflate)
1851fda8596eSMaciej Szwed
1852975efa2aSMaciej Wawryk    def bdev_lvol_decouple_parent(args):
1853975efa2aSMaciej Wawryk        rpc.lvol.bdev_lvol_decouple_parent(args.client,
1854635a1aa8STomasz Kulasek                                           name=args.name)
1855635a1aa8STomasz Kulasek
18567aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_lvol_decouple_parent', help='Decouple parent of lvol')
1857635a1aa8STomasz Kulasek    p.add_argument('name', help='lvol bdev name')
1858975efa2aSMaciej Wawryk    p.set_defaults(func=bdev_lvol_decouple_parent)
1859635a1aa8STomasz Kulasek
1860c2d85bb2SMaciej Wawryk    def bdev_lvol_resize(args):
1861c2d85bb2SMaciej Wawryk        rpc.lvol.bdev_lvol_resize(args.client,
18627d45cfc3SDaniel Verkamp                                  name=args.name,
18637d45cfc3SDaniel Verkamp                                  size=args.size * 1024 * 1024)
18647552707eSSlawomir Mrozowicz
18657aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_lvol_resize', help='Resize existing lvol bdev')
18667552707eSSlawomir Mrozowicz    p.add_argument('name', help='lvol bdev name')
18677552707eSSlawomir Mrozowicz    p.add_argument('size', help='new size in MiB for this bdev', type=int)
1868c2d85bb2SMaciej Wawryk    p.set_defaults(func=bdev_lvol_resize)
1869df897ed4SDaniel Verkamp
1870b7ad0bd0SMaciej Wawryk    def bdev_lvol_set_read_only(args):
1871b7ad0bd0SMaciej Wawryk        rpc.lvol.bdev_lvol_set_read_only(args.client,
18723bb815aeSTomasz Zawadzki                                         name=args.name)
18733bb815aeSTomasz Zawadzki
18747aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_lvol_set_read_only', help='Mark lvol bdev as read only')
18753bb815aeSTomasz Zawadzki    p.add_argument('name', help='lvol bdev name')
1876b7ad0bd0SMaciej Wawryk    p.set_defaults(func=bdev_lvol_set_read_only)
18773bb815aeSTomasz Zawadzki
1878b5fdf4ecSMaciej Wawryk    def bdev_lvol_delete(args):
1879b5fdf4ecSMaciej Wawryk        rpc.lvol.bdev_lvol_delete(args.client,
1880f9d52c9eSDaniel Verkamp                                  name=args.name)
1881f9d52c9eSDaniel Verkamp
18827aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_lvol_delete', help='Destroy a logical volume')
1883f9d52c9eSDaniel Verkamp    p.add_argument('name', help='lvol bdev name')
1884b5fdf4ecSMaciej Wawryk    p.set_defaults(func=bdev_lvol_delete)
1885f9d52c9eSDaniel Verkamp
18864c049618SMaciej Wawryk    def bdev_lvol_delete_lvstore(args):
18874c049618SMaciej Wawryk        rpc.lvol.bdev_lvol_delete_lvstore(args.client,
18887d45cfc3SDaniel Verkamp                                          uuid=args.uuid,
18897d45cfc3SDaniel Verkamp                                          lvs_name=args.lvs_name)
189027f44662STomasz Zawadzki
18917aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_lvol_delete_lvstore', help='Destroy an logical volume store')
1892511adde0SPiotr Pelplinski    p.add_argument('-u', '--uuid', help='lvol store UUID', required=False)
18933ac5d089SDaniel Verkamp    p.add_argument('-l', '--lvs-name', help='lvol store name', required=False)
18944c049618SMaciej Wawryk    p.set_defaults(func=bdev_lvol_delete_lvstore)
1895df897ed4SDaniel Verkamp
18960b3f378fSMaciej Wawryk    def bdev_lvol_get_lvstores(args):
18970b3f378fSMaciej Wawryk        print_dict(rpc.lvol.bdev_lvol_get_lvstores(args.client,
18987d45cfc3SDaniel Verkamp                                                   uuid=args.uuid,
18997d45cfc3SDaniel Verkamp                                                   lvs_name=args.lvs_name))
1900e21aede9STomasz Zawadzki
19017aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_lvol_get_lvstores', help='Display current logical volume store list')
19029856fe06STomasz Zawadzki    p.add_argument('-u', '--uuid', help='lvol store UUID', required=False)
19033ac5d089SDaniel Verkamp    p.add_argument('-l', '--lvs-name', help='lvol store name', required=False)
19040b3f378fSMaciej Wawryk    p.set_defaults(func=bdev_lvol_get_lvstores)
1905e21aede9STomasz Zawadzki
1906b9477173SMaciej Wawryk    def bdev_raid_get_bdevs(args):
1907b9477173SMaciej Wawryk        print_array(rpc.bdev.bdev_raid_get_bdevs(args.client,
190841586b0fSKunal Sablok                                                 category=args.category))
190941586b0fSKunal Sablok
19107aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_raid_get_bdevs',
1911b9477173SMaciej Wawryk                              help="""This is used to list all the raid bdev names based on the input category
191241586b0fSKunal Sablok    requested. Category should be one of 'all', 'online', 'configuring' or 'offline'. 'all' means all the raid bdevs whether
191341586b0fSKunal Sablok    they are online or configuring or offline. 'online' is the raid bdev which is registered with bdev layer. 'configuring'
191441586b0fSKunal Sablok    is the raid bdev which does not have full configuration discovered yet. 'offline' is the raid bdev which is not registered
191541586b0fSKunal Sablok    with bdev as of now and it has encountered any error or user has requested to offline the raid bdev""")
191641586b0fSKunal Sablok    p.add_argument('category', help='all or online or configuring or offline')
1917b9477173SMaciej Wawryk    p.set_defaults(func=bdev_raid_get_bdevs)
191841586b0fSKunal Sablok
1919f0731534SMaciej Wawryk    def bdev_raid_create(args):
192041586b0fSKunal Sablok        base_bdevs = []
192141586b0fSKunal Sablok        for u in args.base_bdevs.strip().split(" "):
192241586b0fSKunal Sablok            base_bdevs.append(u)
192341586b0fSKunal Sablok
1924f0731534SMaciej Wawryk        rpc.bdev.bdev_raid_create(args.client,
192541586b0fSKunal Sablok                                  name=args.name,
19268a1acca6Spaul luse                                  strip_size_kb=args.strip_size_kb,
192741586b0fSKunal Sablok                                  raid_level=args.raid_level,
192841586b0fSKunal Sablok                                  base_bdevs=base_bdevs)
19297aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_raid_create', help='Create new raid bdev')
193041586b0fSKunal Sablok    p.add_argument('-n', '--name', help='raid bdev name', required=True)
1931928db416Syidong0635    p.add_argument('-z', '--strip-size-kb', help='strip size in KB', type=int)
193264eebbd1Syupeng    p.add_argument('-r', '--raid-level', help='raid level, raid0 and a special level concat are supported', required=True)
193341586b0fSKunal Sablok    p.add_argument('-b', '--base-bdevs', help='base bdevs name, whitespace separated list in quotes', required=True)
1934f0731534SMaciej Wawryk    p.set_defaults(func=bdev_raid_create)
193541586b0fSKunal Sablok
193627d8ca2cSMaciej Wawryk    def bdev_raid_delete(args):
193727d8ca2cSMaciej Wawryk        rpc.bdev.bdev_raid_delete(args.client,
193841586b0fSKunal Sablok                                  name=args.name)
19397aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_raid_delete', help='Delete existing raid bdev')
194041586b0fSKunal Sablok    p.add_argument('name', help='raid bdev name')
194127d8ca2cSMaciej Wawryk    p.set_defaults(func=bdev_raid_delete)
194241586b0fSKunal Sablok
1943a5dbccf0SPawel Wodkowski    # split
1944a1bda4e1SMaciej Wawryk    def bdev_split_create(args):
1945a1bda4e1SMaciej Wawryk        print_array(rpc.bdev.bdev_split_create(args.client,
19461ea97654SDaniel Verkamp                                               base_bdev=args.base_bdev,
19471ea97654SDaniel Verkamp                                               split_count=args.split_count,
19481ea97654SDaniel Verkamp                                               split_size_mb=args.split_size_mb))
1949a5dbccf0SPawel Wodkowski
19507aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_split_create',
1951a1bda4e1SMaciej Wawryk                              help="""Add given disk name to split config. If bdev with base_name
1952a5dbccf0SPawel Wodkowski    name exist the split bdevs will be created right away, if not split bdevs will be created when base bdev became
1953a5dbccf0SPawel Wodkowski    available (during examination process).""")
1954a5dbccf0SPawel Wodkowski    p.add_argument('base_bdev', help='base bdev name')
19553ac5d089SDaniel Verkamp    p.add_argument('-s', '--split-size-mb', help='size in MiB for each bdev', type=int, default=0)
1956a5dbccf0SPawel Wodkowski    p.add_argument('split_count', help="""Optional - number of split bdevs to create. Total size * split_count must not
1957a5dbccf0SPawel Wodkowski    exceed the base bdev size.""", type=int)
1958a1bda4e1SMaciej Wawryk    p.set_defaults(func=bdev_split_create)
1959a5dbccf0SPawel Wodkowski
19607df830a8SMaciej Wawryk    def bdev_split_delete(args):
19617df830a8SMaciej Wawryk        rpc.bdev.bdev_split_delete(args.client,
19621ea97654SDaniel Verkamp                                   base_bdev=args.base_bdev)
1963a5dbccf0SPawel Wodkowski
19647aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_split_delete', help="""Delete split config with all created splits.""")
1965a5dbccf0SPawel Wodkowski    p.add_argument('base_bdev', help='base bdev name')
19667df830a8SMaciej Wawryk    p.set_defaults(func=bdev_split_delete)
1967a5dbccf0SPawel Wodkowski
19687c233adeSWojciech Malikowski    # ftl
1969cd115ecfSMateusz Kozlowski    ftl_valid_limits = ('crit', 'high', 'low', 'start')
1970cd115ecfSMateusz Kozlowski
1971ee3403b5SPawel Kaminski    def bdev_ftl_create(args):
1972cd115ecfSMateusz Kozlowski        def parse_limits(limits, arg_dict, key_suffix=''):
1973cd115ecfSMateusz Kozlowski            for limit in limits.split(','):
1974cd115ecfSMateusz Kozlowski                key, value = limit.split(':', 1)
1975cd115ecfSMateusz Kozlowski                if key in ftl_valid_limits:
1976cd115ecfSMateusz Kozlowski                    arg_dict['limit_' + key + key_suffix] = int(value)
1977cd115ecfSMateusz Kozlowski                else:
1978cd115ecfSMateusz Kozlowski                    raise ValueError('Limit {} is not supported'.format(key))
1979cd115ecfSMateusz Kozlowski
1980cd115ecfSMateusz Kozlowski        arg_limits = {}
1981cd115ecfSMateusz Kozlowski        if args.limit_threshold:
1982cd115ecfSMateusz Kozlowski            parse_limits(args.limit_threshold, arg_limits, '_threshold')
1983cd115ecfSMateusz Kozlowski
1984cd115ecfSMateusz Kozlowski        if args.limit:
1985cd115ecfSMateusz Kozlowski            parse_limits(args.limit, arg_limits)
1986cd115ecfSMateusz Kozlowski
1987ee3403b5SPawel Kaminski        print_dict(rpc.bdev.bdev_ftl_create(args.client,
19887c233adeSWojciech Malikowski                                            name=args.name,
1989f2c8083eSWojciech Malikowski                                            base_bdev=args.base_bdev,
1990a0cb5e9dSKonrad Sztyber                                            uuid=args.uuid,
199142fe2e9bSMateusz Kozlowski                                            cache=args.cache,
1992cd115ecfSMateusz Kozlowski                                            allow_open_bands=args.allow_open_bands,
1993cd115ecfSMateusz Kozlowski                                            overprovisioning=args.overprovisioning,
199412642633SMaciej Szczepaniak                                            l2p_path=args.l2p_path,
1995dcd3fc1fSWojciech Malikowski                                            use_append=args.use_append,
1996cd115ecfSMateusz Kozlowski                                            **arg_limits))
19977c233adeSWojciech Malikowski
19987aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_ftl_create', help='Add FTL bdev')
19997c233adeSWojciech Malikowski    p.add_argument('-b', '--name', help="Name of the bdev", required=True)
20007a372bbeSJim Harris    p.add_argument('-d', '--base-bdev', help='Name of zoned bdev used as underlying device',
2001f2c8083eSWojciech Malikowski                   required=True)
20027c233adeSWojciech Malikowski    p.add_argument('-u', '--uuid', help='UUID of restored bdev (not applicable when creating new '
20037c233adeSWojciech Malikowski                   'instance): e.g. b286d19a-0059-4709-abcd-9f7732b1567d (optional)')
2004a0cb5e9dSKonrad Sztyber    p.add_argument('-c', '--cache', help='Name of the bdev to be used as a write buffer cache (optional)')
20057a372bbeSJim Harris    p.add_argument('-o', '--allow-open-bands', help='Restoring after dirty shutdown without cache will'
200642fe2e9bSMateusz Kozlowski                   ' result in partial data recovery, instead of error', action='store_true')
2007cd115ecfSMateusz Kozlowski    p.add_argument('--overprovisioning', help='Percentage of device used for relocation, not exposed'
2008cd115ecfSMateusz Kozlowski                   ' to user (optional)', type=int)
20097a372bbeSJim Harris    p.add_argument('--l2p-path', help='Path to persistent memory file or device to store l2p onto, '
201012642633SMaciej Szczepaniak                                      'by default l2p is kept in DRAM and is volatile (optional)')
20117a372bbeSJim Harris    p.add_argument('--use-append', help='Use appends instead of writes', action='store_true')
2012cd115ecfSMateusz Kozlowski
2013cd115ecfSMateusz Kozlowski    limits = p.add_argument_group('Defrag limits', 'Configures defrag limits and thresholds for'
2014cd115ecfSMateusz Kozlowski                                  ' levels ' + str(ftl_valid_limits)[1:-1])
2015cd115ecfSMateusz Kozlowski    limits.add_argument('--limit', help='Percentage of allowed user versus internal writes at given'
2016cd115ecfSMateusz Kozlowski                        ' levels, e.g. crit:0,high:20,low:80')
2017cd115ecfSMateusz Kozlowski    limits.add_argument('--limit-threshold', help='Number of free bands triggering a given level of'
2018cd115ecfSMateusz Kozlowski                        ' write limiting e.g. crit:1,high:2,low:3,start:4')
2019ee3403b5SPawel Kaminski    p.set_defaults(func=bdev_ftl_create)
20207c233adeSWojciech Malikowski
2021ee3403b5SPawel Kaminski    def bdev_ftl_delete(args):
2022ee3403b5SPawel Kaminski        print_dict(rpc.bdev.bdev_ftl_delete(args.client, name=args.name))
20237c233adeSWojciech Malikowski
20247aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_ftl_delete', help='Delete FTL bdev')
20257c233adeSWojciech Malikowski    p.add_argument('-b', '--name', help="Name of the bdev", required=True)
2026ee3403b5SPawel Kaminski    p.set_defaults(func=bdev_ftl_delete)
20277c233adeSWojciech Malikowski
2028825ae66bSWojciech Malikowski    # vmd
2029825ae66bSWojciech Malikowski    def enable_vmd(args):
2030825ae66bSWojciech Malikowski        print_dict(rpc.vmd.enable_vmd(args.client))
2031825ae66bSWojciech Malikowski
2032825ae66bSWojciech Malikowski    p = subparsers.add_parser('enable_vmd', help='Enable VMD enumeration')
2033825ae66bSWojciech Malikowski    p.set_defaults(func=enable_vmd)
2034825ae66bSWojciech Malikowski
20354dd3f4a7SBen Walker    # nbd
20360a993323SPawel Kaminski    def nbd_start_disk(args):
20370a993323SPawel Kaminski        print(rpc.nbd.nbd_start_disk(args.client,
203885f316b1SDaniel Verkamp                                     bdev_name=args.bdev_name,
20395eb33f0aSDaniel Verkamp                                     nbd_device=args.nbd_device))
2040df897ed4SDaniel Verkamp
204110ba9348Swanghailiangx    p = subparsers.add_parser('nbd_start_disk',
2042793d34e5Spaul luse                              help='Export a bdev as an nbd disk')
20434dd3f4a7SBen Walker    p.add_argument('bdev_name', help='Blockdev name to be exported. Example: Malloc0.')
2044efdd6edbSXiaodong Liu    p.add_argument('nbd_device', help='Nbd device name to be assigned. Example: /dev/nbd0.', nargs='?')
20450a993323SPawel Kaminski    p.set_defaults(func=nbd_start_disk)
2046df897ed4SDaniel Verkamp
2047d242f5a0SPawel Kaminski    def nbd_stop_disk(args):
2048d242f5a0SPawel Kaminski        rpc.nbd.nbd_stop_disk(args.client,
204985f316b1SDaniel Verkamp                              nbd_device=args.nbd_device)
2050e21aede9STomasz Zawadzki
205110ba9348Swanghailiangx    p = subparsers.add_parser('nbd_stop_disk',
2052793d34e5Spaul luse                              help='Stop an nbd disk')
20534dd3f4a7SBen Walker    p.add_argument('nbd_device', help='Nbd device name to be stopped. Example: /dev/nbd0.')
2054d242f5a0SPawel Kaminski    p.set_defaults(func=nbd_stop_disk)
2055df897ed4SDaniel Verkamp
20565456a430SPawel Kaminski    def nbd_get_disks(args):
20575456a430SPawel Kaminski        print_dict(rpc.nbd.nbd_get_disks(args.client,
205885f316b1SDaniel Verkamp                                         nbd_device=args.nbd_device))
20591e92d78aSBen Walker
206010ba9348Swanghailiangx    p = subparsers.add_parser('nbd_get_disks',
20615456a430SPawel Kaminski                              help='Display full or specified nbd device list')
20623ac5d089SDaniel Verkamp    p.add_argument('-n', '--nbd-device', help="Path of the nbd device. Example: /dev/nbd0", required=False)
20635456a430SPawel Kaminski    p.set_defaults(func=nbd_get_disks)
20641e92d78aSBen Walker
20654dd3f4a7SBen Walker    # NVMe-oF
2066a1a8585cSMaciej Wawryk    def nvmf_set_max_subsystems(args):
2067a1a8585cSMaciej Wawryk        rpc.nvmf.nvmf_set_max_subsystems(args.client,
2068962ba4e8SSeth Howell                                         max_subsystems=args.max_subsystems)
2069962ba4e8SSeth Howell
207014273794Swanghailiangx    p = subparsers.add_parser('nvmf_set_max_subsystems',
2071a1a8585cSMaciej Wawryk                              help='Set the maximum number of NVMf target subsystems')
2072962ba4e8SSeth Howell    p.add_argument('-x', '--max-subsystems', help='Max number of NVMf subsystems', type=int, required=True)
2073a1a8585cSMaciej Wawryk    p.set_defaults(func=nvmf_set_max_subsystems)
2074962ba4e8SSeth Howell
207593d6b7beSMaciej Wawryk    def nvmf_set_config(args):
207693d6b7beSMaciej Wawryk        rpc.nvmf.nvmf_set_config(args.client,
207738a30da5SYuri                                 passthru_identify_ctrlr=args.passthru_identify_ctrlr,
20783d8904c6SAlexey Marchuk                                 poll_groups_mask=args.poll_groups_mask,
20793d8904c6SAlexey Marchuk                                 discovery_filter=args.discovery_filter)
208046a3d50bSShuhei Matsumoto
208114273794Swanghailiangx    p = subparsers.add_parser('nvmf_set_config', help='Set NVMf target config')
2082c9874b91SMichael Haeuptle    p.add_argument('-i', '--passthru-identify-ctrlr', help="""Passthrough fields like serial number and model number
2083c9874b91SMichael Haeuptle    when the controller has a single namespace that is an NVMe bdev""", action='store_true')
208438a30da5SYuri    p.add_argument('-m', '--poll-groups-mask', help='Set cpumask for NVMf poll groups (optional)', type=str)
20853d8904c6SAlexey Marchuk    p.add_argument('-d', '--discovery-filter', help="""Set discovery filter (optional), possible values are: `match_any` (default) or
20863d8904c6SAlexey Marchuk         comma separated values: `transport`, `address`, `svcid`""", type=str)
208793d6b7beSMaciej Wawryk    p.set_defaults(func=nvmf_set_config)
208846a3d50bSShuhei Matsumoto
2089183d81d0SJohn Barnard    def nvmf_create_transport(args):
209064debe04Sjiaqizho        rpc.nvmf.nvmf_create_transport(**vars(args))
2091183d81d0SJohn Barnard
2092183d81d0SJohn Barnard    p = subparsers.add_parser('nvmf_create_transport', help='Create NVMf transport')
2093183d81d0SJohn Barnard    p.add_argument('-t', '--trtype', help='Transport type (ex. RDMA)', type=str, required=True)
20947a372bbeSJim Harris    p.add_argument('-g', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str)
2095183d81d0SJohn Barnard    p.add_argument('-q', '--max-queue-depth', help='Max number of outstanding I/O per queue', type=int)
20961551197dSAlexey Marchuk    p.add_argument('-m', '--max-io-qpairs-per-ctrlr', help='Max number of IO qpairs per controller', type=int)
2097183d81d0SJohn Barnard    p.add_argument('-c', '--in-capsule-data-size', help='Max number of in-capsule data size', type=int)
2098183d81d0SJohn Barnard    p.add_argument('-i', '--max-io-size', help='Max I/O size (bytes)', type=int)
2099183d81d0SJohn Barnard    p.add_argument('-u', '--io-unit-size', help='I/O unit size (bytes)', type=int)
2100183d81d0SJohn Barnard    p.add_argument('-a', '--max-aq-depth', help='Max number of admin cmds per AQ', type=int)
210158f16244SZiye Yang    p.add_argument('-n', '--num-shared-buffers', help='The number of pooled data buffers available to the transport', type=int)
2102ad272579SBen Walker    p.add_argument('-b', '--buf-cache-size', help='The number of shared buffers to reserve for each poll group', type=int)
2103aa1d0398SKonrad Sztyber    p.add_argument('-z', '--zcopy', action='store_true', help='''Use zero-copy operations if the
2104aa1d0398SKonrad Sztyber    underlying bdev supports them''')
21057a372bbeSJim Harris    p.add_argument('-d', '--num-cqe', help="""The number of CQ entires. Only used when no_srq=true.
210697ef8701SMonica Kenguva    Relevant only for RDMA transport""", type=int)
2107ed0b611fSEvgeniy Kochetov    p.add_argument('-s', '--max-srq-depth', help='Max number of outstanding I/O per SRQ. Relevant only for RDMA transport', type=int)
2108350e429aSSeth Howell    p.add_argument('-r', '--no-srq', action='store_true', help='Disable per-thread shared receive queue. Relevant only for RDMA transport')
2109e2c0d9a2SSeth Howell    p.add_argument('-o', '--c2h-success', action='store_false', help='Disable C2H success optimization. Relevant only for TCP transport')
2110390cffb6SShuhei Matsumoto    p.add_argument('-f', '--dif-insert-or-strip', action='store_true', help='Enable DIF insert/strip. Relevant only for TCP transport')
21116ad6a113SZiye Yang    p.add_argument('-y', '--sock-priority', help='The sock priority of the tcp connection. Relevant only for TCP transport', type=int)
21127a372bbeSJim Harris    p.add_argument('-l', '--acceptor-backlog', help='Pending connections allowed at one time. Relevant only for RDMA transport', type=int)
211326e0ef9aSShuhei Matsumoto    p.add_argument('-x', '--abort-timeout-sec', help='Abort execution timeout value, in seconds', type=int)
2114bd3840a7SIvan Betsis    p.add_argument('-w', '--no-wr-batching', action='store_true', help='Disable work requests batching. Relevant only for RDMA transport')
21157a372bbeSJim Harris    p.add_argument('-e', '--control-msg-num', help="""The number of control messages per poll group.
21164fe47d6fSAlexey Marchuk    Relevant only for TCP transport""", type=int)
2117180d2c1dSJohn Levon    p.add_argument('-M', '--disable-mappable-bar0', action='store_true', help="""Disable mmap() of BAR0.
2118180d2c1dSJohn Levon    Relevant only for VFIO-USER transport""")
2119dd174597SRui Chang    p.add_argument('-I', '--disable-adaptive-irq', action='store_true', help="""Disable adaptive interrupt feature.
2120dd174597SRui Chang    Relevant only for VFIO-USER transport""")
21213b047a61SAndreas Economides    p.add_argument('-S', '--disable-shadow-doorbells', action='store_true', help="""Disable shadow doorbell support.
21223b047a61SAndreas Economides    Relevant only for VFIO-USER transport""")
212343022da3SJacek Kalwas    p.add_argument('--acceptor-poll-rate', help='Polling interval of the acceptor for incoming connections (usec)', type=int)
2124183d81d0SJohn Barnard    p.set_defaults(func=nvmf_create_transport)
2125183d81d0SJohn Barnard
21260772af4dSMaciej Wawryk    def nvmf_get_transports(args):
2127fb335cb2SJacek Kalwas        print_dict(rpc.nvmf.nvmf_get_transports(args.client, trtype=args.trtype, tgt_name=args.tgt_name))
2128c89b7bacSSeth Howell
212914273794Swanghailiangx    p = subparsers.add_parser('nvmf_get_transports', help='Display nvmf transports or required transport')
2130fb335cb2SJacek Kalwas    p.add_argument('--trtype', help='Transport type (optional)')
21317a372bbeSJim Harris    p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str)
21320772af4dSMaciej Wawryk    p.set_defaults(func=nvmf_get_transports)
2133c89b7bacSSeth Howell
213480a0c5beSMaciej Wawryk    def nvmf_get_subsystems(args):
2135dfafab22SJacek Kalwas        print_dict(rpc.nvmf.nvmf_get_subsystems(args.client, nqn=args.nqn, tgt_name=args.tgt_name))
2136df897ed4SDaniel Verkamp
213714273794Swanghailiangx    p = subparsers.add_parser('nvmf_get_subsystems', help='Display nvmf subsystems or required subsystem')
2138dfafab22SJacek Kalwas    p.add_argument('nqn', help='Subsystem NQN (optional)', nargs="?", default=None)
21397a372bbeSJim Harris    p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str)
214080a0c5beSMaciej Wawryk    p.set_defaults(func=nvmf_get_subsystems)
2141df897ed4SDaniel Verkamp
21427538af70SMaciej Wawryk    def nvmf_create_subsystem(args):
21437538af70SMaciej Wawryk        rpc.nvmf.nvmf_create_subsystem(args.client,
2144aedac1a8SBen Walker                                       nqn=args.nqn,
2145f8433aadSSeth Howell                                       tgt_name=args.tgt_name,
2146aedac1a8SBen Walker                                       serial_number=args.serial_number,
214714032a98SGregory Shapiro                                       model_number=args.model_number,
2148aedac1a8SBen Walker                                       allow_any_host=args.allow_any_host,
21491da94ed7SShuhei Matsumoto                                       max_namespaces=args.max_namespaces,
2150be6a01efSJonathan Teh                                       ana_reporting=args.ana_reporting,
2151be6a01efSJonathan Teh                                       min_cntlid=args.min_cntlid,
2152be6a01efSJonathan Teh                                       max_cntlid=args.max_cntlid)
2153aedac1a8SBen Walker
215414273794Swanghailiangx    p = subparsers.add_parser('nvmf_create_subsystem', help='Create an NVMe-oF subsystem')
2155aedac1a8SBen Walker    p.add_argument('nqn', help='Subsystem NQN (ASCII)')
21567a372bbeSJim Harris    p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str)
2157aedac1a8SBen Walker    p.add_argument("-s", "--serial-number", help="""
2158aedac1a8SBen Walker    Format:  'sn' etc
21592eacfd87SBen Walker    Example: 'SPDK00000000000001'""", default='00000000000000000000')
216014032a98SGregory Shapiro    p.add_argument("-d", "--model-number", help="""
216114032a98SGregory Shapiro    Format:  'mn' etc
216214032a98SGregory Shapiro    Example: 'SPDK Controller'""", default='SPDK bdev Controller')
2163131e6171SJim Harris    p.add_argument("-a", "--allow-any-host", action='store_true', help="Allow any host to connect (don't enforce allowed host NQN list)")
2164aedac1a8SBen Walker    p.add_argument("-m", "--max-namespaces", help="Maximum number of namespaces allowed",
2165aedac1a8SBen Walker                   type=int, default=0)
21661da94ed7SShuhei Matsumoto    p.add_argument("-r", "--ana-reporting", action='store_true', help="Enable ANA reporting feature")
2167be6a01efSJonathan Teh    p.add_argument("-i", "--min_cntlid", help="Minimum controller ID", type=int, default=1)
2168be6a01efSJonathan Teh    p.add_argument("-I", "--max_cntlid", help="Maximum controller ID", type=int, default=0xffef)
21697538af70SMaciej Wawryk    p.set_defaults(func=nvmf_create_subsystem)
2170aedac1a8SBen Walker
217119baaa9aSMaciej Wawryk    def nvmf_delete_subsystem(args):
217219baaa9aSMaciej Wawryk        rpc.nvmf.nvmf_delete_subsystem(args.client,
2173f8433aadSSeth Howell                                       nqn=args.subsystem_nqn,
2174f8433aadSSeth Howell                                       tgt_name=args.tgt_name)
2175d20b90b2SCunyin Chang
217614273794Swanghailiangx    p = subparsers.add_parser('nvmf_delete_subsystem', help='Delete a nvmf subsystem')
21774dd3f4a7SBen Walker    p.add_argument('subsystem_nqn',
21784dd3f4a7SBen Walker                   help='subsystem nqn to be deleted. Example: nqn.2016-06.io.spdk:cnode1.')
21797a372bbeSJim Harris    p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str)
218019baaa9aSMaciej Wawryk    p.set_defaults(func=nvmf_delete_subsystem)
2181df897ed4SDaniel Verkamp
2182df897ed4SDaniel Verkamp    def nvmf_subsystem_add_listener(args):
218364debe04Sjiaqizho        rpc.nvmf.nvmf_subsystem_add_listener(**vars(args))
2184d20b90b2SCunyin Chang
21856336217eSBen Walker    p = subparsers.add_parser('nvmf_subsystem_add_listener', help='Add a listener to an NVMe-oF subsystem')
218606ef6757SJim Harris    p.add_argument('nqn', help='NVMe-oF subsystem NQN (\'discovery\' can be used as shortcut for discovery NQN)')
21876336217eSBen Walker    p.add_argument('-t', '--trtype', help='NVMe-oF transport type: e.g., rdma', required=True)
21886336217eSBen Walker    p.add_argument('-a', '--traddr', help='NVMe-oF transport address: e.g., an ip address', required=True)
21897a372bbeSJim Harris    p.add_argument('-p', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str)
21906336217eSBen Walker    p.add_argument('-f', '--adrfam', help='NVMe-oF transport adrfam: e.g., ipv4, ipv6, ib, fc, intra_host')
21919a1cf1c5SJacek Kalwas    p.add_argument('-s', '--trsvcid', help='NVMe-oF transport service id: e.g., a port number (required for RDMA or TCP)')
2192df897ed4SDaniel Verkamp    p.set_defaults(func=nvmf_subsystem_add_listener)
2193df897ed4SDaniel Verkamp
2194df897ed4SDaniel Verkamp    def nvmf_subsystem_remove_listener(args):
2195aceeb8cdSheluwei        rpc.nvmf.nvmf_subsystem_remove_listener(args.client,
2196aceeb8cdSheluwei                                                nqn=args.nqn,
2197aceeb8cdSheluwei                                                trtype=args.trtype,
2198aceeb8cdSheluwei                                                traddr=args.traddr,
2199f8433aadSSeth Howell                                                tgt_name=args.tgt_name,
2200aceeb8cdSheluwei                                                adrfam=args.adrfam,
2201aceeb8cdSheluwei                                                trsvcid=args.trsvcid)
22026336217eSBen Walker
2203a1ee1187Sparam    p = subparsers.add_parser('nvmf_subsystem_remove_listener', help='Remove a listener from an NVMe-oF subsystem')
220406ef6757SJim Harris    p.add_argument('nqn', help='NVMe-oF subsystem NQN (\'discovery\' can be used as shortcut for discovery NQN)')
2205a1ee1187Sparam    p.add_argument('-t', '--trtype', help='NVMe-oF transport type: e.g., rdma', required=True)
2206a1ee1187Sparam    p.add_argument('-a', '--traddr', help='NVMe-oF transport address: e.g., an ip address', required=True)
22077a372bbeSJim Harris    p.add_argument('-p', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str)
2208a1ee1187Sparam    p.add_argument('-f', '--adrfam', help='NVMe-oF transport adrfam: e.g., ipv4, ipv6, ib, fc, intra_host')
2209aaff6707Syidong0635    p.add_argument('-s', '--trsvcid', help='NVMe-oF transport service id: e.g., a port number (required for TCP and RDMA transport types)')
2210df897ed4SDaniel Verkamp    p.set_defaults(func=nvmf_subsystem_remove_listener)
2211df897ed4SDaniel Verkamp
2212c8cb51d4SShuhei Matsumoto    def nvmf_subsystem_listener_set_ana_state(args):
2213c8cb51d4SShuhei Matsumoto        rpc.nvmf.nvmf_subsystem_listener_set_ana_state(args.client,
2214c8cb51d4SShuhei Matsumoto                                                       nqn=args.nqn,
2215c8cb51d4SShuhei Matsumoto                                                       ana_state=args.ana_state,
2216c8cb51d4SShuhei Matsumoto                                                       trtype=args.trtype,
2217c8cb51d4SShuhei Matsumoto                                                       traddr=args.traddr,
2218c8cb51d4SShuhei Matsumoto                                                       tgt_name=args.tgt_name,
2219c8cb51d4SShuhei Matsumoto                                                       adrfam=args.adrfam,
22206d716c47SShuhei Matsumoto                                                       trsvcid=args.trsvcid,
22216d716c47SShuhei Matsumoto                                                       anagrpid=args.anagrpid)
2222c8cb51d4SShuhei Matsumoto
2223c8cb51d4SShuhei Matsumoto    p = subparsers.add_parser('nvmf_subsystem_listener_set_ana_state', help='Set ANA state of a listener for an NVMe-oF subsystem')
2224c8cb51d4SShuhei Matsumoto    p.add_argument('nqn', help='NVMe-oF subsystem NQN')
22251421a35eSAlexey Marchuk    p.add_argument('-n', '--ana-state', help='ANA state to set: optimized, non_optimized, or inaccessible', required=True)
2226c8cb51d4SShuhei Matsumoto    p.add_argument('-t', '--trtype', help='NVMe-oF transport type: e.g., rdma', required=True)
2227c8cb51d4SShuhei Matsumoto    p.add_argument('-a', '--traddr', help='NVMe-oF transport address: e.g., an ip address', required=True)
22287a372bbeSJim Harris    p.add_argument('-p', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str)
2229c8cb51d4SShuhei Matsumoto    p.add_argument('-f', '--adrfam', help='NVMe-oF transport adrfam: e.g., ipv4, ipv6, ib, fc, intra_host')
2230c8cb51d4SShuhei Matsumoto    p.add_argument('-s', '--trsvcid', help='NVMe-oF transport service id: e.g., a port number')
22316d716c47SShuhei Matsumoto    p.add_argument('-g', '--anagrpid', help='ANA group ID (optional)', type=int)
2232c8cb51d4SShuhei Matsumoto    p.set_defaults(func=nvmf_subsystem_listener_set_ana_state)
2233c8cb51d4SShuhei Matsumoto
2234df897ed4SDaniel Verkamp    def nvmf_subsystem_add_ns(args):
2235aceeb8cdSheluwei        rpc.nvmf.nvmf_subsystem_add_ns(args.client,
2236aceeb8cdSheluwei                                       nqn=args.nqn,
2237aceeb8cdSheluwei                                       bdev_name=args.bdev_name,
2238f8433aadSSeth Howell                                       tgt_name=args.tgt_name,
22395317a9f7SChangpeng Liu                                       ptpl_file=args.ptpl_file,
2240aceeb8cdSheluwei                                       nsid=args.nsid,
2241aceeb8cdSheluwei                                       nguid=args.nguid,
2242aceeb8cdSheluwei                                       eui64=args.eui64,
2243694fa34dSShuhei Matsumoto                                       uuid=args.uuid,
2244694fa34dSShuhei Matsumoto                                       anagrpid=args.anagrpid)
2245a1ee1187Sparam
224647b17299SBen Walker    p = subparsers.add_parser('nvmf_subsystem_add_ns', help='Add a namespace to an NVMe-oF subsystem')
224747b17299SBen Walker    p.add_argument('nqn', help='NVMe-oF subsystem NQN')
224847b17299SBen Walker    p.add_argument('bdev_name', help='The name of the bdev that will back this namespace')
22497a372bbeSJim Harris    p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str)
22505317a9f7SChangpeng Liu    p.add_argument('-p', '--ptpl-file', help='The persistent reservation storage location (optional)', type=str)
225147b17299SBen Walker    p.add_argument('-n', '--nsid', help='The requested NSID (optional)', type=int)
22521023ca7bSDaniel Verkamp    p.add_argument('-g', '--nguid', help='Namespace globally unique identifier (optional)')
22531023ca7bSDaniel Verkamp    p.add_argument('-e', '--eui64', help='Namespace EUI-64 identifier (optional)')
225457ae6bf6SDaniel Verkamp    p.add_argument('-u', '--uuid', help='Namespace UUID (optional)')
2255694fa34dSShuhei Matsumoto    p.add_argument('-a', '--anagrpid', help='ANA group ID (optional)', type=int)
2256df897ed4SDaniel Verkamp    p.set_defaults(func=nvmf_subsystem_add_ns)
2257df897ed4SDaniel Verkamp
2258df897ed4SDaniel Verkamp    def nvmf_subsystem_remove_ns(args):
2259aceeb8cdSheluwei        rpc.nvmf.nvmf_subsystem_remove_ns(args.client,
2260aceeb8cdSheluwei                                          nqn=args.nqn,
2261f8433aadSSeth Howell                                          nsid=args.nsid,
2262f8433aadSSeth Howell                                          tgt_name=args.tgt_name)
226347b17299SBen Walker
2264d9321520SChangpeng Liu    p = subparsers.add_parser('nvmf_subsystem_remove_ns', help='Remove a namespace to an NVMe-oF subsystem')
2265d9321520SChangpeng Liu    p.add_argument('nqn', help='NVMe-oF subsystem NQN')
2266d9321520SChangpeng Liu    p.add_argument('nsid', help='The requested NSID', type=int)
22677a372bbeSJim Harris    p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str)
2268df897ed4SDaniel Verkamp    p.set_defaults(func=nvmf_subsystem_remove_ns)
2269df897ed4SDaniel Verkamp
2270df897ed4SDaniel Verkamp    def nvmf_subsystem_add_host(args):
2271aceeb8cdSheluwei        rpc.nvmf.nvmf_subsystem_add_host(args.client,
2272aceeb8cdSheluwei                                         nqn=args.nqn,
2273f8433aadSSeth Howell                                         host=args.host,
2274f8433aadSSeth Howell                                         tgt_name=args.tgt_name)
2275d9321520SChangpeng Liu
22766285e36eSBen Walker    p = subparsers.add_parser('nvmf_subsystem_add_host', help='Add a host to an NVMe-oF subsystem')
22776285e36eSBen Walker    p.add_argument('nqn', help='NVMe-oF subsystem NQN')
22786285e36eSBen Walker    p.add_argument('host', help='Host NQN to allow')
22797a372bbeSJim Harris    p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str)
2280df897ed4SDaniel Verkamp    p.set_defaults(func=nvmf_subsystem_add_host)
2281df897ed4SDaniel Verkamp
2282df897ed4SDaniel Verkamp    def nvmf_subsystem_remove_host(args):
2283aceeb8cdSheluwei        rpc.nvmf.nvmf_subsystem_remove_host(args.client,
2284aceeb8cdSheluwei                                            nqn=args.nqn,
2285f8433aadSSeth Howell                                            host=args.host,
2286f8433aadSSeth Howell                                            tgt_name=args.tgt_name)
22876285e36eSBen Walker
22886285e36eSBen Walker    p = subparsers.add_parser('nvmf_subsystem_remove_host', help='Remove a host from an NVMe-oF subsystem')
22896285e36eSBen Walker    p.add_argument('nqn', help='NVMe-oF subsystem NQN')
22906285e36eSBen Walker    p.add_argument('host', help='Host NQN to remove')
22917a372bbeSJim Harris    p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str)
2292df897ed4SDaniel Verkamp    p.set_defaults(func=nvmf_subsystem_remove_host)
2293df897ed4SDaniel Verkamp
2294df897ed4SDaniel Verkamp    def nvmf_subsystem_allow_any_host(args):
2295aceeb8cdSheluwei        rpc.nvmf.nvmf_subsystem_allow_any_host(args.client,
2296aceeb8cdSheluwei                                               nqn=args.nqn,
2297f8433aadSSeth Howell                                               disable=args.disable,
2298f8433aadSSeth Howell                                               tgt_name=args.tgt_name)
22996285e36eSBen Walker
23006285e36eSBen Walker    p = subparsers.add_parser('nvmf_subsystem_allow_any_host', help='Allow any host to connect to the subsystem')
23016285e36eSBen Walker    p.add_argument('nqn', help='NVMe-oF subsystem NQN')
23026285e36eSBen Walker    p.add_argument('-e', '--enable', action='store_true', help='Enable allowing any host')
23036285e36eSBen Walker    p.add_argument('-d', '--disable', action='store_true', help='Disable allowing any host')
23047a372bbeSJim Harris    p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str)
2305df897ed4SDaniel Verkamp    p.set_defaults(func=nvmf_subsystem_allow_any_host)
23066285e36eSBen Walker
23074cc04a12SShuhei Matsumoto    def nvmf_subsystem_get_controllers(args):
23084cc04a12SShuhei Matsumoto        print_dict(rpc.nvmf.nvmf_subsystem_get_controllers(args.client,
23094cc04a12SShuhei Matsumoto                                                           nqn=args.nqn,
23104cc04a12SShuhei Matsumoto                                                           tgt_name=args.tgt_name))
23114cc04a12SShuhei Matsumoto
23124cc04a12SShuhei Matsumoto    p = subparsers.add_parser('nvmf_subsystem_get_controllers',
23134cc04a12SShuhei Matsumoto                              help='Display controllers of an NVMe-oF subsystem.')
23144cc04a12SShuhei Matsumoto    p.add_argument('nqn', help='NVMe-oF subsystem NQN')
23154cc04a12SShuhei Matsumoto    p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str)
23164cc04a12SShuhei Matsumoto    p.set_defaults(func=nvmf_subsystem_get_controllers)
23174cc04a12SShuhei Matsumoto
231883eb352bSShuhei Matsumoto    def nvmf_subsystem_get_qpairs(args):
231983eb352bSShuhei Matsumoto        print_dict(rpc.nvmf.nvmf_subsystem_get_qpairs(args.client,
232083eb352bSShuhei Matsumoto                                                      nqn=args.nqn,
232183eb352bSShuhei Matsumoto                                                      tgt_name=args.tgt_name))
232283eb352bSShuhei Matsumoto
232383eb352bSShuhei Matsumoto    p = subparsers.add_parser('nvmf_subsystem_get_qpairs',
232483eb352bSShuhei Matsumoto                              help='Display queue pairs of an NVMe-oF subsystem.')
232583eb352bSShuhei Matsumoto    p.add_argument('nqn', help='NVMe-oF subsystem NQN')
232683eb352bSShuhei Matsumoto    p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str)
232783eb352bSShuhei Matsumoto    p.set_defaults(func=nvmf_subsystem_get_qpairs)
232883eb352bSShuhei Matsumoto
23299c1d6483SShuhei Matsumoto    def nvmf_subsystem_get_listeners(args):
23309c1d6483SShuhei Matsumoto        print_dict(rpc.nvmf.nvmf_subsystem_get_listeners(args.client,
23319c1d6483SShuhei Matsumoto                                                         nqn=args.nqn,
23329c1d6483SShuhei Matsumoto                                                         tgt_name=args.tgt_name))
23339c1d6483SShuhei Matsumoto
23349c1d6483SShuhei Matsumoto    p = subparsers.add_parser('nvmf_subsystem_get_listeners',
23359c1d6483SShuhei Matsumoto                              help='Display listeners of an NVMe-oF subsystem.')
23369c1d6483SShuhei Matsumoto    p.add_argument('nqn', help='NVMe-oF subsystem NQN')
23379c1d6483SShuhei Matsumoto    p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str)
23389c1d6483SShuhei Matsumoto    p.set_defaults(func=nvmf_subsystem_get_listeners)
23399c1d6483SShuhei Matsumoto
2340fca6ff8fSEvgeniy Kochetov    def nvmf_get_stats(args):
2341f8433aadSSeth Howell        print_dict(rpc.nvmf.nvmf_get_stats(args.client, tgt_name=args.tgt_name))
2342fca6ff8fSEvgeniy Kochetov
2343fca6ff8fSEvgeniy Kochetov    p = subparsers.add_parser(
2344fca6ff8fSEvgeniy Kochetov        'nvmf_get_stats', help='Display current statistics for NVMf subsystem')
23457a372bbeSJim Harris    p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str)
2346fca6ff8fSEvgeniy Kochetov    p.set_defaults(func=nvmf_get_stats)
2347fca6ff8fSEvgeniy Kochetov
2348b832f99fSyupeng    def nvmf_set_crdt(args):
2349b832f99fSyupeng        print_dict(rpc.nvmf.nvmf_set_crdt(args.client, args.crdt1, args.crdt2, args.crdt3))
2350b832f99fSyupeng
2351b832f99fSyupeng    p = subparsers.add_parser(
2352b832f99fSyupeng        'nvmf_set_crdt',
2353b832f99fSyupeng        help="""Set the 3 crdt (Command Retry Delay Time) values for NVMf subsystem. All
2354b832f99fSyupeng        values are in units of 100 milliseconds (same as the NVM Express specification).""")
2355b832f99fSyupeng    p.add_argument('-t1', '--crdt1', help='Command Retry Delay Time 1, in units of 100 milliseconds', type=int)
2356b832f99fSyupeng    p.add_argument('-t2', '--crdt2', help='Command Retry Delay Time 2, in units of 100 milliseconds', type=int)
2357b832f99fSyupeng    p.add_argument('-t3', '--crdt3', help='Command Retry Delay Time 3, in units of 100 milliseconds', type=int)
2358b832f99fSyupeng    p.set_defaults(func=nvmf_set_crdt)
2359b832f99fSyupeng
23604dd3f4a7SBen Walker    # pmem
23615d89d50eSPawel Kaminski    def bdev_pmem_create_pool(args):
23625e9dbb5eSKarol Latecki        num_blocks = int((args.total_size * 1024 * 1024) / args.block_size)
23635d89d50eSPawel Kaminski        rpc.pmem.bdev_pmem_create_pool(args.client,
23645e9dbb5eSKarol Latecki                                       pmem_file=args.pmem_file,
23655e9dbb5eSKarol Latecki                                       num_blocks=num_blocks,
23665e9dbb5eSKarol Latecki                                       block_size=args.block_size)
2367df897ed4SDaniel Verkamp
23687aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_pmem_create_pool', help='Create pmem pool')
23694dd3f4a7SBen Walker    p.add_argument('pmem_file', help='Path to pmemblk pool file')
237049911c47Swanghailiangx    p.add_argument('total_size', help='Size of pmem bdev in MB (int > 0)', type=int)
23714dd3f4a7SBen Walker    p.add_argument('block_size', help='Block size for this pmem pool', type=int)
23725d89d50eSPawel Kaminski    p.set_defaults(func=bdev_pmem_create_pool)
2373df897ed4SDaniel Verkamp
2374a6aeb969SPawel Kaminski    def bdev_pmem_get_pool_info(args):
2375a6aeb969SPawel Kaminski        print_dict(rpc.pmem.bdev_pmem_get_pool_info(args.client,
23765e9dbb5eSKarol Latecki                                                    pmem_file=args.pmem_file))
23771e92d78aSBen Walker
23787aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_pmem_get_pool_info', help='Display pmem pool info and check consistency')
23794dd3f4a7SBen Walker    p.add_argument('pmem_file', help='Path to pmemblk pool file')
2380a6aeb969SPawel Kaminski    p.set_defaults(func=bdev_pmem_get_pool_info)
2381df897ed4SDaniel Verkamp
23826c425deaSPawel Kaminski    def bdev_pmem_delete_pool(args):
23836c425deaSPawel Kaminski        rpc.pmem.bdev_pmem_delete_pool(args.client,
23845e9dbb5eSKarol Latecki                                       pmem_file=args.pmem_file)
238532b4ab71SCunyin Chang
23867aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_pmem_delete_pool', help='Delete pmem pool')
23874dd3f4a7SBen Walker    p.add_argument('pmem_file', help='Path to pmemblk pool file')
23886c425deaSPawel Kaminski    p.set_defaults(func=bdev_pmem_delete_pool)
238932b4ab71SCunyin Chang
2390ba1859edSPawel Wodkowski    # subsystem
23918710b600SMaciej Wawryk    def framework_get_subsystems(args):
23928710b600SMaciej Wawryk        print_dict(rpc.subsystem.framework_get_subsystems(args.client))
2393df897ed4SDaniel Verkamp
239481d3cc1bSwanghailiangx    p = subparsers.add_parser('framework_get_subsystems',
23958710b600SMaciej Wawryk                              help="""Print subsystems array in initialization order. Each subsystem
2396ba1859edSPawel Wodkowski    entry contain (unsorted) array of subsystems it depends on.""")
23978710b600SMaciej Wawryk    p.set_defaults(func=framework_get_subsystems)
2398df897ed4SDaniel Verkamp
2399378ad60bSMaciej Wawryk    def framework_get_config(args):
2400378ad60bSMaciej Wawryk        print_dict(rpc.subsystem.framework_get_config(args.client, args.name))
2401ba1859edSPawel Wodkowski
240281d3cc1bSwanghailiangx    p = subparsers.add_parser('framework_get_config', help="""Print subsystem configuration""")
2403bd4ecea5SPawel Wodkowski    p.add_argument('name', help='Name of subsystem to query')
2404378ad60bSMaciej Wawryk    p.set_defaults(func=framework_get_config)
2405bd4ecea5SPawel Wodkowski
24064dd3f4a7SBen Walker    # vhost
2407bf15f51cSPawel Kaminski    def vhost_controller_set_coalescing(args):
2408bf15f51cSPawel Kaminski        rpc.vhost.vhost_controller_set_coalescing(args.client,
240925c11b8eSKarol Latecki                                                  ctrlr=args.ctrlr,
241025c11b8eSKarol Latecki                                                  delay_base_us=args.delay_base_us,
241125c11b8eSKarol Latecki                                                  iops_threshold=args.iops_threshold)
2412df897ed4SDaniel Verkamp
241323d832a0Swanghailiangx    p = subparsers.add_parser('vhost_controller_set_coalescing', help='Set vhost controller coalescing')
2414ff1863f4SPawel Wodkowski    p.add_argument('ctrlr', help='controller name')
2415ff1863f4SPawel Wodkowski    p.add_argument('delay_base_us', help='Base delay time', type=int)
2416ff1863f4SPawel Wodkowski    p.add_argument('iops_threshold', help='IOPS threshold when coalescing is enabled', type=int)
2417bf15f51cSPawel Kaminski    p.set_defaults(func=vhost_controller_set_coalescing)
2418df897ed4SDaniel Verkamp
2419b727e804STomasz Zawadzki    def virtio_blk_create_transport(args):
2420b727e804STomasz Zawadzki        rpc.vhost.virtio_blk_create_transport(args.client,
2421b727e804STomasz Zawadzki                                              name=args.name,
2422b727e804STomasz Zawadzki                                              opts=args.opts)
2423b727e804STomasz Zawadzki
2424b727e804STomasz Zawadzki    p = subparsers.add_parser('virtio_blk_create_transport',
2425b727e804STomasz Zawadzki                              help='Create virtio blk transport')
2426b727e804STomasz Zawadzki    p.add_argument('name', help='transport name')
2427b727e804STomasz Zawadzki    p.set_defaults(func=virtio_blk_create_transport)
2428b727e804STomasz Zawadzki
2429c7e05d83SPawel Kaminski    def vhost_create_scsi_controller(args):
2430c7e05d83SPawel Kaminski        rpc.vhost.vhost_create_scsi_controller(args.client,
243125c11b8eSKarol Latecki                                               ctrlr=args.ctrlr,
243225c11b8eSKarol Latecki                                               cpumask=args.cpumask)
2433ff1863f4SPawel Wodkowski
243423d832a0Swanghailiangx    p = subparsers.add_parser('vhost_create_scsi_controller', help='Add new vhost controller')
24351dbf53eeSPiotr Pelplinski    p.add_argument('ctrlr', help='controller name')
24361dbf53eeSPiotr Pelplinski    p.add_argument('--cpumask', help='cpu mask for this controller')
2437c7e05d83SPawel Kaminski    p.set_defaults(func=vhost_create_scsi_controller)
2438df897ed4SDaniel Verkamp
2439d4245df9SPawel Kaminski    def vhost_scsi_controller_add_target(args):
2440d4245df9SPawel Kaminski        print_json(rpc.vhost.vhost_scsi_controller_add_target(args.client,
244125c11b8eSKarol Latecki                                                              ctrlr=args.ctrlr,
244225c11b8eSKarol Latecki                                                              scsi_target_num=args.scsi_target_num,
244348834f0dSPawel Wodkowski                                                              bdev_name=args.bdev_name))
24447dce704cSPawel Wodkowski
244523d832a0Swanghailiangx    p = subparsers.add_parser('vhost_scsi_controller_add_target', help='Add lun to vhost controller')
24461ff3715dSJosh Soref    p.add_argument('ctrlr', help='controller name where add lun')
24470709cc48SSebastian Basierski    p.add_argument('scsi_target_num', help='scsi_target_num', type=int)
2448583e9699SShuhei Matsumoto    p.add_argument('bdev_name', help='bdev name')
2449d4245df9SPawel Kaminski    p.set_defaults(func=vhost_scsi_controller_add_target)
2450df897ed4SDaniel Verkamp
245136e04eb4SPawel Kaminski    def vhost_scsi_controller_remove_target(args):
245236e04eb4SPawel Kaminski        rpc.vhost.vhost_scsi_controller_remove_target(args.client,
245325c11b8eSKarol Latecki                                                      ctrlr=args.ctrlr,
245425c11b8eSKarol Latecki                                                      scsi_target_num=args.scsi_target_num)
2455679e2831SDariusz Stojaczyk
245636e04eb4SPawel Kaminski    p = subparsers.add_parser('vhost_scsi_controller_remove_target',
245736e04eb4SPawel Kaminski                              help='Remove target from vhost controller')
24580709cc48SSebastian Basierski    p.add_argument('ctrlr', help='controller name to remove target from')
24590709cc48SSebastian Basierski    p.add_argument('scsi_target_num', help='scsi_target_num', type=int)
246036e04eb4SPawel Kaminski    p.set_defaults(func=vhost_scsi_controller_remove_target)
2461df897ed4SDaniel Verkamp
2462d7c00c17SPawel Kaminski    def vhost_create_blk_controller(args):
2463d7c00c17SPawel Kaminski        rpc.vhost.vhost_create_blk_controller(args.client,
246425c11b8eSKarol Latecki                                              ctrlr=args.ctrlr,
246525c11b8eSKarol Latecki                                              dev_name=args.dev_name,
246625c11b8eSKarol Latecki                                              cpumask=args.cpumask,
2467b727e804STomasz Zawadzki                                              transport=args.transport,
24682eabc715SJin Yu                                              readonly=args.readonly,
24692969c5abSJin Yu                                              packed_ring=args.packed_ring,
24702969c5abSJin Yu                                              packed_ring_recovery=args.packed_ring_recovery)
2471ff88449dSPawel Niedzwiecki
247223d832a0Swanghailiangx    p = subparsers.add_parser('vhost_create_blk_controller', help='Add a new vhost block controller')
2473ff88449dSPawel Niedzwiecki    p.add_argument('ctrlr', help='controller name')
2474ff88449dSPawel Niedzwiecki    p.add_argument('dev_name', help='device name')
2475ff88449dSPawel Niedzwiecki    p.add_argument('--cpumask', help='cpu mask for this controller')
2476b727e804STomasz Zawadzki    p.add_argument('--transport', help='virtio blk transport name (default: vhost_user_blk)')
2477a264d9d2SPawel Niedzwiecki    p.add_argument("-r", "--readonly", action='store_true', help='Set controller as read-only')
24782eabc715SJin Yu    p.add_argument("-p", "--packed_ring", action='store_true', help='Set controller as packed ring supported')
24791ff3715dSJosh Soref    p.add_argument("-l", "--packed_ring_recovery", action='store_true', help='Enable packed ring live recovery')
2480d7c00c17SPawel Kaminski    p.set_defaults(func=vhost_create_blk_controller)
2481df897ed4SDaniel Verkamp
24822976fbd2SPawel Kaminski    def vhost_get_controllers(args):
24832976fbd2SPawel Kaminski        print_dict(rpc.vhost.vhost_get_controllers(args.client, args.name))
2484ff88449dSPawel Niedzwiecki
248523d832a0Swanghailiangx    p = subparsers.add_parser('vhost_get_controllers', help='List all or specific vhost controller(s)')
248674a28c19Swuzhouhui    p.add_argument('-n', '--name', help="Name of vhost controller", required=False)
24872976fbd2SPawel Kaminski    p.set_defaults(func=vhost_get_controllers)
2488df897ed4SDaniel Verkamp
2489edb18971SPawel Kaminski    def vhost_delete_controller(args):
2490edb18971SPawel Kaminski        rpc.vhost.vhost_delete_controller(args.client,
249125c11b8eSKarol Latecki                                          ctrlr=args.ctrlr)
2492c63d9de4SPawel Niedzwiecki
249323d832a0Swanghailiangx    p = subparsers.add_parser('vhost_delete_controller', help='Delete a vhost controller')
2494c63d9de4SPawel Niedzwiecki    p.add_argument('ctrlr', help='controller name')
2495edb18971SPawel Kaminski    p.set_defaults(func=vhost_delete_controller)
2496df897ed4SDaniel Verkamp
24972aed03f0SMaciej Wawryk    def bdev_virtio_attach_controller(args):
24982aed03f0SMaciej Wawryk        print_array(rpc.vhost.bdev_virtio_attach_controller(args.client,
249900054fc6SKarol Latecki                                                            name=args.name,
250025c11b8eSKarol Latecki                                                            trtype=args.trtype,
250125c11b8eSKarol Latecki                                                            traddr=args.traddr,
250225c11b8eSKarol Latecki                                                            dev_type=args.dev_type,
250325c11b8eSKarol Latecki                                                            vq_count=args.vq_count,
250425c11b8eSKarol Latecki                                                            vq_size=args.vq_size))
25051a6dac40SPawel Wodkowski
25067aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_virtio_attach_controller',
25072aed03f0SMaciej Wawryk                              help="""Attach virtio controller using provided
25082aed03f0SMaciej Wawryk    transport type and device type. This will also create bdevs for any block devices connected to the
25092aed03f0SMaciej Wawryk    controller (for example, SCSI devices for a virtio-scsi controller).
25102aed03f0SMaciej Wawryk    Result is array of added bdevs.""")
25111a6dac40SPawel Wodkowski    p.add_argument('name', help="Use this name as base for new created bdevs")
25121a6dac40SPawel Wodkowski    p.add_argument('-t', '--trtype',
25131a6dac40SPawel Wodkowski                   help='Virtio target transport type: pci or user', required=True)
25141a6dac40SPawel Wodkowski    p.add_argument('-a', '--traddr',
25151a6dac40SPawel Wodkowski                   help='Transport type specific target address: e.g. UNIX domain socket path or BDF', required=True)
25161a6dac40SPawel Wodkowski    p.add_argument('-d', '--dev-type',
25171a6dac40SPawel Wodkowski                   help='Device type: blk or scsi', required=True)
25181a6dac40SPawel Wodkowski    p.add_argument('--vq-count', help='Number of virtual queues to be used.', type=int)
25191a6dac40SPawel Wodkowski    p.add_argument('--vq-size', help='Size of each queue', type=int)
25202aed03f0SMaciej Wawryk    p.set_defaults(func=bdev_virtio_attach_controller)
25211a6dac40SPawel Wodkowski
2522c2a4f329SMaciej Wawryk    def bdev_virtio_scsi_get_devices(args):
2523c2a4f329SMaciej Wawryk        print_dict(rpc.vhost.bdev_virtio_scsi_get_devices(args.client))
2524b3518196SDariusz Stojaczyk
25257aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_virtio_scsi_get_devices', help='List all Virtio-SCSI devices.')
2526c2a4f329SMaciej Wawryk    p.set_defaults(func=bdev_virtio_scsi_get_devices)
2527b3518196SDariusz Stojaczyk
2528c1b87b3dSMaciej Wawryk    def bdev_virtio_detach_controller(args):
2529c1b87b3dSMaciej Wawryk        rpc.vhost.bdev_virtio_detach_controller(args.client,
253043fe3667STomasz Zawadzki                                                name=args.name)
253143fe3667STomasz Zawadzki
25327aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_virtio_detach_controller', help="""Remove a Virtio device
253343fe3667STomasz Zawadzki    This will delete all bdevs exposed by this device""")
253443fe3667STomasz Zawadzki    p.add_argument('name', help='Virtio device name. E.g. VirtioUser0')
2535c1b87b3dSMaciej Wawryk    p.set_defaults(func=bdev_virtio_detach_controller)
253643fe3667STomasz Zawadzki
25372f600ca7SJin Yu    def bdev_virtio_blk_set_hotplug(args):
25382f600ca7SJin Yu        rpc.vhost.bdev_virtio_blk_set_hotplug(args.client, enable=args.enable, period_us=args.period_us)
25392f600ca7SJin Yu
25402f600ca7SJin Yu    p = subparsers.add_parser('bdev_virtio_blk_set_hotplug', help='Set hotplug options for bdev virtio_blk type.')
25412f600ca7SJin Yu    p.add_argument('-d', '--disable', dest='enable', default=False, action='store_false', help="Disable hotplug (default)")
25422f600ca7SJin Yu    p.add_argument('-e', '--enable', dest='enable', action='store_true', help="Enable hotplug")
25432f600ca7SJin Yu    p.add_argument('-r', '--period-us',
25442f600ca7SJin Yu                   help='How often the hotplug is processed for insert and remove events', type=int)
25452f600ca7SJin Yu    p.set_defaults(func=bdev_virtio_blk_set_hotplug)
25462f600ca7SJin Yu
2547ce2e6828SShuhei Matsumoto    # ioat
2548aa7a13afSpaul luse    def ioat_scan_accel_engine(args):
2549895ad892SJim Harris        rpc.ioat.ioat_scan_accel_engine(args.client)
2550ce2e6828SShuhei Matsumoto
2551465f99e9Swanghailiangx    p = subparsers.add_parser('ioat_scan_accel_engine', help='Enable IOAT accel engine offload.')
2552aa7a13afSpaul luse    p.set_defaults(func=ioat_scan_accel_engine)
2553ce2e6828SShuhei Matsumoto
2554ffef30aeSpaul luse    # dsa
2555ffef30aeSpaul luse    def dsa_scan_accel_engine(args):
2556ffef30aeSpaul luse        rpc.dsa.dsa_scan_accel_engine(args.client, config_kernel_mode=args.config_kernel_mode)
255742eb233eSpaul luse
2558ffef30aeSpaul luse    p = subparsers.add_parser('dsa_scan_accel_engine',
2559ffef30aeSpaul luse                              help='Set config and enable dsa accel engine offload.')
2560ffef30aeSpaul luse    p.add_argument('-k', '--config-kernel-mode', help='Use Kernel mode dsa',
2561e5d5b3ebSZiye Yang                   action='store_true', dest='config_kernel_mode')
2562ffef30aeSpaul luse    p.set_defaults(func=dsa_scan_accel_engine, config_kernel_mode=None)
256342eb233eSpaul luse
2564b483811fSpaul luse    # iaa
2565b483811fSpaul luse    def iaa_scan_accel_engine(args):
2566b483811fSpaul luse        rpc.iaa.iaa_scan_accel_engine(args.client)
2567b483811fSpaul luse
2568b483811fSpaul luse    p = subparsers.add_parser('iaa_scan_accel_engine',
2569b483811fSpaul luse                              help='Set config and enable iaa accel engine offload.')
2570b483811fSpaul luse    p.set_defaults(func=iaa_scan_accel_engine)
2571b483811fSpaul luse
25720a18f228SChunyang Hui    # opal
257336c9ac2dSChunyang Hui    def bdev_nvme_opal_init(args):
257436c9ac2dSChunyang Hui        rpc.nvme.bdev_nvme_opal_init(args.client,
257536c9ac2dSChunyang Hui                                     nvme_ctrlr_name=args.nvme_ctrlr_name,
257636c9ac2dSChunyang Hui                                     password=args.password)
257736c9ac2dSChunyang Hui
257836c9ac2dSChunyang Hui    p = subparsers.add_parser('bdev_nvme_opal_init', help='take ownership and activate')
257936c9ac2dSChunyang Hui    p.add_argument('-b', '--nvme-ctrlr-name', help='nvme ctrlr name')
258036c9ac2dSChunyang Hui    p.add_argument('-p', '--password', help='password for admin')
258136c9ac2dSChunyang Hui    p.set_defaults(func=bdev_nvme_opal_init)
258236c9ac2dSChunyang Hui
258336c9ac2dSChunyang Hui    def bdev_nvme_opal_revert(args):
258436c9ac2dSChunyang Hui        rpc.nvme.bdev_nvme_opal_revert(args.client,
258536c9ac2dSChunyang Hui                                       nvme_ctrlr_name=args.nvme_ctrlr_name,
258636c9ac2dSChunyang Hui                                       password=args.password)
258736c9ac2dSChunyang Hui    p = subparsers.add_parser('bdev_nvme_opal_revert', help='Revert to default factory settings')
258836c9ac2dSChunyang Hui    p.add_argument('-b', '--nvme-ctrlr-name', help='nvme ctrlr name')
258936c9ac2dSChunyang Hui    p.add_argument('-p', '--password', help='password')
259036c9ac2dSChunyang Hui    p.set_defaults(func=bdev_nvme_opal_revert)
259136c9ac2dSChunyang Hui
25920a18f228SChunyang Hui    def bdev_opal_create(args):
25930a18f228SChunyang Hui        print_json(rpc.bdev.bdev_opal_create(args.client,
25940a18f228SChunyang Hui                                             nvme_ctrlr_name=args.nvme_ctrlr_name,
25950a18f228SChunyang Hui                                             nsid=args.nsid,
25960a18f228SChunyang Hui                                             locking_range_id=args.locking_range_id,
25970a18f228SChunyang Hui                                             range_start=args.range_start,
25980a18f228SChunyang Hui                                             range_length=args.range_length,
25990a18f228SChunyang Hui                                             password=args.password))
26000a18f228SChunyang Hui
26010a18f228SChunyang Hui    p = subparsers.add_parser('bdev_opal_create', help="""Create opal bdev on specified NVMe controller""")
26020a18f228SChunyang Hui    p.add_argument('-b', '--nvme-ctrlr-name', help='nvme ctrlr name', required=True)
26030a18f228SChunyang Hui    p.add_argument('-n', '--nsid', help='namespace ID (only support nsid=1 for now)', type=int, required=True)
26040a18f228SChunyang Hui    p.add_argument('-i', '--locking-range-id', help='locking range id', type=int, required=True)
26050a18f228SChunyang Hui    p.add_argument('-s', '--range-start', help='locking range start LBA', type=int, required=True)
26060a18f228SChunyang Hui    p.add_argument('-l', '--range-length', help='locking range length (in blocks)', type=int, required=True)
26070a18f228SChunyang Hui    p.add_argument('-p', '--password', help='admin password', required=True)
26080a18f228SChunyang Hui    p.set_defaults(func=bdev_opal_create)
26090a18f228SChunyang Hui
261036c9ac2dSChunyang Hui    def bdev_opal_get_info(args):
261136c9ac2dSChunyang Hui        print_dict(rpc.bdev.bdev_opal_get_info(args.client,
261236c9ac2dSChunyang Hui                                               bdev_name=args.bdev_name,
261336c9ac2dSChunyang Hui                                               password=args.password))
261436c9ac2dSChunyang Hui
261536c9ac2dSChunyang Hui    p = subparsers.add_parser('bdev_opal_get_info', help='get opal locking range info for this bdev')
261636c9ac2dSChunyang Hui    p.add_argument('-b', '--bdev-name', help='opal bdev')
261736c9ac2dSChunyang Hui    p.add_argument('-p', '--password', help='password')
261836c9ac2dSChunyang Hui    p.set_defaults(func=bdev_opal_get_info)
261936c9ac2dSChunyang Hui
26200a18f228SChunyang Hui    def bdev_opal_delete(args):
26210a18f228SChunyang Hui        rpc.bdev.bdev_opal_delete(args.client,
26220a18f228SChunyang Hui                                  bdev_name=args.bdev_name,
26230a18f228SChunyang Hui                                  password=args.password)
26240a18f228SChunyang Hui
26250a18f228SChunyang Hui    p = subparsers.add_parser('bdev_opal_delete', help="""delete a virtual opal bdev""")
26260a18f228SChunyang Hui    p.add_argument('-b', '--bdev-name', help='opal virtual bdev', required=True)
26270a18f228SChunyang Hui    p.add_argument('-p', '--password', help='admin password', required=True)
26280a18f228SChunyang Hui    p.set_defaults(func=bdev_opal_delete)
26290a18f228SChunyang Hui
2630bc40f5f6SChunyang Hui    def bdev_opal_new_user(args):
2631bc40f5f6SChunyang Hui        rpc.bdev.bdev_opal_new_user(args.client,
2632bc40f5f6SChunyang Hui                                    bdev_name=args.bdev_name,
2633bc40f5f6SChunyang Hui                                    admin_password=args.admin_password,
2634bc40f5f6SChunyang Hui                                    user_id=args.user_id,
2635bc40f5f6SChunyang Hui                                    user_password=args.user_password)
2636bc40f5f6SChunyang Hui
2637bc40f5f6SChunyang Hui    p = subparsers.add_parser('bdev_opal_new_user', help="""Add a user to opal bdev who can set lock state for this bdev""")
2638bc40f5f6SChunyang Hui    p.add_argument('-b', '--bdev-name', help='opal bdev', required=True)
2639bc40f5f6SChunyang Hui    p.add_argument('-p', '--admin-password', help='admin password', required=True)
2640bc40f5f6SChunyang Hui    p.add_argument('-i', '--user-id', help='ID for new user', type=int, required=True)
2641bc40f5f6SChunyang Hui    p.add_argument('-u', '--user-password', help='password set for this user', required=True)
2642bc40f5f6SChunyang Hui    p.set_defaults(func=bdev_opal_new_user)
2643bc40f5f6SChunyang Hui
2644bc40f5f6SChunyang Hui    def bdev_opal_set_lock_state(args):
2645bc40f5f6SChunyang Hui        rpc.bdev.bdev_opal_set_lock_state(args.client,
2646bc40f5f6SChunyang Hui                                          bdev_name=args.bdev_name,
2647bc40f5f6SChunyang Hui                                          user_id=args.user_id,
2648bc40f5f6SChunyang Hui                                          password=args.password,
2649bc40f5f6SChunyang Hui                                          lock_state=args.lock_state)
2650bc40f5f6SChunyang Hui
2651bc40f5f6SChunyang Hui    p = subparsers.add_parser('bdev_opal_set_lock_state', help="""set lock state for an opal bdev""")
2652bc40f5f6SChunyang Hui    p.add_argument('-b', '--bdev-name', help='opal bdev', required=True)
2653bc40f5f6SChunyang Hui    p.add_argument('-i', '--user-id', help='ID of the user who want to set lock state, either admin or a user assigned to this bdev',
2654bc40f5f6SChunyang Hui                   type=int, required=True)
2655bc40f5f6SChunyang Hui    p.add_argument('-p', '--password', help='password of this user', required=True)
2656bc40f5f6SChunyang Hui    p.add_argument('-l', '--lock-state', help='lock state to set, choose from {readwrite, readonly, rwlock}', required=True)
2657bc40f5f6SChunyang Hui    p.set_defaults(func=bdev_opal_set_lock_state)
2658bc40f5f6SChunyang Hui
2659b318d5f0SPawel Kaminski    # bdev_nvme_send_cmd
2660b318d5f0SPawel Kaminski    def bdev_nvme_send_cmd(args):
2661b318d5f0SPawel Kaminski        print_dict(rpc.nvme.bdev_nvme_send_cmd(args.client,
2662e66ea624SLiu Xiaodong                                               name=args.nvme_name,
2663e66ea624SLiu Xiaodong                                               cmd_type=args.cmd_type,
2664e66ea624SLiu Xiaodong                                               data_direction=args.data_direction,
2665e66ea624SLiu Xiaodong                                               cmdbuf=args.cmdbuf,
2666e66ea624SLiu Xiaodong                                               data=args.data,
2667e66ea624SLiu Xiaodong                                               metadata=args.metadata,
2668e66ea624SLiu Xiaodong                                               data_len=args.data_length,
2669e66ea624SLiu Xiaodong                                               metadata_len=args.metadata_length,
2670e66ea624SLiu Xiaodong                                               timeout_ms=args.timeout_ms))
2671e66ea624SLiu Xiaodong
26727aa92ad5Swanghailiangx    p = subparsers.add_parser('bdev_nvme_send_cmd', help='NVMe passthrough cmd.')
2673e66ea624SLiu Xiaodong    p.add_argument('-n', '--nvme-name', help="""Name of the operating NVMe controller""")
2674e66ea624SLiu Xiaodong    p.add_argument('-t', '--cmd-type', help="""Type of nvme cmd. Valid values are: admin, io""")
2675e66ea624SLiu Xiaodong    p.add_argument('-r', '--data-direction', help="""Direction of data transfer. Valid values are: c2h, h2c""")
2676e66ea624SLiu Xiaodong    p.add_argument('-c', '--cmdbuf', help="""NVMe command encoded by base64 urlsafe""")
2677e66ea624SLiu Xiaodong    p.add_argument('-d', '--data', help="""Data transferring to controller from host, encoded by base64 urlsafe""")
2678e66ea624SLiu Xiaodong    p.add_argument('-m', '--metadata', help="""Metadata transferring to controller from host, encoded by base64 urlsafe""")
2679e66ea624SLiu Xiaodong    p.add_argument('-D', '--data-length', help="""Data length required to transfer from controller to host""", type=int)
2680e66ea624SLiu Xiaodong    p.add_argument('-M', '--metadata-length', help="""Metadata length required to transfer from controller to host""", type=int)
2681e66ea624SLiu Xiaodong    p.add_argument('-T', '--timeout-ms',
2682e66ea624SLiu Xiaodong                   help="""Command execution timeout value, in milliseconds,  if 0, don't track timeout""", type=int, default=0)
2683b318d5f0SPawel Kaminski    p.set_defaults(func=bdev_nvme_send_cmd)
2684e66ea624SLiu Xiaodong
26852cccea55SPawel Wodkowski    # Notifications
2686c7174d9eSMaciej Wawryk    def notify_get_types(args):
2687c7174d9eSMaciej Wawryk        print_dict(rpc.notify.notify_get_types(args.client))
26882cccea55SPawel Wodkowski
2689405be3b7Swanghailiangx    p = subparsers.add_parser('notify_get_types', help='List available notifications that user can subscribe to.')
2690c7174d9eSMaciej Wawryk    p.set_defaults(func=notify_get_types)
26912cccea55SPawel Wodkowski
269285ab05d3SMaciej Wawryk    def notify_get_notifications(args):
269385ab05d3SMaciej Wawryk        ret = rpc.notify.notify_get_notifications(args.client,
26942cccea55SPawel Wodkowski                                                  id=args.id,
26952cccea55SPawel Wodkowski                                                  max=args.max)
26962cccea55SPawel Wodkowski        print_dict(ret)
26972cccea55SPawel Wodkowski
2698405be3b7Swanghailiangx    p = subparsers.add_parser('notify_get_notifications', help='Get notifications')
26992cccea55SPawel Wodkowski    p.add_argument('-i', '--id', help="""First ID to start fetching from""", type=int)
27002cccea55SPawel Wodkowski    p.add_argument('-n', '--max', help="""Maximum number of notifications to return in response""", type=int)
270185ab05d3SMaciej Wawryk    p.set_defaults(func=notify_get_notifications)
27022cccea55SPawel Wodkowski
27037535cdbdSEvgeniy Kochetov    def thread_get_stats(args):
27047535cdbdSEvgeniy Kochetov        print_dict(rpc.app.thread_get_stats(args.client))
27057535cdbdSEvgeniy Kochetov
27067535cdbdSEvgeniy Kochetov    p = subparsers.add_parser(
27077535cdbdSEvgeniy Kochetov        'thread_get_stats', help='Display current statistics of all the threads')
27087535cdbdSEvgeniy Kochetov    p.set_defaults(func=thread_get_stats)
27097535cdbdSEvgeniy Kochetov
271095b35daaSShuhei Matsumoto    def thread_set_cpumask(args):
271195b35daaSShuhei Matsumoto        ret = rpc.app.thread_set_cpumask(args.client,
271295b35daaSShuhei Matsumoto                                         id=args.id,
271395b35daaSShuhei Matsumoto                                         cpumask=args.cpumask)
271495b35daaSShuhei Matsumoto    p = subparsers.add_parser('thread_set_cpumask',
271595b35daaSShuhei Matsumoto                              help="""set the cpumask of the thread whose ID matches to the
271695b35daaSShuhei Matsumoto    specified value. The thread may be migrated to one of the specified CPUs.""")
271795b35daaSShuhei Matsumoto    p.add_argument('-i', '--id', type=int, help='thread ID')
271895b35daaSShuhei Matsumoto    p.add_argument('-m', '--cpumask', help='cpumask for this thread')
271995b35daaSShuhei Matsumoto    p.set_defaults(func=thread_set_cpumask)
272095b35daaSShuhei Matsumoto
2721d267d0e8SVitaliy Mysak    def log_enable_timestamps(args):
2722d267d0e8SVitaliy Mysak        ret = rpc.app.log_enable_timestamps(args.client,
2723d267d0e8SVitaliy Mysak                                            enabled=args.enabled)
2724d267d0e8SVitaliy Mysak    p = subparsers.add_parser('log_enable_timestamps',
2725d267d0e8SVitaliy Mysak                              help='Enable or disable timestamps.')
2726d267d0e8SVitaliy Mysak    p.add_argument('-d', '--disable', dest='enabled', default=False, action='store_false', help="Disable timestamps")
2727d267d0e8SVitaliy Mysak    p.add_argument('-e', '--enable', dest='enabled', action='store_true', help="Enable timestamps")
2728d267d0e8SVitaliy Mysak    p.set_defaults(func=log_enable_timestamps)
2729d267d0e8SVitaliy Mysak
27300b0f0c54SShuhei Matsumoto    def thread_get_pollers(args):
27310b0f0c54SShuhei Matsumoto        print_dict(rpc.app.thread_get_pollers(args.client))
27320b0f0c54SShuhei Matsumoto
27330b0f0c54SShuhei Matsumoto    p = subparsers.add_parser(
27340b0f0c54SShuhei Matsumoto        'thread_get_pollers', help='Display current pollers of all the threads')
27350b0f0c54SShuhei Matsumoto    p.set_defaults(func=thread_get_pollers)
27360b0f0c54SShuhei Matsumoto
273749cffc1eSShuhei Matsumoto    def thread_get_io_channels(args):
273849cffc1eSShuhei Matsumoto        print_dict(rpc.app.thread_get_io_channels(args.client))
273949cffc1eSShuhei Matsumoto
274049cffc1eSShuhei Matsumoto    p = subparsers.add_parser(
274149cffc1eSShuhei Matsumoto        'thread_get_io_channels', help='Display current IO channels of all the threads')
274249cffc1eSShuhei Matsumoto    p.set_defaults(func=thread_get_io_channels)
274349cffc1eSShuhei Matsumoto
2744de467ec9SSeth Howell    def env_dpdk_get_mem_stats(args):
2745de467ec9SSeth Howell        print_dict(rpc.env_dpdk.env_dpdk_get_mem_stats(args.client))
2746de467ec9SSeth Howell
2747de467ec9SSeth Howell    p = subparsers.add_parser(
2748de467ec9SSeth Howell        'env_dpdk_get_mem_stats', help='write the dpdk memory stats to a file.')
2749de467ec9SSeth Howell    p.set_defaults(func=env_dpdk_get_mem_stats)
2750de467ec9SSeth Howell
27513ce759a1SXiaodong Liu    # blobfs
27523ce759a1SXiaodong Liu    def blobfs_detect(args):
27533ce759a1SXiaodong Liu        print(rpc.blobfs.blobfs_detect(args.client,
27543ce759a1SXiaodong Liu                                       bdev_name=args.bdev_name))
27553ce759a1SXiaodong Liu
27563ce759a1SXiaodong Liu    p = subparsers.add_parser('blobfs_detect', help='Detect whether a blobfs exists on bdev')
27573ce759a1SXiaodong Liu    p.add_argument('bdev_name', help='Blockdev name to detect blobfs. Example: Malloc0.')
27583ce759a1SXiaodong Liu    p.set_defaults(func=blobfs_detect)
27593ce759a1SXiaodong Liu
27606433c103SXiaodong Liu    def blobfs_create(args):
27616433c103SXiaodong Liu        print(rpc.blobfs.blobfs_create(args.client,
27626433c103SXiaodong Liu                                       bdev_name=args.bdev_name,
27636433c103SXiaodong Liu                                       cluster_sz=args.cluster_sz))
27646433c103SXiaodong Liu
27656433c103SXiaodong Liu    p = subparsers.add_parser('blobfs_create', help='Build a blobfs on bdev')
27666433c103SXiaodong Liu    p.add_argument('bdev_name', help='Blockdev name to build blobfs. Example: Malloc0.')
27677a372bbeSJim Harris    p.add_argument('-c', '--cluster-sz',
27686433c103SXiaodong Liu                   help="""Size of cluster in bytes (Optional). Must be multiple of 4KB page size. Default and minimal value is 1M.""")
27696433c103SXiaodong Liu    p.set_defaults(func=blobfs_create)
27706433c103SXiaodong Liu
27719c6e7426SXiaodong Liu    def blobfs_mount(args):
27729c6e7426SXiaodong Liu        print(rpc.blobfs.blobfs_mount(args.client,
27739c6e7426SXiaodong Liu                                      bdev_name=args.bdev_name,
27749c6e7426SXiaodong Liu                                      mountpoint=args.mountpoint))
27759c6e7426SXiaodong Liu
27769c6e7426SXiaodong Liu    p = subparsers.add_parser('blobfs_mount', help='Mount a blobfs on bdev to host path by FUSE')
27779c6e7426SXiaodong Liu    p.add_argument('bdev_name', help='Blockdev name where the blobfs is. Example: Malloc0.')
27789c6e7426SXiaodong Liu    p.add_argument('mountpoint', help='Mountpoint path in host to mount blobfs. Example: /mnt/.')
27799c6e7426SXiaodong Liu    p.set_defaults(func=blobfs_mount)
27809c6e7426SXiaodong Liu
2781138e6daeSXiaodong Liu    def blobfs_set_cache_size(args):
2782138e6daeSXiaodong Liu        print(rpc.blobfs.blobfs_set_cache_size(args.client,
2783138e6daeSXiaodong Liu                                               size_in_mb=args.size_in_mb))
2784138e6daeSXiaodong Liu
2785138e6daeSXiaodong Liu    p = subparsers.add_parser('blobfs_set_cache_size', help='Set cache size for blobfs')
2786138e6daeSXiaodong Liu    p.add_argument('size_in_mb', help='Cache size for blobfs in megabytes.', type=int)
2787138e6daeSXiaodong Liu    p.set_defaults(func=blobfs_set_cache_size)
2788138e6daeSXiaodong Liu
2789b1074c49SEvgeniy Kochetov    # sock
2790b1074c49SEvgeniy Kochetov    def sock_impl_get_options(args):
2791b1074c49SEvgeniy Kochetov        print_json(rpc.sock.sock_impl_get_options(args.client,
2792b1074c49SEvgeniy Kochetov                                                  impl_name=args.impl))
2793b1074c49SEvgeniy Kochetov
2794b1074c49SEvgeniy Kochetov    p = subparsers.add_parser('sock_impl_get_options', help="""Get options of socket layer implementation""")
2795b1074c49SEvgeniy Kochetov    p.add_argument('-i', '--impl', help='Socket implementation name, e.g. posix', required=True)
2796b1074c49SEvgeniy Kochetov    p.set_defaults(func=sock_impl_get_options)
2797b1074c49SEvgeniy Kochetov
2798b1074c49SEvgeniy Kochetov    def sock_impl_set_options(args):
2799b1074c49SEvgeniy Kochetov        rpc.sock.sock_impl_set_options(args.client,
2800b1074c49SEvgeniy Kochetov                                       impl_name=args.impl,
2801b1074c49SEvgeniy Kochetov                                       recv_buf_size=args.recv_buf_size,
280263c5e51eSEvgeniy Kochetov                                       send_buf_size=args.send_buf_size,
280329f31a90SEvgeniy Kochetov                                       enable_recv_pipe=args.enable_recv_pipe,
2804a6db2f35SZiye Yang                                       enable_quickack=args.enable_quickack,
28058e85b675SAlexey Marchuk                                       enable_placement_id=args.enable_placement_id,
28068e85b675SAlexey Marchuk                                       enable_zerocopy_send_server=args.enable_zerocopy_send_server,
28079bff828fSRichael Zhuang                                       enable_zerocopy_send_client=args.enable_zerocopy_send_client,
28089bff828fSRichael Zhuang                                       zerocopy_threshold=args.zerocopy_threshold)
2809b1074c49SEvgeniy Kochetov
2810b1074c49SEvgeniy Kochetov    p = subparsers.add_parser('sock_impl_set_options', help="""Set options of socket layer implementation""")
2811b1074c49SEvgeniy Kochetov    p.add_argument('-i', '--impl', help='Socket implementation name, e.g. posix', required=True)
2812b1074c49SEvgeniy Kochetov    p.add_argument('-r', '--recv-buf-size', help='Size of receive buffer on socket in bytes', type=int)
2813b1074c49SEvgeniy Kochetov    p.add_argument('-s', '--send-buf-size', help='Size of send buffer on socket in bytes', type=int)
2814201aa634SRichael Zhuang    p.add_argument('-p', '--enable-placement-id', help='Option for placement-id. 0:disable,1:incoming_napi,2:incoming_cpu', type=int)
281563c5e51eSEvgeniy Kochetov    p.add_argument('--enable-recv-pipe', help='Enable receive pipe',
281663c5e51eSEvgeniy Kochetov                   action='store_true', dest='enable_recv_pipe')
281763c5e51eSEvgeniy Kochetov    p.add_argument('--disable-recv-pipe', help='Disable receive pipe',
281863c5e51eSEvgeniy Kochetov                   action='store_false', dest='enable_recv_pipe')
281961cd9d30SShuhei Matsumoto    p.add_argument('--enable-quickack', help='Enable quick ACK',
282061cd9d30SShuhei Matsumoto                   action='store_true', dest='enable_quickack')
282161cd9d30SShuhei Matsumoto    p.add_argument('--disable-quickack', help='Disable quick ACK',
282261cd9d30SShuhei Matsumoto                   action='store_false', dest='enable_quickack')
28238e85b675SAlexey Marchuk    p.add_argument('--enable-zerocopy-send-server', help='Enable zerocopy on send for server sockets',
28248e85b675SAlexey Marchuk                   action='store_true', dest='enable_zerocopy_send_server')
28258e85b675SAlexey Marchuk    p.add_argument('--disable-zerocopy-send-server', help='Disable zerocopy on send for server sockets',
28262716eb02SEvgeniy Kochetov                   action='store_false', dest='enable_zerocopy_send_server')
28278e85b675SAlexey Marchuk    p.add_argument('--enable-zerocopy-send-client', help='Enable zerocopy on send for client sockets',
28288e85b675SAlexey Marchuk                   action='store_true', dest='enable_zerocopy_send_client')
28298e85b675SAlexey Marchuk    p.add_argument('--disable-zerocopy-send-client', help='Disable zerocopy on send for client sockets',
28308e85b675SAlexey Marchuk                   action='store_false', dest='enable_zerocopy_send_client')
28319bff828fSRichael Zhuang    p.add_argument('--zerocopy-threshold', help='Set zerocopy_threshold in bytes',
28329bff828fSRichael Zhuang                   action='store_true', dest='zerocopy_threshold')
2833ec1b78dbSAlexey Marchuk    p.set_defaults(func=sock_impl_set_options, enable_recv_pipe=None, enable_quickack=None,
28349bff828fSRichael Zhuang                   enable_placement_id=None, enable_zerocopy_send_server=None, enable_zerocopy_send_client=None,
28359bff828fSRichael Zhuang                   zerocopy_threshold=None)
2836b1074c49SEvgeniy Kochetov
283789d9fe55SAlexey Marchuk    def sock_set_default_impl(args):
283889d9fe55SAlexey Marchuk        print_json(rpc.sock.sock_set_default_impl(args.client,
283989d9fe55SAlexey Marchuk                                                  impl_name=args.impl))
284089d9fe55SAlexey Marchuk
284189d9fe55SAlexey Marchuk    p = subparsers.add_parser('sock_set_default_impl', help="""Set the default sock implementation""")
284289d9fe55SAlexey Marchuk    p.add_argument('-i', '--impl', help='Socket implementation name, e.g. posix', required=True)
284389d9fe55SAlexey Marchuk    p.set_defaults(func=sock_set_default_impl)
284489d9fe55SAlexey Marchuk
28459647fd4eSKonrad Sztyber    def framework_get_pci_devices(args):
28463911bc34SKonrad Sztyber        def splitbuf(buf, step):
28473911bc34SKonrad Sztyber            return [buf[i:i+step] for i in range(0, len(buf), step)]
28483911bc34SKonrad Sztyber
28493911bc34SKonrad Sztyber        devices = rpc.subsystem.framework_get_pci_devices(args.client)
28503911bc34SKonrad Sztyber        if not args.format_lspci:
28513911bc34SKonrad Sztyber            print_json(devices)
28523911bc34SKonrad Sztyber        else:
28533911bc34SKonrad Sztyber            for devid, dev in enumerate(devices):
28543911bc34SKonrad Sztyber                print('{} device #{}'.format(dev['address'], devid))
28553911bc34SKonrad Sztyber                for lineid, line in enumerate(splitbuf(dev['config_space'], 32)):
28563911bc34SKonrad Sztyber                    print('{:02x}: {}'.format(lineid * 16, ' '.join(splitbuf(line.lower(), 2))))
28573911bc34SKonrad Sztyber                print()
28589647fd4eSKonrad Sztyber
28599647fd4eSKonrad Sztyber    p = subparsers.add_parser('framework_get_pci_devices', help='''Get a list of attached PCI devices''')
28603911bc34SKonrad Sztyber    p.add_argument('--format-lspci', help='Format the output in a way to be consumed by lspci -F',
28613911bc34SKonrad Sztyber                   action='store_true')
28629647fd4eSKonrad Sztyber    p.set_defaults(func=framework_get_pci_devices)
28639647fd4eSKonrad Sztyber
28647a0c901aSMichael Haeuptle    # bdev_nvme_add_error_injection
28657a0c901aSMichael Haeuptle    def bdev_nvme_add_error_injection(args):
28667a0c901aSMichael Haeuptle        print_dict(rpc.nvme.bdev_nvme_add_error_injection(args.client,
28677a0c901aSMichael Haeuptle                                                          name=args.nvme_name,
28687a0c901aSMichael Haeuptle                                                          cmd_type=args.cmd_type,
28697a0c901aSMichael Haeuptle                                                          opc=args.opc,
28707a0c901aSMichael Haeuptle                                                          do_not_submit=args.do_not_submit,
28717a0c901aSMichael Haeuptle                                                          timeout_in_us=args.timeout_in_us,
28727a0c901aSMichael Haeuptle                                                          err_count=args.err_count,
28737a0c901aSMichael Haeuptle                                                          sct=args.sct,
28747a0c901aSMichael Haeuptle                                                          sc=args.sc))
28757a0c901aSMichael Haeuptle    p = subparsers.add_parser('bdev_nvme_add_error_injection',
28767a0c901aSMichael Haeuptle                              help='Add a NVMe command error injection.')
28777a0c901aSMichael Haeuptle    p.add_argument('-n', '--nvme-name', help="""Name of the operating NVMe controller""", required=True)
28787a0c901aSMichael Haeuptle    p.add_argument('-t', '--cmd-type', help="""Type of NVMe command. Valid values are: admin, io""", required=True)
28797a0c901aSMichael Haeuptle    p.add_argument('-o', '--opc', help="""Opcode of the NVMe command.""", required=True, type=int)
28807a0c901aSMichael Haeuptle    p.add_argument('-s', '--do-not-submit',
28817a0c901aSMichael Haeuptle                   help="""Set to true if request should not be submitted to the controller (default false)""",
28827a0c901aSMichael Haeuptle                   default=False, dest="do_not_submit", action='store_true')
28837a0c901aSMichael Haeuptle    p.add_argument('-w', '--timeout-in-us', help="""Wait specified microseconds when do_not_submit is true""", type=int)
28847a0c901aSMichael Haeuptle    p.add_argument('-e', '--err-count', help="""Number of matching NVMe commands to inject errors (default 1)""", type=int, default=1)
28857a0c901aSMichael Haeuptle    p.add_argument('-u', '--sct', help="""Status code type""", type=int)
28867a0c901aSMichael Haeuptle    p.add_argument('-c', '--sc', help="""Status code""", type=int)
28877a0c901aSMichael Haeuptle    p.set_defaults(func=bdev_nvme_add_error_injection)
28887a0c901aSMichael Haeuptle
28897a0c901aSMichael Haeuptle    # bdev_nvme_remove_error_injection
28907a0c901aSMichael Haeuptle    def bdev_nvme_remove_error_injection(args):
28917a0c901aSMichael Haeuptle        print_dict(rpc.nvme.bdev_nvme_remove_error_injection(args.client,
28927a0c901aSMichael Haeuptle                                                             name=args.nvme_name,
28937a0c901aSMichael Haeuptle                                                             cmd_type=args.cmd_type,
28947a0c901aSMichael Haeuptle                                                             opc=args.opc))
28957a0c901aSMichael Haeuptle    p = subparsers.add_parser('bdev_nvme_remove_error_injection',
28967a0c901aSMichael Haeuptle                              help='Removes a NVMe command error injection.')
28977a0c901aSMichael Haeuptle    p.add_argument('-n', '--nvme-name', help="""Name of the operating NVMe controller""", required=True)
28987a0c901aSMichael Haeuptle    p.add_argument('-t', '--cmd-type', help="""Type of nvme cmd. Valid values are: admin, io""", required=True)
28997a0c901aSMichael Haeuptle    p.add_argument('-o', '--opc', help="""Opcode of the nvme cmd.""", required=True, type=int)
29007a0c901aSMichael Haeuptle    p.set_defaults(func=bdev_nvme_remove_error_injection)
29017a0c901aSMichael Haeuptle
2902c2b5a3f6SJim Harris    def check_called_name(name):
2903c2b5a3f6SJim Harris        if name in deprecated_aliases:
2904c2b5a3f6SJim Harris            print("{} is deprecated, use {} instead.".format(name, deprecated_aliases[name]), file=sys.stderr)
2905c2b5a3f6SJim Harris
2906c47d6541SDarek Stojaczyk    class dry_run_client:
29076e4ea8fdSPawel Kaminski        def call(self, method, params=None):
29086e4ea8fdSPawel Kaminski            print("Request:\n" + json.dumps({"method": method, "params": params}, indent=2))
29096e4ea8fdSPawel Kaminski
2910c47d6541SDarek Stojaczyk    def null_print(arg):
29116e4ea8fdSPawel Kaminski        pass
29126e4ea8fdSPawel Kaminski
29136895f0f2SJim Harris    def call_rpc_func(args):
2914f7cb69cbSPawel Wodkowski        args.func(args)
2915c2b5a3f6SJim Harris        check_called_name(args.called_rpc_name)
29166895f0f2SJim Harris
2917363fe506SJim Harris    def execute_script(parser, client, fd):
29183bf82af8SPawel Kaminski        executed_rpc = ""
2919363fe506SJim Harris        for rpc_call in map(str.rstrip, fd):
2920caec8928SJim Harris            if not rpc_call.strip():
2921caec8928SJim Harris                continue
29223bf82af8SPawel Kaminski            executed_rpc = "\n".join([executed_rpc, rpc_call])
292370a6e3acSJim Harris            rpc_args = shlex.split(rpc_call)
292470a6e3acSJim Harris            if rpc_args[0][0] == '#':
292570a6e3acSJim Harris                # Ignore lines starting with # - treat them as comments
292670a6e3acSJim Harris                continue
292770a6e3acSJim Harris            args = parser.parse_args(rpc_args)
2928363fe506SJim Harris            args.client = client
29293bf82af8SPawel Kaminski            try:
2930363fe506SJim Harris                call_rpc_func(args)
29313bf82af8SPawel Kaminski            except JSONRPCException as ex:
29323bf82af8SPawel Kaminski                print("Exception:")
29333bf82af8SPawel Kaminski                print(executed_rpc.strip() + " <<<")
29343bf82af8SPawel Kaminski                print(ex.message)
29353bf82af8SPawel Kaminski                exit(1)
2936363fe506SJim Harris
29375ddb210eSMichal Berger    def load_plugin(args):
2938b0bac20aSMaciej Szwed        # Create temporary parser, pull out the plugin parameter, load the module, and then run the real argument parser
2939b0bac20aSMaciej Szwed        plugin_parser = argparse.ArgumentParser(add_help=False)
2940b0bac20aSMaciej Szwed        plugin_parser.add_argument('--plugin', dest='rpc_plugin', help='Module name of plugin with additional RPC commands')
2941b0bac20aSMaciej Szwed
2942b0bac20aSMaciej Szwed        rpc_module = plugin_parser.parse_known_args()[0].rpc_plugin
29435ddb210eSMichal Berger        if args is not None:
29445ddb210eSMichal Berger            rpc_module = plugin_parser.parse_known_args(args)[0].rpc_plugin
29455ddb210eSMichal Berger
2946b0bac20aSMaciej Szwed        if rpc_module is not None:
2947b0bac20aSMaciej Szwed            try:
2948b0bac20aSMaciej Szwed                rpc_plugin = importlib.import_module(rpc_module)
2949b0bac20aSMaciej Szwed                try:
2950b0bac20aSMaciej Szwed                    rpc_plugin.spdk_rpc_plugin_initialize(subparsers)
2951b0bac20aSMaciej Szwed                except AttributeError:
2952b0bac20aSMaciej Szwed                    print("Module %s does not contain 'spdk_rpc_plugin_initialize' function" % rpc_module)
2953b0bac20aSMaciej Szwed            except ModuleNotFoundError:
2954b0bac20aSMaciej Szwed                print("Module %s not found" % rpc_module)
2955b0bac20aSMaciej Szwed
29567a372bbeSJim Harris    def replace_arg_underscores(args):
29577a372bbeSJim Harris        # All option names are defined with dashes only - for example: --tgt-name
29587a372bbeSJim Harris        # But if user used underscores, convert them to dashes (--tgt_name => --tgt-name)
29597a372bbeSJim Harris        # SPDK was inconsistent previously and had some options with underscores, so
29607a372bbeSJim Harris        # doing this conversion ensures backward compatibility with older scripts.
29617a372bbeSJim Harris        for i in range(len(args)):
29627a372bbeSJim Harris            arg = args[i]
29637a372bbeSJim Harris            if arg.startswith('--') and "_" in arg:
29647a372bbeSJim Harris                args[i] = arg.replace('_', '-')
29657a372bbeSJim Harris
29665ddb210eSMichal Berger    load_plugin(None)
29675ddb210eSMichal Berger
29687a372bbeSJim Harris    replace_arg_underscores(sys.argv)
29697a372bbeSJim Harris
29706895f0f2SJim Harris    args = parser.parse_args()
297117c2f4eeSTomasz Zawadzki
297217c2f4eeSTomasz Zawadzki    if sys.stdin.isatty() and not hasattr(args, 'func'):
297317c2f4eeSTomasz Zawadzki        # No arguments and no data piped through stdin
297417c2f4eeSTomasz Zawadzki        parser.print_help()
297517c2f4eeSTomasz Zawadzki        exit(1)
29768b98cdb6SDarek Stojaczyk    if args.is_server:
29778b98cdb6SDarek Stojaczyk        for input in sys.stdin:
29788b98cdb6SDarek Stojaczyk            cmd = shlex.split(input)
29797a372bbeSJim Harris            replace_arg_underscores(cmd)
29808b98cdb6SDarek Stojaczyk            try:
29815ddb210eSMichal Berger                load_plugin(cmd)
29828b98cdb6SDarek Stojaczyk                tmp_args = parser.parse_args(cmd)
29838b98cdb6SDarek Stojaczyk            except SystemExit as ex:
29848b98cdb6SDarek Stojaczyk                print("**STATUS=1", flush=True)
29858b98cdb6SDarek Stojaczyk                continue
29868b98cdb6SDarek Stojaczyk
29878b98cdb6SDarek Stojaczyk            try:
29888b98cdb6SDarek Stojaczyk                tmp_args.client = rpc.client.JSONRPCClient(
29898b98cdb6SDarek Stojaczyk                    tmp_args.server_addr, tmp_args.port, tmp_args.timeout,
299000b52bf5SDarek Stojaczyk                    log_level=getattr(logging, tmp_args.verbose.upper()), conn_retries=tmp_args.conn_retries)
29918b98cdb6SDarek Stojaczyk                call_rpc_func(tmp_args)
29928b98cdb6SDarek Stojaczyk                print("**STATUS=0", flush=True)
29938b98cdb6SDarek Stojaczyk            except JSONRPCException as ex:
29948b98cdb6SDarek Stojaczyk                print(ex.message)
29958b98cdb6SDarek Stojaczyk                print("**STATUS=1", flush=True)
29968b98cdb6SDarek Stojaczyk        exit(0)
29978b98cdb6SDarek Stojaczyk    elif args.dry_run:
2998c47d6541SDarek Stojaczyk        args.client = dry_run_client()
2999c47d6541SDarek Stojaczyk        print_dict = null_print
3000c47d6541SDarek Stojaczyk        print_json = null_print
3001c47d6541SDarek Stojaczyk        print_array = null_print
30026e4ea8fdSPawel Kaminski    else:
30039713bfe9SJim Harris        try:
300400b52bf5SDarek Stojaczyk            args.client = rpc.client.JSONRPCClient(args.server_addr, args.port, args.timeout,
300500b52bf5SDarek Stojaczyk                                                   log_level=getattr(logging, args.verbose.upper()),
300600b52bf5SDarek Stojaczyk                                                   conn_retries=args.conn_retries)
30079713bfe9SJim Harris        except JSONRPCException as ex:
30089713bfe9SJim Harris            print(ex.message)
30099713bfe9SJim Harris            exit(1)
30109713bfe9SJim Harris
3011363fe506SJim Harris    if hasattr(args, 'func'):
3012535654f8SKarol Latecki        try:
30136895f0f2SJim Harris            call_rpc_func(args)
3014535654f8SKarol Latecki        except JSONRPCException as ex:
30155bd76a10SJim Harris            print(ex.message)
3016535654f8SKarol Latecki            exit(1)
3017363fe506SJim Harris    else:
3018363fe506SJim Harris        execute_script(parser, args.client, sys.stdin)
3019