1b96f97cfSPawel Wodkowski#!/usr/bin/env python3 217538bdcSpaul luse# SPDX-License-Identifier: BSD-3-Clause 317538bdcSpaul luse# Copyright (C) 2016 Intel Corporation 417538bdcSpaul luse# All rights reserved. 52796687dSParameswaran Krishnamurthy# Copyright (c) 2022 Dell Inc, or its subsidiaries. 60568555aSEvgeniy Kochetov# Copyright (c) 2022-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 717538bdcSpaul luse# 81e92d78aSBen Walker 927cc63ecSPawel Wodkowskiimport logging 101e92d78aSBen Walkerimport argparse 11b0bac20aSMaciej Szwedimport importlib 127610bc38SKonrad Sztyberimport os 1309a9130eSPawel Kaminskiimport sys 1422c3befdSKarol Lateckiimport shlex 156e4ea8fdSPawel Kaminskiimport json 161e92d78aSBen Walker 17e44aef95SDaniel Verkamptry: 18e44aef95SDaniel Verkamp from shlex import quote 19e44aef95SDaniel Verkampexcept ImportError: 20e44aef95SDaniel Verkamp from pipes import quote 21e44aef95SDaniel Verkamp 227610bc38SKonrad Sztybersys.path.append(os.path.dirname(__file__) + '/../python') 237610bc38SKonrad Sztyber 247610bc38SKonrad Sztyberimport spdk.rpc as rpc # noqa 257610bc38SKonrad Sztyberfrom spdk.rpc.client import print_dict, print_json, JSONRPCException # noqa 267610bc38SKonrad Sztyberfrom spdk.rpc.helpers import deprecated_aliases # noqa 277610bc38SKonrad Sztyber 28e44aef95SDaniel Verkamp 29e44aef95SDaniel Verkampdef print_array(a): 30e78866edSDaniel Verkamp print(" ".join((quote(v) for v in a))) 31e44aef95SDaniel Verkamp 32e44aef95SDaniel Verkamp 334dd3f4a7SBen Walkerif __name__ == "__main__": 344dd3f4a7SBen Walker parser = argparse.ArgumentParser( 350d105d4fSTomasz Zawadzki description='SPDK RPC command line interface', usage='%(prog)s [options]') 364dd3f4a7SBen Walker parser.add_argument('-s', dest='server_addr', 37e632df9dSJim Harris help='RPC domain socket path or IP address', default='/var/tmp/spdk.sock') 384dd3f4a7SBen Walker parser.add_argument('-p', dest='port', 394dd3f4a7SBen Walker help='RPC port number (if server_addr is IP address)', 404dd3f4a7SBen Walker default=5260, type=int) 4114c4a428SPawel Wodkowski parser.add_argument('-t', dest='timeout', 42e632df9dSJim Harris help='Timeout as a floating point number expressed in seconds waiting for response. Default: 60.0', 4393731ac7SMarek Chomnicki default=None, type=float) 4400b52bf5SDarek Stojaczyk parser.add_argument('-r', dest='conn_retries', 4500b52bf5SDarek Stojaczyk help='Retry connecting to the RPC server N times with 0.2s interval. Default: 0', 4600b52bf5SDarek Stojaczyk default=0, type=int) 4727cc63ecSPawel Wodkowski parser.add_argument('-v', dest='verbose', action='store_const', const="INFO", 4827cc63ecSPawel Wodkowski help='Set verbose mode to INFO', default="ERROR") 4927cc63ecSPawel Wodkowski parser.add_argument('--verbose', dest='verbose', choices=['DEBUG', 'INFO', 'ERROR'], 5027cc63ecSPawel Wodkowski help="""Set verbose level. """) 517a372bbeSJim Harris parser.add_argument('--dry-run', dest='dry_run', action='store_true', help="Display request and exit") 526e4ea8fdSPawel Kaminski parser.set_defaults(dry_run=False) 53a5ea50e7SMaciej Mis parser.add_argument('--go-client', dest='go_client', action='store_true', help="Use Go client") 54a5ea50e7SMaciej Mis parser.set_defaults(go_client=False) 558b98cdb6SDarek Stojaczyk parser.add_argument('--server', dest='is_server', action='store_true', 568b98cdb6SDarek Stojaczyk help="Start listening on stdin, parse each line as a regular rpc.py execution and create \ 578b98cdb6SDarek Stojaczyk a separate connection for each command. Each command's output ends with either \ 588b98cdb6SDarek Stojaczyk **STATUS=0 if the command succeeded or **STATUS=1 if it failed. --server is meant \ 598b98cdb6SDarek Stojaczyk to be used in conjunction with bash coproc, where stdin and stdout are connected to \ 608b98cdb6SDarek Stojaczyk pipes and can be used as a faster way to send RPC commands. If enabled, rpc.py \ 618b98cdb6SDarek Stojaczyk must be executed without any other parameters.") 628b98cdb6SDarek Stojaczyk parser.set_defaults(is_server=False) 63b0bac20aSMaciej Szwed parser.add_argument('--plugin', dest='rpc_plugin', help='Module name of plugin with additional RPC commands') 64519d7209STomasz Zawadzki subparsers = parser.add_subparsers(help='RPC methods', dest='called_rpc_name', metavar='') 651e92d78aSBen Walker 66e85d4712SMaciej Wawryk def framework_start_init(args): 67e85d4712SMaciej Wawryk rpc.framework_start_init(args.client) 6828589dbbSShuhei Matsumoto 6931513614Swanghailiangx p = subparsers.add_parser('framework_start_init', help='Start initialization of subsystems') 70e85d4712SMaciej Wawryk p.set_defaults(func=framework_start_init) 7128589dbbSShuhei Matsumoto 72fb3918a0SMaciej Wawryk def framework_wait_init(args): 73fb3918a0SMaciej Wawryk rpc.framework_wait_init(args.client) 74b7f54bd6SSeth Howell 7531513614Swanghailiangx p = subparsers.add_parser('framework_wait_init', help='Block until subsystems have been initialized') 76fb3918a0SMaciej Wawryk p.set_defaults(func=framework_wait_init) 77b7f54bd6SSeth Howell 786ee44c69SJim Harris def rpc_get_methods(args): 796ee44c69SJim Harris print_dict(rpc.rpc_get_methods(args.client, 80f60eeb6fSPawel Kaminski current=args.current, 81f60eeb6fSPawel Kaminski include_aliases=args.include_aliases)) 82df897ed4SDaniel Verkamp 8331513614Swanghailiangx p = subparsers.add_parser('rpc_get_methods', help='Get list of supported RPC methods') 84bf9806d5SShuhei Matsumoto p.add_argument('-c', '--current', help='Get list of RPC methods only callable in the current state.', action='store_true') 85f60eeb6fSPawel Kaminski p.add_argument('-i', '--include-aliases', help='include RPC aliases', action='store_true') 866ee44c69SJim Harris p.set_defaults(func=rpc_get_methods) 87df897ed4SDaniel Verkamp 886b6dfea6SPawel Kaminski def spdk_get_version(args): 896b6dfea6SPawel Kaminski print_json(rpc.spdk_get_version(args.client)) 9038902a5aSChunyang Hui 9131513614Swanghailiangx p = subparsers.add_parser('spdk_get_version', help='Get SPDK version') 926b6dfea6SPawel Kaminski p.set_defaults(func=spdk_get_version) 9338902a5aSChunyang Hui 94df897ed4SDaniel Verkamp def save_config(args): 959ff7313fSKarol Latecki rpc.save_config(args.client, 9609a9130eSPawel Kaminski sys.stdout, 97496d6e76SJim Harris indent=args.indent, 98496d6e76SJim Harris subsystems=args.subsystems) 991e92d78aSBen Walker 10055014ddfSJim Harris p = subparsers.add_parser('save_config', help="""Write current (live) configuration of SPDK subsystems and targets to stdout. 10155014ddfSJim Harris """) 10255014ddfSJim Harris p.add_argument('-i', '--indent', help="""Indent level. Value less than 0 mean compact mode. Default indent level is 2. 10355014ddfSJim Harris """, type=int, default=2) 104496d6e76SJim Harris p.add_argument('-s', '--subsystems', help="""Comma-separated list of subsystems (and their dependencies) to save""") 105df897ed4SDaniel Verkamp p.set_defaults(func=save_config) 106df897ed4SDaniel Verkamp 107df897ed4SDaniel Verkamp def load_config(args): 108871214e2SMichal Berger rpc.load_config(args.client, args.json_conf, 109f60eeb6fSPawel Kaminski include_aliases=args.include_aliases) 11050d738b4SPawel Wodkowski 111871214e2SMichal Berger p = subparsers.add_parser('load_config', help="""Configure SPDK subsystems and targets using JSON RPC.""") 112f60eeb6fSPawel Kaminski p.add_argument('-i', '--include-aliases', help='include RPC aliases', action='store_true') 1137a372bbeSJim Harris p.add_argument('-j', '--json-conf', help='Valid JSON configuration', default=sys.stdin) 114df897ed4SDaniel Verkamp p.set_defaults(func=load_config) 11550d738b4SPawel Wodkowski 116800a1423SShuhei Matsumoto def save_subsystem_config(args): 1179ff7313fSKarol Latecki rpc.save_subsystem_config(args.client, 11809a9130eSPawel Kaminski sys.stdout, 1199ff7313fSKarol Latecki indent=args.indent, 1209ff7313fSKarol Latecki name=args.name) 121800a1423SShuhei Matsumoto 12255014ddfSJim Harris p = subparsers.add_parser('save_subsystem_config', help="""Write current (live) configuration of SPDK subsystem to stdout. 12355014ddfSJim Harris """) 12455014ddfSJim Harris p.add_argument('-i', '--indent', help="""Indent level. Value less than 0 mean compact mode. Default indent level is 2. 12555014ddfSJim Harris """, type=int, default=2) 126800a1423SShuhei Matsumoto p.add_argument('-n', '--name', help='Name of subsystem', required=True) 127800a1423SShuhei Matsumoto p.set_defaults(func=save_subsystem_config) 128800a1423SShuhei Matsumoto 12943c5429dSPawel Niedzwiecki def load_subsystem_config(args): 13009a9130eSPawel Kaminski rpc.load_subsystem_config(args.client, 131871214e2SMichal Berger args.json_conf) 13243c5429dSPawel Niedzwiecki 133871214e2SMichal Berger p = subparsers.add_parser('load_subsystem_config', help="""Configure SPDK subsystem using JSON RPC.""") 1347a372bbeSJim Harris p.add_argument('-j', '--json-conf', help='Valid JSON configuration', default=sys.stdin) 13543c5429dSPawel Niedzwiecki p.set_defaults(func=load_subsystem_config) 13643c5429dSPawel Niedzwiecki 1374dd3f4a7SBen Walker # app 1383402bfbdSPawel Kaminski def spdk_kill_instance(args): 1393402bfbdSPawel Kaminski rpc.app.spdk_kill_instance(args.client, 1404a534344SDaniel Verkamp sig_name=args.sig_name) 141df897ed4SDaniel Verkamp 142000ee408Swanghailiangx p = subparsers.add_parser('spdk_kill_instance', help='Send signal to instance') 1434dd3f4a7SBen Walker p.add_argument('sig_name', help='signal will be sent to server.') 1443402bfbdSPawel Kaminski p.set_defaults(func=spdk_kill_instance) 145df897ed4SDaniel Verkamp 146a10d0ce7SMaciej Wawryk def framework_monitor_context_switch(args): 1474a534344SDaniel Verkamp enabled = None 1484a534344SDaniel Verkamp if args.enable: 1494a534344SDaniel Verkamp enabled = True 1504a534344SDaniel Verkamp if args.disable: 1514a534344SDaniel Verkamp enabled = False 152a10d0ce7SMaciej Wawryk print_dict(rpc.app.framework_monitor_context_switch(args.client, 1534a534344SDaniel Verkamp enabled=enabled)) 1541e92d78aSBen Walker 155000ee408Swanghailiangx p = subparsers.add_parser('framework_monitor_context_switch', 156a10d0ce7SMaciej Wawryk help='Control whether the context switch monitor is enabled') 1574dd3f4a7SBen Walker p.add_argument('-e', '--enable', action='store_true', help='Enable context switch monitoring') 1584dd3f4a7SBen Walker p.add_argument('-d', '--disable', action='store_true', help='Disable context switch monitoring') 159a10d0ce7SMaciej Wawryk p.set_defaults(func=framework_monitor_context_switch) 1601e92d78aSBen Walker 161876fdf2aSShuhei Matsumoto def framework_get_reactors(args): 162876fdf2aSShuhei Matsumoto print_dict(rpc.app.framework_get_reactors(args.client)) 163876fdf2aSShuhei Matsumoto 164876fdf2aSShuhei Matsumoto p = subparsers.add_parser( 165876fdf2aSShuhei Matsumoto 'framework_get_reactors', help='Display list of all reactors') 166876fdf2aSShuhei Matsumoto p.set_defaults(func=framework_get_reactors) 167876fdf2aSShuhei Matsumoto 168a2596f4dSVitaliy Mysak def framework_set_scheduler(args): 169a2596f4dSVitaliy Mysak rpc.app.framework_set_scheduler(args.client, 1706e3346dfSMaciej Szwed name=args.name, 171ca8e6d23SKrzysztof Karas period=args.period, 172ca8e6d23SKrzysztof Karas load_limit=args.load_limit, 173ca8e6d23SKrzysztof Karas core_limit=args.core_limit, 1743a02df0bSJim Harris core_busy=args.core_busy, 1753a02df0bSJim Harris mappings=args.mappings) 176a2596f4dSVitaliy Mysak 177a2596f4dSVitaliy Mysak p = subparsers.add_parser( 1786e3346dfSMaciej Szwed 'framework_set_scheduler', help='Select thread scheduler that will be activated and its period (experimental)') 179a2596f4dSVitaliy Mysak p.add_argument('name', help="Name of a scheduler") 1806e3346dfSMaciej Szwed p.add_argument('-p', '--period', help="Scheduler period in microseconds", type=int) 181dc3e7140SJacek Kalwas p.add_argument('--load-limit', help="Scheduler load limit. Reserved for dynamic scheduler", type=int) 182dc3e7140SJacek Kalwas p.add_argument('--core-limit', help="Scheduler core limit. Reserved for dynamic scheduler", type=int) 183462fd69eSSeungYeon Shin p.add_argument('--core-busy', help="Scheduler core busy limit. Reserved for dynamic scheduler", type=int) 1843a02df0bSJim Harris p.add_argument('--mappings', help="Comma-separated list of thread:core mappings. Reserved for static scheduler") 185a2596f4dSVitaliy Mysak p.set_defaults(func=framework_set_scheduler) 186a2596f4dSVitaliy Mysak 187abf52d7dSKrzysztof Karas def framework_get_scheduler(args): 188abf52d7dSKrzysztof Karas print_dict(rpc.app.framework_get_scheduler(args.client)) 189abf52d7dSKrzysztof Karas 190abf52d7dSKrzysztof Karas p = subparsers.add_parser( 191abf52d7dSKrzysztof Karas 'framework_get_scheduler', help='Display currently set scheduler and its properties.') 192abf52d7dSKrzysztof Karas p.set_defaults(func=framework_get_scheduler) 193abf52d7dSKrzysztof Karas 194dde60dbaSKrishna Kanth Reddy def framework_get_governor(args): 195dde60dbaSKrishna Kanth Reddy print_dict(rpc.app.framework_get_governor(args.client)) 196dde60dbaSKrishna Kanth Reddy 197dde60dbaSKrishna Kanth Reddy p = subparsers.add_parser( 198dde60dbaSKrishna Kanth Reddy 'framework_get_governor', help='Display currently set governor and the available, set CPU frequencies.') 199dde60dbaSKrishna Kanth Reddy p.set_defaults(func=framework_get_governor) 200dde60dbaSKrishna Kanth Reddy 201462fd69eSSeungYeon Shin def scheduler_set_options(args): 202462fd69eSSeungYeon Shin rpc.app.scheduler_set_options(args.client, 203462fd69eSSeungYeon Shin isolated_core_mask=args.isolated_core_mask, 204462fd69eSSeungYeon Shin scheduling_core=args.scheduling_core) 205462fd69eSSeungYeon Shin p = subparsers.add_parser('scheduler_set_options', help='Set scheduler options') 206462fd69eSSeungYeon Shin p.add_argument('-i', '--isolated-core-mask', help="Mask of CPU cores to isolate from scheduling change", type=str) 207462fd69eSSeungYeon Shin p.add_argument('-s', '--scheduling-core', help="Scheduler scheduling core. Idle threads will move to scheduling core." 208462fd69eSSeungYeon Shin "Reserved for dynamic scheduler.", type=int) 209462fd69eSSeungYeon Shin p.set_defaults(func=scheduler_set_options) 210462fd69eSSeungYeon Shin 21134424906SKrzysztof Karas def framework_disable_cpumask_locks(args): 21234424906SKrzysztof Karas rpc.framework_disable_cpumask_locks(args.client) 21334424906SKrzysztof Karas 21434424906SKrzysztof Karas p = subparsers.add_parser('framework_disable_cpumask_locks', 21534424906SKrzysztof Karas help='Disable CPU core lock files.') 21634424906SKrzysztof Karas p.set_defaults(func=framework_disable_cpumask_locks) 21734424906SKrzysztof Karas 21834424906SKrzysztof Karas def framework_enable_cpumask_locks(args): 21934424906SKrzysztof Karas rpc.framework_enable_cpumask_locks(args.client) 22034424906SKrzysztof Karas 22134424906SKrzysztof Karas p = subparsers.add_parser('framework_enable_cpumask_locks', 22234424906SKrzysztof Karas help='Enable CPU core lock files.') 22334424906SKrzysztof Karas p.set_defaults(func=framework_enable_cpumask_locks) 22434424906SKrzysztof Karas 2254dd3f4a7SBen Walker # bdev 2268e052bf4SMaciej Wawryk def bdev_set_options(args): 2278e052bf4SMaciej Wawryk rpc.bdev.bdev_set_options(args.client, 2283090f401SJim Harris bdev_io_pool_size=args.bdev_io_pool_size, 229240b243aSyupeng bdev_io_cache_size=args.bdev_io_cache_size, 2309b21ca0cSKonrad Sztyber bdev_auto_examine=args.bdev_auto_examine, 2319b21ca0cSKonrad Sztyber iobuf_small_cache_size=args.iobuf_small_cache_size, 2329b21ca0cSKonrad Sztyber iobuf_large_cache_size=args.iobuf_large_cache_size) 2333090f401SJim Harris 23447bc5870SJim Harris p = subparsers.add_parser('bdev_set_options', 2358e052bf4SMaciej Wawryk help="""Set options of bdev subsystem""") 2363090f401SJim Harris p.add_argument('-p', '--bdev-io-pool-size', help='Number of bdev_io structures in shared buffer pool', type=int) 2373090f401SJim Harris p.add_argument('-c', '--bdev-io-cache-size', help='Maximum number of bdev_io structures cached per thread', type=int) 238240b243aSyupeng group = p.add_mutually_exclusive_group() 239240b243aSyupeng group.add_argument('-e', '--enable-auto-examine', dest='bdev_auto_examine', help='Allow to auto examine', action='store_true') 240240b243aSyupeng group.add_argument('-d', '--disable-auto-examine', dest='bdev_auto_examine', help='Not allow to auto examine', action='store_false') 2419b21ca0cSKonrad Sztyber p.add_argument('--iobuf-small-cache-size', help='Size of the small iobuf per thread cache', type=int) 2429b21ca0cSKonrad Sztyber p.add_argument('--iobuf-large-cache-size', help='Size of the large iobuf per thread cache', type=int) 243240b243aSyupeng p.set_defaults(bdev_auto_examine=True) 2448e052bf4SMaciej Wawryk p.set_defaults(func=bdev_set_options) 2453090f401SJim Harris 2462d30df9bSyupeng def bdev_examine(args): 2472d30df9bSyupeng rpc.bdev.bdev_examine(args.client, 2482d30df9bSyupeng name=args.name) 2492d30df9bSyupeng 2502d30df9bSyupeng p = subparsers.add_parser('bdev_examine', 2512d30df9bSyupeng help="""examine a bdev if it exists, or will examine it after it is created""") 2522d30df9bSyupeng p.add_argument('-b', '--name', help='Name or alias of the bdev') 2532d30df9bSyupeng p.set_defaults(func=bdev_examine) 2542d30df9bSyupeng 25577b6f4bcSTomasz Zawadzki def bdev_wait_for_examine(args): 25677b6f4bcSTomasz Zawadzki rpc.bdev.bdev_wait_for_examine(args.client) 25777b6f4bcSTomasz Zawadzki 25877b6f4bcSTomasz Zawadzki p = subparsers.add_parser('bdev_wait_for_examine', 25977b6f4bcSTomasz Zawadzki help="""Report when all bdevs have been examined""") 26077b6f4bcSTomasz Zawadzki p.set_defaults(func=bdev_wait_for_examine) 26177b6f4bcSTomasz Zawadzki 2629a91a45cSMaciej Wawryk def bdev_compress_create(args): 2639a91a45cSMaciej Wawryk print_json(rpc.bdev.bdev_compress_create(args.client, 264db541f8eSPaul Luse base_bdev_name=args.base_bdev_name, 26562b3b171Spaul luse pm_path=args.pm_path, 266ddd4603cSYankun Li lb_size=args.lb_size, 267ddd4603cSYankun Li comp_algo=args.comp_algo, 268ddd4603cSYankun Li comp_level=args.comp_level)) 2691d039ebaSPawel Kaminski 2707aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_compress_create', help='Add a compress vbdev') 271ff89983cSYankun Li p.add_argument('-b', '--base-bdev-name', help="Name of the base bdev", required=True) 272ff89983cSYankun Li p.add_argument('-p', '--pm-path', help="Path to persistent memory", required=True) 273642f8b3dSJaroslaw Chachulski p.add_argument('-l', '--lb-size', help="Compressed vol logical block size (optional, if used must be 512 or 4096)", type=int) 274ddd4603cSYankun Li p.add_argument('-c', '--comp-algo', help='Compression algorithm, (deflate, lz4). Default is deflate') 275ddd4603cSYankun Li p.add_argument('-L', '--comp-level', 276ddd4603cSYankun Li help="""Compression algorithm level. 277ddd4603cSYankun Li if algo == deflate, level ranges from 0 to 3. 278ddd4603cSYankun Li if algo == lz4, level ranges from 1 to 65537""", 279ddd4603cSYankun Li default=1, type=int) 2809a91a45cSMaciej Wawryk p.set_defaults(func=bdev_compress_create) 281db541f8eSPaul Luse 2829a91a45cSMaciej Wawryk def bdev_compress_delete(args): 2839a91a45cSMaciej Wawryk rpc.bdev.bdev_compress_delete(args.client, 284db541f8eSPaul Luse name=args.name) 285db541f8eSPaul Luse 2867aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_compress_delete', help='Delete a compress disk') 287db541f8eSPaul Luse p.add_argument('name', help='compress bdev name') 2889a91a45cSMaciej Wawryk p.set_defaults(func=bdev_compress_delete) 289db541f8eSPaul Luse 29068e7da44Spaul luse def bdev_compress_get_orphans(args): 29168e7da44Spaul luse print_dict(rpc.bdev.bdev_compress_get_orphans(args.client, 29268e7da44Spaul luse name=args.name)) 29368e7da44Spaul luse p = subparsers.add_parser( 29468e7da44Spaul luse 'bdev_compress_get_orphans', help='Display list of orphaned compress bdevs.') 295dc3e7140SJacek Kalwas p.add_argument('-b', '--name', help="Name of a comp bdev. Example: COMP_Nvme0n1") 29668e7da44Spaul luse p.set_defaults(func=bdev_compress_get_orphans) 29768e7da44Spaul luse 29840c959cbSMaciej Wawryk def bdev_crypto_create(args): 29940c959cbSMaciej Wawryk print_json(rpc.bdev.bdev_crypto_create(args.client, 30051606ed4SPaul Luse base_bdev_name=args.base_bdev_name, 301cafd537cSpaul luse name=args.name, 30251606ed4SPaul Luse crypto_pmd=args.crypto_pmd, 303f070b78cSpaul luse key=args.key, 304f070b78cSpaul luse cipher=args.cipher, 30513f97e67SAlexey Marchuk key2=args.key2, 30613f97e67SAlexey Marchuk key_name=args.key_name)) 3077aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_crypto_create', help='Add a crypto vbdev') 30844626532SKarol Latecki p.add_argument('base_bdev_name', help="Name of the base bdev") 30944626532SKarol Latecki p.add_argument('name', help="Name of the crypto vbdev") 310dc3e7140SJacek Kalwas p.add_argument('-p', '--crypto-pmd', help="Name of the crypto device driver. Obsolete, see dpdk_cryptodev_set_driver") 311dc3e7140SJacek Kalwas p.add_argument('-k', '--key', help="Key. Obsolete, see accel_crypto_key_create") 312dc3e7140SJacek Kalwas p.add_argument('-c', '--cipher', help="cipher to use. Obsolete, see accel_crypto_key_create") 31313f97e67SAlexey Marchuk p.add_argument('-k2', '--key2', help="2nd key for cipher AES_XTS. Obsolete, see accel_crypto_key_create", default=None) 314dc3e7140SJacek Kalwas p.add_argument('-n', '--key-name', help="Key name to use, see accel_crypto_key_create") 31540c959cbSMaciej Wawryk p.set_defaults(func=bdev_crypto_create) 31651606ed4SPaul Luse 31740c959cbSMaciej Wawryk def bdev_crypto_delete(args): 31840c959cbSMaciej Wawryk rpc.bdev.bdev_crypto_delete(args.client, 31951606ed4SPaul Luse name=args.name) 32051606ed4SPaul Luse 3217aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_crypto_delete', help='Delete a crypto disk') 32251606ed4SPaul Luse p.add_argument('name', help='crypto bdev name') 32340c959cbSMaciej Wawryk p.set_defaults(func=bdev_crypto_delete) 32451606ed4SPaul Luse 325557f8ff9SPawel Kaminski def bdev_ocf_create(args): 326557f8ff9SPawel Kaminski print_json(rpc.bdev.bdev_ocf_create(args.client, 32735366140SVitaliy Mysak name=args.name, 32835366140SVitaliy Mysak mode=args.mode, 3294d91b4efSrafalste cache_line_size=args.cache_line_size, 33035366140SVitaliy Mysak cache_bdev_name=args.cache_bdev_name, 33135366140SVitaliy Mysak core_bdev_name=args.core_bdev_name)) 3327aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_ocf_create', help='Add an OCF block device') 33335366140SVitaliy Mysak p.add_argument('name', help='Name of resulting OCF bdev') 33420894340SMarcin Dziegielewski p.add_argument('mode', help='OCF cache mode', choices=['wb', 'wt', 'pt', 'wa', 'wi', 'wo']) 3354d91b4efSrafalste p.add_argument( 3364d91b4efSrafalste '--cache-line-size', 3374d91b4efSrafalste help='OCF cache line size. The unit is KiB', 3384d91b4efSrafalste type=int, 339dc3e7140SJacek Kalwas choices=[4, 8, 16, 32, 64] 3404d91b4efSrafalste ) 34135366140SVitaliy Mysak p.add_argument('cache_bdev_name', help='Name of underlying cache bdev') 3421ff3715dSJosh Soref p.add_argument('core_bdev_name', help='Name of underlying core bdev') 343557f8ff9SPawel Kaminski p.set_defaults(func=bdev_ocf_create) 34435366140SVitaliy Mysak 345557f8ff9SPawel Kaminski def bdev_ocf_delete(args): 346557f8ff9SPawel Kaminski rpc.bdev.bdev_ocf_delete(args.client, 34735366140SVitaliy Mysak name=args.name) 34835366140SVitaliy Mysak 3497aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_ocf_delete', help='Delete an OCF block device') 35035366140SVitaliy Mysak p.add_argument('name', help='Name of OCF bdev') 351557f8ff9SPawel Kaminski p.set_defaults(func=bdev_ocf_delete) 35235366140SVitaliy Mysak 35395482c54SPawel Kaminski def bdev_ocf_get_stats(args): 35495482c54SPawel Kaminski print_dict(rpc.bdev.bdev_ocf_get_stats(args.client, 35527e0190bSVitaliy Mysak name=args.name)) 3567aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_ocf_get_stats', help='Get statistics of chosen OCF block device') 35727e0190bSVitaliy Mysak p.add_argument('name', help='Name of OCF bdev') 35895482c54SPawel Kaminski p.set_defaults(func=bdev_ocf_get_stats) 35927e0190bSVitaliy Mysak 3606b79f767SAmir Haroush def bdev_ocf_reset_stats(args): 3616b79f767SAmir Haroush print_dict(rpc.bdev.bdev_ocf_reset_stats(args.client, 3626b79f767SAmir Haroush name=args.name)) 3636b79f767SAmir Haroush p = subparsers.add_parser('bdev_ocf_reset_stats', help='Reset statistics of chosen OCF block device') 3646b79f767SAmir Haroush p.add_argument('name', help='Name of OCF bdev') 3656b79f767SAmir Haroush p.set_defaults(func=bdev_ocf_reset_stats) 3666b79f767SAmir Haroush 36795482c54SPawel Kaminski def bdev_ocf_get_bdevs(args): 36895482c54SPawel Kaminski print_dict(rpc.bdev.bdev_ocf_get_bdevs(args.client, 369bef0c6edSVitaliy Mysak name=args.name)) 3707aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_ocf_get_bdevs', help='Get list of OCF devices including unregistered ones') 371642f8b3dSJaroslaw Chachulski p.add_argument('name', nargs='?', help='name of OCF vbdev or name of cache device or name of core device (optional)') 37295482c54SPawel Kaminski p.set_defaults(func=bdev_ocf_get_bdevs) 373199080cfSVitaliy Mysak 3745bdaec63SRafal Stefanowski def bdev_ocf_set_cache_mode(args): 3755bdaec63SRafal Stefanowski print_json(rpc.bdev.bdev_ocf_set_cache_mode(args.client, 3765bdaec63SRafal Stefanowski name=args.name, 3775bdaec63SRafal Stefanowski mode=args.mode)) 3785bdaec63SRafal Stefanowski p = subparsers.add_parser('bdev_ocf_set_cache_mode', 3795bdaec63SRafal Stefanowski help='Set cache mode of OCF block device') 3805bdaec63SRafal Stefanowski p.add_argument('name', help='Name of OCF bdev') 3815bdaec63SRafal Stefanowski p.add_argument('mode', help='OCF cache mode', choices=['wb', 'wt', 'pt', 'wa', 'wi', 'wo']) 3825bdaec63SRafal Stefanowski p.set_defaults(func=bdev_ocf_set_cache_mode) 3835bdaec63SRafal Stefanowski 384494b1ba8SRafal Stefanowski def bdev_ocf_set_seqcutoff(args): 385494b1ba8SRafal Stefanowski rpc.bdev.bdev_ocf_set_seqcutoff(args.client, 386494b1ba8SRafal Stefanowski name=args.name, 387494b1ba8SRafal Stefanowski policy=args.policy, 388494b1ba8SRafal Stefanowski threshold=args.threshold, 389494b1ba8SRafal Stefanowski promotion_count=args.promotion_count) 390494b1ba8SRafal Stefanowski p = subparsers.add_parser('bdev_ocf_set_seqcutoff', 391494b1ba8SRafal Stefanowski help='Set sequential cutoff parameters on all cores for the given OCF cache device') 392494b1ba8SRafal Stefanowski p.add_argument('name', help='Name of OCF cache bdev') 393494b1ba8SRafal Stefanowski p.add_argument('-t', '--threshold', type=int, 394494b1ba8SRafal Stefanowski help='Activation threshold [KiB]') 395494b1ba8SRafal Stefanowski p.add_argument('-c', '--promotion-count', type=int, 396494b1ba8SRafal Stefanowski help='Promotion request count') 397494b1ba8SRafal Stefanowski p.add_argument('-p', '--policy', choices=['always', 'full', 'never'], required=True, 398494b1ba8SRafal Stefanowski help='Sequential cutoff policy') 399494b1ba8SRafal Stefanowski p.set_defaults(func=bdev_ocf_set_seqcutoff) 400494b1ba8SRafal Stefanowski 4018000cedbSRafal Stefanowski def bdev_ocf_flush_start(args): 4028000cedbSRafal Stefanowski rpc.bdev.bdev_ocf_flush_start(args.client, name=args.name) 4038000cedbSRafal Stefanowski p = subparsers.add_parser('bdev_ocf_flush_start', 4048000cedbSRafal Stefanowski help='Start flushing OCF cache device') 4058000cedbSRafal Stefanowski p.add_argument('name', help='Name of OCF bdev') 4068000cedbSRafal Stefanowski p.set_defaults(func=bdev_ocf_flush_start) 4078000cedbSRafal Stefanowski 4088000cedbSRafal Stefanowski def bdev_ocf_flush_status(args): 4098000cedbSRafal Stefanowski print_json(rpc.bdev.bdev_ocf_flush_status(args.client, name=args.name)) 4108000cedbSRafal Stefanowski p = subparsers.add_parser('bdev_ocf_flush_status', 4118000cedbSRafal Stefanowski help='Get flush status of OCF cache device') 4128000cedbSRafal Stefanowski p.add_argument('name', help='Name of OCF bdev') 4138000cedbSRafal Stefanowski p.set_defaults(func=bdev_ocf_flush_status) 4148000cedbSRafal Stefanowski 4157964f1dfSPawel Kaminski def bdev_malloc_create(args): 4161ea97654SDaniel Verkamp num_blocks = (args.total_size * 1024 * 1024) // args.block_size 4177964f1dfSPawel Kaminski print_json(rpc.bdev.bdev_malloc_create(args.client, 41822637292SPawel Wodkowski num_blocks=int(num_blocks), 4191ea97654SDaniel Verkamp block_size=args.block_size, 4201eb06bd6SPanfil, Wojciech physical_block_size=args.physical_block_size, 4211ea97654SDaniel Verkamp name=args.name, 4225e1e850bSAlexey Marchuk uuid=args.uuid, 423aef00d44SShuhei Matsumoto optimal_io_boundary=args.optimal_io_boundary, 424aef00d44SShuhei Matsumoto md_size=args.md_size, 42500bff560SShuhei Matsumoto md_interleave=args.md_interleave, 42600bff560SShuhei Matsumoto dif_type=args.dif_type, 427c016e6ffSShuhei Matsumoto dif_is_head_of_md=args.dif_is_head_of_md, 428c016e6ffSShuhei Matsumoto dif_pi_format=args.dif_pi_format)) 429c77f17a5Swanghailiangx p = subparsers.add_parser('bdev_malloc_create', help='Create a bdev with malloc backend') 4304dd3f4a7SBen Walker p.add_argument('-b', '--name', help="Name of the bdev") 431b2b3fa9eSMateusz Kozlowski p.add_argument('-u', '--uuid', help="UUID of the bdev (optional)") 4324dd3f4a7SBen Walker p.add_argument( 43322637292SPawel Wodkowski 'total_size', help='Size of malloc bdev in MB (float > 0)', type=float) 434aef00d44SShuhei Matsumoto p.add_argument('block_size', help='Data block size for this bdev', type=int) 4351eb06bd6SPanfil, Wojciech p.add_argument('-p', '--physical-block-size', help='Physical block size for this bdev.', type=int) 4365e1e850bSAlexey Marchuk p.add_argument('-o', '--optimal-io-boundary', help="""Split on optimal IO boundary, in number of 4375e1e850bSAlexey Marchuk blocks, default 0 (disabled)""", type=int) 438aef00d44SShuhei Matsumoto p.add_argument('-m', '--md-size', type=int, 439aef00d44SShuhei Matsumoto help='Metadata size for this bdev (0, 8, 16, 32, 64, or 128). Default is 0.') 440aef00d44SShuhei Matsumoto p.add_argument('-i', '--md-interleave', action='store_true', 441aef00d44SShuhei Matsumoto help='Metadata location, interleaved if set, and separated if omitted.') 44200bff560SShuhei Matsumoto p.add_argument('-t', '--dif-type', type=int, choices=[0, 1, 2, 3], 44300bff560SShuhei Matsumoto help='Protection information type. Parameter --md-size needs' 44400bff560SShuhei Matsumoto 'to be set along --dif-type. Default=0 - no protection.') 44500bff560SShuhei Matsumoto p.add_argument('-d', '--dif-is-head-of-md', action='store_true', 44600bff560SShuhei Matsumoto help='Protection information is in the first 8 bytes of metadata. Default=false.') 447c016e6ffSShuhei Matsumoto p.add_argument('-f', '--dif-pi-format', type=int, choices=[0, 1, 2], 448c016e6ffSShuhei Matsumoto help='Protection infromation format. Parameter --dif-type needs to be set together.' 449c016e6ffSShuhei Matsumoto '0=16b Guard PI, 1=32b Guard PI, 2=64b Guard PI. Default=0.') 4507964f1dfSPawel Kaminski p.set_defaults(func=bdev_malloc_create) 451df897ed4SDaniel Verkamp 45206a1b419SPawel Kaminski def bdev_malloc_delete(args): 45306a1b419SPawel Kaminski rpc.bdev.bdev_malloc_delete(args.client, 45459dee78bSTomasz Zawadzki name=args.name) 45559dee78bSTomasz Zawadzki 456c77f17a5Swanghailiangx p = subparsers.add_parser('bdev_malloc_delete', help='Delete a malloc disk') 45759dee78bSTomasz Zawadzki p.add_argument('name', help='malloc bdev name') 45806a1b419SPawel Kaminski p.set_defaults(func=bdev_malloc_delete) 45959dee78bSTomasz Zawadzki 46060563dfeSPawel Kaminski def bdev_null_create(args): 4611ea97654SDaniel Verkamp num_blocks = (args.total_size * 1024 * 1024) // args.block_size 4627ff4e2afSKarol Latecki if args.dif_type and not args.md_size: 4637ff4e2afSKarol Latecki print("ERROR: --md-size must be > 0 when --dif-type is > 0") 4647ff4e2afSKarol Latecki exit(1) 46560563dfeSPawel Kaminski print_json(rpc.bdev.bdev_null_create(args.client, 4661ea97654SDaniel Verkamp num_blocks=num_blocks, 4671ea97654SDaniel Verkamp block_size=args.block_size, 4687f50da15SPanfil, Wojciech physical_block_size=args.physical_block_size, 4691ea97654SDaniel Verkamp name=args.name, 4708031dfe2SEvgeniy Kochetov uuid=args.uuid, 47120aeec56SEvgeniy Kochetov md_size=args.md_size, 47220aeec56SEvgeniy Kochetov dif_type=args.dif_type, 4731521bf3bSShuhei Matsumoto dif_is_head_of_md=args.dif_is_head_of_md, 4741521bf3bSShuhei Matsumoto dif_pi_format=args.dif_pi_format)) 4756f01da76SDaniel Verkamp 476c77f17a5Swanghailiangx p = subparsers.add_parser('bdev_null_create', help='Add a bdev with null backend') 4774dd3f4a7SBen Walker p.add_argument('name', help='Block device name') 478b2b3fa9eSMateusz Kozlowski p.add_argument('-u', '--uuid', help='UUID of the bdev (optional)') 4797ff4e2afSKarol Latecki p.add_argument('total_size', help='Size of null bdev in MB (int > 0). Includes only data blocks.', type=int) 480a9837c70SChangpeng Liu p.add_argument('block_size', help='Data block size for this bdev.', type=int) 4817f50da15SPanfil, Wojciech p.add_argument('-p', '--physical-block-size', help='Physical block size for this bdev.', type=int) 4828031dfe2SEvgeniy Kochetov p.add_argument('-m', '--md-size', type=int, 4837ff4e2afSKarol Latecki help='Metadata size for this bdev. Default=0.') 484642f8b3dSJaroslaw Chachulski p.add_argument('-t', '--dif-type', type=int, choices=[0, 1, 2, 3], 4857ff4e2afSKarol Latecki help='Protection information type. Parameter --md-size needs' 4867ff4e2afSKarol Latecki 'to be set along --dif-type. Default=0 - no protection.') 48720aeec56SEvgeniy Kochetov p.add_argument('-d', '--dif-is-head-of-md', action='store_true', 4887ff4e2afSKarol Latecki help='Protection information is in the first 8 bytes of metadata. Default=false.') 4891521bf3bSShuhei Matsumoto p.add_argument('-f', '--dif-pi-format', type=int, choices=[0, 1, 2], 4901521bf3bSShuhei Matsumoto help='Protection infromation format. Parameter --dif-type needs to be set together.' 4911521bf3bSShuhei Matsumoto '0=16b Guard PI, 1=32b Guard PI, 2=64b Guard PI. Default=0.') 49260563dfeSPawel Kaminski p.set_defaults(func=bdev_null_create) 493df897ed4SDaniel Verkamp 49460563dfeSPawel Kaminski def bdev_null_delete(args): 49560563dfeSPawel Kaminski rpc.bdev.bdev_null_delete(args.client, 4962ce9836bSMaciej Szwed name=args.name) 4972ce9836bSMaciej Szwed 498c77f17a5Swanghailiangx p = subparsers.add_parser('bdev_null_delete', help='Delete a null bdev') 4992ce9836bSMaciej Szwed p.add_argument('name', help='null bdev name') 50060563dfeSPawel Kaminski p.set_defaults(func=bdev_null_delete) 5012ce9836bSMaciej Szwed 502d0657f32SJin Yu def bdev_null_resize(args): 503d0657f32SJin Yu print_json(rpc.bdev.bdev_null_resize(args.client, 504d0657f32SJin Yu name=args.name, 505d0657f32SJin Yu new_size=int(args.new_size))) 506d0657f32SJin Yu 507d0657f32SJin Yu p = subparsers.add_parser('bdev_null_resize', 508d0657f32SJin Yu help='Resize a null bdev') 509d0657f32SJin Yu p.add_argument('name', help='null bdev name') 510d0657f32SJin Yu p.add_argument('new_size', help='new bdev size for resize operation. The unit is MiB') 511d0657f32SJin Yu p.set_defaults(func=bdev_null_resize) 512d0657f32SJin Yu 513acaa079bSMaciej Wawryk def bdev_aio_create(args): 514acaa079bSMaciej Wawryk print_json(rpc.bdev.bdev_aio_create(args.client, 5151ea97654SDaniel Verkamp filename=args.filename, 5161ea97654SDaniel Verkamp name=args.name, 5174c6a2e3dSYuhua block_size=args.block_size, 518648a5414Szhenwei pi readonly=args.readonly, 519e5693d68SMateusz Kozlowski fallocate=args.fallocate, 520e5693d68SMateusz Kozlowski uuid=args.uuid)) 5216f01da76SDaniel Verkamp 5227aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_aio_create', help='Add a bdev with aio backend') 5234dd3f4a7SBen Walker p.add_argument('filename', help='Path to device or file (ex: /dev/sda)') 5244dd3f4a7SBen Walker p.add_argument('name', help='Block device name') 525642f8b3dSJaroslaw Chachulski p.add_argument('block_size', help='Block size for this bdev', type=int, nargs='?') 5264c6a2e3dSYuhua p.add_argument("-r", "--readonly", action='store_true', help='Set this bdev as read-only') 52771eba7ffSzhenwei pi p.add_argument("--fallocate", action='store_true', help='Support unmap/writezeros by fallocate') 528e5693d68SMateusz Kozlowski p.add_argument('-u', '--uuid', help="UUID of the bdev (optional)") 529acaa079bSMaciej Wawryk p.set_defaults(func=bdev_aio_create) 530df897ed4SDaniel Verkamp 531b635d19aSshuochen0311 def bdev_aio_rescan(args): 532b635d19aSshuochen0311 print_json(rpc.bdev.bdev_aio_rescan(args.client, 533b635d19aSshuochen0311 name=args.name)) 534b635d19aSshuochen0311 535b635d19aSshuochen0311 p = subparsers.add_parser('bdev_aio_rescan', help='Rescan a bdev size with aio backend') 536b635d19aSshuochen0311 p.add_argument('name', help='Block device name') 537b635d19aSshuochen0311 p.set_defaults(func=bdev_aio_rescan) 538b635d19aSshuochen0311 539acaa079bSMaciej Wawryk def bdev_aio_delete(args): 540acaa079bSMaciej Wawryk rpc.bdev.bdev_aio_delete(args.client, 54196e93bd8STomasz Zawadzki name=args.name) 54296e93bd8STomasz Zawadzki 5437aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_aio_delete', help='Delete an aio disk') 54496e93bd8STomasz Zawadzki p.add_argument('name', help='aio bdev name') 545acaa079bSMaciej Wawryk p.set_defaults(func=bdev_aio_delete) 54696e93bd8STomasz Zawadzki 547c8b6a884SJohn Kariuki def bdev_uring_create(args): 548c8b6a884SJohn Kariuki print_json(rpc.bdev.bdev_uring_create(args.client, 549c8b6a884SJohn Kariuki filename=args.filename, 550ec2ba7aaSYao Liu name=args.name, 551a420536aSYoav Cohen block_size=args.block_size, 552a420536aSYoav Cohen uuid=args.uuid)) 553c8b6a884SJohn Kariuki 554c8b6a884SJohn Kariuki p = subparsers.add_parser('bdev_uring_create', help='Create a bdev with io_uring backend') 555c8b6a884SJohn Kariuki p.add_argument('filename', help='Path to device or file (ex: /dev/nvme0n1)') 556ff93f0f9SYao Liu p.add_argument('name', help='bdev name') 557642f8b3dSJaroslaw Chachulski p.add_argument('block_size', help='Block size for this bdev', type=int, nargs='?') 558a420536aSYoav Cohen p.add_argument('-u', '--uuid', help="UUID of the bdev") 559c8b6a884SJohn Kariuki p.set_defaults(func=bdev_uring_create) 560c8b6a884SJohn Kariuki 561d62e9b74Sliucheng def bdev_uring_rescan(args): 562d62e9b74Sliucheng print_json(rpc.bdev.bdev_uring_rescan(args.client, 563d62e9b74Sliucheng name=args.name)) 564d62e9b74Sliucheng 565d62e9b74Sliucheng p = subparsers.add_parser('bdev_uring_rescan', help='Rescan a bdev size with uring backend') 566d62e9b74Sliucheng p.add_argument('name', help='Block device name') 567d62e9b74Sliucheng p.set_defaults(func=bdev_uring_rescan) 568d62e9b74Sliucheng 569c8b6a884SJohn Kariuki def bdev_uring_delete(args): 570c8b6a884SJohn Kariuki rpc.bdev.bdev_uring_delete(args.client, 571c8b6a884SJohn Kariuki name=args.name) 572c8b6a884SJohn Kariuki 573c8b6a884SJohn Kariuki p = subparsers.add_parser('bdev_uring_delete', help='Delete a uring bdev') 574c8b6a884SJohn Kariuki p.add_argument('name', help='uring bdev name') 575c8b6a884SJohn Kariuki p.set_defaults(func=bdev_uring_delete) 576c8b6a884SJohn Kariuki 5776f338d4bSKrishna Kanth Reddy def bdev_xnvme_create(args): 5786f338d4bSKrishna Kanth Reddy print_json(rpc.bdev.bdev_xnvme_create(args.client, 5796f338d4bSKrishna Kanth Reddy filename=args.filename, 5806f338d4bSKrishna Kanth Reddy name=args.name, 581637d0d0bSMichal Berger io_mechanism=args.io_mechanism, 582637d0d0bSMichal Berger conserve_cpu=args.conserve_cpu)) 5836f338d4bSKrishna Kanth Reddy 5846f338d4bSKrishna Kanth Reddy p = subparsers.add_parser('bdev_xnvme_create', help='Create a bdev with xNVMe backend') 5856f338d4bSKrishna Kanth Reddy p.add_argument('filename', help='Path to device or file (ex: /dev/nvme0n1)') 5866f338d4bSKrishna Kanth Reddy p.add_argument('name', help='name of xNVMe bdev to create') 5876f338d4bSKrishna Kanth Reddy p.add_argument('io_mechanism', help='IO mechanism to use (ex: libaio, io_uring, io_uring_cmd, etc.)') 588637d0d0bSMichal Berger p.add_argument('-c', '--conserve-cpu', action='store_true', help='Whether or not to conserve CPU when polling') 5896f338d4bSKrishna Kanth Reddy p.set_defaults(func=bdev_xnvme_create) 5906f338d4bSKrishna Kanth Reddy 5916f338d4bSKrishna Kanth Reddy def bdev_xnvme_delete(args): 5926f338d4bSKrishna Kanth Reddy rpc.bdev.bdev_xnvme_delete(args.client, 5936f338d4bSKrishna Kanth Reddy name=args.name) 5946f338d4bSKrishna Kanth Reddy 5956f338d4bSKrishna Kanth Reddy p = subparsers.add_parser('bdev_xnvme_delete', help='Delete a xNVMe bdev') 5966f338d4bSKrishna Kanth Reddy p.add_argument('name', help='xNVMe bdev name') 5976f338d4bSKrishna Kanth Reddy p.set_defaults(func=bdev_xnvme_delete) 5986f338d4bSKrishna Kanth Reddy 59910d8b7c3SPawel Kaminski def bdev_nvme_set_options(args): 60010d8b7c3SPawel Kaminski rpc.bdev.bdev_nvme_set_options(args.client, 6014bef621eSPawel Wodkowski action_on_timeout=args.action_on_timeout, 602e7878c7cSPawel Niedzwiecki timeout_us=args.timeout_us, 60367fbfdd8SMatt Dumm timeout_admin_us=args.timeout_admin_us, 60446a34859SJin Yu keep_alive_timeout_ms=args.keep_alive_timeout_ms, 6057f6fdcffSChangpeng Liu arbitration_burst=args.arbitration_burst, 6067f6fdcffSChangpeng Liu low_priority_weight=args.low_priority_weight, 6077f6fdcffSChangpeng Liu medium_priority_weight=args.medium_priority_weight, 6087f6fdcffSChangpeng Liu high_priority_weight=args.high_priority_weight, 609a741e341SBen Walker nvme_adminq_poll_period_us=args.nvme_adminq_poll_period_us, 61090520634SChangpeng Liu nvme_ioq_poll_period_us=args.nvme_ioq_poll_period_us, 611542be879SEvgeniy Kochetov io_queue_requests=args.io_queue_requests, 6124495bda4SShuhei Matsumoto delay_cmd_submit=args.delay_cmd_submit, 61343adb646SShuhei Matsumoto transport_retry_count=args.transport_retry_count, 6142ccaf2acSAlexey Marchuk bdev_retry_count=args.bdev_retry_count, 6150fba8dc8SShuhei Matsumoto transport_ack_timeout=args.transport_ack_timeout, 6160fba8dc8SShuhei Matsumoto ctrlr_loss_timeout_sec=args.ctrlr_loss_timeout_sec, 6170fba8dc8SShuhei Matsumoto reconnect_delay_sec=args.reconnect_delay_sec, 61800d46b80SShuhei Matsumoto fast_io_fail_timeout_sec=args.fast_io_fail_timeout_sec, 619b5bdbbb9SKrzysztof Karas disable_auto_failback=args.disable_auto_failback, 620990cd38aSMichael Haeuptle generate_uuids=args.generate_uuids, 621e33ae4a6SShuhei Matsumoto transport_tos=args.transport_tos, 622a3ae6eaaSShuhei Matsumoto nvme_error_stat=args.nvme_error_stat, 623f61b0041SRichael Zhuang rdma_srq_size=args.rdma_srq_size, 6246ecf0442SKonrad Sztyber io_path_stat=args.io_path_stat, 6254790c4efSShuhei Matsumoto allow_accel_sequence=args.allow_accel_sequence, 6260568555aSEvgeniy Kochetov rdma_max_cq_size=args.rdma_max_cq_size, 62775883719SKonrad Sztyber rdma_cm_event_timeout_ms=args.rdma_cm_event_timeout_ms, 62875883719SKonrad Sztyber dhchap_digests=args.dhchap_digests, 629*cec5ba28SAlexey Marchuk dhchap_dhgroups=args.dhchap_dhgroups, 630*cec5ba28SAlexey Marchuk rdma_umr_per_io=args.rdma_umr_per_io) 6314bef621eSPawel Wodkowski 6327aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_nvme_set_options', 6334bef621eSPawel Wodkowski help='Set options for the bdev nvme type. This is startup command.') 6344bef621eSPawel Wodkowski p.add_argument('-a', '--action-on-timeout', 6351ff3715dSJosh Soref help="Action to take on command time out. Valid values are: none, reset, abort") 6364bef621eSPawel Wodkowski p.add_argument('-t', '--timeout-us', 6374bef621eSPawel Wodkowski help="Timeout for each command, in microseconds. If 0, don't track timeouts.", type=int) 63867fbfdd8SMatt Dumm p.add_argument('--timeout-admin-us', 63967fbfdd8SMatt Dumm help="Timeout for each admin command, in microseconds. If 0, treat same as io timeouts.", type=int) 64046a34859SJin Yu p.add_argument('-k', '--keep-alive-timeout-ms', 64146a34859SJin Yu help="Keep alive timeout period in millisecond. If 0, disable keep-alive.", type=int) 6427f6fdcffSChangpeng Liu p.add_argument('--arbitration-burst', 6437f6fdcffSChangpeng Liu help='the value is expressed as a power of two', type=int) 6447f6fdcffSChangpeng Liu p.add_argument('--low-priority-weight', 6457f6fdcffSChangpeng Liu help='the maximum number of commands that the controller may launch at one time from a low priority queue', type=int) 6467f6fdcffSChangpeng Liu p.add_argument('--medium-priority-weight', 6477f6fdcffSChangpeng Liu help='the maximum number of commands that the controller may launch at one time from a medium priority queue', type=int) 6487f6fdcffSChangpeng Liu p.add_argument('--high-priority-weight', 6497f6fdcffSChangpeng Liu help='the maximum number of commands that the controller may launch at one time from a high priority queue', type=int) 6504bef621eSPawel Wodkowski p.add_argument('-p', '--nvme-adminq-poll-period-us', 6514bef621eSPawel Wodkowski help='How often the admin queue is polled for asynchronous events', type=int) 652a741e341SBen Walker p.add_argument('-i', '--nvme-ioq-poll-period-us', 653a741e341SBen Walker help='How often to poll I/O queues for completions', type=int) 65490520634SChangpeng Liu p.add_argument('-s', '--io-queue-requests', 65590520634SChangpeng Liu help='The number of requests allocated for each NVMe I/O queue. Default: 512', type=int) 656542be879SEvgeniy Kochetov p.add_argument('-d', '--disable-delay-cmd-submit', 657542be879SEvgeniy Kochetov help='Disable delaying NVMe command submission, i.e. no batching of multiple commands', 658642f8b3dSJaroslaw Chachulski action='store_false', dest='delay_cmd_submit') 6594495bda4SShuhei Matsumoto p.add_argument('-c', '--transport-retry-count', 6604495bda4SShuhei Matsumoto help='the number of attempts per I/O in the transport layer when an I/O fails.', type=int) 66143adb646SShuhei Matsumoto p.add_argument('-r', '--bdev-retry-count', 66243adb646SShuhei Matsumoto help='the number of attempts per I/O in the bdev layer when an I/O fails. -1 means infinite retries.', type=int) 6632ccaf2acSAlexey Marchuk p.add_argument('-e', '--transport-ack-timeout', 66431db7b13Szhangduan help="""Time to wait ack until packet retransmission for RDMA or until closes connection for TCP. 6652ccaf2acSAlexey Marchuk Range 0-31 where 0 is driver-specific default value.""", type=int) 6660fba8dc8SShuhei Matsumoto p.add_argument('-l', '--ctrlr-loss-timeout-sec', 6670fba8dc8SShuhei Matsumoto help="""Time to wait until ctrlr is reconnected before deleting ctrlr. 6680fba8dc8SShuhei Matsumoto -1 means infinite reconnect retries. 0 means no reconnect retry. 6690fba8dc8SShuhei Matsumoto If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero. 6700fba8dc8SShuhei Matsumoto If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than 6710fba8dc8SShuhei Matsumoto reconnect_delay_sec. 6720fba8dc8SShuhei Matsumoto This can be overridden by bdev_nvme_attach_controller.""", 6730fba8dc8SShuhei Matsumoto type=int) 6740fba8dc8SShuhei Matsumoto p.add_argument('-o', '--reconnect-delay-sec', 6750fba8dc8SShuhei Matsumoto help="""Time to delay a reconnect retry. 6760fba8dc8SShuhei Matsumoto If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero. 6770fba8dc8SShuhei Matsumoto If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero. 6780fba8dc8SShuhei Matsumoto If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_delay_sec has to be non-zero and 6790fba8dc8SShuhei Matsumoto less than ctrlr_loss_timeout_sec. 6800fba8dc8SShuhei Matsumoto This can be overridden by bdev_nvme_attach_controller.""", 6810fba8dc8SShuhei Matsumoto type=int) 6820fba8dc8SShuhei Matsumoto p.add_argument('-u', '--fast-io-fail-timeout-sec', 6830fba8dc8SShuhei Matsumoto help="""Time to wait until ctrlr is reconnected before failing I/O to ctrlr. 6840fba8dc8SShuhei Matsumoto 0 means no such timeout. 6850fba8dc8SShuhei Matsumoto If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and 6860fba8dc8SShuhei Matsumoto less than ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1. 6870fba8dc8SShuhei Matsumoto This can be overridden by bdev_nvme_attach_controller.""", 6880fba8dc8SShuhei Matsumoto type=int) 68900d46b80SShuhei Matsumoto p.add_argument('-f', '--disable-auto-failback', 69000d46b80SShuhei Matsumoto help="""Disable automatic failback. bdev_nvme_set_preferred_path can be used to do manual failback. 69100d46b80SShuhei Matsumoto By default, immediately failback to the preferred I/O path if it restored.""", 69200d46b80SShuhei Matsumoto action='store_true') 693b5bdbbb9SKrzysztof Karas p.add_argument('--generate-uuids', 694b5bdbbb9SKrzysztof Karas help="""Enable generation of unique identifiers for NVMe bdevs only if they do 695b5bdbbb9SKrzysztof Karas not provide UUID themselves. These strings are based on device serial number and 696b5bdbbb9SKrzysztof Karas namespace ID and will always be the same for that device.""", action='store_true') 697990cd38aSMichael Haeuptle p.add_argument('--transport-tos', 698990cd38aSMichael Haeuptle help="""IPv4 Type of Service value. Only applicable for RDMA transports. 699990cd38aSMichael Haeuptle The default is 0 which means no TOS is applied.""", type=int) 700e33ae4a6SShuhei Matsumoto p.add_argument('-m', '--nvme-error-stat', help="Enable collecting NVMe error counts.", action='store_true') 701a3ae6eaaSShuhei Matsumoto p.add_argument('-q', '--rdma-srq-size', 702a3ae6eaaSShuhei Matsumoto help='Set the size of a shared rdma receive queue. Default: 0 (disabled)', type=int) 703f61b0041SRichael Zhuang p.add_argument('--io-path-stat', 704f61b0041SRichael Zhuang help="""Enable collecting I/O path stat of each io path.""", 705f61b0041SRichael Zhuang action='store_true') 7066ecf0442SKonrad Sztyber p.add_argument('--allow-accel-sequence', 7076ecf0442SKonrad Sztyber help='''Allow NVMe bdevs to advertise support for accel sequences if the 7086ecf0442SKonrad Sztyber controller also supports them.''', action='store_true') 7094790c4efSShuhei Matsumoto p.add_argument('--rdma-max-cq-size', 7104790c4efSShuhei Matsumoto help='The maximum size of a rdma completion queue. Default: 0 (unlimited)', type=int) 7110568555aSEvgeniy Kochetov p.add_argument('--rdma-cm-event-timeout-ms', 7120568555aSEvgeniy Kochetov help='Time to wait for RDMA CM event. Only applicable for RDMA transports.', type=int) 71375883719SKonrad Sztyber p.add_argument('--dhchap-digests', help='Comma-separated list of allowed DH-HMAC-CHAP digests', 71475883719SKonrad Sztyber type=lambda d: d.split(',')) 71575883719SKonrad Sztyber p.add_argument('--dhchap-dhgroups', help='Comma-separated list of allowed DH-HMAC-CHAP DH groups', 71675883719SKonrad Sztyber type=lambda d: d.split(',')) 717*cec5ba28SAlexey Marchuk p.add_argument('--enable-rdma-umr-per-io', 718*cec5ba28SAlexey Marchuk help='''Enable scatter-gather RDMA Memory Region per IO if supported by the system.''', 719*cec5ba28SAlexey Marchuk action='store_true', dest='rdma_umr_per_io') 720*cec5ba28SAlexey Marchuk p.add_argument('--disable-rdma-umr-per-io', 721*cec5ba28SAlexey Marchuk help='''Disable scatter-gather RDMA Memory Region per IO.''', 722*cec5ba28SAlexey Marchuk action='store_false', dest='rdma_umr_per_io') 72343adb646SShuhei Matsumoto 72410d8b7c3SPawel Kaminski p.set_defaults(func=bdev_nvme_set_options) 7254bef621eSPawel Wodkowski 72661a42c0eSPawel Kaminski def bdev_nvme_set_hotplug(args): 72761a42c0eSPawel Kaminski rpc.bdev.bdev_nvme_set_hotplug(args.client, enable=args.enable, period_us=args.period_us) 7285f9bdac0SPawel Wodkowski 7297aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_nvme_set_hotplug', help='Set hotplug options for bdev nvme type.') 7305f9bdac0SPawel Wodkowski p.add_argument('-d', '--disable', dest='enable', default=False, action='store_false', help="Disable hotplug (default)") 7315f9bdac0SPawel Wodkowski p.add_argument('-e', '--enable', dest='enable', action='store_true', help="Enable hotplug") 7325f9bdac0SPawel Wodkowski p.add_argument('-r', '--period-us', 7335f9bdac0SPawel Wodkowski help='How often the hotplug is processed for insert and remove events', type=int) 73461a42c0eSPawel Kaminski p.set_defaults(func=bdev_nvme_set_hotplug) 7355f9bdac0SPawel Wodkowski 736f54df840SPawel Kaminski def bdev_nvme_attach_controller(args): 737f54df840SPawel Kaminski print_array(rpc.bdev.bdev_nvme_attach_controller(args.client, 7381ea97654SDaniel Verkamp name=args.name, 7391ea97654SDaniel Verkamp trtype=args.trtype, 7401ea97654SDaniel Verkamp traddr=args.traddr, 7411ea97654SDaniel Verkamp adrfam=args.adrfam, 7421ea97654SDaniel Verkamp trsvcid=args.trsvcid, 74394345a0aSZiye Yang priority=args.priority, 744088379cfSSeth Howell subnqn=args.subnqn, 745cc7a099cSSeth Howell hostnqn=args.hostnqn, 746088379cfSSeth Howell hostaddr=args.hostaddr, 747260f9a77SShuhei Matsumoto hostsvcid=args.hostsvcid, 748260f9a77SShuhei Matsumoto prchk_reftag=args.prchk_reftag, 74905aeb9dbSAlexey Marchuk prchk_guard=args.prchk_guard, 75005aeb9dbSAlexey Marchuk hdgst=args.hdgst, 751d1e67b8bSJim Harris ddgst=args.ddgst, 752ecb6d9ffSEugene Kobyak fabrics_connect_timeout_us=args.fabrics_connect_timeout_us, 753d39cbc13SAdam Aronov multipath=args.multipath, 754ae4e54fdSShuhei Matsumoto num_io_queues=args.num_io_queues, 755ae4e54fdSShuhei Matsumoto ctrlr_loss_timeout_sec=args.ctrlr_loss_timeout_sec, 75680e81273SShuhei Matsumoto reconnect_delay_sec=args.reconnect_delay_sec, 75735f7f0ceSBoris Glimcher fast_io_fail_timeout_sec=args.fast_io_fail_timeout_sec, 75826b9be75SShuhei Matsumoto psk=args.psk, 75958a28432SKonrad Sztyber max_bdevs=args.max_bdevs, 7603e4c5347SKonrad Sztyber dhchap_key=args.dhchap_key, 76178467a35SKarl Bonde Torp dhchap_ctrlr_key=args.dhchap_ctrlr_key, 76278467a35SKarl Bonde Torp allow_unrecognized_csi=args.allow_unrecognized_csi)) 7631e92d78aSBen Walker 7647aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_nvme_attach_controller', help='Add bdevs with nvme backend') 76598187ed9SLiu Xiaodong p.add_argument('-b', '--name', help="Name of the NVMe controller, prefix for each bdev name", required=True) 7664dd3f4a7SBen Walker p.add_argument('-t', '--trtype', 7674dd3f4a7SBen Walker help='NVMe-oF target trtype: e.g., rdma, pcie', required=True) 7684dd3f4a7SBen Walker p.add_argument('-a', '--traddr', 7694dd3f4a7SBen Walker help='NVMe-oF target address: e.g., an ip address or BDF', required=True) 7704dd3f4a7SBen Walker p.add_argument('-f', '--adrfam', 7714dd3f4a7SBen Walker help='NVMe-oF target adrfam: e.g., ipv4, ipv6, ib, fc, intra_host') 7724dd3f4a7SBen Walker p.add_argument('-s', '--trsvcid', 7734dd3f4a7SBen Walker help='NVMe-oF target trsvcid: e.g., a port number') 77494345a0aSZiye Yang p.add_argument('-p', '--priority', 77594345a0aSZiye Yang help='NVMe-oF connection priority: e.g., a priority number') 7764dd3f4a7SBen Walker p.add_argument('-n', '--subnqn', help='NVMe-oF target subnqn') 777cc7a099cSSeth Howell p.add_argument('-q', '--hostnqn', help='NVMe-oF host subnqn') 778088379cfSSeth Howell p.add_argument('-i', '--hostaddr', 779088379cfSSeth Howell help='NVMe-oF host address: e.g., an ip address') 780088379cfSSeth Howell p.add_argument('-c', '--hostsvcid', 781088379cfSSeth Howell help='NVMe-oF host svcid: e.g., a port number') 782260f9a77SShuhei Matsumoto p.add_argument('-r', '--prchk-reftag', 783260f9a77SShuhei Matsumoto help='Enable checking of PI reference tag for I/O processing.', action='store_true') 784260f9a77SShuhei Matsumoto p.add_argument('-g', '--prchk-guard', 785260f9a77SShuhei Matsumoto help='Enable checking of PI guard for I/O processing.', action='store_true') 78605aeb9dbSAlexey Marchuk p.add_argument('-e', '--hdgst', 78705aeb9dbSAlexey Marchuk help='Enable TCP header digest.', action='store_true') 78805aeb9dbSAlexey Marchuk p.add_argument('-d', '--ddgst', 78905aeb9dbSAlexey Marchuk help='Enable TCP data digest.', action='store_true') 790ecb6d9ffSEugene Kobyak p.add_argument('--fabrics-timeout', type=int, help='Fabrics connect timeout in microseconds', 791ecb6d9ffSEugene Kobyak dest="fabrics_connect_timeout_us") 79285c77ec1SShuhei Matsumoto p.add_argument('-x', '--multipath', help='Set multipath behavior (disable, failover, multipath)') 793d39cbc13SAdam Aronov p.add_argument('--num-io-queues', type=int, help='Set the number of IO queues to request during initialization.') 794ae4e54fdSShuhei Matsumoto p.add_argument('-l', '--ctrlr-loss-timeout-sec', 795ae4e54fdSShuhei Matsumoto help="""Time to wait until ctrlr is reconnected before deleting ctrlr. 796ae4e54fdSShuhei Matsumoto -1 means infinite reconnect retries. 0 means no reconnect retry. 797ae4e54fdSShuhei Matsumoto If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero. 798ae4e54fdSShuhei Matsumoto If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than 799ae4e54fdSShuhei Matsumoto reconnect_delay_sec.""", 800ae4e54fdSShuhei Matsumoto type=int) 801ae4e54fdSShuhei Matsumoto p.add_argument('-o', '--reconnect-delay-sec', 802ae4e54fdSShuhei Matsumoto help="""Time to delay a reconnect retry. 803ae4e54fdSShuhei Matsumoto If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero. 804ae4e54fdSShuhei Matsumoto If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero. 805ae4e54fdSShuhei Matsumoto If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_delay_sec has to be non-zero and 806ae4e54fdSShuhei Matsumoto less than ctrlr_loss_timeout_sec.""", 807ae4e54fdSShuhei Matsumoto type=int) 80880e81273SShuhei Matsumoto p.add_argument('-u', '--fast-io-fail-timeout-sec', 80980e81273SShuhei Matsumoto help="""Time to wait until ctrlr is reconnected before failing I/O to ctrlr. 81080e81273SShuhei Matsumoto 0 means no such timeout. 81180e81273SShuhei Matsumoto If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and 81280e81273SShuhei Matsumoto less than ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1.""", 81380e81273SShuhei Matsumoto type=int) 81435f7f0ceSBoris Glimcher p.add_argument('-k', '--psk', 8151ecd5b03SKonrad Sztyber help="""Set PSK and enable TCP SSL socket implementation. The PSK can either be a 81634edd9f1SKamil Godzwon name of a key attached to the keyring or a path to a file containing the key. The 8171ecd5b03SKonrad Sztyber latter method is deprecated.""") 81826b9be75SShuhei Matsumoto p.add_argument('-m', '--max-bdevs', type=int, 81926b9be75SShuhei Matsumoto help='The size of the name array for newly created bdevs. Default is 128',) 82058a28432SKonrad Sztyber p.add_argument('--dhchap-key', help='DH-HMAC-CHAP key name') 8213e4c5347SKonrad Sztyber p.add_argument('--dhchap-ctrlr-key', help='DH-HMAC-CHAP controller key name') 82278467a35SKarl Bonde Torp p.add_argument('-U', '--allow-unrecognized-csi', help="""Allow attaching namespaces with unrecognized command set identifiers. 82378467a35SKarl Bonde Torp These will only support NVMe passthrough.""", action='store_true') 82426b9be75SShuhei Matsumoto 825f54df840SPawel Kaminski p.set_defaults(func=bdev_nvme_attach_controller) 826df897ed4SDaniel Verkamp 8275a2c2993SPawel Kaminski def bdev_nvme_get_controllers(args): 8285a2c2993SPawel Kaminski print_dict(rpc.nvme.bdev_nvme_get_controllers(args.client, 82943b335f9SLiu Xiaodong name=args.name)) 83043b335f9SLiu Xiaodong 83143b335f9SLiu Xiaodong p = subparsers.add_parser( 8327aa92ad5Swanghailiangx 'bdev_nvme_get_controllers', help='Display current NVMe controllers list or required NVMe controller') 833dc3e7140SJacek Kalwas p.add_argument('-n', '--name', help="Name of the NVMe controller. Example: Nvme0") 8345a2c2993SPawel Kaminski p.set_defaults(func=bdev_nvme_get_controllers) 83543b335f9SLiu Xiaodong 83631e77a73SPawel Kaminski def bdev_nvme_detach_controller(args): 83731e77a73SPawel Kaminski rpc.bdev.bdev_nvme_detach_controller(args.client, 8388bff48f6SSeth Howell name=args.name, 8398bff48f6SSeth Howell trtype=args.trtype, 8408bff48f6SSeth Howell traddr=args.traddr, 8418bff48f6SSeth Howell adrfam=args.adrfam, 8428bff48f6SSeth Howell trsvcid=args.trsvcid, 843b098640fSBen Walker subnqn=args.subnqn, 844b098640fSBen Walker hostaddr=args.hostaddr, 845b098640fSBen Walker hostsvcid=args.hostsvcid) 8463a56fabcSTomasz Zawadzki 8477aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_nvme_detach_controller', 84831e77a73SPawel Kaminski help='Detach an NVMe controller and delete any associated bdevs') 8493a56fabcSTomasz Zawadzki p.add_argument('name', help="Name of the controller") 8508bff48f6SSeth Howell p.add_argument('-t', '--trtype', 8518bff48f6SSeth Howell help='NVMe-oF target trtype: e.g., rdma, pcie') 8528bff48f6SSeth Howell p.add_argument('-a', '--traddr', 8538bff48f6SSeth Howell help='NVMe-oF target address: e.g., an ip address or BDF') 8548bff48f6SSeth Howell p.add_argument('-f', '--adrfam', 8558bff48f6SSeth Howell help='NVMe-oF target adrfam: e.g., ipv4, ipv6, ib, fc, intra_host') 8568bff48f6SSeth Howell p.add_argument('-s', '--trsvcid', 8578bff48f6SSeth Howell help='NVMe-oF target trsvcid: e.g., a port number') 8588bff48f6SSeth Howell p.add_argument('-n', '--subnqn', help='NVMe-oF target subnqn') 859b098640fSBen Walker p.add_argument('-i', '--hostaddr', 860b098640fSBen Walker help='NVMe-oF host address: e.g., an ip address') 861b098640fSBen Walker p.add_argument('-c', '--hostsvcid', 862b098640fSBen Walker help='NVMe-oF host svcid: e.g., a port number') 86331e77a73SPawel Kaminski p.set_defaults(func=bdev_nvme_detach_controller) 8643a56fabcSTomasz Zawadzki 865153f03cfSJonathan Teh def bdev_nvme_reset_controller(args): 8666f2e8fa5SShuhei Matsumoto rpc.bdev.bdev_nvme_reset_controller(args.client, 8676f2e8fa5SShuhei Matsumoto name=args.name, 8686f2e8fa5SShuhei Matsumoto cntlid=args.cntlid) 869153f03cfSJonathan Teh 870153f03cfSJonathan Teh p = subparsers.add_parser('bdev_nvme_reset_controller', 8716f2e8fa5SShuhei Matsumoto help='Reset an NVMe controller or all NVMe controllers in an NVMe bdev controller') 872153f03cfSJonathan Teh p.add_argument('name', help="Name of the NVMe controller") 8736f2e8fa5SShuhei Matsumoto p.add_argument('-c', '--cntlid', help="NVMe controller ID", type=int) 874153f03cfSJonathan Teh p.set_defaults(func=bdev_nvme_reset_controller) 875153f03cfSJonathan Teh 876bef7abeeSShuhei Matsumoto def bdev_nvme_enable_controller(args): 877bef7abeeSShuhei Matsumoto rpc.bdev.bdev_nvme_enable_controller(args.client, 878bef7abeeSShuhei Matsumoto name=args.name, 879bef7abeeSShuhei Matsumoto cntlid=args.cntlid) 880bef7abeeSShuhei Matsumoto 881bef7abeeSShuhei Matsumoto p = subparsers.add_parser('bdev_nvme_enable_controller', 882bef7abeeSShuhei Matsumoto help='Enable an NVMe controller or all NVMe controllers in an NVMe bdev controller') 883bef7abeeSShuhei Matsumoto p.add_argument('name', help="Name of the NVMe controller") 884bef7abeeSShuhei Matsumoto p.add_argument('-c', '--cntlid', help="NVMe controller ID", type=int) 885bef7abeeSShuhei Matsumoto p.set_defaults(func=bdev_nvme_enable_controller) 886bef7abeeSShuhei Matsumoto 887bef7abeeSShuhei Matsumoto def bdev_nvme_disable_controller(args): 888bef7abeeSShuhei Matsumoto rpc.bdev.bdev_nvme_disable_controller(args.client, 889bef7abeeSShuhei Matsumoto name=args.name, 890bef7abeeSShuhei Matsumoto cntlid=args.cntlid) 891bef7abeeSShuhei Matsumoto 892bef7abeeSShuhei Matsumoto p = subparsers.add_parser('bdev_nvme_disable_controller', 893bef7abeeSShuhei Matsumoto help='Disable an NVMe controller or all NVMe controllers in an NVMe bdev controller') 894bef7abeeSShuhei Matsumoto p.add_argument('name', help="Name of the NVMe controller") 895bef7abeeSShuhei Matsumoto p.add_argument('-c', '--cntlid', help="NVMe controller ID", type=int) 896bef7abeeSShuhei Matsumoto p.set_defaults(func=bdev_nvme_disable_controller) 897bef7abeeSShuhei Matsumoto 898b68f2eebSJim Harris def bdev_nvme_start_discovery(args): 899b68f2eebSJim Harris rpc.bdev.bdev_nvme_start_discovery(args.client, 900b68f2eebSJim Harris name=args.name, 901b68f2eebSJim Harris trtype=args.trtype, 902b68f2eebSJim Harris traddr=args.traddr, 903b68f2eebSJim Harris adrfam=args.adrfam, 904b68f2eebSJim Harris trsvcid=args.trsvcid, 90513cffc5eSJim Harris hostnqn=args.hostnqn, 9060bd7ace8SJim Harris wait_for_attach=args.wait_for_attach, 907e5f9e822SKonrad Sztyber attach_timeout_ms=args.attach_timeout_ms, 90813cffc5eSJim Harris ctrlr_loss_timeout_sec=args.ctrlr_loss_timeout_sec, 90913cffc5eSJim Harris reconnect_delay_sec=args.reconnect_delay_sec, 91013cffc5eSJim Harris fast_io_fail_timeout_sec=args.fast_io_fail_timeout_sec) 911b68f2eebSJim Harris 912b68f2eebSJim Harris p = subparsers.add_parser('bdev_nvme_start_discovery', help='Start automatic discovery') 913b68f2eebSJim Harris p.add_argument('-b', '--name', help="Name of the NVMe controller prefix for each bdev name", required=True) 914b68f2eebSJim Harris p.add_argument('-t', '--trtype', 915b68f2eebSJim Harris help='NVMe-oF target trtype: e.g., rdma, pcie', required=True) 916b68f2eebSJim Harris p.add_argument('-a', '--traddr', 917b68f2eebSJim Harris help='NVMe-oF target address: e.g., an ip address or BDF', required=True) 918b68f2eebSJim Harris p.add_argument('-f', '--adrfam', 919b68f2eebSJim Harris help='NVMe-oF target adrfam: e.g., ipv4, ipv6, ib, fc, intra_host') 920b68f2eebSJim Harris p.add_argument('-s', '--trsvcid', 921b68f2eebSJim Harris help='NVMe-oF target trsvcid: e.g., a port number') 922b68f2eebSJim Harris p.add_argument('-q', '--hostnqn', help='NVMe-oF host subnqn') 9230bd7ace8SJim Harris p.add_argument('-w', '--wait-for-attach', action='store_true', 9240bd7ace8SJim Harris help='Do not complete RPC until all discovered NVM subsystems are attached') 925dc3e7140SJacek Kalwas p.add_argument('-T', '--attach-timeout-ms', type=int, 926e5f9e822SKonrad Sztyber help="""Time to wait until the discovery and all discovered NVM subsystems 927e5f9e822SKonrad Sztyber are attached (default: 0, meaning wait indefinitely). Automatically 928e5f9e822SKonrad Sztyber selects the --wait-for-attach option.""") 92913cffc5eSJim Harris p.add_argument('-l', '--ctrlr-loss-timeout-sec', 93013cffc5eSJim Harris help="""Time to wait until ctrlr is reconnected before deleting ctrlr. 93113cffc5eSJim Harris -1 means infinite reconnect retries. 0 means no reconnect retry. 93213cffc5eSJim Harris If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero. 93313cffc5eSJim Harris If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than 93413cffc5eSJim Harris reconnect_delay_sec.""", 93513cffc5eSJim Harris type=int) 93613cffc5eSJim Harris p.add_argument('-o', '--reconnect-delay-sec', 93713cffc5eSJim Harris help="""Time to delay a reconnect retry. 93813cffc5eSJim Harris If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero. 93913cffc5eSJim Harris If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero. 94013cffc5eSJim Harris If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_delay_sec has to be non-zero and 94113cffc5eSJim Harris less than ctrlr_loss_timeout_sec.""", 94213cffc5eSJim Harris type=int) 94313cffc5eSJim Harris p.add_argument('-u', '--fast-io-fail-timeout-sec', 94413cffc5eSJim Harris help="""Time to wait until ctrlr is reconnected before failing I/O to ctrlr. 94513cffc5eSJim Harris 0 means no such timeout. 94613cffc5eSJim Harris If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and 94713cffc5eSJim Harris less than ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1.""", 94813cffc5eSJim Harris type=int) 949b68f2eebSJim Harris p.set_defaults(func=bdev_nvme_start_discovery) 950b68f2eebSJim Harris 951932ee64bSJim Harris def bdev_nvme_stop_discovery(args): 952932ee64bSJim Harris rpc.bdev.bdev_nvme_stop_discovery(args.client, name=args.name) 953932ee64bSJim Harris 954932ee64bSJim Harris p = subparsers.add_parser('bdev_nvme_stop_discovery', help='Stop automatic discovery') 955932ee64bSJim Harris p.add_argument('-b', '--name', help="Name of the service to stop", required=True) 956932ee64bSJim Harris p.set_defaults(func=bdev_nvme_stop_discovery) 957932ee64bSJim Harris 958f331ae16SKonrad Sztyber def bdev_nvme_get_discovery_info(args): 959f331ae16SKonrad Sztyber print_dict(rpc.bdev.bdev_nvme_get_discovery_info(args.client)) 960f331ae16SKonrad Sztyber 961f331ae16SKonrad Sztyber p = subparsers.add_parser('bdev_nvme_get_discovery_info', help='Get information about the automatic discovery') 962f331ae16SKonrad Sztyber p.set_defaults(func=bdev_nvme_get_discovery_info) 963f331ae16SKonrad Sztyber 9642a6a6448SShuhei Matsumoto def bdev_nvme_get_io_paths(args): 9652a6a6448SShuhei Matsumoto print_dict(rpc.bdev.bdev_nvme_get_io_paths(args.client, name=args.name)) 9662a6a6448SShuhei Matsumoto 9672a6a6448SShuhei Matsumoto p = subparsers.add_parser('bdev_nvme_get_io_paths', help='Display active I/O paths') 968dc3e7140SJacek Kalwas p.add_argument('-n', '--name', help="Name of the NVMe bdev") 9692a6a6448SShuhei Matsumoto p.set_defaults(func=bdev_nvme_get_io_paths) 9702a6a6448SShuhei Matsumoto 97122b77a3cSShuhei Matsumoto def bdev_nvme_set_preferred_path(args): 97222b77a3cSShuhei Matsumoto rpc.bdev.bdev_nvme_set_preferred_path(args.client, 97322b77a3cSShuhei Matsumoto name=args.name, 97422b77a3cSShuhei Matsumoto cntlid=args.cntlid) 97522b77a3cSShuhei Matsumoto 97622b77a3cSShuhei Matsumoto p = subparsers.add_parser('bdev_nvme_set_preferred_path', 97722b77a3cSShuhei Matsumoto help="""Set the preferred I/O path for an NVMe bdev when in multipath mode""") 97822b77a3cSShuhei Matsumoto p.add_argument('-b', '--name', help='Name of the NVMe bdev', required=True) 97922b77a3cSShuhei Matsumoto p.add_argument('-c', '--cntlid', help='NVMe-oF controller ID', type=int, required=True) 98022b77a3cSShuhei Matsumoto p.set_defaults(func=bdev_nvme_set_preferred_path) 98122b77a3cSShuhei Matsumoto 9828f9b9775SShuhei Matsumoto def bdev_nvme_set_multipath_policy(args): 9838f9b9775SShuhei Matsumoto rpc.bdev.bdev_nvme_set_multipath_policy(args.client, 9848f9b9775SShuhei Matsumoto name=args.name, 9856aa4edc2SRichael Zhuang policy=args.policy, 9862f500a23SRichael Zhuang selector=args.selector, 9872f500a23SRichael Zhuang rr_min_io=args.rr_min_io) 9888f9b9775SShuhei Matsumoto 9898f9b9775SShuhei Matsumoto p = subparsers.add_parser('bdev_nvme_set_multipath_policy', 9908f9b9775SShuhei Matsumoto help="""Set multipath policy of the NVMe bdev""") 9918f9b9775SShuhei Matsumoto p.add_argument('-b', '--name', help='Name of the NVMe bdev', required=True) 9928f9b9775SShuhei Matsumoto p.add_argument('-p', '--policy', help='Multipath policy (active_passive or active_active)', required=True) 993dc3e7140SJacek Kalwas p.add_argument('-s', '--selector', help='Multipath selector (round_robin, queue_depth)') 994d4d57898SEvgeniy Kochetov p.add_argument('-r', '--rr-min-io', 995d4d57898SEvgeniy Kochetov help='Number of IO to route to a path before switching to another for round-robin', 996dc3e7140SJacek Kalwas type=int) 9978f9b9775SShuhei Matsumoto p.set_defaults(func=bdev_nvme_set_multipath_policy) 9988f9b9775SShuhei Matsumoto 999b317d8f3SRichael Zhuang def bdev_nvme_get_path_iostat(args): 1000b317d8f3SRichael Zhuang print_dict(rpc.bdev.bdev_nvme_get_path_iostat(args.client, 1001b317d8f3SRichael Zhuang name=args.name)) 1002b317d8f3SRichael Zhuang 1003b317d8f3SRichael Zhuang p = subparsers.add_parser('bdev_nvme_get_path_iostat', 1004b317d8f3SRichael Zhuang help="""Display current I/O statistics of all the IO paths of the blockdev. It can be 1005b317d8f3SRichael Zhuang called when io_path_stat is true.""") 1006b317d8f3SRichael Zhuang p.add_argument('-b', '--name', help="Name of the Blockdev. Example: NVMe0n1", required=True) 1007b317d8f3SRichael Zhuang p.set_defaults(func=bdev_nvme_get_path_iostat) 1008b317d8f3SRichael Zhuang 100974906b01STomasz Kulasek def bdev_nvme_cuse_register(args): 101074906b01STomasz Kulasek rpc.bdev.bdev_nvme_cuse_register(args.client, 1011b7b45bc7STomasz Kulasek name=args.name) 101274906b01STomasz Kulasek 101374906b01STomasz Kulasek p = subparsers.add_parser('bdev_nvme_cuse_register', 101474906b01STomasz Kulasek help='Register CUSE devices on NVMe controller') 101574906b01STomasz Kulasek p.add_argument('-n', '--name', 101674906b01STomasz Kulasek help='Name of the NVMe controller. Example: Nvme0', required=True) 101774906b01STomasz Kulasek p.set_defaults(func=bdev_nvme_cuse_register) 101874906b01STomasz Kulasek 101974906b01STomasz Kulasek def bdev_nvme_cuse_unregister(args): 102074906b01STomasz Kulasek rpc.bdev.bdev_nvme_cuse_unregister(args.client, 102174906b01STomasz Kulasek name=args.name) 102274906b01STomasz Kulasek 102374906b01STomasz Kulasek p = subparsers.add_parser('bdev_nvme_cuse_unregister', 102474906b01STomasz Kulasek help='Unregister CUSE devices on NVMe controller') 102574906b01STomasz Kulasek p.add_argument('-n', '--name', 102674906b01STomasz Kulasek help='Name of the NVMe controller. Example: Nvme0', required=True) 102774906b01STomasz Kulasek p.set_defaults(func=bdev_nvme_cuse_unregister) 102874906b01STomasz Kulasek 10298d3f8fb8SKonrad Sztyber def bdev_nvme_set_keys(args): 10308d3f8fb8SKonrad Sztyber rpc.bdev.bdev_nvme_set_keys(args.client, args.name, args.dhchap_key, args.dhchap_ctrlr_key) 10318d3f8fb8SKonrad Sztyber 10328d3f8fb8SKonrad Sztyber p = subparsers.add_parser('bdev_nvme_set_keys', 10338d3f8fb8SKonrad Sztyber help='Set DH-HMAC-CHAP keys and force (re)authentication on all ' 10348d3f8fb8SKonrad Sztyber 'connected qpairs') 10358d3f8fb8SKonrad Sztyber p.add_argument('name', help='Name of the NVMe controller') 10368d3f8fb8SKonrad Sztyber p.add_argument('--dhchap-key', help='DH-HMAC-CHAP key name') 10378d3f8fb8SKonrad Sztyber p.add_argument('--dhchap-ctrlr-key', help='DH-HMAC-CHAP controller key name') 10388d3f8fb8SKonrad Sztyber p.set_defaults(func=bdev_nvme_set_keys) 10398d3f8fb8SKonrad Sztyber 1040195be29eSMateusz Kozlowski def bdev_zone_block_create(args): 1041195be29eSMateusz Kozlowski print_json(rpc.bdev.bdev_zone_block_create(args.client, 1042195be29eSMateusz Kozlowski name=args.name, 1043195be29eSMateusz Kozlowski base_bdev=args.base_bdev, 1044195be29eSMateusz Kozlowski zone_capacity=args.zone_capacity, 1045195be29eSMateusz Kozlowski optimal_open_zones=args.optimal_open_zones)) 1046195be29eSMateusz Kozlowski 1047195be29eSMateusz Kozlowski p = subparsers.add_parser('bdev_zone_block_create', 1048195be29eSMateusz Kozlowski help='Create virtual zone namespace device with block device backend') 1049195be29eSMateusz Kozlowski p.add_argument('-b', '--name', help="Name of the zone device", required=True) 1050195be29eSMateusz Kozlowski p.add_argument('-n', '--base-bdev', help='Name of underlying, non-zoned bdev', required=True) 1051195be29eSMateusz Kozlowski p.add_argument('-z', '--zone-capacity', help='Surfaced zone capacity in blocks', type=int, required=True) 1052195be29eSMateusz Kozlowski p.add_argument('-o', '--optimal-open-zones', help='Number of zones required to reach optimal write speed', type=int, required=True) 1053195be29eSMateusz Kozlowski p.set_defaults(func=bdev_zone_block_create) 1054195be29eSMateusz Kozlowski 1055195be29eSMateusz Kozlowski def bdev_zone_block_delete(args): 1056195be29eSMateusz Kozlowski rpc.bdev.bdev_zone_block_delete(args.client, 1057195be29eSMateusz Kozlowski name=args.name) 1058195be29eSMateusz Kozlowski 1059195be29eSMateusz Kozlowski p = subparsers.add_parser('bdev_zone_block_delete', help='Delete a virtual zone namespace device') 1060195be29eSMateusz Kozlowski p.add_argument('name', help='Virtual zone bdev name') 1061195be29eSMateusz Kozlowski p.set_defaults(func=bdev_zone_block_delete) 1062195be29eSMateusz Kozlowski 1063e18eaee2SZiye Yang def bdev_rbd_register_cluster(args): 1064e18eaee2SZiye Yang config_param = None 1065e18eaee2SZiye Yang if args.config_param: 1066e18eaee2SZiye Yang config_param = {} 1067b4269996SAllen Zhu for entry in args.config_param: 1068e18eaee2SZiye Yang parts = entry.split('=', 1) 1069e18eaee2SZiye Yang if len(parts) != 2: 1070e18eaee2SZiye Yang raise Exception('--config %s not in key=value form' % entry) 1071e18eaee2SZiye Yang config_param[parts[0]] = parts[1] 1072e18eaee2SZiye Yang print_json(rpc.bdev.bdev_rbd_register_cluster(args.client, 1073e18eaee2SZiye Yang name=args.name, 1074dd04b4deSEugene Kobyak user_id=args.user, 1075e18eaee2SZiye Yang config_param=config_param, 107620c8a3b8STan Long config_file=args.config_file, 1077b618f056SYue-Zhu key_file=args.key_file, 1078b618f056SYue-Zhu core_mask=args.core_mask)) 1079e18eaee2SZiye Yang 1080e18eaee2SZiye Yang p = subparsers.add_parser('bdev_rbd_register_cluster', 1081e18eaee2SZiye Yang help='Add a Rados cluster with ceph rbd backend') 1082e18eaee2SZiye Yang p.add_argument('name', help="Name of the Rados cluster only known to rbd bdev") 1083dc3e7140SJacek Kalwas p.add_argument('--user', help="Ceph user name (i.e. admin, not client.admin)") 10847a372bbeSJim Harris p.add_argument('--config-param', action='append', metavar='key=value', 1085e18eaee2SZiye Yang help="adds a key=value configuration option for rados_conf_set (default: rely on config file)") 1086dc3e7140SJacek Kalwas p.add_argument('--config-file', help="The file path of the Rados configuration file") 1087dc3e7140SJacek Kalwas p.add_argument('--key-file', help="The file path of the Rados keyring file") 1088dc3e7140SJacek Kalwas p.add_argument('--core-mask', help="Set core mask for librbd IO context threads") 1089e18eaee2SZiye Yang p.set_defaults(func=bdev_rbd_register_cluster) 1090e18eaee2SZiye Yang 1091e18eaee2SZiye Yang def bdev_rbd_unregister_cluster(args): 1092e18eaee2SZiye Yang rpc.bdev.bdev_rbd_unregister_cluster(args.client, name=args.name) 1093e18eaee2SZiye Yang 1094e18eaee2SZiye Yang p = subparsers.add_parser('bdev_rbd_unregister_cluster', 1095e18eaee2SZiye Yang help='Unregister a Rados cluster object') 1096e18eaee2SZiye Yang p.add_argument('name', help='Name of the Rados Cluster only known to rbd bdev') 1097e18eaee2SZiye Yang p.set_defaults(func=bdev_rbd_unregister_cluster) 1098e18eaee2SZiye Yang 1099c3cf9ec2SZiye Yang def bdev_rbd_get_clusters_info(args): 1100c3cf9ec2SZiye Yang print_json(rpc.bdev.bdev_rbd_get_clusters_info(args.client, name=args.name)) 1101c3cf9ec2SZiye Yang 1102c3cf9ec2SZiye Yang p = subparsers.add_parser('bdev_rbd_get_clusters_info', 1103c3cf9ec2SZiye Yang help='Display registered Rados Cluster names and related info') 1104dc3e7140SJacek Kalwas p.add_argument('-b', '--name', help="Name of the registered Rados Cluster Name. Example: Cluster1") 1105c3cf9ec2SZiye Yang p.set_defaults(func=bdev_rbd_get_clusters_info) 1106c3cf9ec2SZiye Yang 11078ac7cad4SMaciej Wawryk def bdev_rbd_create(args): 11084cfae036SPatrick Ohly config = None 11094cfae036SPatrick Ohly if args.config: 11104cfae036SPatrick Ohly config = {} 11114cfae036SPatrick Ohly for entry in args.config: 11124cfae036SPatrick Ohly parts = entry.split('=', 1) 11134cfae036SPatrick Ohly if len(parts) != 2: 11144cfae036SPatrick Ohly raise Exception('--config %s not in key=value form' % entry) 11154cfae036SPatrick Ohly config[parts[0]] = parts[1] 11168ac7cad4SMaciej Wawryk print_json(rpc.bdev.bdev_rbd_create(args.client, 11171ea97654SDaniel Verkamp name=args.name, 1118dd04b4deSEugene Kobyak user_id=args.user, 11194cfae036SPatrick Ohly config=config, 11201ea97654SDaniel Verkamp pool_name=args.pool_name, 11211ea97654SDaniel Verkamp rbd_name=args.rbd_name, 11225c016026SZiye Yang block_size=args.block_size, 11238a154b2cStanlong cluster_name=args.cluster_name, 11248a154b2cStanlong uuid=args.uuid)) 11251e92d78aSBen Walker 11267aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_rbd_create', help='Add a bdev with ceph rbd backend') 1127dc3e7140SJacek Kalwas p.add_argument('-b', '--name', help="Name of the bdev") 1128dc3e7140SJacek Kalwas p.add_argument('--user', help="Ceph user name (i.e. admin, not client.admin)") 11294cfae036SPatrick Ohly p.add_argument('--config', action='append', metavar='key=value', 11304cfae036SPatrick Ohly help="adds a key=value configuration option for rados_conf_set (default: rely on config file)") 11314dd3f4a7SBen Walker p.add_argument('pool_name', help='rbd pool name') 11324dd3f4a7SBen Walker p.add_argument('rbd_name', help='rbd image name') 11334dd3f4a7SBen Walker p.add_argument('block_size', help='rbd block size', type=int) 1134dc3e7140SJacek Kalwas p.add_argument('-c', '--cluster-name', help="cluster name to identify the Rados cluster") 11358a154b2cStanlong p.add_argument('-u', '--uuid', help="UUID of the bdev") 11368ac7cad4SMaciej Wawryk p.set_defaults(func=bdev_rbd_create) 1137df897ed4SDaniel Verkamp 1138164939aaSMaciej Wawryk def bdev_rbd_delete(args): 1139164939aaSMaciej Wawryk rpc.bdev.bdev_rbd_delete(args.client, 11404fd967b2SMaciej Szwed name=args.name) 11414fd967b2SMaciej Szwed 11427aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_rbd_delete', help='Delete a rbd bdev') 11434fd967b2SMaciej Szwed p.add_argument('name', help='rbd bdev name') 1144164939aaSMaciej Wawryk p.set_defaults(func=bdev_rbd_delete) 11454fd967b2SMaciej Szwed 11466a29c6a9SLiang Yan def bdev_rbd_resize(args): 11476a29c6a9SLiang Yan print_json(rpc.bdev.bdev_rbd_resize(args.client, 11486a29c6a9SLiang Yan name=args.name, 11496a29c6a9SLiang Yan new_size=int(args.new_size))) 11506a29c6a9SLiang Yan 11516a29c6a9SLiang Yan p = subparsers.add_parser('bdev_rbd_resize', 11526a29c6a9SLiang Yan help='Resize a rbd bdev') 11536a29c6a9SLiang Yan p.add_argument('name', help='rbd bdev name') 11546a29c6a9SLiang Yan p.add_argument('new_size', help='new bdev size for resize operation. The unit is MiB') 11556a29c6a9SLiang Yan p.set_defaults(func=bdev_rbd_resize) 11566a29c6a9SLiang Yan 11573fb4a66dSSeth Howell def bdev_delay_create(args): 115831c25ab3SDarek Stojaczyk print_json(rpc.bdev.bdev_delay_create(args.client, 11593fb4a66dSSeth Howell base_bdev_name=args.base_bdev_name, 11603fb4a66dSSeth Howell name=args.name, 11612f08dc7fSTomasz Zawadzki uuid=args.uuid, 11623fb4a66dSSeth Howell avg_read_latency=args.avg_read_latency, 11633fb4a66dSSeth Howell p99_read_latency=args.nine_nine_read_latency, 11643fb4a66dSSeth Howell avg_write_latency=args.avg_write_latency, 11653fb4a66dSSeth Howell p99_write_latency=args.nine_nine_write_latency)) 11663fb4a66dSSeth Howell 11673fb4a66dSSeth Howell p = subparsers.add_parser('bdev_delay_create', 11683fb4a66dSSeth Howell help='Add a delay bdev on existing bdev') 11693fb4a66dSSeth Howell p.add_argument('-b', '--base-bdev-name', help="Name of the existing bdev", required=True) 11703fb4a66dSSeth Howell p.add_argument('-d', '--name', help="Name of the delay bdev", required=True) 11712f08dc7fSTomasz Zawadzki p.add_argument('-u', '--uuid', help='UUID of the bdev (optional)') 1172a1d0f799SSeth Howell p.add_argument('-r', '--avg-read-latency', 1173a1d0f799SSeth Howell help="Average latency to apply before completing read ops (in microseconds)", required=True, type=int) 1174a1d0f799SSeth Howell p.add_argument('-t', '--nine-nine-read-latency', 1175a1d0f799SSeth Howell help="latency to apply to 1 in 100 read ops (in microseconds)", required=True, type=int) 1176a1d0f799SSeth Howell p.add_argument('-w', '--avg-write-latency', 1177a1d0f799SSeth Howell help="Average latency to apply before completing write ops (in microseconds)", required=True, type=int) 1178a1d0f799SSeth Howell p.add_argument('-n', '--nine-nine-write-latency', 1179a1d0f799SSeth Howell help="latency to apply to 1 in 100 write ops (in microseconds)", required=True, type=int) 11803fb4a66dSSeth Howell p.set_defaults(func=bdev_delay_create) 11813fb4a66dSSeth Howell 11823fb4a66dSSeth Howell def bdev_delay_delete(args): 11833fb4a66dSSeth Howell rpc.bdev.bdev_delay_delete(args.client, 11843fb4a66dSSeth Howell name=args.name) 11853fb4a66dSSeth Howell 11863fb4a66dSSeth Howell p = subparsers.add_parser('bdev_delay_delete', help='Delete a delay bdev') 11873fb4a66dSSeth Howell p.add_argument('name', help='delay bdev name') 11883fb4a66dSSeth Howell p.set_defaults(func=bdev_delay_delete) 11893fb4a66dSSeth Howell 1190d2424824SSeth Howell def bdev_delay_update_latency(args): 1191d2424824SSeth Howell print_json(rpc.bdev.bdev_delay_update_latency(args.client, 1192d2424824SSeth Howell delay_bdev_name=args.delay_bdev_name, 1193d2424824SSeth Howell latency_type=args.latency_type, 1194d2424824SSeth Howell latency_us=args.latency_us)) 1195d2424824SSeth Howell p = subparsers.add_parser('bdev_delay_update_latency', 1196d2424824SSeth Howell help='Update one of the latency values for a given delay bdev') 1197d2424824SSeth Howell p.add_argument('delay_bdev_name', help='The name of the given delay bdev') 1198d2424824SSeth Howell p.add_argument('latency_type', help='one of: avg_read, avg_write, p99_read, p99_write. No other values accepted.') 1199a1d0f799SSeth Howell p.add_argument('latency_us', help='new latency value in microseconds.', type=int) 1200d2424824SSeth Howell p.set_defaults(func=bdev_delay_update_latency) 1201d2424824SSeth Howell 1202cabb6a7dSMaciej Wawryk def bdev_error_create(args): 1203cabb6a7dSMaciej Wawryk print_json(rpc.bdev.bdev_error_create(args.client, 120491ea8102SKrzysztof Karas base_name=args.base_name, 120591ea8102SKrzysztof Karas uuid=args.uuid)) 12061e92d78aSBen Walker 12077aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_error_create', help='Add bdev with error injection backend') 12084dd3f4a7SBen Walker p.add_argument('base_name', help='base bdev name') 1209dc3e7140SJacek Kalwas p.add_argument('--uuid', help='UUID for this bdev') 1210cabb6a7dSMaciej Wawryk p.set_defaults(func=bdev_error_create) 1211df897ed4SDaniel Verkamp 1212cabb6a7dSMaciej Wawryk def bdev_error_delete(args): 1213cabb6a7dSMaciej Wawryk rpc.bdev.bdev_error_delete(args.client, 12140847ad90STomasz Zawadzki name=args.name) 12150847ad90STomasz Zawadzki 12167aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_error_delete', help='Delete an error bdev') 12170847ad90STomasz Zawadzki p.add_argument('name', help='error bdev name') 1218cabb6a7dSMaciej Wawryk p.set_defaults(func=bdev_error_delete) 12190847ad90STomasz Zawadzki 12201519aa47Sgongwei def bdev_iscsi_set_options(args): 12211519aa47Sgongwei rpc.bdev.bdev_iscsi_set_options(args.client, 1222c8e594c2Sgongwei timeout_sec=args.timeout_sec) 12231519aa47Sgongwei 12241519aa47Sgongwei p = subparsers.add_parser('bdev_iscsi_set_options', help='Set options for the bdev iscsi type.') 1225c8e594c2Sgongwei p.add_argument('-t', '--timeout-sec', help="Timeout for command, in seconds, if 0, don't track timeout.", type=int) 12261519aa47Sgongwei p.set_defaults(func=bdev_iscsi_set_options) 12271519aa47Sgongwei 12289f5cbf4cSMaciej Wawryk def bdev_iscsi_create(args): 12299f5cbf4cSMaciej Wawryk print_json(rpc.bdev.bdev_iscsi_create(args.client, 1230fba68d61SPawel Wodkowski name=args.name, 1231fba68d61SPawel Wodkowski url=args.url, 1232160850f0STomasz Zawadzki initiator_iqn=args.initiator_iqn)) 1233fba68d61SPawel Wodkowski 12343ac967baSwanghailiangx p = subparsers.add_parser('bdev_iscsi_create', 1235fba68d61SPawel Wodkowski help='Add bdev with iSCSI initiator backend') 1236fba68d61SPawel Wodkowski p.add_argument('-b', '--name', help="Name of the bdev", required=True) 1237fba68d61SPawel Wodkowski p.add_argument('-i', '--initiator-iqn', help="Initiator IQN", required=True) 1238fba68d61SPawel Wodkowski p.add_argument('--url', help="iSCSI Lun URL", required=True) 12399f5cbf4cSMaciej Wawryk p.set_defaults(func=bdev_iscsi_create) 1240fba68d61SPawel Wodkowski 12419f5cbf4cSMaciej Wawryk def bdev_iscsi_delete(args): 12429f5cbf4cSMaciej Wawryk rpc.bdev.bdev_iscsi_delete(args.client, 12436be654aaSTomasz Zawadzki name=args.name) 12446be654aaSTomasz Zawadzki 12453ac967baSwanghailiangx p = subparsers.add_parser('bdev_iscsi_delete', help='Delete an iSCSI bdev') 12466be654aaSTomasz Zawadzki p.add_argument('name', help='iSCSI bdev name') 12479f5cbf4cSMaciej Wawryk p.set_defaults(func=bdev_iscsi_delete) 12486be654aaSTomasz Zawadzki 12497e875f37SPawel Kaminski def bdev_passthru_create(args): 12507e875f37SPawel Kaminski print_json(rpc.bdev.bdev_passthru_create(args.client, 12511ea97654SDaniel Verkamp base_bdev_name=args.base_bdev_name, 12527809cb41SArtur Paszkiewicz name=args.name, 12537809cb41SArtur Paszkiewicz uuid=args.uuid)) 1254cb1c88d1SGangCao 12557aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_passthru_create', help='Add a pass through bdev on existing bdev') 1256cb1c88d1SGangCao p.add_argument('-b', '--base-bdev-name', help="Name of the existing bdev", required=True) 1257164d7914Spaul luse p.add_argument('-p', '--name', help="Name of the pass through bdev", required=True) 12587809cb41SArtur Paszkiewicz p.add_argument('-u', '--uuid', help="UUID of the bdev") 12597e875f37SPawel Kaminski p.set_defaults(func=bdev_passthru_create) 1260cb1c88d1SGangCao 12617e875f37SPawel Kaminski def bdev_passthru_delete(args): 12627e875f37SPawel Kaminski rpc.bdev.bdev_passthru_delete(args.client, 1263e48f0bf1SMaciej Szwed name=args.name) 1264e48f0bf1SMaciej Szwed 12657aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_passthru_delete', help='Delete a pass through bdev') 1266e48f0bf1SMaciej Szwed p.add_argument('name', help='pass through bdev name') 12677e875f37SPawel Kaminski p.set_defaults(func=bdev_passthru_delete) 1268e48f0bf1SMaciej Szwed 12692c49e910SMaciej Wawryk def bdev_get_bdevs(args): 12702c49e910SMaciej Wawryk print_dict(rpc.bdev.bdev_get_bdevs(args.client, 1271fa649869SKonrad Sztyber name=args.name, timeout=args.timeout_ms)) 12721e92d78aSBen Walker 127347bc5870SJim Harris p = subparsers.add_parser('bdev_get_bdevs', 12742c49e910SMaciej Wawryk help='Display current blockdev list or required blockdev') 1275dc3e7140SJacek Kalwas p.add_argument('-b', '--name', help="Name of the Blockdev. Example: Nvme0n1") 1276fa649869SKonrad Sztyber p.add_argument('-t', '--timeout-ms', help="""Time in ms to wait for the bdev to appear (only used 1277fa649869SKonrad Sztyber with the -b|--name option). The default timeout is 0, meaning the RPC returns immediately 1278fa649869SKonrad Sztyber whether the bdev exists or not.""", 1279dc3e7140SJacek Kalwas type=int) 12802c49e910SMaciej Wawryk p.set_defaults(func=bdev_get_bdevs) 1281df897ed4SDaniel Verkamp 1282326e68fcSMaciej Wawryk def bdev_get_iostat(args): 1283326e68fcSMaciej Wawryk print_dict(rpc.bdev.bdev_get_iostat(args.client, 1284e28e2479SGangCao name=args.name, 128563e0c25dSVasilii Ivanov per_channel=args.per_channel, 128663e0c25dSVasilii Ivanov reset_mode=args.reset_mode)) 128764ccd4b9SYanbo Zhou 128847bc5870SJim Harris p = subparsers.add_parser('bdev_get_iostat', 1289cf4e8664SShuhei Matsumoto help='Display current I/O statistics of all the blockdevs or specified blockdev.') 1290dc3e7140SJacek Kalwas p.add_argument('-b', '--name', help="Name of the Blockdev. Example: Nvme0n1") 1291e28e2479SGangCao p.add_argument('-c', '--per-channel', default=False, dest='per_channel', help='Display per channel IO stats for specified device', 1292dc3e7140SJacek Kalwas action='store_true') 129363e0c25dSVasilii Ivanov p.add_argument('--reset-mode', help="Mode to reset I/O statistics after getting", choices=['all', 'maxmin', 'none']) 1294326e68fcSMaciej Wawryk p.set_defaults(func=bdev_get_iostat) 129564ccd4b9SYanbo Zhou 1296cf4e8664SShuhei Matsumoto def bdev_reset_iostat(args): 1297d7ad7bcaSShuhei Matsumoto rpc.bdev.bdev_reset_iostat(args.client, name=args.name, mode=args.mode) 1298cf4e8664SShuhei Matsumoto 1299cf4e8664SShuhei Matsumoto p = subparsers.add_parser('bdev_reset_iostat', 1300cf4e8664SShuhei Matsumoto help='Reset I/O statistics of all the blockdevs or specified blockdev.') 1301dc3e7140SJacek Kalwas p.add_argument('-b', '--name', help="Name of the Blockdev. Example: Nvme0n1") 130263e0c25dSVasilii Ivanov p.add_argument('-m', '--mode', help="Mode to reset I/O statistics", choices=['all', 'maxmin', 'none']) 1303cf4e8664SShuhei Matsumoto p.set_defaults(func=bdev_reset_iostat) 1304cf4e8664SShuhei Matsumoto 1305ab6ce828SMaciej Wawryk def bdev_enable_histogram(args): 1306f3cef5e1SAtul Malakar rpc.bdev.bdev_enable_histogram(args.client, name=args.name, enable=args.enable, opc=args.opc) 1307e5e427c9SPiotr Pelplinski 130847bc5870SJim Harris p = subparsers.add_parser('bdev_enable_histogram', 1309ab6ce828SMaciej Wawryk help='Enable or disable histogram for specified bdev') 1310e5e427c9SPiotr Pelplinski p.add_argument('-e', '--enable', default=True, dest='enable', action='store_true', help='Enable histograms on specified device') 1311e5e427c9SPiotr Pelplinski p.add_argument('-d', '--disable', dest='enable', action='store_false', help='Disable histograms on specified device') 1312f3cef5e1SAtul Malakar p.add_argument('-o', '--opc', help='Enable histogram for specified io type. Defaults to all io types if not specified.' 1313f3cef5e1SAtul Malakar ' Refer to bdev_get_bdevs RPC for the list of io types.') 1314e5e427c9SPiotr Pelplinski p.add_argument('name', help='bdev name') 1315ab6ce828SMaciej Wawryk p.set_defaults(func=bdev_enable_histogram) 1316e5e427c9SPiotr Pelplinski 131711f6b773SMaciej Wawryk def bdev_get_histogram(args): 131811f6b773SMaciej Wawryk print_dict(rpc.bdev.bdev_get_histogram(args.client, name=args.name)) 1319e5e427c9SPiotr Pelplinski 132047bc5870SJim Harris p = subparsers.add_parser('bdev_get_histogram', 132111f6b773SMaciej Wawryk help='Get histogram for specified bdev') 1322e5e427c9SPiotr Pelplinski p.add_argument('name', help='bdev name') 132311f6b773SMaciej Wawryk p.set_defaults(func=bdev_get_histogram) 1324e5e427c9SPiotr Pelplinski 1325a96afb8bSMaciej Wawryk def bdev_set_qd_sampling_period(args): 1326a96afb8bSMaciej Wawryk rpc.bdev.bdev_set_qd_sampling_period(args.client, 132703987024SSeth Howell name=args.name, 132803987024SSeth Howell period=args.period) 132903987024SSeth Howell 133047bc5870SJim Harris p = subparsers.add_parser('bdev_set_qd_sampling_period', 1331a96afb8bSMaciej Wawryk help="Enable or disable tracking of a bdev's queue depth.") 133203987024SSeth Howell p.add_argument('name', help='Blockdev name. Example: Malloc0') 133303987024SSeth Howell p.add_argument('period', help='Period with which to poll the block device queue depth in microseconds.' 133403987024SSeth Howell ' If set to 0, polling will be disabled.', 133503987024SSeth Howell type=int) 1336a96afb8bSMaciej Wawryk p.set_defaults(func=bdev_set_qd_sampling_period) 133703987024SSeth Howell 1338c61e14beSMaciej Wawryk def bdev_set_qos_limit(args): 1339c61e14beSMaciej Wawryk rpc.bdev.bdev_set_qos_limit(args.client, 13401ea97654SDaniel Verkamp name=args.name, 1341868c28cdSGangCao rw_ios_per_sec=args.rw_ios_per_sec, 134205b43152SGangCao rw_mbytes_per_sec=args.rw_mbytes_per_sec, 134305b43152SGangCao r_mbytes_per_sec=args.r_mbytes_per_sec, 134405b43152SGangCao w_mbytes_per_sec=args.w_mbytes_per_sec) 1345ffba4fdbSGangCao 134647bc5870SJim Harris p = subparsers.add_parser('bdev_set_qos_limit', 1347c61e14beSMaciej Wawryk help='Set QoS rate limit on a blockdev') 1348ffba4fdbSGangCao p.add_argument('name', help='Blockdev name to set QoS. Example: Malloc0') 13497a372bbeSJim Harris p.add_argument('--rw-ios-per-sec', 1350dd3d5800SJimboLuCN help='R/W IOs per second limit (>=1000, example: 20000). 0 means unlimited.', 1351dc3e7140SJacek Kalwas type=int) 13527a372bbeSJim Harris p.add_argument('--rw-mbytes-per-sec', 1353622ef521SYankunLi help="R/W megabytes per second limit (>=1, example: 100). 0 means unlimited.", 1354dc3e7140SJacek Kalwas type=int) 13557a372bbeSJim Harris p.add_argument('--r-mbytes-per-sec', 1356622ef521SYankunLi help="Read megabytes per second limit (>=1, example: 100). 0 means unlimited.", 1357dc3e7140SJacek Kalwas type=int) 13587a372bbeSJim Harris p.add_argument('--w-mbytes-per-sec', 1359622ef521SYankunLi help="Write megabytes per second limit (>=1, example: 100). 0 means unlimited.", 1360dc3e7140SJacek Kalwas type=int) 1361c61e14beSMaciej Wawryk p.set_defaults(func=bdev_set_qos_limit) 1362ffba4fdbSGangCao 1363cabb6a7dSMaciej Wawryk def bdev_error_inject_error(args): 1364cabb6a7dSMaciej Wawryk rpc.bdev.bdev_error_inject_error(args.client, 13651ea97654SDaniel Verkamp name=args.name, 13661ea97654SDaniel Verkamp io_type=args.io_type, 13671ea97654SDaniel Verkamp error_type=args.error_type, 13683d2a3ee4SShuhei Matsumoto num=args.num, 13694dacace1SArtur Paszkiewicz queue_depth=args.queue_depth, 13703d2a3ee4SShuhei Matsumoto corrupt_offset=args.corrupt_offset, 13713d2a3ee4SShuhei Matsumoto corrupt_value=args.corrupt_value) 13721e92d78aSBen Walker 13737aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_error_inject_error', help='bdev inject error') 13744dd3f4a7SBen Walker p.add_argument('name', help="""the name of the error injection bdev""") 13754dd3f4a7SBen Walker p.add_argument('io_type', help="""io_type: 'clear' 'read' 'write' 'unmap' 'flush' 'all'""") 1376408a2155SArtur Paszkiewicz p.add_argument('error_type', help="""error_type: 'failure' 'pending' 'corrupt_data' 'nomem'""") 13774dd3f4a7SBen Walker p.add_argument( 1378642f8b3dSJaroslaw Chachulski '-n', '--num', help='the number of commands you want to fail', type=int) 13793d2a3ee4SShuhei Matsumoto p.add_argument( 13804dacace1SArtur Paszkiewicz '-q', '--queue-depth', help='the queue depth at which to trigger the error', type=int) 13814dacace1SArtur Paszkiewicz p.add_argument( 13823d2a3ee4SShuhei Matsumoto '-o', '--corrupt-offset', help='the offset in bytes to xor with corrupt_value', type=int) 13833d2a3ee4SShuhei Matsumoto p.add_argument( 13843d2a3ee4SShuhei Matsumoto '-v', '--corrupt-value', help='the value for xor (1-255, 0 is invalid)', type=int) 1385cabb6a7dSMaciej Wawryk p.set_defaults(func=bdev_error_inject_error) 1386df897ed4SDaniel Verkamp 1387b9063e4bSPawel Kaminski def bdev_nvme_apply_firmware(args): 1388b9063e4bSPawel Kaminski print_dict(rpc.bdev.bdev_nvme_apply_firmware(args.client, 13891ea97654SDaniel Verkamp bdev_name=args.bdev_name, 13901ea97654SDaniel Verkamp filename=args.filename)) 13911e92d78aSBen Walker 13927aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_nvme_apply_firmware', help='Download and commit firmware to NVMe device') 13934dd3f4a7SBen Walker p.add_argument('filename', help='filename of the firmware to download') 13944dd3f4a7SBen Walker p.add_argument('bdev_name', help='name of the NVMe device') 1395b9063e4bSPawel Kaminski p.set_defaults(func=bdev_nvme_apply_firmware) 13961e92d78aSBen Walker 13975c33437bSAlexey Marchuk def bdev_nvme_get_transport_statistics(args): 13985c33437bSAlexey Marchuk print_dict(rpc.bdev.bdev_nvme_get_transport_statistics(args.client)) 13995c33437bSAlexey Marchuk 14005c33437bSAlexey Marchuk p = subparsers.add_parser('bdev_nvme_get_transport_statistics', 14015c33437bSAlexey Marchuk help='Get bdev_nvme poll group transport statistics') 14025c33437bSAlexey Marchuk p.set_defaults(func=bdev_nvme_get_transport_statistics) 14035c33437bSAlexey Marchuk 140449ffdc18SWindYu def bdev_nvme_get_controller_health_info(args): 140549ffdc18SWindYu print_dict(rpc.bdev.bdev_nvme_get_controller_health_info(args.client, 140649ffdc18SWindYu name=args.name)) 140749ffdc18SWindYu 140849ffdc18SWindYu p = subparsers.add_parser('bdev_nvme_get_controller_health_info', 140949ffdc18SWindYu help='Display health log of the required NVMe bdev controller.') 141049ffdc18SWindYu p.add_argument('-c', '--name', help="Name of the NVMe bdev controller. Example: Nvme0", required=True) 141149ffdc18SWindYu p.set_defaults(func=bdev_nvme_get_controller_health_info) 141249ffdc18SWindYu 14134dd3f4a7SBen Walker # iSCSI 1414cea4c3e5SPawel Kaminski def iscsi_set_options(args): 1415cea4c3e5SPawel Kaminski rpc.iscsi.iscsi_set_options( 1416253c61beSheluwei args.client, 1417253c61beSheluwei auth_file=args.auth_file, 1418253c61beSheluwei node_base=args.node_base, 1419253c61beSheluwei nop_timeout=args.nop_timeout, 1420253c61beSheluwei nop_in_interval=args.nop_in_interval, 142166723f7fSShuhei Matsumoto disable_chap=args.disable_chap, 142266723f7fSShuhei Matsumoto require_chap=args.require_chap, 142366723f7fSShuhei Matsumoto mutual_chap=args.mutual_chap, 142466723f7fSShuhei Matsumoto chap_group=args.chap_group, 1425253c61beSheluwei max_sessions=args.max_sessions, 142664269787SPawel Wodkowski max_queue_depth=args.max_queue_depth, 1427253c61beSheluwei max_connections_per_session=args.max_connections_per_session, 1428253c61beSheluwei default_time2wait=args.default_time2wait, 1429253c61beSheluwei default_time2retain=args.default_time2retain, 1430d393983dSGangCao first_burst_length=args.first_burst_length, 1431253c61beSheluwei immediate_data=args.immediate_data, 1432253c61beSheluwei error_recovery_level=args.error_recovery_level, 14335aaf754fSShuhei Matsumoto allow_duplicated_isid=args.allow_duplicated_isid, 143405cd6977SShuhei Matsumoto max_large_datain_per_connection=args.max_large_datain_per_connection, 143511d76e8cSShuhei Matsumoto max_r2t_per_connection=args.max_r2t_per_connection, 143611d76e8cSShuhei Matsumoto pdu_pool_size=args.pdu_pool_size, 143711d76e8cSShuhei Matsumoto immediate_data_pool_size=args.immediate_data_pool_size, 143811d76e8cSShuhei Matsumoto data_out_pool_size=args.data_out_pool_size) 143959b3479bSShuhei Matsumoto 1440febe9002SJim Harris p = subparsers.add_parser('iscsi_set_options', 1441cea4c3e5SPawel Kaminski help="""Set options of iSCSI subsystem""") 1442ad323b80SShuhei Matsumoto p.add_argument('-f', '--auth-file', help='Path to CHAP shared secret file') 144359b3479bSShuhei Matsumoto p.add_argument('-b', '--node-base', help='Prefix of the name of iSCSI target node') 144459b3479bSShuhei Matsumoto p.add_argument('-o', '--nop-timeout', help='Timeout in seconds to nop-in request to the initiator', type=int) 144559b3479bSShuhei Matsumoto p.add_argument('-n', '--nop-in-interval', help='Time interval in secs between nop-in requests by the target', type=int) 144666723f7fSShuhei Matsumoto p.add_argument('-d', '--disable-chap', help="""CHAP for discovery session should be disabled. 144766723f7fSShuhei Matsumoto *** Mutually exclusive with --require-chap""", action='store_true') 144866723f7fSShuhei Matsumoto p.add_argument('-r', '--require-chap', help="""CHAP for discovery session should be required. 144966723f7fSShuhei Matsumoto *** Mutually exclusive with --disable-chap""", action='store_true') 145066723f7fSShuhei Matsumoto p.add_argument('-m', '--mutual-chap', help='CHAP for discovery session should be mutual', action='store_true') 145166723f7fSShuhei Matsumoto p.add_argument('-g', '--chap-group', help="""Authentication group ID for discovery session. 145259b3479bSShuhei Matsumoto *** Authentication group must be precreated ***""", type=int) 145359b3479bSShuhei Matsumoto p.add_argument('-a', '--max-sessions', help='Maximum number of sessions in the host.', type=int) 145464269787SPawel Wodkowski p.add_argument('-q', '--max-queue-depth', help='Max number of outstanding I/Os per queue.', type=int) 145559b3479bSShuhei Matsumoto p.add_argument('-c', '--max-connections-per-session', help='Negotiated parameter, MaxConnections.', type=int) 145659b3479bSShuhei Matsumoto p.add_argument('-w', '--default-time2wait', help='Negotiated parameter, DefaultTime2Wait.', type=int) 145759b3479bSShuhei Matsumoto p.add_argument('-v', '--default-time2retain', help='Negotiated parameter, DefaultTime2Retain.', type=int) 1458d393983dSGangCao p.add_argument('-s', '--first-burst-length', help='Negotiated parameter, FirstBurstLength.', type=int) 145959b3479bSShuhei Matsumoto p.add_argument('-i', '--immediate-data', help='Negotiated parameter, ImmediateData.', action='store_true') 146059b3479bSShuhei Matsumoto p.add_argument('-l', '--error-recovery-level', help='Negotiated parameter, ErrorRecoveryLevel', type=int) 146159b3479bSShuhei Matsumoto p.add_argument('-p', '--allow-duplicated-isid', help='Allow duplicated initiator session ID.', action='store_true') 14625aaf754fSShuhei Matsumoto p.add_argument('-x', '--max-large-datain-per-connection', help='Max number of outstanding split read I/Os per connection', type=int) 146305cd6977SShuhei Matsumoto p.add_argument('-k', '--max-r2t-per-connection', help='Max number of outstanding R2Ts per connection', type=int) 146411d76e8cSShuhei Matsumoto p.add_argument('-u', '--pdu-pool-size', help='Number of PDUs in the pool', type=int) 14657a372bbeSJim Harris p.add_argument('-j', '--immediate-data-pool-size', help='Number of immediate data buffers in the pool', type=int) 146611d76e8cSShuhei Matsumoto p.add_argument('-z', '--data-out-pool-size', help='Number of data out buffers in the pool', type=int) 1467cea4c3e5SPawel Kaminski p.set_defaults(func=iscsi_set_options) 146859b3479bSShuhei Matsumoto 1469a05efe0aSPawel Kaminski def iscsi_set_discovery_auth(args): 1470a05efe0aSPawel Kaminski rpc.iscsi.iscsi_set_discovery_auth( 14716cd1714aSShuhei Matsumoto args.client, 14726cd1714aSShuhei Matsumoto disable_chap=args.disable_chap, 14736cd1714aSShuhei Matsumoto require_chap=args.require_chap, 14746cd1714aSShuhei Matsumoto mutual_chap=args.mutual_chap, 14756cd1714aSShuhei Matsumoto chap_group=args.chap_group) 14766cd1714aSShuhei Matsumoto 1477febe9002SJim Harris p = subparsers.add_parser('iscsi_set_discovery_auth', 1478a05efe0aSPawel Kaminski help="""Set CHAP authentication for discovery session.""") 14796cd1714aSShuhei Matsumoto p.add_argument('-d', '--disable-chap', help="""CHAP for discovery session should be disabled. 14806cd1714aSShuhei Matsumoto *** Mutually exclusive with --require-chap""", action='store_true') 14816cd1714aSShuhei Matsumoto p.add_argument('-r', '--require-chap', help="""CHAP for discovery session should be required. 14826cd1714aSShuhei Matsumoto *** Mutually exclusive with --disable-chap""", action='store_true') 14836cd1714aSShuhei Matsumoto p.add_argument('-m', '--mutual-chap', help='CHAP for discovery session should be mutual', action='store_true') 14846cd1714aSShuhei Matsumoto p.add_argument('-g', '--chap-group', help="""Authentication group ID for discovery session. 14856cd1714aSShuhei Matsumoto *** Authentication group must be precreated ***""", type=int) 1486a05efe0aSPawel Kaminski p.set_defaults(func=iscsi_set_discovery_auth) 14876cd1714aSShuhei Matsumoto 1488d9edd3afSPawel Kaminski def iscsi_create_auth_group(args): 1489dcafd5b1SShuhei Matsumoto secrets = None 1490dcafd5b1SShuhei Matsumoto if args.secrets: 1491dcafd5b1SShuhei Matsumoto secrets = [dict(u.split(":") for u in a.split(" ")) for a in args.secrets.split(",")] 1492dcafd5b1SShuhei Matsumoto 1493d9edd3afSPawel Kaminski rpc.iscsi.iscsi_create_auth_group(args.client, tag=args.tag, secrets=secrets) 1494dcafd5b1SShuhei Matsumoto 1495febe9002SJim Harris p = subparsers.add_parser('iscsi_create_auth_group', 1496d9edd3afSPawel Kaminski help='Create authentication group for CHAP authentication.') 1497dcafd5b1SShuhei Matsumoto p.add_argument('tag', help='Authentication group tag (unique, integer > 0).', type=int) 1498dcafd5b1SShuhei Matsumoto p.add_argument('-c', '--secrets', help="""Comma-separated list of CHAP secrets 1499dcafd5b1SShuhei Matsumoto<user:user_name secret:chap_secret muser:mutual_user_name msecret:mutual_chap_secret> enclosed in quotes. 1500dc3e7140SJacek KalwasFormat: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 msecret:ms2'""") 1501d9edd3afSPawel Kaminski p.set_defaults(func=iscsi_create_auth_group) 1502dcafd5b1SShuhei Matsumoto 1503bcab0b3bSPawel Kaminski def iscsi_delete_auth_group(args): 1504bcab0b3bSPawel Kaminski rpc.iscsi.iscsi_delete_auth_group(args.client, tag=args.tag) 1505dcafd5b1SShuhei Matsumoto 1506febe9002SJim Harris p = subparsers.add_parser('iscsi_delete_auth_group', 1507bcab0b3bSPawel Kaminski help='Delete an authentication group.') 1508dcafd5b1SShuhei Matsumoto p.add_argument('tag', help='Authentication group tag', type=int) 1509bcab0b3bSPawel Kaminski p.set_defaults(func=iscsi_delete_auth_group) 1510dcafd5b1SShuhei Matsumoto 15110cbf1237SPawel Kaminski def iscsi_auth_group_add_secret(args): 15120cbf1237SPawel Kaminski rpc.iscsi.iscsi_auth_group_add_secret( 1513750e5d25SShuhei Matsumoto args.client, 1514750e5d25SShuhei Matsumoto tag=args.tag, 1515750e5d25SShuhei Matsumoto user=args.user, 1516750e5d25SShuhei Matsumoto secret=args.secret, 1517750e5d25SShuhei Matsumoto muser=args.muser, 1518750e5d25SShuhei Matsumoto msecret=args.msecret) 1519750e5d25SShuhei Matsumoto 1520febe9002SJim Harris p = subparsers.add_parser('iscsi_auth_group_add_secret', 15210cbf1237SPawel Kaminski help='Add a secret to an authentication group.') 1522750e5d25SShuhei Matsumoto p.add_argument('tag', help='Authentication group tag', type=int) 1523750e5d25SShuhei Matsumoto p.add_argument('-u', '--user', help='User name for one-way CHAP authentication', required=True) 1524750e5d25SShuhei Matsumoto p.add_argument('-s', '--secret', help='Secret for one-way CHAP authentication', required=True) 1525750e5d25SShuhei Matsumoto p.add_argument('-m', '--muser', help='User name for mutual CHAP authentication') 1526750e5d25SShuhei Matsumoto p.add_argument('-r', '--msecret', help='Secret for mutual CHAP authentication') 15270cbf1237SPawel Kaminski p.set_defaults(func=iscsi_auth_group_add_secret) 1528750e5d25SShuhei Matsumoto 1529a25f9bf9SPawel Kaminski def iscsi_auth_group_remove_secret(args): 1530a25f9bf9SPawel Kaminski rpc.iscsi.iscsi_auth_group_remove_secret(args.client, tag=args.tag, user=args.user) 1531750e5d25SShuhei Matsumoto 1532febe9002SJim Harris p = subparsers.add_parser('iscsi_auth_group_remove_secret', 1533a25f9bf9SPawel Kaminski help='Remove a secret from an authentication group.') 1534750e5d25SShuhei Matsumoto p.add_argument('tag', help='Authentication group tag', type=int) 1535750e5d25SShuhei Matsumoto p.add_argument('-u', '--user', help='User name for one-way CHAP authentication', required=True) 1536a25f9bf9SPawel Kaminski p.set_defaults(func=iscsi_auth_group_remove_secret) 1537750e5d25SShuhei Matsumoto 1538c1f6def9SPawel Kaminski def iscsi_get_auth_groups(args): 1539c1f6def9SPawel Kaminski print_dict(rpc.iscsi.iscsi_get_auth_groups(args.client)) 15403a08001dSShuhei Matsumoto 1541febe9002SJim Harris p = subparsers.add_parser('iscsi_get_auth_groups', 15423a08001dSShuhei Matsumoto help='Display current authentication group configuration') 1543c1f6def9SPawel Kaminski p.set_defaults(func=iscsi_get_auth_groups) 15443a08001dSShuhei Matsumoto 15451a6c41a9SPawel Kaminski def iscsi_get_portal_groups(args): 15461a6c41a9SPawel Kaminski print_dict(rpc.iscsi.iscsi_get_portal_groups(args.client)) 1547df897ed4SDaniel Verkamp 1548febe9002SJim Harris p = subparsers.add_parser('iscsi_get_portal_groups', help='Display current portal group configuration') 15491a6c41a9SPawel Kaminski p.set_defaults(func=iscsi_get_portal_groups) 1550df897ed4SDaniel Verkamp 1551e3366470SPawel Kaminski def iscsi_get_initiator_groups(args): 1552e3366470SPawel Kaminski print_dict(rpc.iscsi.iscsi_get_initiator_groups(args.client)) 15531e92d78aSBen Walker 1554e3366470SPawel Kaminski p = subparsers.add_parser('iscsi_get_initiator_groups', 15554dd3f4a7SBen Walker help='Display current initiator group configuration') 1556e3366470SPawel Kaminski p.set_defaults(func=iscsi_get_initiator_groups) 1557df897ed4SDaniel Verkamp 15587d114278SPawel Kaminski def iscsi_get_target_nodes(args): 15597d114278SPawel Kaminski print_dict(rpc.iscsi.iscsi_get_target_nodes(args.client)) 15601e92d78aSBen Walker 1561febe9002SJim Harris p = subparsers.add_parser('iscsi_get_target_nodes', help='Display target nodes') 15627d114278SPawel Kaminski p.set_defaults(func=iscsi_get_target_nodes) 1563df897ed4SDaniel Verkamp 156490ba272cSChangqi Lu def iscsi_enable_histogram(args): 156590ba272cSChangqi Lu rpc.iscsi.iscsi_enable_histogram(args.client, name=args.name, enable=args.enable) 156690ba272cSChangqi Lu 156790ba272cSChangqi Lu p = subparsers.add_parser('iscsi_enable_histogram', 156890ba272cSChangqi Lu help='Enable or disable histogram for specified iscsi target') 156990ba272cSChangqi Lu p.add_argument('-e', '--enable', default=True, dest='enable', action='store_true', help='Enable histograms on specified iscsi target') 157090ba272cSChangqi Lu p.add_argument('-d', '--disable', dest='enable', action='store_false', help='Disable histograms on specified iscsi target') 157190ba272cSChangqi Lu p.add_argument('name', help='iscsi target name') 157290ba272cSChangqi Lu p.set_defaults(func=iscsi_enable_histogram) 157390ba272cSChangqi Lu 1574ba909a45SChangqi Lu def iscsi_get_histogram(args): 1575ba909a45SChangqi Lu print_dict(rpc.iscsi.iscsi_get_histogram(args.client, name=args.name)) 1576ba909a45SChangqi Lu 1577ba909a45SChangqi Lu p = subparsers.add_parser('iscsi_get_histogram', 1578ba909a45SChangqi Lu help='Get histogram for specified iscsi target') 1579ba909a45SChangqi Lu p.add_argument('name', help='target name') 1580ba909a45SChangqi Lu p.set_defaults(func=iscsi_get_histogram) 1581ba909a45SChangqi Lu 1582758b2f94SPawel Kaminski def iscsi_create_target_node(args): 1583253c61beSheluwei luns = [] 1584253c61beSheluwei for u in args.bdev_name_id_pairs.strip().split(" "): 1585253c61beSheluwei bdev_name, lun_id = u.split(":") 1586253c61beSheluwei luns.append({"bdev_name": bdev_name, "lun_id": int(lun_id)}) 1587253c61beSheluwei 1588253c61beSheluwei pg_ig_maps = [] 1589253c61beSheluwei for u in args.pg_ig_mappings.strip().split(" "): 1590253c61beSheluwei pg, ig = u.split(":") 1591253c61beSheluwei pg_ig_maps.append({"pg_tag": int(pg), "ig_tag": int(ig)}) 1592253c61beSheluwei 1593758b2f94SPawel Kaminski rpc.iscsi.iscsi_create_target_node( 1594253c61beSheluwei args.client, 1595253c61beSheluwei luns=luns, 1596253c61beSheluwei pg_ig_maps=pg_ig_maps, 1597253c61beSheluwei name=args.name, 1598253c61beSheluwei alias_name=args.alias_name, 1599253c61beSheluwei queue_depth=args.queue_depth, 1600253c61beSheluwei chap_group=args.chap_group, 1601253c61beSheluwei disable_chap=args.disable_chap, 1602253c61beSheluwei require_chap=args.require_chap, 1603253c61beSheluwei mutual_chap=args.mutual_chap, 1604253c61beSheluwei header_digest=args.header_digest, 1605253c61beSheluwei data_digest=args.data_digest) 16061e92d78aSBen Walker 1607febe9002SJim Harris p = subparsers.add_parser('iscsi_create_target_node', help='Add a target node') 16081e92d78aSBen Walker p.add_argument('name', help='Target node name (ASCII)') 16091e92d78aSBen Walker p.add_argument('alias_name', help='Target node alias name (ASCII)') 1610583e9699SShuhei Matsumoto p.add_argument('bdev_name_id_pairs', help="""Whitespace-separated list of <bdev name:LUN ID> pairs enclosed 1611583e9699SShuhei Matsumoto in quotes. Format: 'bdev_name0:id0 bdev_name1:id1' etc 16121e92d78aSBen Walker Example: 'Malloc0:0 Malloc1:1 Malloc5:2' 1613583e9699SShuhei Matsumoto *** The bdevs must pre-exist *** 16141e92d78aSBen Walker *** LUN0 (id = 0) is required *** 16154dd3f4a7SBen Walker *** bdevs names cannot contain space or colon characters ***""") 16161e92d78aSBen Walker p.add_argument('pg_ig_mappings', help="""List of (Portal_Group_Tag:Initiator_Group_Tag) mappings 16171e92d78aSBen Walker Whitespace separated, quoted, mapping defined with colon 16181e92d78aSBen Walker separated list of "tags" (int > 0) 16191e92d78aSBen Walker Example: '1:1 2:2 2:1' 16201e92d78aSBen Walker *** The Portal/Initiator Groups must be precreated ***""") 16211e92d78aSBen Walker p.add_argument('queue_depth', help='Desired target queue depth', type=int) 162236fc9b2dSShuhei Matsumoto p.add_argument('-g', '--chap-group', help="""Authentication group ID for this target node. 1623169bab1fSJaroslaw Chachulski *** Authentication group must be precreated ***""", type=int) 162436fc9b2dSShuhei Matsumoto p.add_argument('-d', '--disable-chap', help="""CHAP authentication should be disabled for this target node. 162536fc9b2dSShuhei Matsumoto *** Mutually exclusive with --require-chap ***""", action='store_true') 162636fc9b2dSShuhei Matsumoto p.add_argument('-r', '--require-chap', help="""CHAP authentication should be required for this target node. 162736fc9b2dSShuhei Matsumoto *** Mutually exclusive with --disable-chap ***""", action='store_true') 16284dd3f4a7SBen Walker p.add_argument( 162936fc9b2dSShuhei Matsumoto '-m', '--mutual-chap', help='CHAP authentication should be mutual/bidirectional.', action='store_true') 1630b94ba1eeSShuhei Matsumoto p.add_argument('-H', '--header-digest', 1631b94ba1eeSShuhei Matsumoto help='Header Digest should be required for this target node.', action='store_true') 1632b94ba1eeSShuhei Matsumoto p.add_argument('-D', '--data-digest', 1633b94ba1eeSShuhei Matsumoto help='Data Digest should be required for this target node.', action='store_true') 1634758b2f94SPawel Kaminski p.set_defaults(func=iscsi_create_target_node) 1635df897ed4SDaniel Verkamp 163680494e3fSPawel Kaminski def iscsi_target_node_add_lun(args): 163780494e3fSPawel Kaminski rpc.iscsi.iscsi_target_node_add_lun( 1638253c61beSheluwei args.client, 1639253c61beSheluwei name=args.name, 1640253c61beSheluwei bdev_name=args.bdev_name, 1641253c61beSheluwei lun_id=args.lun_id) 1642f0456914SShuhei Matsumoto 1643febe9002SJim Harris p = subparsers.add_parser('iscsi_target_node_add_lun', 164480494e3fSPawel Kaminski help='Add LUN to the target node') 1645f0456914SShuhei Matsumoto p.add_argument('name', help='Target node name (ASCII)') 1646f0456914SShuhei Matsumoto p.add_argument('bdev_name', help="""bdev name enclosed in quotes. 1647f0456914SShuhei Matsumoto *** bdev name cannot contain space or colon characters ***""") 1648f0456914SShuhei Matsumoto p.add_argument('-i', dest='lun_id', help="""LUN ID (integer >= 0) 1649dc3e7140SJacek Kalwas *** If LUN ID is omitted or -1, the lowest free one is assigned ***""", type=int) 165080494e3fSPawel Kaminski p.set_defaults(func=iscsi_target_node_add_lun) 1651df897ed4SDaniel Verkamp 1652032a8b1cSPawel Kaminski def iscsi_target_node_set_auth(args): 1653032a8b1cSPawel Kaminski rpc.iscsi.iscsi_target_node_set_auth( 1654844735c9SShuhei Matsumoto args.client, 1655844735c9SShuhei Matsumoto name=args.name, 1656844735c9SShuhei Matsumoto chap_group=args.chap_group, 1657844735c9SShuhei Matsumoto disable_chap=args.disable_chap, 1658844735c9SShuhei Matsumoto require_chap=args.require_chap, 1659844735c9SShuhei Matsumoto mutual_chap=args.mutual_chap) 1660844735c9SShuhei Matsumoto 1661febe9002SJim Harris p = subparsers.add_parser('iscsi_target_node_set_auth', 1662032a8b1cSPawel Kaminski help='Set CHAP authentication for the target node') 1663844735c9SShuhei Matsumoto p.add_argument('name', help='Target node name (ASCII)') 1664844735c9SShuhei Matsumoto p.add_argument('-g', '--chap-group', help="""Authentication group ID for this target node. 1665169bab1fSJaroslaw Chachulski *** Authentication group must be precreated ***""", type=int) 1666844735c9SShuhei Matsumoto p.add_argument('-d', '--disable-chap', help="""CHAP authentication should be disabled for this target node. 1667844735c9SShuhei Matsumoto *** Mutually exclusive with --require-chap ***""", action='store_true') 1668844735c9SShuhei Matsumoto p.add_argument('-r', '--require-chap', help="""CHAP authentication should be required for this target node. 1669844735c9SShuhei Matsumoto *** Mutually exclusive with --disable-chap ***""", action='store_true') 1670844735c9SShuhei Matsumoto p.add_argument('-m', '--mutual-chap', help='CHAP authentication should be mutual/bidirectional.', 1671844735c9SShuhei Matsumoto action='store_true') 1672032a8b1cSPawel Kaminski p.set_defaults(func=iscsi_target_node_set_auth) 1673844735c9SShuhei Matsumoto 1674a1c9546fSPawel Kaminski def iscsi_target_node_add_pg_ig_maps(args): 1675253c61beSheluwei pg_ig_maps = [] 1676253c61beSheluwei for u in args.pg_ig_mappings.strip().split(" "): 1677253c61beSheluwei pg, ig = u.split(":") 1678253c61beSheluwei pg_ig_maps.append({"pg_tag": int(pg), "ig_tag": int(ig)}) 1679a1c9546fSPawel Kaminski rpc.iscsi.iscsi_target_node_add_pg_ig_maps( 1680253c61beSheluwei args.client, 1681253c61beSheluwei pg_ig_maps=pg_ig_maps, 1682253c61beSheluwei name=args.name) 16837e5ec29aSShuhei Matsumoto 1684a1c9546fSPawel Kaminski p = subparsers.add_parser('iscsi_target_node_add_pg_ig_maps', 1685a1c9546fSPawel Kaminski help='Add PG-IG maps to the target node') 16867e5ec29aSShuhei Matsumoto p.add_argument('name', help='Target node name (ASCII)') 16877e5ec29aSShuhei Matsumoto p.add_argument('pg_ig_mappings', help="""List of (Portal_Group_Tag:Initiator_Group_Tag) mappings 16887e5ec29aSShuhei Matsumoto Whitespace separated, quoted, mapping defined with colon 16897e5ec29aSShuhei Matsumoto separated list of "tags" (int > 0) 16907e5ec29aSShuhei Matsumoto Example: '1:1 2:2 2:1' 16917e5ec29aSShuhei Matsumoto *** The Portal/Initiator Groups must be precreated ***""") 1692a1c9546fSPawel Kaminski p.set_defaults(func=iscsi_target_node_add_pg_ig_maps) 1693df897ed4SDaniel Verkamp 1694655b64daSPawel Kaminski def iscsi_target_node_remove_pg_ig_maps(args): 1695253c61beSheluwei pg_ig_maps = [] 1696253c61beSheluwei for u in args.pg_ig_mappings.strip().split(" "): 1697253c61beSheluwei pg, ig = u.split(":") 1698253c61beSheluwei pg_ig_maps.append({"pg_tag": int(pg), "ig_tag": int(ig)}) 1699655b64daSPawel Kaminski rpc.iscsi.iscsi_target_node_remove_pg_ig_maps( 1700253c61beSheluwei args.client, pg_ig_maps=pg_ig_maps, name=args.name) 17017e5ec29aSShuhei Matsumoto 1702655b64daSPawel Kaminski p = subparsers.add_parser('iscsi_target_node_remove_pg_ig_maps', 1703655b64daSPawel Kaminski help='Delete PG-IG maps from the target node') 17047e5ec29aSShuhei Matsumoto p.add_argument('name', help='Target node name (ASCII)') 17057e5ec29aSShuhei Matsumoto p.add_argument('pg_ig_mappings', help="""List of (Portal_Group_Tag:Initiator_Group_Tag) mappings 17067e5ec29aSShuhei Matsumoto Whitespace separated, quoted, mapping defined with colon 17077e5ec29aSShuhei Matsumoto separated list of "tags" (int > 0) 17087e5ec29aSShuhei Matsumoto Example: '1:1 2:2 2:1' 17097e5ec29aSShuhei Matsumoto *** The Portal/Initiator Groups must be precreated ***""") 1710655b64daSPawel Kaminski p.set_defaults(func=iscsi_target_node_remove_pg_ig_maps) 1711df897ed4SDaniel Verkamp 17124ea19788SShuhei Matsumoto def iscsi_target_node_set_redirect(args): 17134ea19788SShuhei Matsumoto rpc.iscsi.iscsi_target_node_set_redirect( 17144ea19788SShuhei Matsumoto args.client, 17154ea19788SShuhei Matsumoto name=args.name, 17164ea19788SShuhei Matsumoto pg_tag=args.pg_tag, 17174ea19788SShuhei Matsumoto redirect_host=args.redirect_host, 17184ea19788SShuhei Matsumoto redirect_port=args.redirect_port) 17194ea19788SShuhei Matsumoto 17204ea19788SShuhei Matsumoto p = subparsers.add_parser('iscsi_target_node_set_redirect', 17218cf5581fSShuhei Matsumoto help="""Update redirect portal of the public portal group for the target node. 17224ea19788SShuhei Matsumoto Omit redirect host and port to clear previously set redirect settings.""") 17234ea19788SShuhei Matsumoto p.add_argument('name', help='Target node name (ASCII)') 17244ea19788SShuhei Matsumoto p.add_argument('pg_tag', help='Portal group tag (unique, integer > 0)', type=int) 1725dc3e7140SJacek Kalwas p.add_argument('-a', '--redirect-host', help='Numeric IP address for redirect portal') 1726dc3e7140SJacek Kalwas p.add_argument('-p', '--redirect-port', help='Numeric TCP port for redirect portal') 17274ea19788SShuhei Matsumoto p.set_defaults(func=iscsi_target_node_set_redirect) 17284ea19788SShuhei Matsumoto 1729e97fd6c9SShuhei Matsumoto def iscsi_target_node_request_logout(args): 1730e97fd6c9SShuhei Matsumoto rpc.iscsi.iscsi_target_node_request_logout( 1731e97fd6c9SShuhei Matsumoto args.client, 1732e97fd6c9SShuhei Matsumoto name=args.name, 1733e97fd6c9SShuhei Matsumoto pg_tag=args.pg_tag) 1734e97fd6c9SShuhei Matsumoto 1735e97fd6c9SShuhei Matsumoto p = subparsers.add_parser('iscsi_target_node_request_logout', 1736e97fd6c9SShuhei Matsumoto help="""For the target node, request connections whose portal group tag 1737e97fd6c9SShuhei Matsumoto match to logout, or request all connections if portal group tag is omitted.""") 1738e97fd6c9SShuhei Matsumoto p.add_argument('name', help='Target node name (ASCII)') 1739dc3e7140SJacek Kalwas p.add_argument('-t', '--pg-tag', help='Portal group tag (unique, integer > 0)', type=int) 1740e97fd6c9SShuhei Matsumoto p.set_defaults(func=iscsi_target_node_request_logout) 1741e97fd6c9SShuhei Matsumoto 17420f4b3490SPawel Kaminski def iscsi_create_portal_group(args): 1743253c61beSheluwei portals = [] 1744c781fdeeSShuhei Matsumoto for p in args.portal_list.strip().split(' '): 1745253c61beSheluwei ip, separator, port_cpumask = p.rpartition(':') 1746253c61beSheluwei split_port_cpumask = port_cpumask.split('@') 1747253c61beSheluwei if len(split_port_cpumask) == 1: 1748253c61beSheluwei port = port_cpumask 1749253c61beSheluwei portals.append({'host': ip, 'port': port}) 1750253c61beSheluwei else: 1751253c61beSheluwei port = split_port_cpumask[0] 1752253c61beSheluwei cpumask = split_port_cpumask[1] 175339e850d1SBen Walker portals.append({'host': ip, 'port': port}) 175439e850d1SBen Walker print("WARNING: Specifying a portal group with a CPU mask is no longer supported. Ignoring it.") 17550f4b3490SPawel Kaminski rpc.iscsi.iscsi_create_portal_group( 1756253c61beSheluwei args.client, 1757253c61beSheluwei portals=portals, 175810d62184SShuhei Matsumoto tag=args.tag, 1759d4ad1f9cSShuhei Matsumoto private=args.private, 1760d4ad1f9cSShuhei Matsumoto wait=args.wait) 17617e5ec29aSShuhei Matsumoto 1762febe9002SJim Harris p = subparsers.add_parser('iscsi_create_portal_group', 17630f4b3490SPawel Kaminski help='Add a portal group') 17644dd3f4a7SBen Walker p.add_argument( 17654dd3f4a7SBen Walker 'tag', help='Portal group tag (unique, integer > 0)', type=int) 176639e850d1SBen Walker p.add_argument('portal_list', help="""List of portals in host:port format, separated by whitespace 176739e850d1SBen Walker Example: '192.168.100.100:3260 192.168.100.100:3261 192.168.100.100:3262""") 176810d62184SShuhei Matsumoto p.add_argument('-p', '--private', help="""Public (false) or private (true) portal group. 176910d62184SShuhei Matsumoto Private portal groups do not have their portals returned by a discovery session. A public 177010d62184SShuhei Matsumoto portal group may optionally specify a redirect portal for non-discovery logins. This redirect 177110d62184SShuhei Matsumoto portal must be from a private portal group.""", action='store_true') 1772d4ad1f9cSShuhei Matsumoto p.add_argument('-w', '--wait', help="""Do not listening on portals until it is started explicitly. 1773d4ad1f9cSShuhei Matsumoto One major iSCSI initiator may not retry login once it failed. Hence for such initiator, listening 1774d4ad1f9cSShuhei Matsumoto on portals should be allowed after all associated target nodes are created.""", action='store_true') 17750f4b3490SPawel Kaminski p.set_defaults(func=iscsi_create_portal_group) 1776df897ed4SDaniel Verkamp 1777024d2865SShuhei Matsumoto def iscsi_start_portal_group(args): 1778024d2865SShuhei Matsumoto rpc.iscsi.iscsi_start_portal_group(args.client, tag=args.tag) 1779024d2865SShuhei Matsumoto 1780024d2865SShuhei Matsumoto p = subparsers.add_parser('iscsi_start_portal_group', 1781024d2865SShuhei Matsumoto help='Start listening on portals if it is not started yet.') 1782024d2865SShuhei Matsumoto p.add_argument( 1783024d2865SShuhei Matsumoto 'tag', help='Portal group tag (unique, integer > 0)', type=int) 1784024d2865SShuhei Matsumoto p.set_defaults(func=iscsi_start_portal_group) 1785024d2865SShuhei Matsumoto 178694dd4b9aSPawel Kaminski def iscsi_create_initiator_group(args): 1787253c61beSheluwei initiators = [] 1788253c61beSheluwei netmasks = [] 1789253c61beSheluwei for i in args.initiator_list.strip().split(' '): 1790253c61beSheluwei initiators.append(i) 1791253c61beSheluwei for n in args.netmask_list.strip().split(' '): 1792253c61beSheluwei netmasks.append(n) 179394dd4b9aSPawel Kaminski rpc.iscsi.iscsi_create_initiator_group( 1794253c61beSheluwei args.client, 1795253c61beSheluwei tag=args.tag, 1796253c61beSheluwei initiators=initiators, 1797253c61beSheluwei netmasks=netmasks) 17987e5ec29aSShuhei Matsumoto 1799febe9002SJim Harris p = subparsers.add_parser('iscsi_create_initiator_group', 18004dd3f4a7SBen Walker help='Add an initiator group') 18014dd3f4a7SBen Walker p.add_argument( 18024dd3f4a7SBen Walker 'tag', help='Initiator group tag (unique, integer > 0)', type=int) 18034dd3f4a7SBen Walker p.add_argument('initiator_list', help="""Whitespace-separated list of initiator hostnames or IP addresses, 1804cf8a9bf2SShuhei Matsumoto enclosed in quotes. Example: 'ANY' or 'iqn.2016-06.io.spdk:host1 iqn.2016-06.io.spdk:host2'""") 18054dd3f4a7SBen Walker p.add_argument('netmask_list', help="""Whitespace-separated list of initiator netmasks enclosed in quotes. 18064dd3f4a7SBen Walker Example: '255.255.0.0 255.248.0.0' etc""") 180794dd4b9aSPawel Kaminski p.set_defaults(func=iscsi_create_initiator_group) 1808df897ed4SDaniel Verkamp 1809a7d07920SPawel Kaminski def iscsi_initiator_group_add_initiators(args): 1810253c61beSheluwei initiators = None 1811253c61beSheluwei netmasks = None 1812253c61beSheluwei if args.initiator_list: 1813253c61beSheluwei initiators = [] 1814253c61beSheluwei for i in args.initiator_list.strip().split(' '): 1815253c61beSheluwei initiators.append(i) 1816253c61beSheluwei if args.netmask_list: 1817253c61beSheluwei netmasks = [] 1818253c61beSheluwei for n in args.netmask_list.strip().split(' '): 1819253c61beSheluwei netmasks.append(n) 1820a7d07920SPawel Kaminski rpc.iscsi.iscsi_initiator_group_add_initiators( 1821253c61beSheluwei args.client, 1822253c61beSheluwei tag=args.tag, 1823253c61beSheluwei initiators=initiators, 1824253c61beSheluwei netmasks=netmasks) 18251e92d78aSBen Walker 1826a7d07920SPawel Kaminski p = subparsers.add_parser('iscsi_initiator_group_add_initiators', 18272982a74dSShuhei Matsumoto help='Add initiators to an existing initiator group') 18282982a74dSShuhei Matsumoto p.add_argument( 18292982a74dSShuhei Matsumoto 'tag', help='Initiator group tag (unique, integer > 0)', type=int) 18302982a74dSShuhei Matsumoto p.add_argument('-n', dest='initiator_list', help="""Whitespace-separated list of initiator hostnames or IP addresses, 1831cf8a9bf2SShuhei Matsumoto enclosed in quotes. This parameter can be omitted. Example: 'ANY' or 1832dc3e7140SJacek Kalwas 'iqn.2016-06.io.spdk:host1 iqn.2016-06.io.spdk:host2'""") 18332982a74dSShuhei Matsumoto p.add_argument('-m', dest='netmask_list', help="""Whitespace-separated list of initiator netmasks enclosed in quotes. 1834dc3e7140SJacek Kalwas This parameter can be omitted. Example: '255.255.0.0 255.248.0.0' etc""") 1835a7d07920SPawel Kaminski p.set_defaults(func=iscsi_initiator_group_add_initiators) 1836df897ed4SDaniel Verkamp 18370fbba82dSPawel Kaminski def iscsi_initiator_group_remove_initiators(args): 1838253c61beSheluwei initiators = None 1839253c61beSheluwei netmasks = None 1840253c61beSheluwei if args.initiator_list: 1841253c61beSheluwei initiators = [] 1842253c61beSheluwei for i in args.initiator_list.strip().split(' '): 1843253c61beSheluwei initiators.append(i) 1844253c61beSheluwei if args.netmask_list: 1845253c61beSheluwei netmasks = [] 1846253c61beSheluwei for n in args.netmask_list.strip().split(' '): 1847253c61beSheluwei netmasks.append(n) 18480fbba82dSPawel Kaminski rpc.iscsi.iscsi_initiator_group_remove_initiators( 1849253c61beSheluwei args.client, 1850253c61beSheluwei tag=args.tag, 1851253c61beSheluwei initiators=initiators, 1852253c61beSheluwei netmasks=netmasks) 18532982a74dSShuhei Matsumoto 18540fbba82dSPawel Kaminski p = subparsers.add_parser('iscsi_initiator_group_remove_initiators', 18552982a74dSShuhei Matsumoto help='Delete initiators from an existing initiator group') 18562982a74dSShuhei Matsumoto p.add_argument( 18572982a74dSShuhei Matsumoto 'tag', help='Initiator group tag (unique, integer > 0)', type=int) 18582982a74dSShuhei Matsumoto p.add_argument('-n', dest='initiator_list', help="""Whitespace-separated list of initiator hostnames or IP addresses, 1859cf8a9bf2SShuhei Matsumoto enclosed in quotes. This parameter can be omitted. Example: 'ANY' or 1860dc3e7140SJacek Kalwas 'iqn.2016-06.io.spdk:host1 iqn.2016-06.io.spdk:host2'""") 18612982a74dSShuhei Matsumoto p.add_argument('-m', dest='netmask_list', help="""Whitespace-separated list of initiator netmasks enclosed in quotes. 1862dc3e7140SJacek Kalwas This parameter can be omitted. Example: '255.255.0.0 255.248.0.0' etc""") 18630fbba82dSPawel Kaminski p.set_defaults(func=iscsi_initiator_group_remove_initiators) 1864df897ed4SDaniel Verkamp 1865a5a296dcSPawel Kaminski def iscsi_delete_target_node(args): 1866a5a296dcSPawel Kaminski rpc.iscsi.iscsi_delete_target_node( 1867253c61beSheluwei args.client, target_node_name=args.target_node_name) 18682982a74dSShuhei Matsumoto 1869febe9002SJim Harris p = subparsers.add_parser('iscsi_delete_target_node', 18704dd3f4a7SBen Walker help='Delete a target node') 18714dd3f4a7SBen Walker p.add_argument('target_node_name', 18724dd3f4a7SBen Walker help='Target node name to be deleted. Example: iqn.2016-06.io.spdk:disk1.') 1873a5a296dcSPawel Kaminski p.set_defaults(func=iscsi_delete_target_node) 1874df897ed4SDaniel Verkamp 18754bb8a88cSPawel Kaminski def iscsi_delete_portal_group(args): 18764bb8a88cSPawel Kaminski rpc.iscsi.iscsi_delete_portal_group(args.client, tag=args.tag) 18771e92d78aSBen Walker 18784bb8a88cSPawel Kaminski p = subparsers.add_parser('iscsi_delete_portal_group', 18794dd3f4a7SBen Walker help='Delete a portal group') 18804dd3f4a7SBen Walker p.add_argument( 18814dd3f4a7SBen Walker 'tag', help='Portal group tag (unique, integer > 0)', type=int) 18824bb8a88cSPawel Kaminski p.set_defaults(func=iscsi_delete_portal_group) 1883df897ed4SDaniel Verkamp 18847eedb271SPawel Kaminski def iscsi_delete_initiator_group(args): 18857eedb271SPawel Kaminski rpc.iscsi.iscsi_delete_initiator_group(args.client, tag=args.tag) 18861e92d78aSBen Walker 18877eedb271SPawel Kaminski p = subparsers.add_parser('iscsi_delete_initiator_group', 18884dd3f4a7SBen Walker help='Delete an initiator group') 18894dd3f4a7SBen Walker p.add_argument( 18904dd3f4a7SBen Walker 'tag', help='Initiator group tag (unique, integer > 0)', type=int) 18917eedb271SPawel Kaminski p.set_defaults(func=iscsi_delete_initiator_group) 1892df897ed4SDaniel Verkamp 18931aa8e4e5SShuhei Matsumoto def iscsi_portal_group_set_auth(args): 18941aa8e4e5SShuhei Matsumoto rpc.iscsi.iscsi_portal_group_set_auth( 18951aa8e4e5SShuhei Matsumoto args.client, 18961aa8e4e5SShuhei Matsumoto tag=args.tag, 18971aa8e4e5SShuhei Matsumoto chap_group=args.chap_group, 18981aa8e4e5SShuhei Matsumoto disable_chap=args.disable_chap, 18991aa8e4e5SShuhei Matsumoto require_chap=args.require_chap, 19001aa8e4e5SShuhei Matsumoto mutual_chap=args.mutual_chap) 19011aa8e4e5SShuhei Matsumoto 19021aa8e4e5SShuhei Matsumoto p = subparsers.add_parser('iscsi_portal_group_set_auth', 19031aa8e4e5SShuhei Matsumoto help='Set CHAP authentication for discovery sessions specific for the portal group') 19041aa8e4e5SShuhei Matsumoto p.add_argument('tag', help='Portal group tag (unique, integer > 0)', type=int) 19051aa8e4e5SShuhei Matsumoto p.add_argument('-g', '--chap-group', help="""Authentication group ID for this portal group. 1906169bab1fSJaroslaw Chachulski *** Authentication group must be precreated ***""", type=int) 19071aa8e4e5SShuhei Matsumoto p.add_argument('-d', '--disable-chap', help="""CHAP authentication should be disabled for this portal group. 19081aa8e4e5SShuhei Matsumoto *** Mutually exclusive with --require-chap ***""", action='store_true') 19091aa8e4e5SShuhei Matsumoto p.add_argument('-r', '--require-chap', help="""CHAP authentication should be required for this portal group. 19101aa8e4e5SShuhei Matsumoto *** Mutually exclusive with --disable-chap ***""", action='store_true') 19111aa8e4e5SShuhei Matsumoto p.add_argument('-m', '--mutual-chap', help='CHAP authentication should be mutual/bidirectional.', 19121aa8e4e5SShuhei Matsumoto action='store_true') 19131aa8e4e5SShuhei Matsumoto p.set_defaults(func=iscsi_portal_group_set_auth) 19141aa8e4e5SShuhei Matsumoto 19156d779941SPawel Kaminski def iscsi_get_connections(args): 19166d779941SPawel Kaminski print_dict(rpc.iscsi.iscsi_get_connections(args.client)) 19171887183fSTomasz Zawadzki 1918febe9002SJim Harris p = subparsers.add_parser('iscsi_get_connections', 19194dd3f4a7SBen Walker help='Display iSCSI connections') 19206d779941SPawel Kaminski p.set_defaults(func=iscsi_get_connections) 1921df897ed4SDaniel Verkamp 192202035b01SChangqi Lu def iscsi_get_stats(args): 192302035b01SChangqi Lu print_dict(rpc.iscsi.iscsi_get_stats(args.client)) 192402035b01SChangqi Lu 192502035b01SChangqi Lu p = subparsers.add_parser('iscsi_get_stats', 192602035b01SChangqi Lu help='Display stat information of iSCSI connections.') 192702035b01SChangqi Lu p.set_defaults(func=iscsi_get_stats) 192802035b01SChangqi Lu 192961f4433cSPawel Kaminski def iscsi_get_options(args): 193061f4433cSPawel Kaminski print_dict(rpc.iscsi.iscsi_get_options(args.client)) 19311887183fSTomasz Zawadzki 1932febe9002SJim Harris p = subparsers.add_parser('iscsi_get_options', 193361f4433cSPawel Kaminski help='Display iSCSI global parameters') 193461f4433cSPawel Kaminski p.set_defaults(func=iscsi_get_options) 1935df897ed4SDaniel Verkamp 1936617f17d8SPawel Kaminski def scsi_get_devices(args): 1937617f17d8SPawel Kaminski print_dict(rpc.iscsi.scsi_get_devices(args.client)) 19381887183fSTomasz Zawadzki 1939febe9002SJim Harris p = subparsers.add_parser('scsi_get_devices', help='Display SCSI devices') 1940617f17d8SPawel Kaminski p.set_defaults(func=scsi_get_devices) 19411887183fSTomasz Zawadzki 1942ae0aae15SLiu Xiaodong # trace 1943dd29bd7eSPawel Kaminski def trace_enable_tpoint_group(args): 1944dd29bd7eSPawel Kaminski rpc.trace.trace_enable_tpoint_group(args.client, name=args.name) 1945ae0aae15SLiu Xiaodong 1946f552937eSwanghailiangx p = subparsers.add_parser('trace_enable_tpoint_group', 1947dd29bd7eSPawel Kaminski help='enable trace on a specific tpoint group') 1948ae0aae15SLiu Xiaodong p.add_argument( 1949ae0aae15SLiu Xiaodong 'name', help="""trace group name we want to enable in tpoint_group_mask. 1950ae0aae15SLiu Xiaodong (for example "bdev" for bdev trace group, "all" for all trace groups).""") 1951dd29bd7eSPawel Kaminski p.set_defaults(func=trace_enable_tpoint_group) 1952ae0aae15SLiu Xiaodong 1953ecca55c9SPawel Kaminski def trace_disable_tpoint_group(args): 1954ecca55c9SPawel Kaminski rpc.trace.trace_disable_tpoint_group(args.client, name=args.name) 1955ae0aae15SLiu Xiaodong 1956f552937eSwanghailiangx p = subparsers.add_parser('trace_disable_tpoint_group', 1957ecca55c9SPawel Kaminski help='disable trace on a specific tpoint group') 1958ae0aae15SLiu Xiaodong p.add_argument( 1959ae0aae15SLiu Xiaodong 'name', help="""trace group name we want to disable in tpoint_group_mask. 1960ae0aae15SLiu Xiaodong (for example "bdev" for bdev trace group, "all" for all trace groups).""") 1961ecca55c9SPawel Kaminski p.set_defaults(func=trace_disable_tpoint_group) 1962ae0aae15SLiu Xiaodong 1963aa499efdSKrzysztof Karas def trace_set_tpoint_mask(args): 1964aa499efdSKrzysztof Karas rpc.trace.trace_set_tpoint_mask(args.client, name=args.name, tpoint_mask=args.tpoint_mask) 1965aa499efdSKrzysztof Karas 1966aa499efdSKrzysztof Karas p = subparsers.add_parser('trace_set_tpoint_mask', 1967aa499efdSKrzysztof Karas help='enable tracepoint mask on a specific tpoint group') 1968aa499efdSKrzysztof Karas p.add_argument( 1969aa499efdSKrzysztof Karas 'name', help="""trace group name we want to enable in tpoint_group_mask. 1970aa499efdSKrzysztof Karas (for example "bdev" for bdev trace group)""") 1971aa499efdSKrzysztof Karas p.add_argument( 1972aa499efdSKrzysztof Karas 'tpoint_mask', help="""tracepoints to be enabled inside a given trace group. 1973aa499efdSKrzysztof Karas (for example value of "0x3" will enable only the first two tpoints in this group)""", 1974aa499efdSKrzysztof Karas type=lambda m: int(m, 16)) 1975aa499efdSKrzysztof Karas p.set_defaults(func=trace_set_tpoint_mask) 1976aa499efdSKrzysztof Karas 1977aa499efdSKrzysztof Karas def trace_clear_tpoint_mask(args): 1978aa499efdSKrzysztof Karas rpc.trace.trace_clear_tpoint_mask(args.client, name=args.name, tpoint_mask=args.tpoint_mask) 1979aa499efdSKrzysztof Karas 1980aa499efdSKrzysztof Karas p = subparsers.add_parser('trace_clear_tpoint_mask', 1981aa499efdSKrzysztof Karas help='disable tracepoint mask on a specific tpoint group') 1982aa499efdSKrzysztof Karas p.add_argument( 1983aa499efdSKrzysztof Karas 'name', help="""trace group name we want to disable in tpoint_group_mask. 1984aa499efdSKrzysztof Karas (for example "bdev" for bdev trace group)""") 1985aa499efdSKrzysztof Karas p.add_argument( 1986aa499efdSKrzysztof Karas 'tpoint_mask', help="""tracepoints to be disabled inside a given trace group. 1987aa499efdSKrzysztof Karas (for example value of "0x3" will disable the first two tpoints in this group)""", 1988aa499efdSKrzysztof Karas type=lambda m: int(m, 16)) 1989aa499efdSKrzysztof Karas p.set_defaults(func=trace_clear_tpoint_mask) 1990aa499efdSKrzysztof Karas 19913650a733SPawel Kaminski def trace_get_tpoint_group_mask(args): 19923650a733SPawel Kaminski print_dict(rpc.trace.trace_get_tpoint_group_mask(args.client)) 1993ae0aae15SLiu Xiaodong 1994f552937eSwanghailiangx p = subparsers.add_parser('trace_get_tpoint_group_mask', help='get trace point group mask') 19953650a733SPawel Kaminski p.set_defaults(func=trace_get_tpoint_group_mask) 1996ae0aae15SLiu Xiaodong 1997cd4ac9c7SXinrui Mao def trace_get_info(args): 1998cd4ac9c7SXinrui Mao print_dict(rpc.trace.trace_get_info(args.client)) 1999cd4ac9c7SXinrui Mao 2000cd4ac9c7SXinrui Mao p = subparsers.add_parser('trace_get_info', 2001cd4ac9c7SXinrui Mao help='get name of shared memory file and list of the available trace point groups') 2002cd4ac9c7SXinrui Mao p.set_defaults(func=trace_get_info) 2003cd4ac9c7SXinrui Mao 20044dd3f4a7SBen Walker # log 20058dc50d2dSMaciej Wawryk def log_set_flag(args): 20068dc50d2dSMaciej Wawryk rpc.log.log_set_flag(args.client, flag=args.flag) 2007870b0e5bSJim Harris 2008d8d29ec0Swanghailiangx p = subparsers.add_parser('log_set_flag', help='set log flag') 2009870b0e5bSJim Harris p.add_argument( 2010870b0e5bSJim Harris 'flag', help='log flag we want to set. (for example "nvme").') 20118dc50d2dSMaciej Wawryk p.set_defaults(func=log_set_flag) 2012870b0e5bSJim Harris 2013b8fffddeSMaciej Wawryk def log_clear_flag(args): 2014b8fffddeSMaciej Wawryk rpc.log.log_clear_flag(args.client, flag=args.flag) 2015870b0e5bSJim Harris 2016d8d29ec0Swanghailiangx p = subparsers.add_parser('log_clear_flag', help='clear log flag') 2017870b0e5bSJim Harris p.add_argument( 2018870b0e5bSJim Harris 'flag', help='log flag we want to clear. (for example "nvme").') 2019b8fffddeSMaciej Wawryk p.set_defaults(func=log_clear_flag) 2020870b0e5bSJim Harris 2021416310d5SMaciej Wawryk def log_get_flags(args): 2022416310d5SMaciej Wawryk print_dict(rpc.log.log_get_flags(args.client)) 2023870b0e5bSJim Harris 2024d8d29ec0Swanghailiangx p = subparsers.add_parser('log_get_flags', help='get log flags') 2025416310d5SMaciej Wawryk p.set_defaults(func=log_get_flags) 2026870b0e5bSJim Harris 20272fd47b7dSMaciej Wawryk def log_set_level(args): 20282fd47b7dSMaciej Wawryk rpc.log.log_set_level(args.client, level=args.level) 20291887183fSTomasz Zawadzki 2030d8d29ec0Swanghailiangx p = subparsers.add_parser('log_set_level', help='set log level') 20314dd3f4a7SBen Walker p.add_argument('level', help='log level we want to set. (for example "DEBUG").') 20322fd47b7dSMaciej Wawryk p.set_defaults(func=log_set_level) 2033df897ed4SDaniel Verkamp 2034ba735b42SMaciej Wawryk def log_get_level(args): 2035ba735b42SMaciej Wawryk print_dict(rpc.log.log_get_level(args.client)) 20361887183fSTomasz Zawadzki 2037d8d29ec0Swanghailiangx p = subparsers.add_parser('log_get_level', help='get log level') 2038ba735b42SMaciej Wawryk p.set_defaults(func=log_get_level) 2039df897ed4SDaniel Verkamp 204095bfca6cSMaciej Wawryk def log_set_print_level(args): 204195bfca6cSMaciej Wawryk rpc.log.log_set_print_level(args.client, level=args.level) 20421887183fSTomasz Zawadzki 2043d8d29ec0Swanghailiangx p = subparsers.add_parser('log_set_print_level', help='set log print level') 20444dd3f4a7SBen Walker p.add_argument('level', help='log print level we want to set. (for example "DEBUG").') 204595bfca6cSMaciej Wawryk p.set_defaults(func=log_set_print_level) 2046df897ed4SDaniel Verkamp 20477c073fc7SMaciej Wawryk def log_get_print_level(args): 20487c073fc7SMaciej Wawryk print_dict(rpc.log.log_get_print_level(args.client)) 2049fca11f15SPiotr Pelplinski 2050d8d29ec0Swanghailiangx p = subparsers.add_parser('log_get_print_level', help='get log print level') 20517c073fc7SMaciej Wawryk p.set_defaults(func=log_get_print_level) 2052fca11f15SPiotr Pelplinski 20534dd3f4a7SBen Walker # lvol 2054de756853SMaciej Wawryk def bdev_lvol_create_lvstore(args): 2055679c3183SMarek Chomnicki # The default unmap clear method may take over 60.0 sec. 2056679c3183SMarek Chomnicki if args.timeout is None: 2057679c3183SMarek Chomnicki args.client.timeout = 90.0 2058de756853SMaciej Wawryk print_json(rpc.lvol.bdev_lvol_create_lvstore(args.client, 20597d45cfc3SDaniel Verkamp bdev_name=args.bdev_name, 20607d45cfc3SDaniel Verkamp lvs_name=args.lvs_name, 2061ca87060dSTomasz Zawadzki cluster_sz=args.cluster_sz, 20624c59c6acSyupeng clear_method=args.clear_method, 2063e0d7428bSAtul Malakar num_md_pages_per_cluster_ratio=args.md_pages_per_cluster_ratio, 2064e0d7428bSAtul Malakar md_page_size=args.md_page_size)) 2065df897ed4SDaniel Verkamp 20667aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_lvol_create_lvstore', help='Add logical volume store on base bdev') 2067511adde0SPiotr Pelplinski p.add_argument('bdev_name', help='base bdev name') 2068511adde0SPiotr Pelplinski p.add_argument('lvs_name', help='name for lvol store') 2069dc3e7140SJacek Kalwas p.add_argument('-c', '--cluster-sz', help='size of cluster (in bytes)', type=int) 2070ca87060dSTomasz Zawadzki p.add_argument('--clear-method', help="""Change clear method for data region. 2071dc3e7140SJacek Kalwas Available: none, unmap, write_zeroes""") 2072dc3e7140SJacek Kalwas p.add_argument('-m', '--md-pages-per-cluster-ratio', help='reserved metadata pages for each cluster', type=int) 2073e0d7428bSAtul Malakar p.add_argument('-s', '--md-page-size', help='size of metadata page (in bytes)', type=int) 2074de756853SMaciej Wawryk p.set_defaults(func=bdev_lvol_create_lvstore) 2075df897ed4SDaniel Verkamp 207690e4ae5dSMaciej Wawryk def bdev_lvol_rename_lvstore(args): 207790e4ae5dSMaciej Wawryk rpc.lvol.bdev_lvol_rename_lvstore(args.client, 20787d45cfc3SDaniel Verkamp old_name=args.old_name, 20797d45cfc3SDaniel Verkamp new_name=args.new_name) 208027f44662STomasz Zawadzki 20817aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_lvol_rename_lvstore', help='Change logical volume store name') 2082f5e590c8SSebastian Basierski p.add_argument('old_name', help='old name') 2083f5e590c8SSebastian Basierski p.add_argument('new_name', help='new name') 208490e4ae5dSMaciej Wawryk p.set_defaults(func=bdev_lvol_rename_lvstore) 2085df897ed4SDaniel Verkamp 20864c59c6acSyupeng def bdev_lvol_grow_lvstore(args): 20874c59c6acSyupeng print_dict(rpc.lvol.bdev_lvol_grow_lvstore(args.client, 20884c59c6acSyupeng uuid=args.uuid, 20894c59c6acSyupeng lvs_name=args.lvs_name)) 20904c59c6acSyupeng 20914c59c6acSyupeng p = subparsers.add_parser('bdev_lvol_grow_lvstore', 20924c59c6acSyupeng help='Grow the lvstore size to the underlying bdev size') 2093dc3e7140SJacek Kalwas p.add_argument('-u', '--uuid', help='lvol store UUID') 2094dc3e7140SJacek Kalwas p.add_argument('-l', '--lvs-name', help='lvol store name') 20954c59c6acSyupeng p.set_defaults(func=bdev_lvol_grow_lvstore) 20964c59c6acSyupeng 2097c57cd922SMaciej Wawryk def bdev_lvol_create(args): 2098c57cd922SMaciej Wawryk print_json(rpc.lvol.bdev_lvol_create(args.client, 20997d45cfc3SDaniel Verkamp lvol_name=args.lvol_name, 21002d590e74SSebastian Brzezinka size_in_mib=args.size_in_mib, 21017d45cfc3SDaniel Verkamp thin_provision=args.thin_provision, 2102adb39585SMaciej Szwed clear_method=args.clear_method, 21037d45cfc3SDaniel Verkamp uuid=args.uuid, 21047d45cfc3SDaniel Verkamp lvs_name=args.lvs_name)) 2105f5e590c8SSebastian Basierski 21067aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_lvol_create', help='Add a bdev with an logical volume backend') 2107dc3e7140SJacek Kalwas p.add_argument('-u', '--uuid', help='lvol store UUID') 2108dc3e7140SJacek Kalwas p.add_argument('-l', '--lvs-name', help='lvol store name') 21099ed6beddSMaciej Szwed p.add_argument('-t', '--thin-provision', action='store_true', help='create lvol bdev as thin provisioned') 2110adb39585SMaciej Szwed p.add_argument('-c', '--clear-method', help="""Change default data clusters clear method. 2111dc3e7140SJacek Kalwas Available: none, unmap, write_zeroes""") 2112511adde0SPiotr Pelplinski p.add_argument('lvol_name', help='name for this lvol') 21132d590e74SSebastian Brzezinka p.add_argument('size_in_mib', help='size in MiB for this bdev', type=int) 2114c57cd922SMaciej Wawryk p.set_defaults(func=bdev_lvol_create) 2115df897ed4SDaniel Verkamp 2116f5cf8ea1SMaciej Wawryk def bdev_lvol_snapshot(args): 2117f5cf8ea1SMaciej Wawryk print_json(rpc.lvol.bdev_lvol_snapshot(args.client, 21187d45cfc3SDaniel Verkamp lvol_name=args.lvol_name, 2119160850f0STomasz Zawadzki snapshot_name=args.snapshot_name)) 212097934c52STomasz Zawadzki 21217aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_lvol_snapshot', help='Create a snapshot of an lvol bdev') 212297934c52STomasz Zawadzki p.add_argument('lvol_name', help='lvol bdev name') 212397934c52STomasz Zawadzki p.add_argument('snapshot_name', help='lvol snapshot name') 2124f5cf8ea1SMaciej Wawryk p.set_defaults(func=bdev_lvol_snapshot) 212597934c52STomasz Zawadzki 2126827b2667SMaciej Wawryk def bdev_lvol_clone(args): 2127827b2667SMaciej Wawryk print_json(rpc.lvol.bdev_lvol_clone(args.client, 21287d45cfc3SDaniel Verkamp snapshot_name=args.snapshot_name, 2129160850f0STomasz Zawadzki clone_name=args.clone_name)) 213097934c52STomasz Zawadzki 21317aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_lvol_clone', help='Create a clone of an lvol snapshot') 213297934c52STomasz Zawadzki p.add_argument('snapshot_name', help='lvol snapshot name') 213397934c52STomasz Zawadzki p.add_argument('clone_name', help='lvol clone name') 2134827b2667SMaciej Wawryk p.set_defaults(func=bdev_lvol_clone) 213597934c52STomasz Zawadzki 2136a67e0eb3SMike Gerdts def bdev_lvol_clone_bdev(args): 2137a67e0eb3SMike Gerdts print_json(rpc.lvol.bdev_lvol_clone_bdev(args.client, 2138a67e0eb3SMike Gerdts bdev=args.bdev, 2139a67e0eb3SMike Gerdts lvs_name=args.lvs_name, 2140a67e0eb3SMike Gerdts clone_name=args.clone_name)) 2141a67e0eb3SMike Gerdts 2142a67e0eb3SMike Gerdts p = subparsers.add_parser('bdev_lvol_clone_bdev', 2143a67e0eb3SMike Gerdts help='Create a clone of a non-lvol bdev') 2144a67e0eb3SMike Gerdts p.add_argument('bdev', help='bdev to clone') 2145a67e0eb3SMike Gerdts p.add_argument('lvs_name', help='logical volume store name') 2146a67e0eb3SMike Gerdts p.add_argument('clone_name', help='lvol clone name') 2147a67e0eb3SMike Gerdts p.set_defaults(func=bdev_lvol_clone_bdev) 2148a67e0eb3SMike Gerdts 21490ce883ceSMaciej Wawryk def bdev_lvol_rename(args): 21500ce883ceSMaciej Wawryk rpc.lvol.bdev_lvol_rename(args.client, 21517d45cfc3SDaniel Verkamp old_name=args.old_name, 21527d45cfc3SDaniel Verkamp new_name=args.new_name) 215327f44662STomasz Zawadzki 21547aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_lvol_rename', help='Change lvol bdev name') 2155526cd580SSebastian Basierski p.add_argument('old_name', help='lvol bdev name') 2156526cd580SSebastian Basierski p.add_argument('new_name', help='new lvol name') 21570ce883ceSMaciej Wawryk p.set_defaults(func=bdev_lvol_rename) 2158526cd580SSebastian Basierski 21597a294f4cSMaciej Wawryk def bdev_lvol_inflate(args): 21607a294f4cSMaciej Wawryk rpc.lvol.bdev_lvol_inflate(args.client, 2161fda8596eSMaciej Szwed name=args.name) 2162fda8596eSMaciej Szwed 21637aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_lvol_inflate', help='Make thin provisioned lvol a thick provisioned lvol') 2164fda8596eSMaciej Szwed p.add_argument('name', help='lvol bdev name') 21657a294f4cSMaciej Wawryk p.set_defaults(func=bdev_lvol_inflate) 2166fda8596eSMaciej Szwed 2167975efa2aSMaciej Wawryk def bdev_lvol_decouple_parent(args): 2168975efa2aSMaciej Wawryk rpc.lvol.bdev_lvol_decouple_parent(args.client, 2169635a1aa8STomasz Kulasek name=args.name) 2170635a1aa8STomasz Kulasek 21717aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_lvol_decouple_parent', help='Decouple parent of lvol') 2172635a1aa8STomasz Kulasek p.add_argument('name', help='lvol bdev name') 2173975efa2aSMaciej Wawryk p.set_defaults(func=bdev_lvol_decouple_parent) 2174635a1aa8STomasz Kulasek 2175c2d85bb2SMaciej Wawryk def bdev_lvol_resize(args): 2176c2d85bb2SMaciej Wawryk rpc.lvol.bdev_lvol_resize(args.client, 21777d45cfc3SDaniel Verkamp name=args.name, 21782d590e74SSebastian Brzezinka size_in_mib=args.size_in_mib) 21797552707eSSlawomir Mrozowicz 21807aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_lvol_resize', help='Resize existing lvol bdev') 21817552707eSSlawomir Mrozowicz p.add_argument('name', help='lvol bdev name') 21822d590e74SSebastian Brzezinka p.add_argument('size_in_mib', help='new size in MiB for this bdev', type=int) 2183c2d85bb2SMaciej Wawryk p.set_defaults(func=bdev_lvol_resize) 2184df897ed4SDaniel Verkamp 2185b7ad0bd0SMaciej Wawryk def bdev_lvol_set_read_only(args): 2186b7ad0bd0SMaciej Wawryk rpc.lvol.bdev_lvol_set_read_only(args.client, 21873bb815aeSTomasz Zawadzki name=args.name) 21883bb815aeSTomasz Zawadzki 21897aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_lvol_set_read_only', help='Mark lvol bdev as read only') 21903bb815aeSTomasz Zawadzki p.add_argument('name', help='lvol bdev name') 2191b7ad0bd0SMaciej Wawryk p.set_defaults(func=bdev_lvol_set_read_only) 21923bb815aeSTomasz Zawadzki 2193b5fdf4ecSMaciej Wawryk def bdev_lvol_delete(args): 2194b5fdf4ecSMaciej Wawryk rpc.lvol.bdev_lvol_delete(args.client, 2195f9d52c9eSDaniel Verkamp name=args.name) 2196f9d52c9eSDaniel Verkamp 21977aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_lvol_delete', help='Destroy a logical volume') 2198f9d52c9eSDaniel Verkamp p.add_argument('name', help='lvol bdev name') 2199b5fdf4ecSMaciej Wawryk p.set_defaults(func=bdev_lvol_delete) 2200f9d52c9eSDaniel Verkamp 22019b3554b5SDamiano Cipriani def bdev_lvol_start_shallow_copy(args): 22029b3554b5SDamiano Cipriani print_json(rpc.lvol.bdev_lvol_start_shallow_copy(args.client, 22039b3554b5SDamiano Cipriani src_lvol_name=args.src_lvol_name, 22049b3554b5SDamiano Cipriani dst_bdev_name=args.dst_bdev_name)) 22059b3554b5SDamiano Cipriani 22068c41f0d3SDamiano Cipriani p = subparsers.add_parser('bdev_lvol_start_shallow_copy', 22078c41f0d3SDamiano Cipriani help="""Start a shallow copy of an lvol over a given bdev. The status of the operation 22088c41f0d3SDamiano Cipriani can be obtained with bdev_lvol_check_shallow_copy""") 22099b3554b5SDamiano Cipriani p.add_argument('src_lvol_name', help='source lvol name') 22109b3554b5SDamiano Cipriani p.add_argument('dst_bdev_name', help='destination bdev name') 22119b3554b5SDamiano Cipriani p.set_defaults(func=bdev_lvol_start_shallow_copy) 22129b3554b5SDamiano Cipriani 22138c41f0d3SDamiano Cipriani def bdev_lvol_check_shallow_copy(args): 22148c41f0d3SDamiano Cipriani print_json(rpc.lvol.bdev_lvol_check_shallow_copy(args.client, 22158c41f0d3SDamiano Cipriani operation_id=args.operation_id)) 22168c41f0d3SDamiano Cipriani 22178c41f0d3SDamiano Cipriani p = subparsers.add_parser('bdev_lvol_check_shallow_copy', help='Get shallow copy status') 22188c41f0d3SDamiano Cipriani p.add_argument('operation_id', help='operation identifier', type=int) 22198c41f0d3SDamiano Cipriani p.set_defaults(func=bdev_lvol_check_shallow_copy) 22208c41f0d3SDamiano Cipriani 222199ffb3d9SDamiano Cipriani def bdev_lvol_set_parent(args): 222299ffb3d9SDamiano Cipriani rpc.lvol.bdev_lvol_set_parent(args.client, 222399ffb3d9SDamiano Cipriani lvol_name=args.lvol_name, 2224e591409fSHadi Moshayedi parent_name=args.parent_name) 222599ffb3d9SDamiano Cipriani 222699ffb3d9SDamiano Cipriani p = subparsers.add_parser('bdev_lvol_set_parent', help='Set the parent snapshot of a lvol') 222799ffb3d9SDamiano Cipriani p.add_argument('lvol_name', help='lvol name') 2228e591409fSHadi Moshayedi p.add_argument('parent_name', help='parent snapshot name') 222999ffb3d9SDamiano Cipriani p.set_defaults(func=bdev_lvol_set_parent) 223099ffb3d9SDamiano Cipriani 2231672ba928SDamiano Cipriani def bdev_lvol_set_parent_bdev(args): 2232672ba928SDamiano Cipriani rpc.lvol.bdev_lvol_set_parent_bdev(args.client, 2233672ba928SDamiano Cipriani lvol_name=args.lvol_name, 2234e591409fSHadi Moshayedi parent_name=args.parent_name) 2235672ba928SDamiano Cipriani 2236672ba928SDamiano Cipriani p = subparsers.add_parser('bdev_lvol_set_parent_bdev', help='Set the parent external snapshot of a lvol') 2237672ba928SDamiano Cipriani p.add_argument('lvol_name', help='lvol name') 2238e591409fSHadi Moshayedi p.add_argument('parent_name', help='parent external snapshot name') 2239672ba928SDamiano Cipriani p.set_defaults(func=bdev_lvol_set_parent_bdev) 2240672ba928SDamiano Cipriani 22414c049618SMaciej Wawryk def bdev_lvol_delete_lvstore(args): 22424c049618SMaciej Wawryk rpc.lvol.bdev_lvol_delete_lvstore(args.client, 22437d45cfc3SDaniel Verkamp uuid=args.uuid, 22447d45cfc3SDaniel Verkamp lvs_name=args.lvs_name) 224527f44662STomasz Zawadzki 22467aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_lvol_delete_lvstore', help='Destroy an logical volume store') 2247dc3e7140SJacek Kalwas p.add_argument('-u', '--uuid', help='lvol store UUID') 2248dc3e7140SJacek Kalwas p.add_argument('-l', '--lvs-name', help='lvol store name') 22494c049618SMaciej Wawryk p.set_defaults(func=bdev_lvol_delete_lvstore) 2250df897ed4SDaniel Verkamp 22510b3f378fSMaciej Wawryk def bdev_lvol_get_lvstores(args): 22520b3f378fSMaciej Wawryk print_dict(rpc.lvol.bdev_lvol_get_lvstores(args.client, 22537d45cfc3SDaniel Verkamp uuid=args.uuid, 22547d45cfc3SDaniel Verkamp lvs_name=args.lvs_name)) 2255e21aede9STomasz Zawadzki 22567aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_lvol_get_lvstores', help='Display current logical volume store list') 2257dc3e7140SJacek Kalwas p.add_argument('-u', '--uuid', help='lvol store UUID') 2258dc3e7140SJacek Kalwas p.add_argument('-l', '--lvs-name', help='lvol store name') 22590b3f378fSMaciej Wawryk p.set_defaults(func=bdev_lvol_get_lvstores) 2260e21aede9STomasz Zawadzki 2261f3c14b8dSMike Gerdts def bdev_lvol_get_lvols(args): 2262f3c14b8dSMike Gerdts print_dict(rpc.lvol.bdev_lvol_get_lvols(args.client, 2263f3c14b8dSMike Gerdts lvs_uuid=args.lvs_uuid, 2264f3c14b8dSMike Gerdts lvs_name=args.lvs_name)) 2265f3c14b8dSMike Gerdts 2266f3c14b8dSMike Gerdts p = subparsers.add_parser('bdev_lvol_get_lvols', help='Display current logical volume list') 2267dc3e7140SJacek Kalwas p.add_argument('-u', '--lvs-uuid', help='only lvols in lvol store UUID') 2268dc3e7140SJacek Kalwas p.add_argument('-l', '--lvs-name', help='only lvols in lvol store name') 2269f3c14b8dSMike Gerdts p.set_defaults(func=bdev_lvol_get_lvols) 2270f3c14b8dSMike Gerdts 2271f39350beSArtur Paszkiewicz def bdev_raid_set_options(args): 2272f39350beSArtur Paszkiewicz rpc.bdev.bdev_raid_set_options(args.client, 227389fd1730Sxupeng9 process_window_size_kb=args.process_window_size_kb, 227489fd1730Sxupeng9 process_max_bandwidth_mb_sec=args.process_max_bandwidth_mb_sec) 2275f39350beSArtur Paszkiewicz 2276f39350beSArtur Paszkiewicz p = subparsers.add_parser('bdev_raid_set_options', 2277f39350beSArtur Paszkiewicz help='Set options for bdev raid.') 2278f39350beSArtur Paszkiewicz p.add_argument('-w', '--process-window-size-kb', type=int, 2279f39350beSArtur Paszkiewicz help="Background process (e.g. rebuild) window size in KiB") 228089fd1730Sxupeng9 p.add_argument('-b', '--process-max-bandwidth-mb-sec', type=int, 228189fd1730Sxupeng9 help="Background process (e.g. rebuild) maximum bandwidth in MiB/Sec") 2282f39350beSArtur Paszkiewicz 2283f39350beSArtur Paszkiewicz p.set_defaults(func=bdev_raid_set_options) 2284f39350beSArtur Paszkiewicz 2285b9477173SMaciej Wawryk def bdev_raid_get_bdevs(args): 2286ec6d94b6SArtur Paszkiewicz print_json(rpc.bdev.bdev_raid_get_bdevs(args.client, 228741586b0fSKunal Sablok category=args.category)) 228841586b0fSKunal Sablok 22897aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_raid_get_bdevs', 2290ec6d94b6SArtur Paszkiewicz help="""This is used to list all the raid bdev details based on the input category 229141586b0fSKunal Sablok requested. Category should be one of 'all', 'online', 'configuring' or 'offline'. 'all' means all the raid bdevs whether 229241586b0fSKunal Sablok they are online or configuring or offline. 'online' is the raid bdev which is registered with bdev layer. 'configuring' 229341586b0fSKunal Sablok is the raid bdev which does not have full configuration discovered yet. 'offline' is the raid bdev which is not registered 229441586b0fSKunal Sablok with bdev as of now and it has encountered any error or user has requested to offline the raid bdev""") 229541586b0fSKunal Sablok p.add_argument('category', help='all or online or configuring or offline') 2296b9477173SMaciej Wawryk p.set_defaults(func=bdev_raid_get_bdevs) 229741586b0fSKunal Sablok 2298f0731534SMaciej Wawryk def bdev_raid_create(args): 229941586b0fSKunal Sablok base_bdevs = [] 2300c00eb482SYankun Li for u in args.base_bdevs.strip().split(): 230141586b0fSKunal Sablok base_bdevs.append(u) 230241586b0fSKunal Sablok 2303f0731534SMaciej Wawryk rpc.bdev.bdev_raid_create(args.client, 230441586b0fSKunal Sablok name=args.name, 23058a1acca6Spaul luse strip_size_kb=args.strip_size_kb, 230641586b0fSKunal Sablok raid_level=args.raid_level, 23071db41324SKrzysztof Karas base_bdevs=base_bdevs, 2308e39760fdSKrzysztof Smolinski uuid=args.uuid, 2309e39760fdSKrzysztof Smolinski superblock=args.superblock) 23107aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_raid_create', help='Create new raid bdev') 231141586b0fSKunal Sablok p.add_argument('-n', '--name', help='raid bdev name', required=True) 2312928db416Syidong0635 p.add_argument('-z', '--strip-size-kb', help='strip size in KB', type=int) 2313208f21cdSKrzysztof Smolinski p.add_argument('-r', '--raid-level', help='raid level, raid0, raid1 and a special level concat are supported', required=True) 231441586b0fSKunal Sablok p.add_argument('-b', '--base-bdevs', help='base bdevs name, whitespace separated list in quotes', required=True) 2315dc3e7140SJacek Kalwas p.add_argument('--uuid', help='UUID for this raid bdev') 2316e39760fdSKrzysztof Smolinski p.add_argument('-s', '--superblock', help='information about raid bdev will be stored in superblock on each base bdev, ' 2317e39760fdSKrzysztof Smolinski 'disabled by default due to backward compatibility', action='store_true') 2318f0731534SMaciej Wawryk p.set_defaults(func=bdev_raid_create) 231941586b0fSKunal Sablok 232027d8ca2cSMaciej Wawryk def bdev_raid_delete(args): 232127d8ca2cSMaciej Wawryk rpc.bdev.bdev_raid_delete(args.client, 232241586b0fSKunal Sablok name=args.name) 23237aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_raid_delete', help='Delete existing raid bdev') 232441586b0fSKunal Sablok p.add_argument('name', help='raid bdev name') 232527d8ca2cSMaciej Wawryk p.set_defaults(func=bdev_raid_delete) 232641586b0fSKunal Sablok 2327524129a9SKrzysztof Smolinski def bdev_raid_add_base_bdev(args): 2328524129a9SKrzysztof Smolinski rpc.bdev.bdev_raid_add_base_bdev(args.client, 2329524129a9SKrzysztof Smolinski raid_bdev=args.raid_bdev, 2330524129a9SKrzysztof Smolinski base_bdev=args.base_bdev) 2331524129a9SKrzysztof Smolinski p = subparsers.add_parser('bdev_raid_add_base_bdev', help='Add base bdev to existing raid bdev') 2332524129a9SKrzysztof Smolinski p.add_argument('raid_bdev', help='raid bdev name') 2333524129a9SKrzysztof Smolinski p.add_argument('base_bdev', help='base bdev name') 2334524129a9SKrzysztof Smolinski p.set_defaults(func=bdev_raid_add_base_bdev) 2335524129a9SKrzysztof Smolinski 233623850b03SKrzysztof Smolinski def bdev_raid_remove_base_bdev(args): 233723850b03SKrzysztof Smolinski rpc.bdev.bdev_raid_remove_base_bdev(args.client, 233823850b03SKrzysztof Smolinski name=args.name) 233923850b03SKrzysztof Smolinski p = subparsers.add_parser('bdev_raid_remove_base_bdev', help='Remove base bdev from existing raid bdev') 234023850b03SKrzysztof Smolinski p.add_argument('name', help='base bdev name') 234123850b03SKrzysztof Smolinski p.set_defaults(func=bdev_raid_remove_base_bdev) 234223850b03SKrzysztof Smolinski 2343a5dbccf0SPawel Wodkowski # split 2344a1bda4e1SMaciej Wawryk def bdev_split_create(args): 2345a1bda4e1SMaciej Wawryk print_array(rpc.bdev.bdev_split_create(args.client, 23461ea97654SDaniel Verkamp base_bdev=args.base_bdev, 23471ea97654SDaniel Verkamp split_count=args.split_count, 23481ea97654SDaniel Verkamp split_size_mb=args.split_size_mb)) 2349a5dbccf0SPawel Wodkowski 23507aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_split_create', 2351a1bda4e1SMaciej Wawryk help="""Add given disk name to split config. If bdev with base_name 2352a5dbccf0SPawel Wodkowski name exist the split bdevs will be created right away, if not split bdevs will be created when base bdev became 2353a5dbccf0SPawel Wodkowski available (during examination process).""") 2354a5dbccf0SPawel Wodkowski p.add_argument('base_bdev', help='base bdev name') 2355ba81cb16SJaroslaw Chachulski p.add_argument('-s', '--split-size-mb', help='size in MiB for each bdev', type=int) 2356a5dbccf0SPawel Wodkowski p.add_argument('split_count', help="""Optional - number of split bdevs to create. Total size * split_count must not 2357a5dbccf0SPawel Wodkowski exceed the base bdev size.""", type=int) 2358a1bda4e1SMaciej Wawryk p.set_defaults(func=bdev_split_create) 2359a5dbccf0SPawel Wodkowski 23607df830a8SMaciej Wawryk def bdev_split_delete(args): 23617df830a8SMaciej Wawryk rpc.bdev.bdev_split_delete(args.client, 23621ea97654SDaniel Verkamp base_bdev=args.base_bdev) 2363a5dbccf0SPawel Wodkowski 23647aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_split_delete', help="""Delete split config with all created splits.""") 2365a5dbccf0SPawel Wodkowski p.add_argument('base_bdev', help='base bdev name') 23667df830a8SMaciej Wawryk p.set_defaults(func=bdev_split_delete) 2367a5dbccf0SPawel Wodkowski 23687c233adeSWojciech Malikowski # ftl 2369ee3403b5SPawel Kaminski def bdev_ftl_create(args): 2370ee3403b5SPawel Kaminski print_dict(rpc.bdev.bdev_ftl_create(args.client, 23717c233adeSWojciech Malikowski name=args.name, 2372f2c8083eSWojciech Malikowski base_bdev=args.base_bdev, 2373a0cb5e9dSKonrad Sztyber uuid=args.uuid, 237442fe2e9bSMateusz Kozlowski cache=args.cache, 2375cd115ecfSMateusz Kozlowski overprovisioning=args.overprovisioning, 2376e7e5bc07SKozlowski Mateusz l2p_dram_limit=args.l2p_dram_limit, 23770e33da49SKozlowski Mateusz core_mask=args.core_mask, 23780e33da49SKozlowski Mateusz fast_shutdown=args.fast_shutdown)) 23797c233adeSWojciech Malikowski 23807aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_ftl_create', help='Add FTL bdev') 23817c233adeSWojciech Malikowski p.add_argument('-b', '--name', help="Name of the bdev", required=True) 2382be90ea6eSArtur Paszkiewicz p.add_argument('-d', '--base-bdev', help='Name of bdev used as underlying device', 2383f2c8083eSWojciech Malikowski required=True) 23847c233adeSWojciech Malikowski p.add_argument('-u', '--uuid', help='UUID of restored bdev (not applicable when creating new ' 23857c233adeSWojciech Malikowski 'instance): e.g. b286d19a-0059-4709-abcd-9f7732b1567d (optional)') 2386be90ea6eSArtur Paszkiewicz p.add_argument('-c', '--cache', help='Name of the bdev to be used as a write buffer cache', 2387be90ea6eSArtur Paszkiewicz required=True) 2388cd115ecfSMateusz Kozlowski p.add_argument('--overprovisioning', help='Percentage of device used for relocation, not exposed' 2389be90ea6eSArtur Paszkiewicz ' to user (optional); default 20', type=int) 2390e7e5bc07SKozlowski Mateusz p.add_argument('--l2p-dram-limit', help='l2p size that could reside in DRAM (optional); default 2048', 2391e7e5bc07SKozlowski Mateusz type=int) 2392be90ea6eSArtur Paszkiewicz p.add_argument('--core-mask', help='CPU core mask - which cores will be used for ftl core thread, ' 2393be90ea6eSArtur Paszkiewicz 'by default core thread will be set to the main application core (optional)') 23940e33da49SKozlowski Mateusz p.add_argument('-f', '--fast-shutdown', help="Enable fast shutdown", action='store_true') 2395ee3403b5SPawel Kaminski p.set_defaults(func=bdev_ftl_create) 23967c233adeSWojciech Malikowski 2397be90ea6eSArtur Paszkiewicz def bdev_ftl_load(args): 2398be90ea6eSArtur Paszkiewicz print_dict(rpc.bdev.bdev_ftl_load(args.client, 2399be90ea6eSArtur Paszkiewicz name=args.name, 2400be90ea6eSArtur Paszkiewicz base_bdev=args.base_bdev, 2401be90ea6eSArtur Paszkiewicz uuid=args.uuid, 2402be90ea6eSArtur Paszkiewicz cache=args.cache, 2403be90ea6eSArtur Paszkiewicz overprovisioning=args.overprovisioning, 2404e7e5bc07SKozlowski Mateusz l2p_dram_limit=args.l2p_dram_limit, 24050e33da49SKozlowski Mateusz core_mask=args.core_mask, 24060e33da49SKozlowski Mateusz fast_shutdown=args.fast_shutdown)) 2407be90ea6eSArtur Paszkiewicz 2408be90ea6eSArtur Paszkiewicz p = subparsers.add_parser('bdev_ftl_load', help='Load FTL bdev') 2409be90ea6eSArtur Paszkiewicz p.add_argument('-b', '--name', help="Name of the bdev", required=True) 2410be90ea6eSArtur Paszkiewicz p.add_argument('-d', '--base-bdev', help='Name of bdev used as underlying device', 2411be90ea6eSArtur Paszkiewicz required=True) 2412be90ea6eSArtur Paszkiewicz p.add_argument('-u', '--uuid', help='UUID of restored bdev', required=True) 2413be90ea6eSArtur Paszkiewicz p.add_argument('-c', '--cache', help='Name of the bdev to be used as a write buffer cache', 2414be90ea6eSArtur Paszkiewicz required=True) 2415be90ea6eSArtur Paszkiewicz p.add_argument('--overprovisioning', help='Percentage of device used for relocation, not exposed' 2416be90ea6eSArtur Paszkiewicz ' to user (optional); default 20', type=int) 2417e7e5bc07SKozlowski Mateusz p.add_argument('--l2p-dram-limit', help='l2p size that could reside in DRAM (optional); default 2048', 2418e7e5bc07SKozlowski Mateusz type=int) 2419be90ea6eSArtur Paszkiewicz p.add_argument('--core-mask', help='CPU core mask - which cores will be used for ftl core thread, ' 2420be90ea6eSArtur Paszkiewicz 'by default core thread will be set to the main application core (optional)') 24210e33da49SKozlowski Mateusz p.add_argument('-f', '--fast-shutdown', help="Enable fast shutdown", action='store_true') 2422be90ea6eSArtur Paszkiewicz p.set_defaults(func=bdev_ftl_load) 2423be90ea6eSArtur Paszkiewicz 2424be90ea6eSArtur Paszkiewicz def bdev_ftl_unload(args): 2425cec20de8SHailiang Wang print_dict(rpc.bdev.bdev_ftl_unload(args.client, name=args.name, fast_shutdown=args.fast_shutdown)) 2426be90ea6eSArtur Paszkiewicz 2427be90ea6eSArtur Paszkiewicz p = subparsers.add_parser('bdev_ftl_unload', help='Unload FTL bdev') 2428be90ea6eSArtur Paszkiewicz p.add_argument('-b', '--name', help="Name of the bdev", required=True) 24290e33da49SKozlowski Mateusz p.add_argument('-f', '--fast-shutdown', help="Fast shutdown", action='store_true') 2430be90ea6eSArtur Paszkiewicz p.set_defaults(func=bdev_ftl_unload) 2431be90ea6eSArtur Paszkiewicz 2432ee3403b5SPawel Kaminski def bdev_ftl_delete(args): 24330e33da49SKozlowski Mateusz print_dict(rpc.bdev.bdev_ftl_delete(args.client, name=args.name, fast_shutdown=args.fast_shutdown)) 24347c233adeSWojciech Malikowski 24357aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_ftl_delete', help='Delete FTL bdev') 24367c233adeSWojciech Malikowski p.add_argument('-b', '--name', help="Name of the bdev", required=True) 24370e33da49SKozlowski Mateusz p.add_argument('-f', '--fast-shutdown', help="Fast shutdown", action='store_true') 2438ee3403b5SPawel Kaminski p.set_defaults(func=bdev_ftl_delete) 24397c233adeSWojciech Malikowski 24402c7c8b6cSKozlowski Mateusz def bdev_ftl_unmap(args): 24412c7c8b6cSKozlowski Mateusz print_dict(rpc.bdev.bdev_ftl_unmap(args.client, name=args.name, 24422c7c8b6cSKozlowski Mateusz lba=args.lba, 24432c7c8b6cSKozlowski Mateusz num_blocks=args.num_blocks)) 24442c7c8b6cSKozlowski Mateusz 24452c7c8b6cSKozlowski Mateusz p = subparsers.add_parser('bdev_ftl_unmap', help='FTL unmap') 24462c7c8b6cSKozlowski Mateusz p.add_argument('-b', '--name', help="Name of the bdev", required=True) 24472c7c8b6cSKozlowski Mateusz p.add_argument('--lba', help='start LBA', required=True, type=int) 24482c7c8b6cSKozlowski Mateusz p.add_argument('--num-blocks', help='num blocks', required=True, type=int) 24492c7c8b6cSKozlowski Mateusz p.set_defaults(func=bdev_ftl_unmap) 24502c7c8b6cSKozlowski Mateusz 24511790ee8aSArtur Paszkiewicz def bdev_ftl_get_stats(args): 24521790ee8aSArtur Paszkiewicz print_dict(rpc.bdev.bdev_ftl_get_stats(args.client, name=args.name)) 24531790ee8aSArtur Paszkiewicz 24541790ee8aSArtur Paszkiewicz p = subparsers.add_parser('bdev_ftl_get_stats', help='print ftl stats') 24551790ee8aSArtur Paszkiewicz p.add_argument('-b', '--name', help="Name of the bdev", required=True) 24561790ee8aSArtur Paszkiewicz p.set_defaults(func=bdev_ftl_get_stats) 24571790ee8aSArtur Paszkiewicz 2458309682caSMateusz Kozlowski def bdev_ftl_get_properties(args): 2459309682caSMateusz Kozlowski print_dict(rpc.bdev.bdev_ftl_get_properties(args.client, name=args.name)) 2460309682caSMateusz Kozlowski 2461309682caSMateusz Kozlowski p = subparsers.add_parser('bdev_ftl_get_properties', help='Print FTL properties') 2462309682caSMateusz Kozlowski p.add_argument('-b', '--name', help="Name of the bdev", required=True) 2463309682caSMateusz Kozlowski p.set_defaults(func=bdev_ftl_get_properties) 2464309682caSMateusz Kozlowski 2465c959f72eSMateusz Kozlowski def bdev_ftl_set_property(args): 2466c959f72eSMateusz Kozlowski print_dict(rpc.bdev.bdev_ftl_set_property(args.client, name=args.name, 2467c959f72eSMateusz Kozlowski ftl_property=args.property, 2468c959f72eSMateusz Kozlowski value=args.value)) 2469c959f72eSMateusz Kozlowski 2470c959f72eSMateusz Kozlowski p = subparsers.add_parser('bdev_ftl_set_property', help='Set FTL property') 2471c959f72eSMateusz Kozlowski p.add_argument('-b', '--name', help="Name of the bdev", required=True) 2472c959f72eSMateusz Kozlowski p.add_argument('-p', '--property', help="Name of the property to be set", required=True) 2473c959f72eSMateusz Kozlowski p.add_argument('-v', '--value', help="Value of the property", required=True) 2474c959f72eSMateusz Kozlowski p.set_defaults(func=bdev_ftl_set_property) 2475c959f72eSMateusz Kozlowski 2476825ae66bSWojciech Malikowski # vmd 2477f0441b29SKonrad Sztyber def vmd_enable(args): 2478f0441b29SKonrad Sztyber print_dict(rpc.vmd.vmd_enable(args.client)) 2479825ae66bSWojciech Malikowski 2480f0441b29SKonrad Sztyber p = subparsers.add_parser('vmd_enable', aliases=['enable_vmd'], help='Enable VMD enumeration') 2481f0441b29SKonrad Sztyber p.set_defaults(func=vmd_enable) 2482825ae66bSWojciech Malikowski 2483052ea0baSKonrad Sztyber def vmd_remove_device(args): 2484052ea0baSKonrad Sztyber print_dict(rpc.vmd.vmd_remove_device(args.client, addr=args.addr)) 2485052ea0baSKonrad Sztyber 2486052ea0baSKonrad Sztyber p = subparsers.add_parser('vmd_remove_device', help='Remove a device behind VMD') 2487052ea0baSKonrad Sztyber p.add_argument('addr', help='Address of the device to remove', type=str) 2488052ea0baSKonrad Sztyber p.set_defaults(func=vmd_remove_device) 2489052ea0baSKonrad Sztyber 24904cbd23e2SKonrad Sztyber def vmd_rescan(args): 24914cbd23e2SKonrad Sztyber print_dict(rpc.vmd.vmd_rescan(args.client)) 24924cbd23e2SKonrad Sztyber 24934cbd23e2SKonrad Sztyber p = subparsers.add_parser('vmd_rescan', help='Force a rescan of the devices behind VMD') 24944cbd23e2SKonrad Sztyber p.set_defaults(func=vmd_rescan) 24954cbd23e2SKonrad Sztyber 2496a1944e01SYifan Bian # ublk 2497a1944e01SYifan Bian def ublk_create_target(args): 2498a1944e01SYifan Bian rpc.ublk.ublk_create_target(args.client, 24999b8579e4SChangpeng Liu cpumask=args.cpumask, 25009b8579e4SChangpeng Liu disable_user_copy=args.disable_user_copy) 2501a1944e01SYifan Bian p = subparsers.add_parser('ublk_create_target', 2502a1944e01SYifan Bian help='Create spdk ublk target for ublk dev') 2503a1944e01SYifan Bian p.add_argument('-m', '--cpumask', help='cpu mask for ublk dev') 25049b8579e4SChangpeng Liu p.add_argument('--disable-user-copy', help='Disable user copy feature', action='store_true') 2505a1944e01SYifan Bian p.set_defaults(func=ublk_create_target) 2506a1944e01SYifan Bian 2507a1944e01SYifan Bian def ublk_destroy_target(args): 2508a1944e01SYifan Bian rpc.ublk.ublk_destroy_target(args.client) 2509a1944e01SYifan Bian p = subparsers.add_parser('ublk_destroy_target', 2510a1944e01SYifan Bian help='Destroy spdk ublk target for ublk dev') 2511a1944e01SYifan Bian p.set_defaults(func=ublk_destroy_target) 2512a1944e01SYifan Bian 2513e8a94a71SYifan Bian def ublk_start_disk(args): 2514e8a94a71SYifan Bian print(rpc.ublk.ublk_start_disk(args.client, 2515e8a94a71SYifan Bian bdev_name=args.bdev_name, 2516e8a94a71SYifan Bian ublk_id=args.ublk_id, 2517e8a94a71SYifan Bian num_queues=args.num_queues, 2518e8a94a71SYifan Bian queue_depth=args.queue_depth)) 2519e8a94a71SYifan Bian 2520e8a94a71SYifan Bian p = subparsers.add_parser('ublk_start_disk', 2521e8a94a71SYifan Bian help='Export a bdev as a ublk device') 2522e8a94a71SYifan Bian p.add_argument('bdev_name', help='Blockdev name to be exported. Example: Malloc0.') 2523e8a94a71SYifan Bian p.add_argument('ublk_id', help='ublk device id to be assigned. Example: 1.', type=int) 2524dc3e7140SJacek Kalwas p.add_argument('-q', '--num-queues', help="the total number of queues. Example: 1", type=int) 2525dc3e7140SJacek Kalwas p.add_argument('-d', '--queue-depth', help="queue depth. Example: 128", type=int) 2526e8a94a71SYifan Bian p.set_defaults(func=ublk_start_disk) 2527e8a94a71SYifan Bian 2528e8a94a71SYifan Bian def ublk_stop_disk(args): 2529e8a94a71SYifan Bian rpc.ublk.ublk_stop_disk(args.client, 2530e8a94a71SYifan Bian ublk_id=args.ublk_id) 2531e8a94a71SYifan Bian 2532e8a94a71SYifan Bian p = subparsers.add_parser('ublk_stop_disk', 2533e8a94a71SYifan Bian help='Stop a ublk device') 2534e8a94a71SYifan Bian p.add_argument('ublk_id', help='ublk device id to be deleted. Example: 1.', type=int) 2535e8a94a71SYifan Bian p.set_defaults(func=ublk_stop_disk) 2536e8a94a71SYifan Bian 253771bcd68aSChangpeng Liu def ublk_recover_disk(args): 253871bcd68aSChangpeng Liu print(rpc.ublk.ublk_recover_disk(args.client, 253971bcd68aSChangpeng Liu bdev_name=args.bdev_name, 254071bcd68aSChangpeng Liu ublk_id=args.ublk_id)) 254171bcd68aSChangpeng Liu 254271bcd68aSChangpeng Liu p = subparsers.add_parser('ublk_recover_disk', 254371bcd68aSChangpeng Liu help='Recover ublk device') 254471bcd68aSChangpeng Liu p.add_argument('bdev_name', help='Blockdev name to be recovered. Example: Malloc0.') 254571bcd68aSChangpeng Liu p.add_argument('ublk_id', help='ublk device id to be recovered. Example: 1.', type=int) 254671bcd68aSChangpeng Liu p.set_defaults(func=ublk_recover_disk) 254771bcd68aSChangpeng Liu 254890a6407dSYifan Bian def ublk_get_disks(args): 254990a6407dSYifan Bian print_dict(rpc.ublk.ublk_get_disks(args.client, 255090a6407dSYifan Bian ublk_id=args.ublk_id)) 255190a6407dSYifan Bian 255290a6407dSYifan Bian p = subparsers.add_parser('ublk_get_disks', 255390a6407dSYifan Bian help='Display full or specified ublk device list') 2554dc3e7140SJacek Kalwas p.add_argument('-n', '--ublk-id', help="ublk device id. Example: 1", type=int) 255590a6407dSYifan Bian p.set_defaults(func=ublk_get_disks) 255690a6407dSYifan Bian 25574dd3f4a7SBen Walker # nbd 25580a993323SPawel Kaminski def nbd_start_disk(args): 25590a993323SPawel Kaminski print(rpc.nbd.nbd_start_disk(args.client, 256085f316b1SDaniel Verkamp bdev_name=args.bdev_name, 25615eb33f0aSDaniel Verkamp nbd_device=args.nbd_device)) 2562df897ed4SDaniel Verkamp 256310ba9348Swanghailiangx p = subparsers.add_parser('nbd_start_disk', 2564793d34e5Spaul luse help='Export a bdev as an nbd disk') 25654dd3f4a7SBen Walker p.add_argument('bdev_name', help='Blockdev name to be exported. Example: Malloc0.') 2566efdd6edbSXiaodong Liu p.add_argument('nbd_device', help='Nbd device name to be assigned. Example: /dev/nbd0.', nargs='?') 25670a993323SPawel Kaminski p.set_defaults(func=nbd_start_disk) 2568df897ed4SDaniel Verkamp 2569d242f5a0SPawel Kaminski def nbd_stop_disk(args): 2570d242f5a0SPawel Kaminski rpc.nbd.nbd_stop_disk(args.client, 257185f316b1SDaniel Verkamp nbd_device=args.nbd_device) 2572e21aede9STomasz Zawadzki 257310ba9348Swanghailiangx p = subparsers.add_parser('nbd_stop_disk', 2574793d34e5Spaul luse help='Stop an nbd disk') 25754dd3f4a7SBen Walker p.add_argument('nbd_device', help='Nbd device name to be stopped. Example: /dev/nbd0.') 2576d242f5a0SPawel Kaminski p.set_defaults(func=nbd_stop_disk) 2577df897ed4SDaniel Verkamp 25785456a430SPawel Kaminski def nbd_get_disks(args): 25795456a430SPawel Kaminski print_dict(rpc.nbd.nbd_get_disks(args.client, 258085f316b1SDaniel Verkamp nbd_device=args.nbd_device)) 25811e92d78aSBen Walker 258210ba9348Swanghailiangx p = subparsers.add_parser('nbd_get_disks', 25835456a430SPawel Kaminski help='Display full or specified nbd device list') 2584dc3e7140SJacek Kalwas p.add_argument('-n', '--nbd-device', help="Path of the nbd device. Example: /dev/nbd0") 25855456a430SPawel Kaminski p.set_defaults(func=nbd_get_disks) 25861e92d78aSBen Walker 25874dd3f4a7SBen Walker # NVMe-oF 2588a1a8585cSMaciej Wawryk def nvmf_set_max_subsystems(args): 2589a1a8585cSMaciej Wawryk rpc.nvmf.nvmf_set_max_subsystems(args.client, 2590962ba4e8SSeth Howell max_subsystems=args.max_subsystems) 2591962ba4e8SSeth Howell 259214273794Swanghailiangx p = subparsers.add_parser('nvmf_set_max_subsystems', 2593a1a8585cSMaciej Wawryk help='Set the maximum number of NVMf target subsystems') 2594962ba4e8SSeth Howell p.add_argument('-x', '--max-subsystems', help='Max number of NVMf subsystems', type=int, required=True) 2595a1a8585cSMaciej Wawryk p.set_defaults(func=nvmf_set_max_subsystems) 2596962ba4e8SSeth Howell 259793d6b7beSMaciej Wawryk def nvmf_set_config(args): 259893d6b7beSMaciej Wawryk rpc.nvmf.nvmf_set_config(args.client, 259938a30da5SYuri passthru_identify_ctrlr=args.passthru_identify_ctrlr, 26003d8904c6SAlexey Marchuk poll_groups_mask=args.poll_groups_mask, 260100a557f2SKonrad Sztyber discovery_filter=args.discovery_filter, 260200a557f2SKonrad Sztyber dhchap_digests=args.dhchap_digests, 260300a557f2SKonrad Sztyber dhchap_dhgroups=args.dhchap_dhgroups) 260446a3d50bSShuhei Matsumoto 260514273794Swanghailiangx p = subparsers.add_parser('nvmf_set_config', help='Set NVMf target config') 2606c9874b91SMichael Haeuptle p.add_argument('-i', '--passthru-identify-ctrlr', help="""Passthrough fields like serial number and model number 2607c9874b91SMichael Haeuptle when the controller has a single namespace that is an NVMe bdev""", action='store_true') 260838a30da5SYuri p.add_argument('-m', '--poll-groups-mask', help='Set cpumask for NVMf poll groups (optional)', type=str) 26093d8904c6SAlexey Marchuk p.add_argument('-d', '--discovery-filter', help="""Set discovery filter (optional), possible values are: `match_any` (default) or 26103d8904c6SAlexey Marchuk comma separated values: `transport`, `address`, `svcid`""", type=str) 261100a557f2SKonrad Sztyber p.add_argument('--dhchap-digests', help='Comma-separated list of allowed DH-HMAC-CHAP digests', 261200a557f2SKonrad Sztyber type=lambda d: d.split(',')) 261300a557f2SKonrad Sztyber p.add_argument('--dhchap-dhgroups', help='Comma-separated list of allowed DH-HMAC-CHAP DH groups', 261400a557f2SKonrad Sztyber type=lambda d: d.split(',')) 261593d6b7beSMaciej Wawryk p.set_defaults(func=nvmf_set_config) 261646a3d50bSShuhei Matsumoto 2617183d81d0SJohn Barnard def nvmf_create_transport(args): 261864debe04Sjiaqizho rpc.nvmf.nvmf_create_transport(**vars(args)) 2619183d81d0SJohn Barnard 2620183d81d0SJohn Barnard p = subparsers.add_parser('nvmf_create_transport', help='Create NVMf transport') 2621183d81d0SJohn Barnard p.add_argument('-t', '--trtype', help='Transport type (ex. RDMA)', type=str, required=True) 26227a372bbeSJim Harris p.add_argument('-g', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 2623183d81d0SJohn Barnard p.add_argument('-q', '--max-queue-depth', help='Max number of outstanding I/O per queue', type=int) 26241551197dSAlexey Marchuk p.add_argument('-m', '--max-io-qpairs-per-ctrlr', help='Max number of IO qpairs per controller', type=int) 2625183d81d0SJohn Barnard p.add_argument('-c', '--in-capsule-data-size', help='Max number of in-capsule data size', type=int) 2626183d81d0SJohn Barnard p.add_argument('-i', '--max-io-size', help='Max I/O size (bytes)', type=int) 2627183d81d0SJohn Barnard p.add_argument('-u', '--io-unit-size', help='I/O unit size (bytes)', type=int) 2628183d81d0SJohn Barnard p.add_argument('-a', '--max-aq-depth', help='Max number of admin cmds per AQ', type=int) 262958f16244SZiye Yang p.add_argument('-n', '--num-shared-buffers', help='The number of pooled data buffers available to the transport', type=int) 2630ad272579SBen Walker p.add_argument('-b', '--buf-cache-size', help='The number of shared buffers to reserve for each poll group', type=int) 2631aa1d0398SKonrad Sztyber p.add_argument('-z', '--zcopy', action='store_true', help='''Use zero-copy operations if the 2632aa1d0398SKonrad Sztyber underlying bdev supports them''') 26333f912cf0SMichal Berger p.add_argument('-d', '--num-cqe', help="""The number of CQ entries. Only used when no_srq=true. 263497ef8701SMonica Kenguva Relevant only for RDMA transport""", type=int) 2635ed0b611fSEvgeniy Kochetov p.add_argument('-s', '--max-srq-depth', help='Max number of outstanding I/O per SRQ. Relevant only for RDMA transport', type=int) 2636350e429aSSeth Howell p.add_argument('-r', '--no-srq', action='store_true', help='Disable per-thread shared receive queue. Relevant only for RDMA transport') 2637e2c0d9a2SSeth Howell p.add_argument('-o', '--c2h-success', action='store_false', help='Disable C2H success optimization. Relevant only for TCP transport') 2638390cffb6SShuhei Matsumoto p.add_argument('-f', '--dif-insert-or-strip', action='store_true', help='Enable DIF insert/strip. Relevant only for TCP transport') 26396ad6a113SZiye Yang p.add_argument('-y', '--sock-priority', help='The sock priority of the tcp connection. Relevant only for TCP transport', type=int) 26407a372bbeSJim Harris p.add_argument('-l', '--acceptor-backlog', help='Pending connections allowed at one time. Relevant only for RDMA transport', type=int) 264126e0ef9aSShuhei Matsumoto p.add_argument('-x', '--abort-timeout-sec', help='Abort execution timeout value, in seconds', type=int) 2642bd3840a7SIvan Betsis p.add_argument('-w', '--no-wr-batching', action='store_true', help='Disable work requests batching. Relevant only for RDMA transport') 26437a372bbeSJim Harris p.add_argument('-e', '--control-msg-num', help="""The number of control messages per poll group. 26444fe47d6fSAlexey Marchuk Relevant only for TCP transport""", type=int) 2645180d2c1dSJohn Levon p.add_argument('-M', '--disable-mappable-bar0', action='store_true', help="""Disable mmap() of BAR0. 2646180d2c1dSJohn Levon Relevant only for VFIO-USER transport""") 2647dd174597SRui Chang p.add_argument('-I', '--disable-adaptive-irq', action='store_true', help="""Disable adaptive interrupt feature. 2648dd174597SRui Chang Relevant only for VFIO-USER transport""") 26493b047a61SAndreas Economides p.add_argument('-S', '--disable-shadow-doorbells', action='store_true', help="""Disable shadow doorbell support. 26503b047a61SAndreas Economides Relevant only for VFIO-USER transport""") 265143022da3SJacek Kalwas p.add_argument('--acceptor-poll-rate', help='Polling interval of the acceptor for incoming connections (usec)', type=int) 265279606beeSKonrad Sztyber p.add_argument('--ack-timeout', help='ACK timeout in milliseconds', type=int) 26537dab13c0SAlexey Marchuk p.add_argument('--data-wr-pool-size', help='RDMA data WR pool size. Relevant only for RDMA transport', type=int) 265465335336SKonrad Sztyber p.add_argument('--disable-command-passthru', help='Disallow command passthru', action='store_true') 2655183d81d0SJohn Barnard p.set_defaults(func=nvmf_create_transport) 2656183d81d0SJohn Barnard 26570772af4dSMaciej Wawryk def nvmf_get_transports(args): 2658fb335cb2SJacek Kalwas print_dict(rpc.nvmf.nvmf_get_transports(args.client, trtype=args.trtype, tgt_name=args.tgt_name)) 2659c89b7bacSSeth Howell 266014273794Swanghailiangx p = subparsers.add_parser('nvmf_get_transports', help='Display nvmf transports or required transport') 2661fb335cb2SJacek Kalwas p.add_argument('--trtype', help='Transport type (optional)') 26627a372bbeSJim Harris p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 26630772af4dSMaciej Wawryk p.set_defaults(func=nvmf_get_transports) 2664c89b7bacSSeth Howell 266580a0c5beSMaciej Wawryk def nvmf_get_subsystems(args): 2666dfafab22SJacek Kalwas print_dict(rpc.nvmf.nvmf_get_subsystems(args.client, nqn=args.nqn, tgt_name=args.tgt_name)) 2667df897ed4SDaniel Verkamp 266814273794Swanghailiangx p = subparsers.add_parser('nvmf_get_subsystems', help='Display nvmf subsystems or required subsystem') 2669ba81cb16SJaroslaw Chachulski p.add_argument('nqn', help='Subsystem NQN (optional)', nargs="?") 26707a372bbeSJim Harris p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 267180a0c5beSMaciej Wawryk p.set_defaults(func=nvmf_get_subsystems) 2672df897ed4SDaniel Verkamp 26737538af70SMaciej Wawryk def nvmf_create_subsystem(args): 26747538af70SMaciej Wawryk rpc.nvmf.nvmf_create_subsystem(args.client, 2675aedac1a8SBen Walker nqn=args.nqn, 2676f8433aadSSeth Howell tgt_name=args.tgt_name, 2677aedac1a8SBen Walker serial_number=args.serial_number, 267814032a98SGregory Shapiro model_number=args.model_number, 2679aedac1a8SBen Walker allow_any_host=args.allow_any_host, 26801da94ed7SShuhei Matsumoto max_namespaces=args.max_namespaces, 2681be6a01efSJonathan Teh ana_reporting=args.ana_reporting, 2682be6a01efSJonathan Teh min_cntlid=args.min_cntlid, 2683c7feb85dSHaoqian He max_cntlid=args.max_cntlid, 2684c7feb85dSHaoqian He max_discard_size_kib=args.max_discard_size, 268560241941SKarl Bonde Torp max_write_zeroes_size_kib=args.max_write_zeroes_size, 268660241941SKarl Bonde Torp passthrough=args.passthrough) 2687aedac1a8SBen Walker 268814273794Swanghailiangx p = subparsers.add_parser('nvmf_create_subsystem', help='Create an NVMe-oF subsystem') 2689aedac1a8SBen Walker p.add_argument('nqn', help='Subsystem NQN (ASCII)') 26907a372bbeSJim Harris p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 2691aedac1a8SBen Walker p.add_argument("-s", "--serial-number", help=""" 2692aedac1a8SBen Walker Format: 'sn' etc 26939518bbc2SJaroslaw Chachulski Example: 'SPDK00000000000001'""") 269414032a98SGregory Shapiro p.add_argument("-d", "--model-number", help=""" 269514032a98SGregory Shapiro Format: 'mn' etc 26969518bbc2SJaroslaw Chachulski Example: 'SPDK Controller'""") 2697131e6171SJim Harris p.add_argument("-a", "--allow-any-host", action='store_true', help="Allow any host to connect (don't enforce allowed host NQN list)") 2698aedac1a8SBen Walker p.add_argument("-m", "--max-namespaces", help="Maximum number of namespaces allowed", 26999518bbc2SJaroslaw Chachulski type=int) 27001da94ed7SShuhei Matsumoto p.add_argument("-r", "--ana-reporting", action='store_true', help="Enable ANA reporting feature") 27019518bbc2SJaroslaw Chachulski p.add_argument("-i", "--min_cntlid", help="Minimum controller ID", type=int) 27029518bbc2SJaroslaw Chachulski p.add_argument("-I", "--max_cntlid", help="Maximum controller ID", type=int) 2703c7feb85dSHaoqian He p.add_argument("--max-discard-size", help="Maximum discard size (Kib)", type=int) 2704c7feb85dSHaoqian He p.add_argument("--max-write-zeroes-size", help="Maximum write_zeroes size (Kib)", type=int) 270560241941SKarl Bonde Torp p.add_argument("-p", "--passthrough", action='store_true', help="""Use NVMe passthrough for all I/O commands and namespace-directed 270660241941SKarl Bonde Torp admin commands""") 27077538af70SMaciej Wawryk p.set_defaults(func=nvmf_create_subsystem) 2708aedac1a8SBen Walker 270919baaa9aSMaciej Wawryk def nvmf_delete_subsystem(args): 271019baaa9aSMaciej Wawryk rpc.nvmf.nvmf_delete_subsystem(args.client, 2711f8433aadSSeth Howell nqn=args.subsystem_nqn, 2712f8433aadSSeth Howell tgt_name=args.tgt_name) 2713d20b90b2SCunyin Chang 271414273794Swanghailiangx p = subparsers.add_parser('nvmf_delete_subsystem', help='Delete a nvmf subsystem') 27154dd3f4a7SBen Walker p.add_argument('subsystem_nqn', 27164dd3f4a7SBen Walker help='subsystem nqn to be deleted. Example: nqn.2016-06.io.spdk:cnode1.') 27177a372bbeSJim Harris p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 271819baaa9aSMaciej Wawryk p.set_defaults(func=nvmf_delete_subsystem) 2719df897ed4SDaniel Verkamp 2720df897ed4SDaniel Verkamp def nvmf_subsystem_add_listener(args): 272164debe04Sjiaqizho rpc.nvmf.nvmf_subsystem_add_listener(**vars(args)) 2722d20b90b2SCunyin Chang 27236336217eSBen Walker p = subparsers.add_parser('nvmf_subsystem_add_listener', help='Add a listener to an NVMe-oF subsystem') 272406ef6757SJim Harris p.add_argument('nqn', help='NVMe-oF subsystem NQN (\'discovery\' can be used as shortcut for discovery NQN)') 27256336217eSBen Walker p.add_argument('-t', '--trtype', help='NVMe-oF transport type: e.g., rdma', required=True) 27266336217eSBen Walker p.add_argument('-a', '--traddr', help='NVMe-oF transport address: e.g., an ip address', required=True) 27277a372bbeSJim Harris p.add_argument('-p', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 27286336217eSBen Walker p.add_argument('-f', '--adrfam', help='NVMe-oF transport adrfam: e.g., ipv4, ipv6, ib, fc, intra_host') 27299a1cf1c5SJacek Kalwas p.add_argument('-s', '--trsvcid', help='NVMe-oF transport service id: e.g., a port number (required for RDMA or TCP)') 27304becb0d1SBoris Glimcher p.add_argument('-k', '--secure-channel', help='Immediately establish a secure channel', action="store_true") 2731dc3e7140SJacek Kalwas p.add_argument('-n', '--ana-state', help='ANA state to set: optimized, non_optimized, or inaccessible', type=str) 2732248c547dSKarl Bonde Torp p.add_argument('-S', '--sock-impl', help='The socket implementation to use for the listener (ex. posix)', type=str) 2733df897ed4SDaniel Verkamp p.set_defaults(func=nvmf_subsystem_add_listener) 2734df897ed4SDaniel Verkamp 2735df897ed4SDaniel Verkamp def nvmf_subsystem_remove_listener(args): 2736aceeb8cdSheluwei rpc.nvmf.nvmf_subsystem_remove_listener(args.client, 2737aceeb8cdSheluwei nqn=args.nqn, 2738aceeb8cdSheluwei trtype=args.trtype, 2739aceeb8cdSheluwei traddr=args.traddr, 2740f8433aadSSeth Howell tgt_name=args.tgt_name, 2741aceeb8cdSheluwei adrfam=args.adrfam, 2742aceeb8cdSheluwei trsvcid=args.trsvcid) 27436336217eSBen Walker 2744a1ee1187Sparam p = subparsers.add_parser('nvmf_subsystem_remove_listener', help='Remove a listener from an NVMe-oF subsystem') 274506ef6757SJim Harris p.add_argument('nqn', help='NVMe-oF subsystem NQN (\'discovery\' can be used as shortcut for discovery NQN)') 2746a1ee1187Sparam p.add_argument('-t', '--trtype', help='NVMe-oF transport type: e.g., rdma', required=True) 2747a1ee1187Sparam p.add_argument('-a', '--traddr', help='NVMe-oF transport address: e.g., an ip address', required=True) 27487a372bbeSJim Harris p.add_argument('-p', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 2749a1ee1187Sparam p.add_argument('-f', '--adrfam', help='NVMe-oF transport adrfam: e.g., ipv4, ipv6, ib, fc, intra_host') 2750aaff6707Syidong0635 p.add_argument('-s', '--trsvcid', help='NVMe-oF transport service id: e.g., a port number (required for TCP and RDMA transport types)') 2751df897ed4SDaniel Verkamp p.set_defaults(func=nvmf_subsystem_remove_listener) 2752df897ed4SDaniel Verkamp 2753c8cb51d4SShuhei Matsumoto def nvmf_subsystem_listener_set_ana_state(args): 2754c8cb51d4SShuhei Matsumoto rpc.nvmf.nvmf_subsystem_listener_set_ana_state(args.client, 2755c8cb51d4SShuhei Matsumoto nqn=args.nqn, 2756c8cb51d4SShuhei Matsumoto ana_state=args.ana_state, 2757c8cb51d4SShuhei Matsumoto trtype=args.trtype, 2758c8cb51d4SShuhei Matsumoto traddr=args.traddr, 2759c8cb51d4SShuhei Matsumoto tgt_name=args.tgt_name, 2760c8cb51d4SShuhei Matsumoto adrfam=args.adrfam, 27616d716c47SShuhei Matsumoto trsvcid=args.trsvcid, 27626d716c47SShuhei Matsumoto anagrpid=args.anagrpid) 2763c8cb51d4SShuhei Matsumoto 2764c8cb51d4SShuhei Matsumoto p = subparsers.add_parser('nvmf_subsystem_listener_set_ana_state', help='Set ANA state of a listener for an NVMe-oF subsystem') 2765c8cb51d4SShuhei Matsumoto p.add_argument('nqn', help='NVMe-oF subsystem NQN') 27661421a35eSAlexey Marchuk p.add_argument('-n', '--ana-state', help='ANA state to set: optimized, non_optimized, or inaccessible', required=True) 2767c8cb51d4SShuhei Matsumoto p.add_argument('-t', '--trtype', help='NVMe-oF transport type: e.g., rdma', required=True) 2768c8cb51d4SShuhei Matsumoto p.add_argument('-a', '--traddr', help='NVMe-oF transport address: e.g., an ip address', required=True) 27697a372bbeSJim Harris p.add_argument('-p', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 2770c8cb51d4SShuhei Matsumoto p.add_argument('-f', '--adrfam', help='NVMe-oF transport adrfam: e.g., ipv4, ipv6, ib, fc, intra_host') 2771c8cb51d4SShuhei Matsumoto p.add_argument('-s', '--trsvcid', help='NVMe-oF transport service id: e.g., a port number') 27726d716c47SShuhei Matsumoto p.add_argument('-g', '--anagrpid', help='ANA group ID (optional)', type=int) 2773c8cb51d4SShuhei Matsumoto p.set_defaults(func=nvmf_subsystem_listener_set_ana_state) 2774c8cb51d4SShuhei Matsumoto 2775470e8518SSlawomir Ptak def nvmf_discovery_add_referral(args): 2776470e8518SSlawomir Ptak rpc.nvmf.nvmf_discovery_add_referral(**vars(args)) 2777470e8518SSlawomir Ptak 2778470e8518SSlawomir Ptak p = subparsers.add_parser('nvmf_discovery_add_referral', help='Add a discovery service referral to an NVMe-oF target') 2779470e8518SSlawomir Ptak p.add_argument('-t', '--trtype', help='NVMe-oF transport type: e.g., rdma', required=True) 2780470e8518SSlawomir Ptak p.add_argument('-a', '--traddr', help='NVMe-oF transport address: e.g., an ip address', required=True) 2781470e8518SSlawomir Ptak p.add_argument('-p', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 2782470e8518SSlawomir Ptak p.add_argument('-f', '--adrfam', help='NVMe-oF transport adrfam: e.g., ipv4, ipv6, ib, fc, intra_host') 2783470e8518SSlawomir Ptak p.add_argument('-s', '--trsvcid', help='NVMe-oF transport service id: e.g., a port number (required for RDMA or TCP)') 2784470e8518SSlawomir Ptak p.add_argument('-k', '--secure-channel', help='The connection to that discovery subsystem requires a secure channel', 2785470e8518SSlawomir Ptak action="store_true") 2786020c4e11SKonrad Sztyber p.add_argument('-n', '--subnqn', help='Subsystem NQN') 2787470e8518SSlawomir Ptak p.set_defaults(func=nvmf_discovery_add_referral) 2788470e8518SSlawomir Ptak 2789470e8518SSlawomir Ptak def nvmf_discovery_remove_referral(args): 2790470e8518SSlawomir Ptak rpc.nvmf.nvmf_discovery_remove_referral(args.client, 2791470e8518SSlawomir Ptak trtype=args.trtype, 2792470e8518SSlawomir Ptak traddr=args.traddr, 2793470e8518SSlawomir Ptak tgt_name=args.tgt_name, 2794470e8518SSlawomir Ptak adrfam=args.adrfam, 2795020c4e11SKonrad Sztyber trsvcid=args.trsvcid, 2796020c4e11SKonrad Sztyber subnqn=args.subnqn) 2797470e8518SSlawomir Ptak 2798470e8518SSlawomir Ptak p = subparsers.add_parser('nvmf_discovery_remove_referral', help='Remove a discovery service referral from an NVMe-oF target') 2799470e8518SSlawomir Ptak p.add_argument('-t', '--trtype', help='NVMe-oF transport type: e.g., rdma', required=True) 2800470e8518SSlawomir Ptak p.add_argument('-a', '--traddr', help='NVMe-oF transport address: e.g., an ip address', required=True) 2801470e8518SSlawomir Ptak p.add_argument('-p', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 2802470e8518SSlawomir Ptak p.add_argument('-f', '--adrfam', help='NVMe-oF transport adrfam: e.g., ipv4, ipv6, ib, fc, intra_host') 2803470e8518SSlawomir Ptak p.add_argument('-s', '--trsvcid', help='NVMe-oF transport service id: e.g., a port number (required for TCP and RDMA transport types)') 2804020c4e11SKonrad Sztyber p.add_argument('-n', '--subnqn', help='Subsystem NQN') 2805470e8518SSlawomir Ptak p.set_defaults(func=nvmf_discovery_remove_referral) 2806470e8518SSlawomir Ptak 2807470e8518SSlawomir Ptak def nvmf_discovery_get_referrals(args): 2808470e8518SSlawomir Ptak print_dict(rpc.nvmf.nvmf_discovery_get_referrals(args.client, 2809470e8518SSlawomir Ptak tgt_name=args.tgt_name)) 2810470e8518SSlawomir Ptak 2811470e8518SSlawomir Ptak p = subparsers.add_parser('nvmf_discovery_get_referrals', 2812470e8518SSlawomir Ptak help='Display discovery subsystem referrals of an NVMe-oF target') 2813470e8518SSlawomir Ptak p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 2814470e8518SSlawomir Ptak p.set_defaults(func=nvmf_discovery_get_referrals) 2815470e8518SSlawomir Ptak 2816df897ed4SDaniel Verkamp def nvmf_subsystem_add_ns(args): 2817f19c5a58SJacek Kalwas rpc.nvmf.nvmf_subsystem_add_ns(**vars(args)) 2818a1ee1187Sparam 281947b17299SBen Walker p = subparsers.add_parser('nvmf_subsystem_add_ns', help='Add a namespace to an NVMe-oF subsystem') 282047b17299SBen Walker p.add_argument('nqn', help='NVMe-oF subsystem NQN') 282147b17299SBen Walker p.add_argument('bdev_name', help='The name of the bdev that will back this namespace') 28227a372bbeSJim Harris p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 28235317a9f7SChangpeng Liu p.add_argument('-p', '--ptpl-file', help='The persistent reservation storage location (optional)', type=str) 282447b17299SBen Walker p.add_argument('-n', '--nsid', help='The requested NSID (optional)', type=int) 28251023ca7bSDaniel Verkamp p.add_argument('-g', '--nguid', help='Namespace globally unique identifier (optional)') 28261023ca7bSDaniel Verkamp p.add_argument('-e', '--eui64', help='Namespace EUI-64 identifier (optional)') 282757ae6bf6SDaniel Verkamp p.add_argument('-u', '--uuid', help='Namespace UUID (optional)') 2828694fa34dSShuhei Matsumoto p.add_argument('-a', '--anagrpid', help='ANA group ID (optional)', type=int) 2829d37555b4SJonas Pfefferle p.add_argument('-i', '--no-auto-visible', action='store_true', 2830d37555b4SJonas Pfefferle help='Do not auto make namespace visible to controllers (optional)') 2831afdec00eSShuhei Matsumoto p.add_argument('-N', '--hide-metadata', action='store_true', 2832afdec00eSShuhei Matsumoto help='Enable hide_metadata option to the bdev (optional)') 2833df897ed4SDaniel Verkamp p.set_defaults(func=nvmf_subsystem_add_ns) 2834df897ed4SDaniel Verkamp 2835698b2423SShuhei Matsumoto def nvmf_subsystem_set_ns_ana_group(args): 2836698b2423SShuhei Matsumoto rpc.nvmf.nvmf_subsystem_set_ns_ana_group(args.client, 2837698b2423SShuhei Matsumoto nqn=args.nqn, 2838698b2423SShuhei Matsumoto nsid=args.nsid, 2839698b2423SShuhei Matsumoto anagrpid=args.anagrpid, 2840698b2423SShuhei Matsumoto tgt_name=args.tgt_name) 2841698b2423SShuhei Matsumoto 2842698b2423SShuhei Matsumoto p = subparsers.add_parser('nvmf_subsystem_set_ns_ana_group', help='Change ANA group ID of a namespace') 2843698b2423SShuhei Matsumoto p.add_argument('nqn', help='NVMe-oF subsystem NQN') 2844698b2423SShuhei Matsumoto p.add_argument('nsid', help='The requested NSID', type=int) 2845698b2423SShuhei Matsumoto p.add_argument('anagrpid', help='ANA group ID', type=int) 2846698b2423SShuhei Matsumoto p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 2847698b2423SShuhei Matsumoto p.set_defaults(func=nvmf_subsystem_set_ns_ana_group) 2848698b2423SShuhei Matsumoto 2849df897ed4SDaniel Verkamp def nvmf_subsystem_remove_ns(args): 2850aceeb8cdSheluwei rpc.nvmf.nvmf_subsystem_remove_ns(args.client, 2851aceeb8cdSheluwei nqn=args.nqn, 2852f8433aadSSeth Howell nsid=args.nsid, 2853f8433aadSSeth Howell tgt_name=args.tgt_name) 285447b17299SBen Walker 2855d9321520SChangpeng Liu p = subparsers.add_parser('nvmf_subsystem_remove_ns', help='Remove a namespace to an NVMe-oF subsystem') 2856d9321520SChangpeng Liu p.add_argument('nqn', help='NVMe-oF subsystem NQN') 2857d9321520SChangpeng Liu p.add_argument('nsid', help='The requested NSID', type=int) 28587a372bbeSJim Harris p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 2859df897ed4SDaniel Verkamp p.set_defaults(func=nvmf_subsystem_remove_ns) 2860df897ed4SDaniel Verkamp 2861d37555b4SJonas Pfefferle def nvmf_ns_add_host(args): 2862d37555b4SJonas Pfefferle rpc.nvmf.nvmf_ns_visible(True, 2863d37555b4SJonas Pfefferle args.client, 2864d37555b4SJonas Pfefferle nqn=args.nqn, 2865d37555b4SJonas Pfefferle nsid=args.nsid, 2866d37555b4SJonas Pfefferle host=args.host, 2867d37555b4SJonas Pfefferle tgt_name=args.tgt_name) 2868d37555b4SJonas Pfefferle 2869d37555b4SJonas Pfefferle def nvmf_ns_visible_add_args(p): 2870d37555b4SJonas Pfefferle p.add_argument('nqn', help='NVMe-oF subsystem NQN') 2871d37555b4SJonas Pfefferle p.add_argument('nsid', help='The requested NSID', type=int) 2872d37555b4SJonas Pfefferle p.add_argument('host', help='Host NQN to make namespace visible to') 2873d37555b4SJonas Pfefferle p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 2874d37555b4SJonas Pfefferle 2875d37555b4SJonas Pfefferle p = subparsers.add_parser('nvmf_ns_add_host', help='Make namespace visible to controllers of host') 2876d37555b4SJonas Pfefferle nvmf_ns_visible_add_args(p) 2877d37555b4SJonas Pfefferle p.set_defaults(func=nvmf_ns_add_host) 2878d37555b4SJonas Pfefferle 2879d37555b4SJonas Pfefferle def nvmf_ns_remove_host(args): 2880d37555b4SJonas Pfefferle rpc.nvmf.nvmf_ns_visible(False, 2881d37555b4SJonas Pfefferle args.client, 2882d37555b4SJonas Pfefferle nqn=args.nqn, 2883d37555b4SJonas Pfefferle nsid=args.nsid, 2884d37555b4SJonas Pfefferle host=args.host, 2885d37555b4SJonas Pfefferle tgt_name=args.tgt_name) 2886d37555b4SJonas Pfefferle 288734edd9f1SKamil Godzwon p = subparsers.add_parser('nvmf_ns_remove_host', help='Make namespace not visible to controllers of host') 2888d37555b4SJonas Pfefferle nvmf_ns_visible_add_args(p) 2889d37555b4SJonas Pfefferle p.set_defaults(func=nvmf_ns_remove_host) 2890d37555b4SJonas Pfefferle 2891df897ed4SDaniel Verkamp def nvmf_subsystem_add_host(args): 2892aceeb8cdSheluwei rpc.nvmf.nvmf_subsystem_add_host(args.client, 2893aceeb8cdSheluwei nqn=args.nqn, 2894f8433aadSSeth Howell host=args.host, 2895663243cbSKrzysztof Karas tgt_name=args.tgt_name, 28963f4f8ad0SKonrad Sztyber psk=args.psk, 2897aa13730dSKonrad Sztyber dhchap_key=args.dhchap_key, 2898aa13730dSKonrad Sztyber dhchap_ctrlr_key=args.dhchap_ctrlr_key) 2899d9321520SChangpeng Liu 29006285e36eSBen Walker p = subparsers.add_parser('nvmf_subsystem_add_host', help='Add a host to an NVMe-oF subsystem') 29016285e36eSBen Walker p.add_argument('nqn', help='NVMe-oF subsystem NQN') 29026285e36eSBen Walker p.add_argument('host', help='Host NQN to allow') 29037a372bbeSJim Harris p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 290403b6183aSKrzysztof Karas p.add_argument('--psk', help='Path to PSK file for TLS authentication (optional). Only applicable for TCP transport.', type=str) 29053f4f8ad0SKonrad Sztyber p.add_argument('--dhchap-key', help='DH-HMAC-CHAP key name (optional)') 2906aa13730dSKonrad Sztyber p.add_argument('--dhchap-ctrlr-key', help='DH-HMAC-CHAP controller key name (optional)') 2907df897ed4SDaniel Verkamp p.set_defaults(func=nvmf_subsystem_add_host) 2908df897ed4SDaniel Verkamp 2909df897ed4SDaniel Verkamp def nvmf_subsystem_remove_host(args): 2910aceeb8cdSheluwei rpc.nvmf.nvmf_subsystem_remove_host(args.client, 2911aceeb8cdSheluwei nqn=args.nqn, 2912f8433aadSSeth Howell host=args.host, 2913f8433aadSSeth Howell tgt_name=args.tgt_name) 29146285e36eSBen Walker 29156285e36eSBen Walker p = subparsers.add_parser('nvmf_subsystem_remove_host', help='Remove a host from an NVMe-oF subsystem') 29166285e36eSBen Walker p.add_argument('nqn', help='NVMe-oF subsystem NQN') 29176285e36eSBen Walker p.add_argument('host', help='Host NQN to remove') 29187a372bbeSJim Harris p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 2919df897ed4SDaniel Verkamp p.set_defaults(func=nvmf_subsystem_remove_host) 2920df897ed4SDaniel Verkamp 29218a4b7226SKonrad Sztyber def nvmf_subsystem_set_keys(args): 29228a4b7226SKonrad Sztyber rpc.nvmf.nvmf_subsystem_set_keys(args.client, 29238a4b7226SKonrad Sztyber nqn=args.nqn, 29248a4b7226SKonrad Sztyber host=args.host, 29258a4b7226SKonrad Sztyber tgt_name=args.tgt_name, 29268a4b7226SKonrad Sztyber dhchap_key=args.dhchap_key, 29278a4b7226SKonrad Sztyber dhchap_ctrlr_key=args.dhchap_ctrlr_key) 29288a4b7226SKonrad Sztyber 29298a4b7226SKonrad Sztyber p = subparsers.add_parser('nvmf_subsystem_set_keys', help='Set keys required for a host to connect to a given subsystem') 29308a4b7226SKonrad Sztyber p.add_argument('nqn', help='Subsystem NQN') 29318a4b7226SKonrad Sztyber p.add_argument('host', help='Host NQN') 29328a4b7226SKonrad Sztyber p.add_argument('-t', '--tgt-name', help='Name of the NVMe-oF target') 29338a4b7226SKonrad Sztyber p.add_argument('--dhchap-key', help='DH-HMAC-CHAP key name') 29348a4b7226SKonrad Sztyber p.add_argument('--dhchap-ctrlr-key', help='DH-HMAC-CHAP controller key name') 29358a4b7226SKonrad Sztyber p.set_defaults(func=nvmf_subsystem_set_keys) 29368a4b7226SKonrad Sztyber 2937df897ed4SDaniel Verkamp def nvmf_subsystem_allow_any_host(args): 2938aceeb8cdSheluwei rpc.nvmf.nvmf_subsystem_allow_any_host(args.client, 2939aceeb8cdSheluwei nqn=args.nqn, 2940f8433aadSSeth Howell disable=args.disable, 2941f8433aadSSeth Howell tgt_name=args.tgt_name) 29426285e36eSBen Walker 29436285e36eSBen Walker p = subparsers.add_parser('nvmf_subsystem_allow_any_host', help='Allow any host to connect to the subsystem') 29446285e36eSBen Walker p.add_argument('nqn', help='NVMe-oF subsystem NQN') 29456285e36eSBen Walker p.add_argument('-e', '--enable', action='store_true', help='Enable allowing any host') 29466285e36eSBen Walker p.add_argument('-d', '--disable', action='store_true', help='Disable allowing any host') 29477a372bbeSJim Harris p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 2948df897ed4SDaniel Verkamp p.set_defaults(func=nvmf_subsystem_allow_any_host) 29496285e36eSBen Walker 29504cc04a12SShuhei Matsumoto def nvmf_subsystem_get_controllers(args): 29514cc04a12SShuhei Matsumoto print_dict(rpc.nvmf.nvmf_subsystem_get_controllers(args.client, 29524cc04a12SShuhei Matsumoto nqn=args.nqn, 29534cc04a12SShuhei Matsumoto tgt_name=args.tgt_name)) 29544cc04a12SShuhei Matsumoto 29554cc04a12SShuhei Matsumoto p = subparsers.add_parser('nvmf_subsystem_get_controllers', 29564cc04a12SShuhei Matsumoto help='Display controllers of an NVMe-oF subsystem.') 29574cc04a12SShuhei Matsumoto p.add_argument('nqn', help='NVMe-oF subsystem NQN') 29584cc04a12SShuhei Matsumoto p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 29594cc04a12SShuhei Matsumoto p.set_defaults(func=nvmf_subsystem_get_controllers) 29604cc04a12SShuhei Matsumoto 296183eb352bSShuhei Matsumoto def nvmf_subsystem_get_qpairs(args): 296283eb352bSShuhei Matsumoto print_dict(rpc.nvmf.nvmf_subsystem_get_qpairs(args.client, 296383eb352bSShuhei Matsumoto nqn=args.nqn, 296483eb352bSShuhei Matsumoto tgt_name=args.tgt_name)) 296583eb352bSShuhei Matsumoto 296683eb352bSShuhei Matsumoto p = subparsers.add_parser('nvmf_subsystem_get_qpairs', 296783eb352bSShuhei Matsumoto help='Display queue pairs of an NVMe-oF subsystem.') 296883eb352bSShuhei Matsumoto p.add_argument('nqn', help='NVMe-oF subsystem NQN') 296983eb352bSShuhei Matsumoto p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 297083eb352bSShuhei Matsumoto p.set_defaults(func=nvmf_subsystem_get_qpairs) 297183eb352bSShuhei Matsumoto 29729c1d6483SShuhei Matsumoto def nvmf_subsystem_get_listeners(args): 29739c1d6483SShuhei Matsumoto print_dict(rpc.nvmf.nvmf_subsystem_get_listeners(args.client, 29749c1d6483SShuhei Matsumoto nqn=args.nqn, 29759c1d6483SShuhei Matsumoto tgt_name=args.tgt_name)) 29769c1d6483SShuhei Matsumoto 29779c1d6483SShuhei Matsumoto p = subparsers.add_parser('nvmf_subsystem_get_listeners', 29789c1d6483SShuhei Matsumoto help='Display listeners of an NVMe-oF subsystem.') 29799c1d6483SShuhei Matsumoto p.add_argument('nqn', help='NVMe-oF subsystem NQN') 29809c1d6483SShuhei Matsumoto p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 29819c1d6483SShuhei Matsumoto p.set_defaults(func=nvmf_subsystem_get_listeners) 29829c1d6483SShuhei Matsumoto 2983fca6ff8fSEvgeniy Kochetov def nvmf_get_stats(args): 2984f8433aadSSeth Howell print_dict(rpc.nvmf.nvmf_get_stats(args.client, tgt_name=args.tgt_name)) 2985fca6ff8fSEvgeniy Kochetov 2986fca6ff8fSEvgeniy Kochetov p = subparsers.add_parser( 2987fca6ff8fSEvgeniy Kochetov 'nvmf_get_stats', help='Display current statistics for NVMf subsystem') 29887a372bbeSJim Harris p.add_argument('-t', '--tgt-name', help='The name of the parent NVMe-oF target (optional)', type=str) 2989fca6ff8fSEvgeniy Kochetov p.set_defaults(func=nvmf_get_stats) 2990fca6ff8fSEvgeniy Kochetov 2991b832f99fSyupeng def nvmf_set_crdt(args): 2992b832f99fSyupeng print_dict(rpc.nvmf.nvmf_set_crdt(args.client, args.crdt1, args.crdt2, args.crdt3)) 2993b832f99fSyupeng 2994b832f99fSyupeng p = subparsers.add_parser( 2995b832f99fSyupeng 'nvmf_set_crdt', 2996b832f99fSyupeng help="""Set the 3 crdt (Command Retry Delay Time) values for NVMf subsystem. All 2997b832f99fSyupeng values are in units of 100 milliseconds (same as the NVM Express specification).""") 2998b832f99fSyupeng p.add_argument('-t1', '--crdt1', help='Command Retry Delay Time 1, in units of 100 milliseconds', type=int) 2999b832f99fSyupeng p.add_argument('-t2', '--crdt2', help='Command Retry Delay Time 2, in units of 100 milliseconds', type=int) 3000b832f99fSyupeng p.add_argument('-t3', '--crdt3', help='Command Retry Delay Time 3, in units of 100 milliseconds', type=int) 3001b832f99fSyupeng p.set_defaults(func=nvmf_set_crdt) 3002b832f99fSyupeng 3003e2d54380Skyuho.son def nvmf_publish_mdns_prr(args): 3004e2d54380Skyuho.son rpc.nvmf.nvmf_publish_mdns_prr(args.client, args.tgt_name) 3005e2d54380Skyuho.son 3006e2d54380Skyuho.son p = subparsers.add_parser('nvmf_publish_mdns_prr', 3007e2d54380Skyuho.son help='Publish pull registration request through mdns') 3008e2d54380Skyuho.son p.add_argument('-t', '--tgt-name', help='The name of the NVMe-oF target (optional)', type=str) 3009e2d54380Skyuho.son p.set_defaults(func=nvmf_publish_mdns_prr) 3010e2d54380Skyuho.son 301148352fbbSkyuho.son def nvmf_stop_mdns_prr(args): 301248352fbbSkyuho.son rpc.nvmf.nvmf_stop_mdns_prr(args.client, args.tgt_name) 301348352fbbSkyuho.son 301448352fbbSkyuho.son p = subparsers.add_parser('nvmf_stop_mdns_prr', 301548352fbbSkyuho.son help='Stop publishing pull registration request through mdns') 301648352fbbSkyuho.son p.add_argument('-t', '--tgt-name', help='The name of the NVMe-oF target (optional)', type=str) 301748352fbbSkyuho.son p.set_defaults(func=nvmf_stop_mdns_prr) 301848352fbbSkyuho.son 3019ba1859edSPawel Wodkowski # subsystem 30208710b600SMaciej Wawryk def framework_get_subsystems(args): 30218710b600SMaciej Wawryk print_dict(rpc.subsystem.framework_get_subsystems(args.client)) 3022df897ed4SDaniel Verkamp 302381d3cc1bSwanghailiangx p = subparsers.add_parser('framework_get_subsystems', 30248710b600SMaciej Wawryk help="""Print subsystems array in initialization order. Each subsystem 3025ba1859edSPawel Wodkowski entry contain (unsorted) array of subsystems it depends on.""") 30268710b600SMaciej Wawryk p.set_defaults(func=framework_get_subsystems) 3027df897ed4SDaniel Verkamp 3028378ad60bSMaciej Wawryk def framework_get_config(args): 3029378ad60bSMaciej Wawryk print_dict(rpc.subsystem.framework_get_config(args.client, args.name)) 3030ba1859edSPawel Wodkowski 303181d3cc1bSwanghailiangx p = subparsers.add_parser('framework_get_config', help="""Print subsystem configuration""") 3032bd4ecea5SPawel Wodkowski p.add_argument('name', help='Name of subsystem to query') 3033378ad60bSMaciej Wawryk p.set_defaults(func=framework_get_config) 3034bd4ecea5SPawel Wodkowski 30354dd3f4a7SBen Walker # vhost 3036bf15f51cSPawel Kaminski def vhost_controller_set_coalescing(args): 3037bf15f51cSPawel Kaminski rpc.vhost.vhost_controller_set_coalescing(args.client, 303825c11b8eSKarol Latecki ctrlr=args.ctrlr, 303925c11b8eSKarol Latecki delay_base_us=args.delay_base_us, 304025c11b8eSKarol Latecki iops_threshold=args.iops_threshold) 3041df897ed4SDaniel Verkamp 304223d832a0Swanghailiangx p = subparsers.add_parser('vhost_controller_set_coalescing', help='Set vhost controller coalescing') 3043ff1863f4SPawel Wodkowski p.add_argument('ctrlr', help='controller name') 3044ff1863f4SPawel Wodkowski p.add_argument('delay_base_us', help='Base delay time', type=int) 3045ff1863f4SPawel Wodkowski p.add_argument('iops_threshold', help='IOPS threshold when coalescing is enabled', type=int) 3046bf15f51cSPawel Kaminski p.set_defaults(func=vhost_controller_set_coalescing) 3047df897ed4SDaniel Verkamp 3048b727e804STomasz Zawadzki def virtio_blk_create_transport(args): 3049e661c8e8SKonrad Sztyber rpc.vhost.virtio_blk_create_transport(**vars(args)) 3050b727e804STomasz Zawadzki 3051b727e804STomasz Zawadzki p = subparsers.add_parser('virtio_blk_create_transport', 3052b727e804STomasz Zawadzki help='Create virtio blk transport') 3053b727e804STomasz Zawadzki p.add_argument('name', help='transport name') 3054b727e804STomasz Zawadzki p.set_defaults(func=virtio_blk_create_transport) 3055b727e804STomasz Zawadzki 3056537929e1SKrystyna Szybalska def virtio_blk_get_transports(args): 3057537929e1SKrystyna Szybalska print_dict(rpc.vhost.virtio_blk_get_transports(args.client, name=args.name)) 3058537929e1SKrystyna Szybalska 3059537929e1SKrystyna Szybalska p = subparsers.add_parser('virtio_blk_get_transports', help='Display virtio-blk transports or requested transport') 3060537929e1SKrystyna Szybalska p.add_argument('--name', help='Transport name (optional)', type=str) 3061537929e1SKrystyna Szybalska p.set_defaults(func=virtio_blk_get_transports) 3062537929e1SKrystyna Szybalska 3063c7e05d83SPawel Kaminski def vhost_create_scsi_controller(args): 3064c7e05d83SPawel Kaminski rpc.vhost.vhost_create_scsi_controller(args.client, 306525c11b8eSKarol Latecki ctrlr=args.ctrlr, 3066dc93bd85SHaoqian He cpumask=args.cpumask, 3067dc93bd85SHaoqian He delay=args.delay) 3068ff1863f4SPawel Wodkowski 306923d832a0Swanghailiangx p = subparsers.add_parser('vhost_create_scsi_controller', help='Add new vhost controller') 30701dbf53eeSPiotr Pelplinski p.add_argument('ctrlr', help='controller name') 30711dbf53eeSPiotr Pelplinski p.add_argument('--cpumask', help='cpu mask for this controller') 3072dc93bd85SHaoqian He p.add_argument("--delay", action='store_true', help='whether delay starting controller or not') 3073c7e05d83SPawel Kaminski p.set_defaults(func=vhost_create_scsi_controller) 3074df897ed4SDaniel Verkamp 3075dc93bd85SHaoqian He def vhost_start_scsi_controller(args): 3076dc93bd85SHaoqian He rpc.vhost.vhost_start_scsi_controller(args.client, 3077dc93bd85SHaoqian He ctrlr=args.ctrlr) 3078dc93bd85SHaoqian He 3079dc93bd85SHaoqian He p = subparsers.add_parser('vhost_start_scsi_controller', help='Start vhost scsi controller') 3080dc93bd85SHaoqian He p.add_argument('ctrlr', help='controller name') 3081dc93bd85SHaoqian He p.set_defaults(func=vhost_start_scsi_controller) 3082dc93bd85SHaoqian He 3083d4245df9SPawel Kaminski def vhost_scsi_controller_add_target(args): 3084d4245df9SPawel Kaminski print_json(rpc.vhost.vhost_scsi_controller_add_target(args.client, 308525c11b8eSKarol Latecki ctrlr=args.ctrlr, 308625c11b8eSKarol Latecki scsi_target_num=args.scsi_target_num, 308748834f0dSPawel Wodkowski bdev_name=args.bdev_name)) 30887dce704cSPawel Wodkowski 308923d832a0Swanghailiangx p = subparsers.add_parser('vhost_scsi_controller_add_target', help='Add lun to vhost controller') 30901ff3715dSJosh Soref p.add_argument('ctrlr', help='controller name where add lun') 30910709cc48SSebastian Basierski p.add_argument('scsi_target_num', help='scsi_target_num', type=int) 3092583e9699SShuhei Matsumoto p.add_argument('bdev_name', help='bdev name') 3093d4245df9SPawel Kaminski p.set_defaults(func=vhost_scsi_controller_add_target) 3094df897ed4SDaniel Verkamp 309536e04eb4SPawel Kaminski def vhost_scsi_controller_remove_target(args): 309636e04eb4SPawel Kaminski rpc.vhost.vhost_scsi_controller_remove_target(args.client, 309725c11b8eSKarol Latecki ctrlr=args.ctrlr, 309825c11b8eSKarol Latecki scsi_target_num=args.scsi_target_num) 3099679e2831SDariusz Stojaczyk 310036e04eb4SPawel Kaminski p = subparsers.add_parser('vhost_scsi_controller_remove_target', 310136e04eb4SPawel Kaminski help='Remove target from vhost controller') 31020709cc48SSebastian Basierski p.add_argument('ctrlr', help='controller name to remove target from') 31030709cc48SSebastian Basierski p.add_argument('scsi_target_num', help='scsi_target_num', type=int) 310436e04eb4SPawel Kaminski p.set_defaults(func=vhost_scsi_controller_remove_target) 3105df897ed4SDaniel Verkamp 3106d7c00c17SPawel Kaminski def vhost_create_blk_controller(args): 31075ab0f37fSKonrad Sztyber rpc.vhost.vhost_create_blk_controller(**vars(args)) 3108ff88449dSPawel Niedzwiecki 310923d832a0Swanghailiangx p = subparsers.add_parser('vhost_create_blk_controller', help='Add a new vhost block controller') 3110ff88449dSPawel Niedzwiecki p.add_argument('ctrlr', help='controller name') 3111ff88449dSPawel Niedzwiecki p.add_argument('dev_name', help='device name') 3112ff88449dSPawel Niedzwiecki p.add_argument('--cpumask', help='cpu mask for this controller') 3113b727e804STomasz Zawadzki p.add_argument('--transport', help='virtio blk transport name (default: vhost_user_blk)') 3114a264d9d2SPawel Niedzwiecki p.add_argument("-r", "--readonly", action='store_true', help='Set controller as read-only') 31152eabc715SJin Yu p.add_argument("-p", "--packed_ring", action='store_true', help='Set controller as packed ring supported') 3116d7c00c17SPawel Kaminski p.set_defaults(func=vhost_create_blk_controller) 3117df897ed4SDaniel Verkamp 31182976fbd2SPawel Kaminski def vhost_get_controllers(args): 31192976fbd2SPawel Kaminski print_dict(rpc.vhost.vhost_get_controllers(args.client, args.name)) 3120ff88449dSPawel Niedzwiecki 312123d832a0Swanghailiangx p = subparsers.add_parser('vhost_get_controllers', help='List all or specific vhost controller(s)') 3122dc3e7140SJacek Kalwas p.add_argument('-n', '--name', help="Name of vhost controller") 31232976fbd2SPawel Kaminski p.set_defaults(func=vhost_get_controllers) 3124df897ed4SDaniel Verkamp 3125edb18971SPawel Kaminski def vhost_delete_controller(args): 3126edb18971SPawel Kaminski rpc.vhost.vhost_delete_controller(args.client, 312725c11b8eSKarol Latecki ctrlr=args.ctrlr) 3128c63d9de4SPawel Niedzwiecki 312923d832a0Swanghailiangx p = subparsers.add_parser('vhost_delete_controller', help='Delete a vhost controller') 3130c63d9de4SPawel Niedzwiecki p.add_argument('ctrlr', help='controller name') 3131edb18971SPawel Kaminski p.set_defaults(func=vhost_delete_controller) 3132df897ed4SDaniel Verkamp 31332aed03f0SMaciej Wawryk def bdev_virtio_attach_controller(args): 31342aed03f0SMaciej Wawryk print_array(rpc.vhost.bdev_virtio_attach_controller(args.client, 313500054fc6SKarol Latecki name=args.name, 313625c11b8eSKarol Latecki trtype=args.trtype, 313725c11b8eSKarol Latecki traddr=args.traddr, 313825c11b8eSKarol Latecki dev_type=args.dev_type, 313925c11b8eSKarol Latecki vq_count=args.vq_count, 314025c11b8eSKarol Latecki vq_size=args.vq_size)) 31411a6dac40SPawel Wodkowski 31427aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_virtio_attach_controller', 31432aed03f0SMaciej Wawryk help="""Attach virtio controller using provided 31442aed03f0SMaciej Wawryk transport type and device type. This will also create bdevs for any block devices connected to the 31452aed03f0SMaciej Wawryk controller (for example, SCSI devices for a virtio-scsi controller). 31462aed03f0SMaciej Wawryk Result is array of added bdevs.""") 31471a6dac40SPawel Wodkowski p.add_argument('name', help="Use this name as base for new created bdevs") 31481a6dac40SPawel Wodkowski p.add_argument('-t', '--trtype', 31491a6dac40SPawel Wodkowski help='Virtio target transport type: pci or user', required=True) 31501a6dac40SPawel Wodkowski p.add_argument('-a', '--traddr', 31511a6dac40SPawel Wodkowski help='Transport type specific target address: e.g. UNIX domain socket path or BDF', required=True) 31521a6dac40SPawel Wodkowski p.add_argument('-d', '--dev-type', 31531a6dac40SPawel Wodkowski help='Device type: blk or scsi', required=True) 31541a6dac40SPawel Wodkowski p.add_argument('--vq-count', help='Number of virtual queues to be used.', type=int) 31551a6dac40SPawel Wodkowski p.add_argument('--vq-size', help='Size of each queue', type=int) 31562aed03f0SMaciej Wawryk p.set_defaults(func=bdev_virtio_attach_controller) 31571a6dac40SPawel Wodkowski 3158c2a4f329SMaciej Wawryk def bdev_virtio_scsi_get_devices(args): 3159c2a4f329SMaciej Wawryk print_dict(rpc.vhost.bdev_virtio_scsi_get_devices(args.client)) 3160b3518196SDariusz Stojaczyk 31617aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_virtio_scsi_get_devices', help='List all Virtio-SCSI devices.') 3162c2a4f329SMaciej Wawryk p.set_defaults(func=bdev_virtio_scsi_get_devices) 3163b3518196SDariusz Stojaczyk 3164c1b87b3dSMaciej Wawryk def bdev_virtio_detach_controller(args): 3165c1b87b3dSMaciej Wawryk rpc.vhost.bdev_virtio_detach_controller(args.client, 316643fe3667STomasz Zawadzki name=args.name) 316743fe3667STomasz Zawadzki 31687aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_virtio_detach_controller', help="""Remove a Virtio device 316943fe3667STomasz Zawadzki This will delete all bdevs exposed by this device""") 317043fe3667STomasz Zawadzki p.add_argument('name', help='Virtio device name. E.g. VirtioUser0') 3171c1b87b3dSMaciej Wawryk p.set_defaults(func=bdev_virtio_detach_controller) 317243fe3667STomasz Zawadzki 31732f600ca7SJin Yu def bdev_virtio_blk_set_hotplug(args): 31742f600ca7SJin Yu rpc.vhost.bdev_virtio_blk_set_hotplug(args.client, enable=args.enable, period_us=args.period_us) 31752f600ca7SJin Yu 31762f600ca7SJin Yu p = subparsers.add_parser('bdev_virtio_blk_set_hotplug', help='Set hotplug options for bdev virtio_blk type.') 31772f600ca7SJin Yu p.add_argument('-d', '--disable', dest='enable', default=False, action='store_false', help="Disable hotplug (default)") 31782f600ca7SJin Yu p.add_argument('-e', '--enable', dest='enable', action='store_true', help="Enable hotplug") 31792f600ca7SJin Yu p.add_argument('-r', '--period-us', 31802f600ca7SJin Yu help='How often the hotplug is processed for insert and remove events', type=int) 31812f600ca7SJin Yu p.set_defaults(func=bdev_virtio_blk_set_hotplug) 31822f600ca7SJin Yu 3183da231290SChangpeng Liu # vfio-user target 3184da231290SChangpeng Liu def vfu_tgt_set_base_path(args): 3185da231290SChangpeng Liu rpc.vfio_user.vfu_tgt_set_base_path(args.client, path=args.path) 3186da231290SChangpeng Liu 3187da231290SChangpeng Liu p = subparsers.add_parser('vfu_tgt_set_base_path', help='Set socket base path.') 3188da231290SChangpeng Liu p.add_argument('path', help='socket base path') 3189da231290SChangpeng Liu p.set_defaults(func=vfu_tgt_set_base_path) 3190da231290SChangpeng Liu 319123ef6388SChangpeng Liu def vfu_virtio_delete_endpoint(args): 319223ef6388SChangpeng Liu rpc.vfio_user.vfu_virtio_delete_endpoint(args.client, name=args.name) 319323ef6388SChangpeng Liu 319423ef6388SChangpeng Liu p = subparsers.add_parser('vfu_virtio_delete_endpoint', help='Delete the PCI device via endpoint name.') 319523ef6388SChangpeng Liu p.add_argument('name', help='Endpoint name') 319623ef6388SChangpeng Liu p.set_defaults(func=vfu_virtio_delete_endpoint) 319723ef6388SChangpeng Liu 319823ef6388SChangpeng Liu def vfu_virtio_create_blk_endpoint(args): 319923ef6388SChangpeng Liu rpc.vfio_user.vfu_virtio_create_blk_endpoint(args.client, 320023ef6388SChangpeng Liu name=args.name, 320123ef6388SChangpeng Liu bdev_name=args.bdev_name, 320223ef6388SChangpeng Liu cpumask=args.cpumask, 320323ef6388SChangpeng Liu num_queues=args.num_queues, 320423ef6388SChangpeng Liu qsize=args.qsize, 320523ef6388SChangpeng Liu packed_ring=args.packed_ring) 320623ef6388SChangpeng Liu 320723ef6388SChangpeng Liu p = subparsers.add_parser('vfu_virtio_create_blk_endpoint', help='Create virtio-blk endpoint.') 320823ef6388SChangpeng Liu p.add_argument('name', help='Name of the endpoint') 320923ef6388SChangpeng Liu p.add_argument('--bdev-name', help='block device name', type=str, required=True) 321023ef6388SChangpeng Liu p.add_argument('--cpumask', help='CPU masks') 321123ef6388SChangpeng Liu p.add_argument('--num-queues', help='number of vrings', type=int, default=0) 321223ef6388SChangpeng Liu p.add_argument('--qsize', help='number of element for each vring', type=int, default=0) 321323ef6388SChangpeng Liu p.add_argument("--packed-ring", action='store_true', help='Enable packed ring') 321423ef6388SChangpeng Liu p.set_defaults(func=vfu_virtio_create_blk_endpoint) 321523ef6388SChangpeng Liu 32165004d7b8SChangpeng Liu def vfu_virtio_scsi_add_target(args): 32175004d7b8SChangpeng Liu rpc.vfio_user.vfu_virtio_scsi_add_target(args.client, 32185004d7b8SChangpeng Liu name=args.name, 32195004d7b8SChangpeng Liu scsi_target_num=args.scsi_target_num, 32205004d7b8SChangpeng Liu bdev_name=args.bdev_name) 32215004d7b8SChangpeng Liu 32225004d7b8SChangpeng Liu p = subparsers.add_parser('vfu_virtio_scsi_add_target', help='Attach a block device to SCSI target of PCI endpoint.') 32235004d7b8SChangpeng Liu p.add_argument('name', help='Name of the endpoint') 32245004d7b8SChangpeng Liu p.add_argument('--scsi-target-num', help='number of SCSI Target', type=int, required=True) 32255004d7b8SChangpeng Liu p.add_argument('--bdev-name', help='block device name', type=str, required=True) 32265004d7b8SChangpeng Liu p.set_defaults(func=vfu_virtio_scsi_add_target) 32275004d7b8SChangpeng Liu 32285004d7b8SChangpeng Liu def vfu_virtio_scsi_remove_target(args): 32295004d7b8SChangpeng Liu rpc.vfio_user.vfu_virtio_scsi_remove_target(args.client, 32305004d7b8SChangpeng Liu name=args.name, 32315004d7b8SChangpeng Liu scsi_target_num=args.scsi_target_num) 32325004d7b8SChangpeng Liu 32335004d7b8SChangpeng Liu p = subparsers.add_parser('vfu_virtio_scsi_remove_target', help='Remove the specified SCSI target of PCI endpoint.') 32345004d7b8SChangpeng Liu p.add_argument('name', help='Name of the endpoint') 32355004d7b8SChangpeng Liu p.add_argument('--scsi-target-num', help='number of SCSI Target', type=int, required=True) 32365004d7b8SChangpeng Liu p.set_defaults(func=vfu_virtio_scsi_remove_target) 32375004d7b8SChangpeng Liu 32385004d7b8SChangpeng Liu def vfu_virtio_create_scsi_endpoint(args): 32395004d7b8SChangpeng Liu rpc.vfio_user.vfu_virtio_create_scsi_endpoint(args.client, 32405004d7b8SChangpeng Liu name=args.name, 32415004d7b8SChangpeng Liu cpumask=args.cpumask, 32425004d7b8SChangpeng Liu num_io_queues=args.num_io_queues, 32435004d7b8SChangpeng Liu qsize=args.qsize, 32445004d7b8SChangpeng Liu packed_ring=args.packed_ring) 32455004d7b8SChangpeng Liu 32465004d7b8SChangpeng Liu p = subparsers.add_parser('vfu_virtio_create_scsi_endpoint', help='Create virtio-scsi endpoint.') 32475004d7b8SChangpeng Liu p.add_argument('name', help='Name of the endpoint') 32485004d7b8SChangpeng Liu p.add_argument('--cpumask', help='CPU masks') 32495004d7b8SChangpeng Liu p.add_argument('--num-io-queues', help='number of IO vrings', type=int, default=0) 32505004d7b8SChangpeng Liu p.add_argument('--qsize', help='number of element for each vring', type=int, default=0) 32515004d7b8SChangpeng Liu p.add_argument("--packed-ring", action='store_true', help='Enable packed ring') 32525004d7b8SChangpeng Liu p.set_defaults(func=vfu_virtio_create_scsi_endpoint) 32535004d7b8SChangpeng Liu 32544d453b24SAnton Nayshtut def vfu_virtio_create_fs_endpoint(args): 32554d453b24SAnton Nayshtut rpc.vfio_user.vfu_virtio_create_fs_endpoint(args.client, 32564d453b24SAnton Nayshtut name=args.name, 32574d453b24SAnton Nayshtut fsdev_name=args.fsdev_name, 32584d453b24SAnton Nayshtut tag=args.tag, 32594d453b24SAnton Nayshtut cpumask=args.cpumask, 32604d453b24SAnton Nayshtut num_queues=args.num_queues, 32614d453b24SAnton Nayshtut qsize=args.qsize, 32624d453b24SAnton Nayshtut packed_ring=args.packed_ring) 32634d453b24SAnton Nayshtut 32644d453b24SAnton Nayshtut p = subparsers.add_parser('vfu_virtio_create_fs_endpoint', help='Create virtio-fs endpoint.') 32654d453b24SAnton Nayshtut p.add_argument('name', help='Name of the endpoint') 32664d453b24SAnton Nayshtut p.add_argument('--fsdev-name', help='fsdev name', type=str, required=True) 32674d453b24SAnton Nayshtut p.add_argument('--tag', help='virtiofs tag', type=str, required=True) 32684d453b24SAnton Nayshtut p.add_argument('--cpumask', help='CPU masks') 32694d453b24SAnton Nayshtut p.add_argument('--num-queues', help='number of vrings', type=int, default=0) 32704d453b24SAnton Nayshtut p.add_argument('--qsize', help='number of element for each vring', type=int, default=0) 32714d453b24SAnton Nayshtut p.add_argument("--packed-ring", action='store_true', help='Enable packed ring') 32724d453b24SAnton Nayshtut p.set_defaults(func=vfu_virtio_create_fs_endpoint) 32734d453b24SAnton Nayshtut 3274c6ecddccSpaul luse # accel_fw 3275c6ecddccSpaul luse def accel_get_opc_assignments(args): 3276c6ecddccSpaul luse print_dict(rpc.accel.accel_get_opc_assignments(args.client)) 3277c6ecddccSpaul luse 3278712e8cb7SBen Walker p = subparsers.add_parser('accel_get_opc_assignments', help='Get list of opcode name to module assignments.') 3279c6ecddccSpaul luse p.set_defaults(func=accel_get_opc_assignments) 3280c6ecddccSpaul luse 3281712e8cb7SBen Walker def accel_get_module_info(args): 3282712e8cb7SBen Walker print_dict(rpc.accel.accel_get_module_info(args.client)) 328344cbea40Spaul luse 3284e7b78543SJim Harris p = subparsers.add_parser('accel_get_module_info', aliases=['accel_get_engine_info'], 3285e7b78543SJim Harris help='Get list of valid module names and their operations.') 3286712e8cb7SBen Walker p.set_defaults(func=accel_get_module_info) 328744cbea40Spaul luse 3288efa33b85Spaul luse def accel_assign_opc(args): 3289712e8cb7SBen Walker rpc.accel.accel_assign_opc(args.client, opname=args.opname, module=args.module) 3290efa33b85Spaul luse 3291712e8cb7SBen Walker p = subparsers.add_parser('accel_assign_opc', help='Manually assign an operation to a module.') 3292efa33b85Spaul luse p.add_argument('-o', '--opname', help='opname') 3293712e8cb7SBen Walker p.add_argument('-m', '--module', help='name of module') 3294efa33b85Spaul luse p.set_defaults(func=accel_assign_opc) 3295efa33b85Spaul luse 32962608d129SAlexey Marchuk def accel_crypto_key_create(args): 32972608d129SAlexey Marchuk print_dict(rpc.accel.accel_crypto_key_create(args.client, 32982608d129SAlexey Marchuk cipher=args.cipher, 32992608d129SAlexey Marchuk key=args.key, 33002608d129SAlexey Marchuk key2=args.key2, 33013b8b12cdSJacek Kalwas tweak_mode=args.tweak_mode, 33022608d129SAlexey Marchuk name=args.name)) 33032608d129SAlexey Marchuk 33042608d129SAlexey Marchuk p = subparsers.add_parser('accel_crypto_key_create', help='Create encryption key') 33053b8b12cdSJacek Kalwas p.add_argument('-c', '--cipher', help='cipher', required=True) 33063b8b12cdSJacek Kalwas p.add_argument('-k', '--key', help='key', required=True) 3307dc3e7140SJacek Kalwas p.add_argument('-e', '--key2', help='key2', default=None) 3308dc3e7140SJacek Kalwas p.add_argument('-t', '--tweak-mode', help='tweak mode', default=None) 33093b8b12cdSJacek Kalwas p.add_argument('-n', '--name', help='key name', required=True) 33102608d129SAlexey Marchuk p.set_defaults(func=accel_crypto_key_create) 33112608d129SAlexey Marchuk 331213f97e67SAlexey Marchuk def accel_crypto_key_destroy(args): 331313f97e67SAlexey Marchuk print_dict(rpc.accel.accel_crypto_key_destroy(args.client, 3314c30dfbc2SKonrad Sztyber key_name=args.name)) 331513f97e67SAlexey Marchuk 331613f97e67SAlexey Marchuk p = subparsers.add_parser('accel_crypto_key_destroy', help='Destroy encryption key') 331713f97e67SAlexey Marchuk p.add_argument('-n', '--name', help='key name', required=True, type=str) 331813f97e67SAlexey Marchuk p.set_defaults(func=accel_crypto_key_destroy) 331913f97e67SAlexey Marchuk 33202608d129SAlexey Marchuk def accel_crypto_keys_get(args): 33212608d129SAlexey Marchuk print_dict(rpc.accel.accel_crypto_keys_get(args.client, 33222608d129SAlexey Marchuk key_name=args.key_name)) 33232608d129SAlexey Marchuk 33242608d129SAlexey Marchuk p = subparsers.add_parser('accel_crypto_keys_get', help='Get a list of the crypto keys') 33252608d129SAlexey Marchuk p.add_argument('-k', '--key-name', help='Get information about a specific key', type=str) 33262608d129SAlexey Marchuk p.set_defaults(func=accel_crypto_keys_get) 33272608d129SAlexey Marchuk 3328b2454dfbSKonrad Sztyber def accel_set_driver(args): 3329b2454dfbSKonrad Sztyber rpc.accel.accel_set_driver(args.client, name=args.name) 3330b2454dfbSKonrad Sztyber 3331b2454dfbSKonrad Sztyber p = subparsers.add_parser('accel_set_driver', help='Select accel platform driver to execute ' + 3332b2454dfbSKonrad Sztyber 'operation chains') 3333b2454dfbSKonrad Sztyber p.add_argument('name', help='name of the platform driver') 3334b2454dfbSKonrad Sztyber p.set_defaults(func=accel_set_driver) 3335b2454dfbSKonrad Sztyber 3336688f7fb8SKonrad Sztyber def accel_set_options(args): 333731bfcb45SKonrad Sztyber rpc.accel.accel_set_options(args.client, args.small_cache_size, args.large_cache_size, 333831bfcb45SKonrad Sztyber args.task_count, args.sequence_count, args.buf_count) 3339688f7fb8SKonrad Sztyber 3340688f7fb8SKonrad Sztyber p = subparsers.add_parser('accel_set_options', help='Set accel framework\'s options') 3341688f7fb8SKonrad Sztyber p.add_argument('--small-cache-size', type=int, help='Size of the small iobuf cache') 3342688f7fb8SKonrad Sztyber p.add_argument('--large-cache-size', type=int, help='Size of the large iobuf cache') 334331bfcb45SKonrad Sztyber p.add_argument('--task-count', type=int, help='Maximum number of tasks per IO channel') 334431bfcb45SKonrad Sztyber p.add_argument('--sequence-count', type=int, help='Maximum number of sequences per IO channel') 334531bfcb45SKonrad Sztyber p.add_argument('--buf-count', type=int, help='Maximum number of buffers per IO channel') 3346688f7fb8SKonrad Sztyber p.set_defaults(func=accel_set_options) 3347688f7fb8SKonrad Sztyber 3348f2459a2fSKonrad Sztyber def accel_get_stats(args): 3349f2459a2fSKonrad Sztyber print_dict(rpc.accel.accel_get_stats(args.client)) 3350f2459a2fSKonrad Sztyber 3351f2459a2fSKonrad Sztyber p = subparsers.add_parser('accel_get_stats', help='Display accel framework\'s statistics') 3352f2459a2fSKonrad Sztyber p.set_defaults(func=accel_get_stats) 3353f2459a2fSKonrad Sztyber 3354ce2e6828SShuhei Matsumoto # ioat 3355712e8cb7SBen Walker def ioat_scan_accel_module(args): 3356712e8cb7SBen Walker rpc.ioat.ioat_scan_accel_module(args.client) 3357ce2e6828SShuhei Matsumoto 3358e7b78543SJim Harris p = subparsers.add_parser('ioat_scan_accel_module', aliases=['ioat_scan_accel_engine'], 3359e7b78543SJim Harris help='Enable IOAT accel module offload.') 3360712e8cb7SBen Walker p.set_defaults(func=ioat_scan_accel_module) 3361ce2e6828SShuhei Matsumoto 3362976f8b09Spaul luse # dpdk compressdev 3363976f8b09Spaul luse def compressdev_scan_accel_module(args): 3364976f8b09Spaul luse rpc.compressdev.compressdev_scan_accel_module(args.client, pmd=args.pmd) 3365976f8b09Spaul luse 3366976f8b09Spaul luse p = subparsers.add_parser('compressdev_scan_accel_module', help='Scan and enable compressdev module and set pmd option.') 33672186fc03SZhangfei Gao p.add_argument('-p', '--pmd', type=int, help='0 = auto-select, 1= QAT only, 2 = mlx5_pci only, 3 = uadk only') 3368976f8b09Spaul luse p.set_defaults(func=compressdev_scan_accel_module) 3369976f8b09Spaul luse 3370ffef30aeSpaul luse # dsa 3371712e8cb7SBen Walker def dsa_scan_accel_module(args): 3372712e8cb7SBen Walker rpc.dsa.dsa_scan_accel_module(args.client, config_kernel_mode=args.config_kernel_mode) 337342eb233eSpaul luse 3374e7b78543SJim Harris p = subparsers.add_parser('dsa_scan_accel_module', aliases=['dsa_scan_accel_engine'], 3375712e8cb7SBen Walker help='Set config and enable dsa accel module offload.') 3376ffef30aeSpaul luse p.add_argument('-k', '--config-kernel-mode', help='Use Kernel mode dsa', 3377e5d5b3ebSZiye Yang action='store_true', dest='config_kernel_mode') 3378712e8cb7SBen Walker p.set_defaults(func=dsa_scan_accel_module, config_kernel_mode=None) 337942eb233eSpaul luse 3380b483811fSpaul luse # iaa 3381712e8cb7SBen Walker def iaa_scan_accel_module(args): 3382712e8cb7SBen Walker rpc.iaa.iaa_scan_accel_module(args.client) 3383b483811fSpaul luse 3384e7b78543SJim Harris p = subparsers.add_parser('iaa_scan_accel_module', aliases=['iaa_scan_accel_engine'], 3385712e8cb7SBen Walker help='Set config and enable iaa accel module offload.') 3386712e8cb7SBen Walker p.set_defaults(func=iaa_scan_accel_module) 3387b483811fSpaul luse 338861fbb000SAlexey Marchuk def dpdk_cryptodev_scan_accel_module(args): 338961fbb000SAlexey Marchuk rpc.dpdk_cryptodev.dpdk_cryptodev_scan_accel_module(args.client) 339061fbb000SAlexey Marchuk 339161fbb000SAlexey Marchuk p = subparsers.add_parser('dpdk_cryptodev_scan_accel_module', 339261fbb000SAlexey Marchuk help='Enable dpdk_cryptodev accel module offload.') 339361fbb000SAlexey Marchuk p.set_defaults(func=dpdk_cryptodev_scan_accel_module) 339461fbb000SAlexey Marchuk 339561fbb000SAlexey Marchuk def dpdk_cryptodev_set_driver(args): 339661fbb000SAlexey Marchuk rpc.dpdk_cryptodev.dpdk_cryptodev_set_driver(args.client, 339761fbb000SAlexey Marchuk driver_name=args.driver_name) 339861fbb000SAlexey Marchuk 339961fbb000SAlexey Marchuk p = subparsers.add_parser('dpdk_cryptodev_set_driver', 340061fbb000SAlexey Marchuk help='Set the DPDK cryptodev driver.') 340161fbb000SAlexey Marchuk p.add_argument('-d', '--driver-name', help='The driver, can be one of crypto_aesni_mb, crypto_qat or mlx5_pci', type=str) 340261fbb000SAlexey Marchuk p.set_defaults(func=dpdk_cryptodev_set_driver) 340361fbb000SAlexey Marchuk 340461fbb000SAlexey Marchuk def dpdk_cryptodev_get_driver(args): 340561fbb000SAlexey Marchuk print_dict(rpc.dpdk_cryptodev.dpdk_cryptodev_get_driver(args.client)) 340661fbb000SAlexey Marchuk 340761fbb000SAlexey Marchuk p = subparsers.add_parser('dpdk_cryptodev_get_driver', help='Get the DPDK cryptodev driver') 340861fbb000SAlexey Marchuk p.set_defaults(func=dpdk_cryptodev_get_driver) 340961fbb000SAlexey Marchuk 3410a1dfa7ecSAlexey Marchuk # mlx5 3411a1dfa7ecSAlexey Marchuk def mlx5_scan_accel_module(args): 3412a1dfa7ecSAlexey Marchuk rpc.mlx5.mlx5_scan_accel_module(args.client, 3413a1dfa7ecSAlexey Marchuk qp_size=args.qp_size, 34143f657ddbSAlexey Marchuk num_requests=args.num_requests, 3415e892af6bSAlexey Marchuk allowed_devs=args.allowed_devs, 3416008a6371SAlexey Marchuk crypto_split_blocks=args.crypto_split_blocks, 3417008a6371SAlexey Marchuk enable_driver=args.enable_driver) 3418a1dfa7ecSAlexey Marchuk 3419a1dfa7ecSAlexey Marchuk p = subparsers.add_parser('mlx5_scan_accel_module', help='Enable mlx5 accel module.') 3420a1dfa7ecSAlexey Marchuk p.add_argument('-q', '--qp-size', type=int, help='QP size') 3421a1dfa7ecSAlexey Marchuk p.add_argument('-r', '--num-requests', type=int, help='Size of the shared requests pool') 34223f657ddbSAlexey Marchuk p.add_argument('-d', '--allowed-devs', help="Comma separated list of allowed device names, e.g. mlx5_0,mlx5_1") 3423e892af6bSAlexey Marchuk p.add_argument('-s', '--crypto-split-blocks', type=int, 3424e892af6bSAlexey Marchuk help="Number of data blocks to be processed in 1 crypto UMR. [0-65535], 0 means no limit") 3425008a6371SAlexey Marchuk p.add_argument('-e', '--enable-driver', dest='enable_driver', action='store_true', default=None, 3426008a6371SAlexey Marchuk help="Enable mlx5 platform driver. Note: the driver supports reduced scope of operations, enable with care") 3427a1dfa7ecSAlexey Marchuk p.set_defaults(func=mlx5_scan_accel_module) 3428a1dfa7ecSAlexey Marchuk 3429fe7bb7bdSAlexey Marchuk def accel_mlx5_dump_stats(args): 3430fe7bb7bdSAlexey Marchuk print_dict(rpc.mlx5.accel_mlx5_dump_stats(args.client, level=args.level)) 3431fe7bb7bdSAlexey Marchuk 3432fe7bb7bdSAlexey Marchuk p = subparsers.add_parser('accel_mlx5_dump_stats', help='Dump accel mlx5 module statistics.') 3433fe7bb7bdSAlexey Marchuk p.add_argument('-l', '--level', type=str, help='Verbose level, one of \"total\", \"channel\" or \"device\"') 3434fe7bb7bdSAlexey Marchuk p.set_defaults(func=accel_mlx5_dump_stats) 3435fe7bb7bdSAlexey Marchuk 34368625cc18SKonrad Sztyber # accel_error 34378625cc18SKonrad Sztyber def accel_error_inject_error(args): 34388625cc18SKonrad Sztyber rpc.accel.accel_error_inject_error(args.client, opcode=args.opcode, 3439bb019612SKonrad Sztyber type=args.type, count=args.count, 3440760cb023SKonrad Sztyber interval=args.interval, errcode=args.errcode) 34418625cc18SKonrad Sztyber 34428625cc18SKonrad Sztyber p = subparsers.add_parser('accel_error_inject_error', 34438625cc18SKonrad Sztyber help='Inject an error to processing accel operation') 34448625cc18SKonrad Sztyber p.add_argument('-o', '--opcode', help='Opcode') 34458625cc18SKonrad Sztyber p.add_argument('-t', '--type', 3446bb019612SKonrad Sztyber help='Error type ("corrupt": corrupt the data, "failure": fail the operation, "disable": disable error injection)') 34478625cc18SKonrad Sztyber p.add_argument('-c', '--count', type=int, 34488625cc18SKonrad Sztyber help='Number of errors to inject on each IO channel (0 to disable error injection)') 3449760cb023SKonrad Sztyber p.add_argument('-i', '--interval', type=int, help='Interval between injections') 3450bb019612SKonrad Sztyber p.add_argument('--errcode', type=int, help='Error code to inject (only relevant for type=failure)') 34518625cc18SKonrad Sztyber p.set_defaults(func=accel_error_inject_error) 34528625cc18SKonrad Sztyber 34530a18f228SChunyang Hui # opal 345436c9ac2dSChunyang Hui def bdev_nvme_opal_init(args): 345536c9ac2dSChunyang Hui rpc.nvme.bdev_nvme_opal_init(args.client, 345636c9ac2dSChunyang Hui nvme_ctrlr_name=args.nvme_ctrlr_name, 345736c9ac2dSChunyang Hui password=args.password) 345836c9ac2dSChunyang Hui 345936c9ac2dSChunyang Hui p = subparsers.add_parser('bdev_nvme_opal_init', help='take ownership and activate') 346036c9ac2dSChunyang Hui p.add_argument('-b', '--nvme-ctrlr-name', help='nvme ctrlr name') 346136c9ac2dSChunyang Hui p.add_argument('-p', '--password', help='password for admin') 346236c9ac2dSChunyang Hui p.set_defaults(func=bdev_nvme_opal_init) 346336c9ac2dSChunyang Hui 346436c9ac2dSChunyang Hui def bdev_nvme_opal_revert(args): 346536c9ac2dSChunyang Hui rpc.nvme.bdev_nvme_opal_revert(args.client, 346636c9ac2dSChunyang Hui nvme_ctrlr_name=args.nvme_ctrlr_name, 346736c9ac2dSChunyang Hui password=args.password) 346836c9ac2dSChunyang Hui p = subparsers.add_parser('bdev_nvme_opal_revert', help='Revert to default factory settings') 346936c9ac2dSChunyang Hui p.add_argument('-b', '--nvme-ctrlr-name', help='nvme ctrlr name') 347036c9ac2dSChunyang Hui p.add_argument('-p', '--password', help='password') 347136c9ac2dSChunyang Hui p.set_defaults(func=bdev_nvme_opal_revert) 347236c9ac2dSChunyang Hui 34730a18f228SChunyang Hui def bdev_opal_create(args): 34740a18f228SChunyang Hui print_json(rpc.bdev.bdev_opal_create(args.client, 34750a18f228SChunyang Hui nvme_ctrlr_name=args.nvme_ctrlr_name, 34760a18f228SChunyang Hui nsid=args.nsid, 34770a18f228SChunyang Hui locking_range_id=args.locking_range_id, 34780a18f228SChunyang Hui range_start=args.range_start, 34790a18f228SChunyang Hui range_length=args.range_length, 34800a18f228SChunyang Hui password=args.password)) 34810a18f228SChunyang Hui 34820a18f228SChunyang Hui p = subparsers.add_parser('bdev_opal_create', help="""Create opal bdev on specified NVMe controller""") 34830a18f228SChunyang Hui p.add_argument('-b', '--nvme-ctrlr-name', help='nvme ctrlr name', required=True) 34840a18f228SChunyang Hui p.add_argument('-n', '--nsid', help='namespace ID (only support nsid=1 for now)', type=int, required=True) 34850a18f228SChunyang Hui p.add_argument('-i', '--locking-range-id', help='locking range id', type=int, required=True) 34860a18f228SChunyang Hui p.add_argument('-s', '--range-start', help='locking range start LBA', type=int, required=True) 34870a18f228SChunyang Hui p.add_argument('-l', '--range-length', help='locking range length (in blocks)', type=int, required=True) 34880a18f228SChunyang Hui p.add_argument('-p', '--password', help='admin password', required=True) 34890a18f228SChunyang Hui p.set_defaults(func=bdev_opal_create) 34900a18f228SChunyang Hui 349136c9ac2dSChunyang Hui def bdev_opal_get_info(args): 349236c9ac2dSChunyang Hui print_dict(rpc.bdev.bdev_opal_get_info(args.client, 349336c9ac2dSChunyang Hui bdev_name=args.bdev_name, 349436c9ac2dSChunyang Hui password=args.password)) 349536c9ac2dSChunyang Hui 349636c9ac2dSChunyang Hui p = subparsers.add_parser('bdev_opal_get_info', help='get opal locking range info for this bdev') 349736c9ac2dSChunyang Hui p.add_argument('-b', '--bdev-name', help='opal bdev') 349836c9ac2dSChunyang Hui p.add_argument('-p', '--password', help='password') 349936c9ac2dSChunyang Hui p.set_defaults(func=bdev_opal_get_info) 350036c9ac2dSChunyang Hui 35010a18f228SChunyang Hui def bdev_opal_delete(args): 35020a18f228SChunyang Hui rpc.bdev.bdev_opal_delete(args.client, 35030a18f228SChunyang Hui bdev_name=args.bdev_name, 35040a18f228SChunyang Hui password=args.password) 35050a18f228SChunyang Hui 35060a18f228SChunyang Hui p = subparsers.add_parser('bdev_opal_delete', help="""delete a virtual opal bdev""") 35070a18f228SChunyang Hui p.add_argument('-b', '--bdev-name', help='opal virtual bdev', required=True) 35080a18f228SChunyang Hui p.add_argument('-p', '--password', help='admin password', required=True) 35090a18f228SChunyang Hui p.set_defaults(func=bdev_opal_delete) 35100a18f228SChunyang Hui 3511bc40f5f6SChunyang Hui def bdev_opal_new_user(args): 3512bc40f5f6SChunyang Hui rpc.bdev.bdev_opal_new_user(args.client, 3513bc40f5f6SChunyang Hui bdev_name=args.bdev_name, 3514bc40f5f6SChunyang Hui admin_password=args.admin_password, 3515bc40f5f6SChunyang Hui user_id=args.user_id, 3516bc40f5f6SChunyang Hui user_password=args.user_password) 3517bc40f5f6SChunyang Hui 3518bc40f5f6SChunyang Hui p = subparsers.add_parser('bdev_opal_new_user', help="""Add a user to opal bdev who can set lock state for this bdev""") 3519bc40f5f6SChunyang Hui p.add_argument('-b', '--bdev-name', help='opal bdev', required=True) 3520bc40f5f6SChunyang Hui p.add_argument('-p', '--admin-password', help='admin password', required=True) 3521bc40f5f6SChunyang Hui p.add_argument('-i', '--user-id', help='ID for new user', type=int, required=True) 3522bc40f5f6SChunyang Hui p.add_argument('-u', '--user-password', help='password set for this user', required=True) 3523bc40f5f6SChunyang Hui p.set_defaults(func=bdev_opal_new_user) 3524bc40f5f6SChunyang Hui 3525bc40f5f6SChunyang Hui def bdev_opal_set_lock_state(args): 3526bc40f5f6SChunyang Hui rpc.bdev.bdev_opal_set_lock_state(args.client, 3527bc40f5f6SChunyang Hui bdev_name=args.bdev_name, 3528bc40f5f6SChunyang Hui user_id=args.user_id, 3529bc40f5f6SChunyang Hui password=args.password, 3530bc40f5f6SChunyang Hui lock_state=args.lock_state) 3531bc40f5f6SChunyang Hui 3532bc40f5f6SChunyang Hui p = subparsers.add_parser('bdev_opal_set_lock_state', help="""set lock state for an opal bdev""") 3533bc40f5f6SChunyang Hui p.add_argument('-b', '--bdev-name', help='opal bdev', required=True) 3534bc40f5f6SChunyang 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', 3535bc40f5f6SChunyang Hui type=int, required=True) 3536bc40f5f6SChunyang Hui p.add_argument('-p', '--password', help='password of this user', required=True) 3537bc40f5f6SChunyang Hui p.add_argument('-l', '--lock-state', help='lock state to set, choose from {readwrite, readonly, rwlock}', required=True) 3538bc40f5f6SChunyang Hui p.set_defaults(func=bdev_opal_set_lock_state) 3539bc40f5f6SChunyang Hui 3540b318d5f0SPawel Kaminski # bdev_nvme_send_cmd 3541b318d5f0SPawel Kaminski def bdev_nvme_send_cmd(args): 3542b318d5f0SPawel Kaminski print_dict(rpc.nvme.bdev_nvme_send_cmd(args.client, 3543e66ea624SLiu Xiaodong name=args.nvme_name, 3544e66ea624SLiu Xiaodong cmd_type=args.cmd_type, 3545e66ea624SLiu Xiaodong data_direction=args.data_direction, 3546e66ea624SLiu Xiaodong cmdbuf=args.cmdbuf, 3547e66ea624SLiu Xiaodong data=args.data, 3548e66ea624SLiu Xiaodong metadata=args.metadata, 3549e66ea624SLiu Xiaodong data_len=args.data_length, 3550e66ea624SLiu Xiaodong metadata_len=args.metadata_length, 3551e66ea624SLiu Xiaodong timeout_ms=args.timeout_ms)) 3552e66ea624SLiu Xiaodong 35537aa92ad5Swanghailiangx p = subparsers.add_parser('bdev_nvme_send_cmd', help='NVMe passthrough cmd.') 3554e66ea624SLiu Xiaodong p.add_argument('-n', '--nvme-name', help="""Name of the operating NVMe controller""") 3555e66ea624SLiu Xiaodong p.add_argument('-t', '--cmd-type', help="""Type of nvme cmd. Valid values are: admin, io""") 3556e66ea624SLiu Xiaodong p.add_argument('-r', '--data-direction', help="""Direction of data transfer. Valid values are: c2h, h2c""") 3557e66ea624SLiu Xiaodong p.add_argument('-c', '--cmdbuf', help="""NVMe command encoded by base64 urlsafe""") 3558e66ea624SLiu Xiaodong p.add_argument('-d', '--data', help="""Data transferring to controller from host, encoded by base64 urlsafe""") 3559e66ea624SLiu Xiaodong p.add_argument('-m', '--metadata', help="""Metadata transferring to controller from host, encoded by base64 urlsafe""") 3560e66ea624SLiu Xiaodong p.add_argument('-D', '--data-length', help="""Data length required to transfer from controller to host""", type=int) 3561e66ea624SLiu Xiaodong p.add_argument('-M', '--metadata-length', help="""Metadata length required to transfer from controller to host""", type=int) 3562e66ea624SLiu Xiaodong p.add_argument('-T', '--timeout-ms', 356316772e6dSJaroslaw Chachulski help="""Command execution timeout value, in milliseconds, if 0, don't track timeout""", type=int) 3564b318d5f0SPawel Kaminski p.set_defaults(func=bdev_nvme_send_cmd) 3565e66ea624SLiu Xiaodong 35662cccea55SPawel Wodkowski # Notifications 3567c7174d9eSMaciej Wawryk def notify_get_types(args): 3568c7174d9eSMaciej Wawryk print_dict(rpc.notify.notify_get_types(args.client)) 35692cccea55SPawel Wodkowski 3570405be3b7Swanghailiangx p = subparsers.add_parser('notify_get_types', help='List available notifications that user can subscribe to.') 3571c7174d9eSMaciej Wawryk p.set_defaults(func=notify_get_types) 35722cccea55SPawel Wodkowski 357385ab05d3SMaciej Wawryk def notify_get_notifications(args): 357485ab05d3SMaciej Wawryk ret = rpc.notify.notify_get_notifications(args.client, 35752cccea55SPawel Wodkowski id=args.id, 35762cccea55SPawel Wodkowski max=args.max) 35772cccea55SPawel Wodkowski print_dict(ret) 35782cccea55SPawel Wodkowski 3579405be3b7Swanghailiangx p = subparsers.add_parser('notify_get_notifications', help='Get notifications') 35802cccea55SPawel Wodkowski p.add_argument('-i', '--id', help="""First ID to start fetching from""", type=int) 35812cccea55SPawel Wodkowski p.add_argument('-n', '--max', help="""Maximum number of notifications to return in response""", type=int) 358285ab05d3SMaciej Wawryk p.set_defaults(func=notify_get_notifications) 35832cccea55SPawel Wodkowski 35847535cdbdSEvgeniy Kochetov def thread_get_stats(args): 35857535cdbdSEvgeniy Kochetov print_dict(rpc.app.thread_get_stats(args.client)) 35867535cdbdSEvgeniy Kochetov 35877535cdbdSEvgeniy Kochetov p = subparsers.add_parser( 35887535cdbdSEvgeniy Kochetov 'thread_get_stats', help='Display current statistics of all the threads') 35897535cdbdSEvgeniy Kochetov p.set_defaults(func=thread_get_stats) 35907535cdbdSEvgeniy Kochetov 359195b35daaSShuhei Matsumoto def thread_set_cpumask(args): 359295b35daaSShuhei Matsumoto ret = rpc.app.thread_set_cpumask(args.client, 359395b35daaSShuhei Matsumoto id=args.id, 359495b35daaSShuhei Matsumoto cpumask=args.cpumask) 359595b35daaSShuhei Matsumoto p = subparsers.add_parser('thread_set_cpumask', 359695b35daaSShuhei Matsumoto help="""set the cpumask of the thread whose ID matches to the 359795b35daaSShuhei Matsumoto specified value. The thread may be migrated to one of the specified CPUs.""") 359895b35daaSShuhei Matsumoto p.add_argument('-i', '--id', type=int, help='thread ID') 359995b35daaSShuhei Matsumoto p.add_argument('-m', '--cpumask', help='cpumask for this thread') 360095b35daaSShuhei Matsumoto p.set_defaults(func=thread_set_cpumask) 360195b35daaSShuhei Matsumoto 3602d267d0e8SVitaliy Mysak def log_enable_timestamps(args): 3603d267d0e8SVitaliy Mysak ret = rpc.app.log_enable_timestamps(args.client, 3604d267d0e8SVitaliy Mysak enabled=args.enabled) 3605d267d0e8SVitaliy Mysak p = subparsers.add_parser('log_enable_timestamps', 3606d267d0e8SVitaliy Mysak help='Enable or disable timestamps.') 3607d267d0e8SVitaliy Mysak p.add_argument('-d', '--disable', dest='enabled', default=False, action='store_false', help="Disable timestamps") 3608d267d0e8SVitaliy Mysak p.add_argument('-e', '--enable', dest='enabled', action='store_true', help="Enable timestamps") 3609d267d0e8SVitaliy Mysak p.set_defaults(func=log_enable_timestamps) 3610d267d0e8SVitaliy Mysak 36110b0f0c54SShuhei Matsumoto def thread_get_pollers(args): 36120b0f0c54SShuhei Matsumoto print_dict(rpc.app.thread_get_pollers(args.client)) 36130b0f0c54SShuhei Matsumoto 36140b0f0c54SShuhei Matsumoto p = subparsers.add_parser( 36150b0f0c54SShuhei Matsumoto 'thread_get_pollers', help='Display current pollers of all the threads') 36160b0f0c54SShuhei Matsumoto p.set_defaults(func=thread_get_pollers) 36170b0f0c54SShuhei Matsumoto 361849cffc1eSShuhei Matsumoto def thread_get_io_channels(args): 361949cffc1eSShuhei Matsumoto print_dict(rpc.app.thread_get_io_channels(args.client)) 362049cffc1eSShuhei Matsumoto 362149cffc1eSShuhei Matsumoto p = subparsers.add_parser( 362249cffc1eSShuhei Matsumoto 'thread_get_io_channels', help='Display current IO channels of all the threads') 362349cffc1eSShuhei Matsumoto p.set_defaults(func=thread_get_io_channels) 362449cffc1eSShuhei Matsumoto 3625de467ec9SSeth Howell def env_dpdk_get_mem_stats(args): 3626de467ec9SSeth Howell print_dict(rpc.env_dpdk.env_dpdk_get_mem_stats(args.client)) 3627de467ec9SSeth Howell 3628de467ec9SSeth Howell p = subparsers.add_parser( 3629de467ec9SSeth Howell 'env_dpdk_get_mem_stats', help='write the dpdk memory stats to a file.') 3630de467ec9SSeth Howell p.set_defaults(func=env_dpdk_get_mem_stats) 3631de467ec9SSeth Howell 36323ce759a1SXiaodong Liu # blobfs 36333ce759a1SXiaodong Liu def blobfs_detect(args): 36343ce759a1SXiaodong Liu print(rpc.blobfs.blobfs_detect(args.client, 36353ce759a1SXiaodong Liu bdev_name=args.bdev_name)) 36363ce759a1SXiaodong Liu 36373ce759a1SXiaodong Liu p = subparsers.add_parser('blobfs_detect', help='Detect whether a blobfs exists on bdev') 36383ce759a1SXiaodong Liu p.add_argument('bdev_name', help='Blockdev name to detect blobfs. Example: Malloc0.') 36393ce759a1SXiaodong Liu p.set_defaults(func=blobfs_detect) 36403ce759a1SXiaodong Liu 36416433c103SXiaodong Liu def blobfs_create(args): 36426433c103SXiaodong Liu print(rpc.blobfs.blobfs_create(args.client, 36436433c103SXiaodong Liu bdev_name=args.bdev_name, 36446433c103SXiaodong Liu cluster_sz=args.cluster_sz)) 36456433c103SXiaodong Liu 36466433c103SXiaodong Liu p = subparsers.add_parser('blobfs_create', help='Build a blobfs on bdev') 36476433c103SXiaodong Liu p.add_argument('bdev_name', help='Blockdev name to build blobfs. Example: Malloc0.') 36487a372bbeSJim Harris p.add_argument('-c', '--cluster-sz', 36496433c103SXiaodong Liu help="""Size of cluster in bytes (Optional). Must be multiple of 4KB page size. Default and minimal value is 1M.""") 36506433c103SXiaodong Liu p.set_defaults(func=blobfs_create) 36516433c103SXiaodong Liu 36529c6e7426SXiaodong Liu def blobfs_mount(args): 36539c6e7426SXiaodong Liu print(rpc.blobfs.blobfs_mount(args.client, 36549c6e7426SXiaodong Liu bdev_name=args.bdev_name, 36559c6e7426SXiaodong Liu mountpoint=args.mountpoint)) 36569c6e7426SXiaodong Liu 36579c6e7426SXiaodong Liu p = subparsers.add_parser('blobfs_mount', help='Mount a blobfs on bdev to host path by FUSE') 36589c6e7426SXiaodong Liu p.add_argument('bdev_name', help='Blockdev name where the blobfs is. Example: Malloc0.') 36599c6e7426SXiaodong Liu p.add_argument('mountpoint', help='Mountpoint path in host to mount blobfs. Example: /mnt/.') 36609c6e7426SXiaodong Liu p.set_defaults(func=blobfs_mount) 36619c6e7426SXiaodong Liu 3662138e6daeSXiaodong Liu def blobfs_set_cache_size(args): 3663138e6daeSXiaodong Liu print(rpc.blobfs.blobfs_set_cache_size(args.client, 3664138e6daeSXiaodong Liu size_in_mb=args.size_in_mb)) 3665138e6daeSXiaodong Liu 3666138e6daeSXiaodong Liu p = subparsers.add_parser('blobfs_set_cache_size', help='Set cache size for blobfs') 3667138e6daeSXiaodong Liu p.add_argument('size_in_mb', help='Cache size for blobfs in megabytes.', type=int) 3668138e6daeSXiaodong Liu p.set_defaults(func=blobfs_set_cache_size) 3669138e6daeSXiaodong Liu 3670260d18d1SAnton Nayshtut # fsdev 3671260d18d1SAnton Nayshtut def fsdev_get_opts(args): 3672260d18d1SAnton Nayshtut print_json(rpc.fsdev.fsdev_get_opts(args.client)) 3673260d18d1SAnton Nayshtut 3674260d18d1SAnton Nayshtut p = subparsers.add_parser('fsdev_get_opts', help='Get the fsdev subsystem options') 3675260d18d1SAnton Nayshtut p.set_defaults(func=fsdev_get_opts) 3676260d18d1SAnton Nayshtut 3677260d18d1SAnton Nayshtut def fsdev_set_opts(args): 3678260d18d1SAnton Nayshtut print(rpc.fsdev.fsdev_set_opts(args.client, fsdev_io_pool_size=args.fsdev_io_pool_size, 3679260d18d1SAnton Nayshtut fsdev_io_cache_size=args.fsdev_io_cache_size)) 3680260d18d1SAnton Nayshtut 3681260d18d1SAnton Nayshtut p = subparsers.add_parser('fsdev_set_opts', help='Set the fsdev subsystem options') 3682260d18d1SAnton Nayshtut p.add_argument('fsdev-io-pool-size', help='Size of fsdev IO objects pool', type=int) 3683260d18d1SAnton Nayshtut p.add_argument('fsdev-io-cache-size', help='Size of fsdev IO objects cache per thread', type=int) 3684260d18d1SAnton Nayshtut p.set_defaults(func=fsdev_set_opts) 3685260d18d1SAnton Nayshtut 368614ce7c76SEvgeniy Kochetov def fsdev_aio_create(args): 368714ce7c76SEvgeniy Kochetov print(rpc.fsdev.fsdev_aio_create(args.client, name=args.name, root_path=args.root_path, 368814ce7c76SEvgeniy Kochetov enable_xattr=args.enable_xattr, enable_writeback_cache=args.enable_writeback_cache, 368992108e0aSYoray Zack max_write=args.max_write, skip_rw=args.skip_rw)) 369014ce7c76SEvgeniy Kochetov 369114ce7c76SEvgeniy Kochetov p = subparsers.add_parser('fsdev_aio_create', help='Create a aio filesystem') 369214ce7c76SEvgeniy Kochetov p.add_argument('name', help='Filesystem name. Example: aio0.') 369314ce7c76SEvgeniy Kochetov p.add_argument('root_path', help='Path on the system fs to expose as SPDK filesystem') 369414ce7c76SEvgeniy Kochetov 369514ce7c76SEvgeniy Kochetov group = p.add_mutually_exclusive_group() 369614ce7c76SEvgeniy Kochetov group.add_argument('--enable-xattr', help='Enable extended attributes', action='store_true', default=None) 369714ce7c76SEvgeniy Kochetov group.add_argument('--disable-xattr', help='Disable extended attributes', dest='enable_xattr', action='store_false', default=None) 369814ce7c76SEvgeniy Kochetov 369914ce7c76SEvgeniy Kochetov group = p.add_mutually_exclusive_group() 370014ce7c76SEvgeniy Kochetov group.add_argument('--enable-writeback-cache', help='Enable writeback cache', action='store_true', default=None) 370114ce7c76SEvgeniy Kochetov group.add_argument('--disable-writeback-cache', help='Disable writeback cache', dest='enable_writeback_cache', action='store_false', 370214ce7c76SEvgeniy Kochetov default=None) 370314ce7c76SEvgeniy Kochetov 370414ce7c76SEvgeniy Kochetov p.add_argument('-w', '--max-write', help='Max write size in bytes', type=int) 370592108e0aSYoray Zack 370692108e0aSYoray Zack p.add_argument('--skip-rw', dest='skip_rw', help="Do not process read or write commands. This is used for testing.", 370792108e0aSYoray Zack action='store_true', default=None) 370892108e0aSYoray Zack 370914ce7c76SEvgeniy Kochetov p.set_defaults(func=fsdev_aio_create) 371014ce7c76SEvgeniy Kochetov 371114ce7c76SEvgeniy Kochetov def fsdev_aio_delete(args): 371214ce7c76SEvgeniy Kochetov print(rpc.fsdev.fsdev_aio_delete(args.client, name=args.name)) 371314ce7c76SEvgeniy Kochetov 371414ce7c76SEvgeniy Kochetov p = subparsers.add_parser('fsdev_aio_delete', help='Delete a aio filesystem') 371514ce7c76SEvgeniy Kochetov p.add_argument('name', help='Filesystem name. Example: aio0.') 371614ce7c76SEvgeniy Kochetov p.set_defaults(func=fsdev_aio_delete) 371714ce7c76SEvgeniy Kochetov 3718b1074c49SEvgeniy Kochetov # sock 3719b1074c49SEvgeniy Kochetov def sock_impl_get_options(args): 3720b1074c49SEvgeniy Kochetov print_json(rpc.sock.sock_impl_get_options(args.client, 3721b1074c49SEvgeniy Kochetov impl_name=args.impl)) 3722b1074c49SEvgeniy Kochetov 3723b1074c49SEvgeniy Kochetov p = subparsers.add_parser('sock_impl_get_options', help="""Get options of socket layer implementation""") 3724b1074c49SEvgeniy Kochetov p.add_argument('-i', '--impl', help='Socket implementation name, e.g. posix', required=True) 3725b1074c49SEvgeniy Kochetov p.set_defaults(func=sock_impl_get_options) 3726b1074c49SEvgeniy Kochetov 3727b1074c49SEvgeniy Kochetov def sock_impl_set_options(args): 3728b1074c49SEvgeniy Kochetov rpc.sock.sock_impl_set_options(args.client, 3729b1074c49SEvgeniy Kochetov impl_name=args.impl, 3730b1074c49SEvgeniy Kochetov recv_buf_size=args.recv_buf_size, 373163c5e51eSEvgeniy Kochetov send_buf_size=args.send_buf_size, 373229f31a90SEvgeniy Kochetov enable_recv_pipe=args.enable_recv_pipe, 3733a6db2f35SZiye Yang enable_quickack=args.enable_quickack, 37348e85b675SAlexey Marchuk enable_placement_id=args.enable_placement_id, 37358e85b675SAlexey Marchuk enable_zerocopy_send_server=args.enable_zerocopy_send_server, 37369bff828fSRichael Zhuang enable_zerocopy_send_client=args.enable_zerocopy_send_client, 3737806744b7SBoris Glimcher zerocopy_threshold=args.zerocopy_threshold, 3738806744b7SBoris Glimcher tls_version=args.tls_version, 37391df4f4bbSKrzysztof Karas enable_ktls=args.enable_ktls) 3740b1074c49SEvgeniy Kochetov 3741b1074c49SEvgeniy Kochetov p = subparsers.add_parser('sock_impl_set_options', help="""Set options of socket layer implementation""") 3742b1074c49SEvgeniy Kochetov p.add_argument('-i', '--impl', help='Socket implementation name, e.g. posix', required=True) 3743b1074c49SEvgeniy Kochetov p.add_argument('-r', '--recv-buf-size', help='Size of receive buffer on socket in bytes', type=int) 3744b1074c49SEvgeniy Kochetov p.add_argument('-s', '--send-buf-size', help='Size of send buffer on socket in bytes', type=int) 3745201aa634SRichael Zhuang p.add_argument('-p', '--enable-placement-id', help='Option for placement-id. 0:disable,1:incoming_napi,2:incoming_cpu', type=int) 374663c5e51eSEvgeniy Kochetov p.add_argument('--enable-recv-pipe', help='Enable receive pipe', 374763c5e51eSEvgeniy Kochetov action='store_true', dest='enable_recv_pipe') 374863c5e51eSEvgeniy Kochetov p.add_argument('--disable-recv-pipe', help='Disable receive pipe', 374963c5e51eSEvgeniy Kochetov action='store_false', dest='enable_recv_pipe') 375061cd9d30SShuhei Matsumoto p.add_argument('--enable-quickack', help='Enable quick ACK', 375161cd9d30SShuhei Matsumoto action='store_true', dest='enable_quickack') 375261cd9d30SShuhei Matsumoto p.add_argument('--disable-quickack', help='Disable quick ACK', 375361cd9d30SShuhei Matsumoto action='store_false', dest='enable_quickack') 37548e85b675SAlexey Marchuk p.add_argument('--enable-zerocopy-send-server', help='Enable zerocopy on send for server sockets', 37558e85b675SAlexey Marchuk action='store_true', dest='enable_zerocopy_send_server') 37568e85b675SAlexey Marchuk p.add_argument('--disable-zerocopy-send-server', help='Disable zerocopy on send for server sockets', 37572716eb02SEvgeniy Kochetov action='store_false', dest='enable_zerocopy_send_server') 37588e85b675SAlexey Marchuk p.add_argument('--enable-zerocopy-send-client', help='Enable zerocopy on send for client sockets', 37598e85b675SAlexey Marchuk action='store_true', dest='enable_zerocopy_send_client') 37608e85b675SAlexey Marchuk p.add_argument('--disable-zerocopy-send-client', help='Disable zerocopy on send for client sockets', 37618e85b675SAlexey Marchuk action='store_false', dest='enable_zerocopy_send_client') 37629e03923bSKonrad Sztyber p.add_argument('--zerocopy-threshold', help='Set zerocopy_threshold in bytes', type=int) 3763806744b7SBoris Glimcher p.add_argument('--tls-version', help='TLS protocol version', type=int) 3764806744b7SBoris Glimcher p.add_argument('--enable-ktls', help='Enable Kernel TLS', 3765806744b7SBoris Glimcher action='store_true', dest='enable_ktls') 3766806744b7SBoris Glimcher p.add_argument('--disable-ktls', help='Disable Kernel TLS', 3767806744b7SBoris Glimcher action='store_false', dest='enable_ktls') 3768ec1b78dbSAlexey Marchuk p.set_defaults(func=sock_impl_set_options, enable_recv_pipe=None, enable_quickack=None, 37699bff828fSRichael Zhuang enable_placement_id=None, enable_zerocopy_send_server=None, enable_zerocopy_send_client=None, 37701df4f4bbSKrzysztof Karas zerocopy_threshold=None, tls_version=None, enable_ktls=None) 3771b1074c49SEvgeniy Kochetov 377289d9fe55SAlexey Marchuk def sock_set_default_impl(args): 377389d9fe55SAlexey Marchuk print_json(rpc.sock.sock_set_default_impl(args.client, 377489d9fe55SAlexey Marchuk impl_name=args.impl)) 377589d9fe55SAlexey Marchuk 377689d9fe55SAlexey Marchuk p = subparsers.add_parser('sock_set_default_impl', help="""Set the default sock implementation""") 377789d9fe55SAlexey Marchuk p.add_argument('-i', '--impl', help='Socket implementation name, e.g. posix', required=True) 377889d9fe55SAlexey Marchuk p.set_defaults(func=sock_set_default_impl) 377989d9fe55SAlexey Marchuk 3780fe22b505SKrzysztof Karas def sock_get_default_impl(args): 3781fe22b505SKrzysztof Karas print_json(rpc.sock.sock_get_default_impl(args.client)) 3782fe22b505SKrzysztof Karas 3783fe22b505SKrzysztof Karas p = subparsers.add_parser('sock_get_default_impl', help="Get the default sock implementation name") 3784fe22b505SKrzysztof Karas p.set_defaults(func=sock_get_default_impl) 3785fe22b505SKrzysztof Karas 37869647fd4eSKonrad Sztyber def framework_get_pci_devices(args): 37873911bc34SKonrad Sztyber def splitbuf(buf, step): 37883911bc34SKonrad Sztyber return [buf[i:i+step] for i in range(0, len(buf), step)] 37893911bc34SKonrad Sztyber 37903911bc34SKonrad Sztyber devices = rpc.subsystem.framework_get_pci_devices(args.client) 37913911bc34SKonrad Sztyber if not args.format_lspci: 37923911bc34SKonrad Sztyber print_json(devices) 37933911bc34SKonrad Sztyber else: 37943911bc34SKonrad Sztyber for devid, dev in enumerate(devices): 37953911bc34SKonrad Sztyber print('{} device #{}'.format(dev['address'], devid)) 37963911bc34SKonrad Sztyber for lineid, line in enumerate(splitbuf(dev['config_space'], 32)): 37973911bc34SKonrad Sztyber print('{:02x}: {}'.format(lineid * 16, ' '.join(splitbuf(line.lower(), 2)))) 37983911bc34SKonrad Sztyber print() 37999647fd4eSKonrad Sztyber 38009647fd4eSKonrad Sztyber p = subparsers.add_parser('framework_get_pci_devices', help='''Get a list of attached PCI devices''') 38013911bc34SKonrad Sztyber p.add_argument('--format-lspci', help='Format the output in a way to be consumed by lspci -F', 38023911bc34SKonrad Sztyber action='store_true') 38039647fd4eSKonrad Sztyber p.set_defaults(func=framework_get_pci_devices) 38049647fd4eSKonrad Sztyber 38057a0c901aSMichael Haeuptle # bdev_nvme_add_error_injection 38067a0c901aSMichael Haeuptle def bdev_nvme_add_error_injection(args): 38077a0c901aSMichael Haeuptle print_dict(rpc.nvme.bdev_nvme_add_error_injection(args.client, 38087a0c901aSMichael Haeuptle name=args.nvme_name, 38097a0c901aSMichael Haeuptle cmd_type=args.cmd_type, 38107a0c901aSMichael Haeuptle opc=args.opc, 38117a0c901aSMichael Haeuptle do_not_submit=args.do_not_submit, 38127a0c901aSMichael Haeuptle timeout_in_us=args.timeout_in_us, 38137a0c901aSMichael Haeuptle err_count=args.err_count, 38147a0c901aSMichael Haeuptle sct=args.sct, 38157a0c901aSMichael Haeuptle sc=args.sc)) 38167a0c901aSMichael Haeuptle p = subparsers.add_parser('bdev_nvme_add_error_injection', 38177a0c901aSMichael Haeuptle help='Add a NVMe command error injection.') 38187a0c901aSMichael Haeuptle p.add_argument('-n', '--nvme-name', help="""Name of the operating NVMe controller""", required=True) 38197a0c901aSMichael Haeuptle p.add_argument('-t', '--cmd-type', help="""Type of NVMe command. Valid values are: admin, io""", required=True) 38207a0c901aSMichael Haeuptle p.add_argument('-o', '--opc', help="""Opcode of the NVMe command.""", required=True, type=int) 38217a0c901aSMichael Haeuptle p.add_argument('-s', '--do-not-submit', 38225960c74dSJaroslaw Chachulski help="""Set to true if request should not be submitted to the controller""", 38235960c74dSJaroslaw Chachulski dest="do_not_submit", action='store_true') 38247a0c901aSMichael Haeuptle p.add_argument('-w', '--timeout-in-us', help="""Wait specified microseconds when do_not_submit is true""", type=int) 38255960c74dSJaroslaw Chachulski p.add_argument('-e', '--err-count', help="""Number of matching NVMe commands to inject errors""", type=int) 38267a0c901aSMichael Haeuptle p.add_argument('-u', '--sct', help="""Status code type""", type=int) 38277a0c901aSMichael Haeuptle p.add_argument('-c', '--sc', help="""Status code""", type=int) 38287a0c901aSMichael Haeuptle p.set_defaults(func=bdev_nvme_add_error_injection) 38297a0c901aSMichael Haeuptle 38307a0c901aSMichael Haeuptle # bdev_nvme_remove_error_injection 38317a0c901aSMichael Haeuptle def bdev_nvme_remove_error_injection(args): 38327a0c901aSMichael Haeuptle print_dict(rpc.nvme.bdev_nvme_remove_error_injection(args.client, 38337a0c901aSMichael Haeuptle name=args.nvme_name, 38347a0c901aSMichael Haeuptle cmd_type=args.cmd_type, 38357a0c901aSMichael Haeuptle opc=args.opc)) 38367a0c901aSMichael Haeuptle p = subparsers.add_parser('bdev_nvme_remove_error_injection', 38377a0c901aSMichael Haeuptle help='Removes a NVMe command error injection.') 38387a0c901aSMichael Haeuptle p.add_argument('-n', '--nvme-name', help="""Name of the operating NVMe controller""", required=True) 38397a0c901aSMichael Haeuptle p.add_argument('-t', '--cmd-type', help="""Type of nvme cmd. Valid values are: admin, io""", required=True) 38407a0c901aSMichael Haeuptle p.add_argument('-o', '--opc', help="""Opcode of the nvme cmd.""", required=True, type=int) 38417a0c901aSMichael Haeuptle p.set_defaults(func=bdev_nvme_remove_error_injection) 38427a0c901aSMichael Haeuptle 38432e283fcbS0xe0f def bdev_daos_create(args): 38442e283fcbS0xe0f num_blocks = (args.total_size * 1024 * 1024) // args.block_size 38452e283fcbS0xe0f print_json(rpc.bdev.bdev_daos_create(args.client, 38462e283fcbS0xe0f num_blocks=int(num_blocks), 38472e283fcbS0xe0f block_size=args.block_size, 38482e283fcbS0xe0f name=args.name, 38492e283fcbS0xe0f uuid=args.uuid, 38502e283fcbS0xe0f pool=args.pool, 38513d7851e0SDenis Barakhtanov cont=args.cont, 38523d7851e0SDenis Barakhtanov oclass=args.oclass)) 38532e283fcbS0xe0f p = subparsers.add_parser('bdev_daos_create', 38542e283fcbS0xe0f help='Create a bdev with DAOS backend') 38552e283fcbS0xe0f p.add_argument('name', help="Name of the bdev") 38562e283fcbS0xe0f p.add_argument('pool', help="UUID of the DAOS pool") 38572e283fcbS0xe0f p.add_argument('cont', help="UUID of the DAOS container") 38582e283fcbS0xe0f p.add_argument( 38592e283fcbS0xe0f 'total_size', help='Size of DAOS bdev in MB (float > 0)', type=float) 38602e283fcbS0xe0f p.add_argument('block_size', help='Block size for this bdev', type=int) 38612e283fcbS0xe0f p.add_argument('-u', '--uuid', help="UUID of the bdev") 38623d7851e0SDenis Barakhtanov p.add_argument('-o', '--oclass', help="DAOS object class") 38632e283fcbS0xe0f p.set_defaults(func=bdev_daos_create) 38642e283fcbS0xe0f 38652e283fcbS0xe0f def bdev_daos_delete(args): 38662e283fcbS0xe0f rpc.bdev.bdev_daos_delete(args.client, 38672e283fcbS0xe0f name=args.name) 38682e283fcbS0xe0f 38692e283fcbS0xe0f p = subparsers.add_parser('bdev_daos_delete', 38702e283fcbS0xe0f help='Delete a DAOS disk') 38712e283fcbS0xe0f p.add_argument('name', help='DAOS bdev name') 38722e283fcbS0xe0f p.set_defaults(func=bdev_daos_delete) 38732e283fcbS0xe0f 3874bdc683aaSDenis Barakhtanov def bdev_daos_resize(args): 3875bdc683aaSDenis Barakhtanov print_json(rpc.bdev.bdev_daos_resize(args.client, 3876bdc683aaSDenis Barakhtanov name=args.name, 3877bdc683aaSDenis Barakhtanov new_size=int(args.new_size))) 3878bdc683aaSDenis Barakhtanov 3879bdc683aaSDenis Barakhtanov p = subparsers.add_parser('bdev_daos_resize', 3880bdc683aaSDenis Barakhtanov help='Resize a DAOS bdev') 3881bdc683aaSDenis Barakhtanov p.add_argument('name', help='DAOS bdev name') 3882bdc683aaSDenis Barakhtanov p.add_argument('new_size', help='new bdev size for resize operation. The unit is MiB') 3883bdc683aaSDenis Barakhtanov p.set_defaults(func=bdev_daos_resize) 3884bdc683aaSDenis Barakhtanov 388555b047a7SKonrad Sztyber def iobuf_set_options(args): 388655b047a7SKonrad Sztyber rpc.iobuf.iobuf_set_options(args.client, 388755b047a7SKonrad Sztyber small_pool_count=args.small_pool_count, 388855b047a7SKonrad Sztyber large_pool_count=args.large_pool_count, 388955b047a7SKonrad Sztyber small_bufsize=args.small_bufsize, 389042d1bd28SJim Harris large_bufsize=args.large_bufsize, 389142d1bd28SJim Harris enable_numa=args.enable_numa) 389255b047a7SKonrad Sztyber p = subparsers.add_parser('iobuf_set_options', help='Set iobuf pool options') 389355b047a7SKonrad Sztyber p.add_argument('--small-pool-count', help='number of small buffers in the global pool', type=int) 389455b047a7SKonrad Sztyber p.add_argument('--large-pool-count', help='number of large buffers in the global pool', type=int) 389555b047a7SKonrad Sztyber p.add_argument('--small-bufsize', help='size of a small buffer', type=int) 389655b047a7SKonrad Sztyber p.add_argument('--large-bufsize', help='size of a large buffer', type=int) 389742d1bd28SJim Harris p.add_argument('--enable-numa', help='enable per-NUMA node buffer pools', action='store_true') 389855b047a7SKonrad Sztyber p.set_defaults(func=iobuf_set_options) 389955b047a7SKonrad Sztyber 39007bbba48aSJacek Kalwas def iobuf_get_stats(args): 39017bbba48aSJacek Kalwas print_dict(rpc.iobuf.iobuf_get_stats(args.client)) 39027bbba48aSJacek Kalwas 39037bbba48aSJacek Kalwas p = subparsers.add_parser('iobuf_get_stats', help='Display iobuf statistics') 39047bbba48aSJacek Kalwas p.set_defaults(func=iobuf_get_stats) 39057bbba48aSJacek Kalwas 39062796687dSParameswaran Krishnamurthy def bdev_nvme_start_mdns_discovery(args): 39072796687dSParameswaran Krishnamurthy rpc.bdev.bdev_nvme_start_mdns_discovery(args.client, 39082796687dSParameswaran Krishnamurthy name=args.name, 39092796687dSParameswaran Krishnamurthy svcname=args.svcname, 39102796687dSParameswaran Krishnamurthy hostnqn=args.hostnqn) 39112796687dSParameswaran Krishnamurthy 39122796687dSParameswaran Krishnamurthy p = subparsers.add_parser('bdev_nvme_start_mdns_discovery', help='Start mdns based automatic discovery') 39132796687dSParameswaran Krishnamurthy p.add_argument('-b', '--name', help="Name of the NVMe controller prefix for each bdev name", required=True) 39142796687dSParameswaran Krishnamurthy p.add_argument('-s', '--svcname', help='Service type to discover: e.g., _nvme-disc._tcp', required=True) 39152796687dSParameswaran Krishnamurthy p.add_argument('-q', '--hostnqn', help='NVMe-oF host subnqn') 39162796687dSParameswaran Krishnamurthy p.set_defaults(func=bdev_nvme_start_mdns_discovery) 39172796687dSParameswaran Krishnamurthy 39182796687dSParameswaran Krishnamurthy def bdev_nvme_stop_mdns_discovery(args): 39192796687dSParameswaran Krishnamurthy rpc.bdev.bdev_nvme_stop_mdns_discovery(args.client, name=args.name) 39202796687dSParameswaran Krishnamurthy 39212796687dSParameswaran Krishnamurthy p = subparsers.add_parser('bdev_nvme_stop_mdns_discovery', help='Stop automatic mdns discovery') 39222796687dSParameswaran Krishnamurthy p.add_argument('-b', '--name', help="Name of the service to stop", required=True) 39232796687dSParameswaran Krishnamurthy p.set_defaults(func=bdev_nvme_stop_mdns_discovery) 39242796687dSParameswaran Krishnamurthy 39252796687dSParameswaran Krishnamurthy def bdev_nvme_get_mdns_discovery_info(args): 39262796687dSParameswaran Krishnamurthy print_dict(rpc.bdev.bdev_nvme_get_mdns_discovery_info(args.client)) 39272796687dSParameswaran Krishnamurthy 39282796687dSParameswaran Krishnamurthy p = subparsers.add_parser('bdev_nvme_get_mdns_discovery_info', help='Get information about the automatic mdns discovery') 39292796687dSParameswaran Krishnamurthy p.set_defaults(func=bdev_nvme_get_mdns_discovery_info) 39302796687dSParameswaran Krishnamurthy 39318db51b4eSKonrad Sztyber def keyring_file_add_key(args): 39328db51b4eSKonrad Sztyber rpc.keyring.keyring_file_add_key(args.client, args.name, args.path) 39338db51b4eSKonrad Sztyber 39348db51b4eSKonrad Sztyber p = subparsers.add_parser('keyring_file_add_key', help='Add a file-based key to the keyring') 39358db51b4eSKonrad Sztyber p.add_argument('name', help='Name of the key to add') 39368db51b4eSKonrad Sztyber p.add_argument('path', help='Path of the file containing the key') 39378db51b4eSKonrad Sztyber p.set_defaults(func=keyring_file_add_key) 39388db51b4eSKonrad Sztyber 39398db51b4eSKonrad Sztyber def keyring_file_remove_key(args): 39408db51b4eSKonrad Sztyber rpc.keyring.keyring_file_remove_key(args.client, args.name) 39418db51b4eSKonrad Sztyber 39428db51b4eSKonrad Sztyber p = subparsers.add_parser('keyring_file_remove_key', help='Remove a file-based key from the keyring') 39438db51b4eSKonrad Sztyber p.add_argument('name', help='Name of the key to remove') 39448db51b4eSKonrad Sztyber p.set_defaults(func=keyring_file_remove_key) 39458db51b4eSKonrad Sztyber 394648a04a3fSKonrad Sztyber def keyring_get_keys(args): 394748a04a3fSKonrad Sztyber print_dict(rpc.keyring.keyring_get_keys(args.client)) 394848a04a3fSKonrad Sztyber 394948a04a3fSKonrad Sztyber p = subparsers.add_parser('keyring_get_keys', help='Get a list of registered keys') 395048a04a3fSKonrad Sztyber p.set_defaults(func=keyring_get_keys) 395148a04a3fSKonrad Sztyber 3952b6562ed3SKonrad Sztyber def keyring_linux_set_options(args): 3953b6562ed3SKonrad Sztyber rpc.keyring.keyring_linux_set_options(args.client, args.enable) 3954b6562ed3SKonrad Sztyber 3955b6562ed3SKonrad Sztyber p = subparsers.add_parser('keyring_linux_set_options', help='Set options of the keyring_linux module') 3956b6562ed3SKonrad Sztyber p.add_argument('-e', '--enable', help='Enable keyring_linux module', action='store_true') 3957b6562ed3SKonrad Sztyber p.set_defaults(func=keyring_linux_set_options) 3958b6562ed3SKonrad Sztyber 3959c2b5a3f6SJim Harris def check_called_name(name): 3960c2b5a3f6SJim Harris if name in deprecated_aliases: 3961c2b5a3f6SJim Harris print("{} is deprecated, use {} instead.".format(name, deprecated_aliases[name]), file=sys.stderr) 3962c2b5a3f6SJim Harris 3963c47d6541SDarek Stojaczyk class dry_run_client: 39646e4ea8fdSPawel Kaminski def call(self, method, params=None): 39656e4ea8fdSPawel Kaminski print("Request:\n" + json.dumps({"method": method, "params": params}, indent=2)) 39666e4ea8fdSPawel Kaminski 3967c47d6541SDarek Stojaczyk def null_print(arg): 39686e4ea8fdSPawel Kaminski pass 39696e4ea8fdSPawel Kaminski 39706895f0f2SJim Harris def call_rpc_func(args): 3971f7cb69cbSPawel Wodkowski args.func(args) 3972c2b5a3f6SJim Harris check_called_name(args.called_rpc_name) 39736895f0f2SJim Harris 39746121d38eSJim Harris def execute_script(parser, client, timeout, fd): 39753bf82af8SPawel Kaminski executed_rpc = "" 3976363fe506SJim Harris for rpc_call in map(str.rstrip, fd): 3977caec8928SJim Harris if not rpc_call.strip(): 3978caec8928SJim Harris continue 39793bf82af8SPawel Kaminski executed_rpc = "\n".join([executed_rpc, rpc_call]) 398070a6e3acSJim Harris rpc_args = shlex.split(rpc_call) 398170a6e3acSJim Harris if rpc_args[0][0] == '#': 398270a6e3acSJim Harris # Ignore lines starting with # - treat them as comments 398370a6e3acSJim Harris continue 398470a6e3acSJim Harris args = parser.parse_args(rpc_args) 3985363fe506SJim Harris args.client = client 39866121d38eSJim Harris args.timeout = timeout 39873bf82af8SPawel Kaminski try: 3988363fe506SJim Harris call_rpc_func(args) 39893bf82af8SPawel Kaminski except JSONRPCException as ex: 39903bf82af8SPawel Kaminski print("Exception:") 39913bf82af8SPawel Kaminski print(executed_rpc.strip() + " <<<") 39923bf82af8SPawel Kaminski print(ex.message) 39933bf82af8SPawel Kaminski exit(1) 3994363fe506SJim Harris 39955ddb210eSMichal Berger def load_plugin(args): 3996b0bac20aSMaciej Szwed # Create temporary parser, pull out the plugin parameter, load the module, and then run the real argument parser 3997b0bac20aSMaciej Szwed plugin_parser = argparse.ArgumentParser(add_help=False) 3998b0bac20aSMaciej Szwed plugin_parser.add_argument('--plugin', dest='rpc_plugin', help='Module name of plugin with additional RPC commands') 3999b0bac20aSMaciej Szwed 4000b0bac20aSMaciej Szwed rpc_module = plugin_parser.parse_known_args()[0].rpc_plugin 40015ddb210eSMichal Berger if args is not None: 40025ddb210eSMichal Berger rpc_module = plugin_parser.parse_known_args(args)[0].rpc_plugin 40035ddb210eSMichal Berger 40045dcb6e24SMichal Berger if rpc_module in plugins: 40055dcb6e24SMichal Berger return 40065dcb6e24SMichal Berger 4007b0bac20aSMaciej Szwed if rpc_module is not None: 4008b0bac20aSMaciej Szwed try: 4009b0bac20aSMaciej Szwed rpc_plugin = importlib.import_module(rpc_module) 4010b0bac20aSMaciej Szwed try: 4011b0bac20aSMaciej Szwed rpc_plugin.spdk_rpc_plugin_initialize(subparsers) 40125dcb6e24SMichal Berger plugins.append(rpc_module) 4013b0bac20aSMaciej Szwed except AttributeError: 4014b0bac20aSMaciej Szwed print("Module %s does not contain 'spdk_rpc_plugin_initialize' function" % rpc_module) 4015b0bac20aSMaciej Szwed except ModuleNotFoundError: 4016b0bac20aSMaciej Szwed print("Module %s not found" % rpc_module) 4017b0bac20aSMaciej Szwed 40187a372bbeSJim Harris def replace_arg_underscores(args): 40197a372bbeSJim Harris # All option names are defined with dashes only - for example: --tgt-name 40207a372bbeSJim Harris # But if user used underscores, convert them to dashes (--tgt_name => --tgt-name) 40217a372bbeSJim Harris # SPDK was inconsistent previously and had some options with underscores, so 40227a372bbeSJim Harris # doing this conversion ensures backward compatibility with older scripts. 40237a372bbeSJim Harris for i in range(len(args)): 40247a372bbeSJim Harris arg = args[i] 40257a372bbeSJim Harris if arg.startswith('--') and "_" in arg: 4026db8c911eSKonrad Sztyber opt, *vals = arg.split('=') 4027db8c911eSKonrad Sztyber args[i] = '='.join([opt.replace('_', '-'), *vals]) 40287a372bbeSJim Harris 40295dcb6e24SMichal Berger plugins = [] 40305ddb210eSMichal Berger load_plugin(None) 40315ddb210eSMichal Berger 40327a372bbeSJim Harris replace_arg_underscores(sys.argv) 40337a372bbeSJim Harris 40346895f0f2SJim Harris args = parser.parse_args() 403517c2f4eeSTomasz Zawadzki 40369c9f5151SEmilia Haligowska try: 40379c9f5151SEmilia Haligowska use_go_client = int(os.getenv('SPDK_JSONRPC_GO_CLIENT', 0)) == 1 40389c9f5151SEmilia Haligowska except ValueError: 40399c9f5151SEmilia Haligowska use_go_client = False 40409c9f5151SEmilia Haligowska 404117c2f4eeSTomasz Zawadzki if sys.stdin.isatty() and not hasattr(args, 'func'): 404217c2f4eeSTomasz Zawadzki # No arguments and no data piped through stdin 404317c2f4eeSTomasz Zawadzki parser.print_help() 404417c2f4eeSTomasz Zawadzki exit(1) 40458b98cdb6SDarek Stojaczyk if args.is_server: 40468b98cdb6SDarek Stojaczyk for input in sys.stdin: 40478b98cdb6SDarek Stojaczyk cmd = shlex.split(input) 40487a372bbeSJim Harris replace_arg_underscores(cmd) 40498b98cdb6SDarek Stojaczyk try: 40505ddb210eSMichal Berger load_plugin(cmd) 40518b98cdb6SDarek Stojaczyk tmp_args = parser.parse_args(cmd) 40528b98cdb6SDarek Stojaczyk except SystemExit as ex: 40538b98cdb6SDarek Stojaczyk print("**STATUS=1", flush=True) 40548b98cdb6SDarek Stojaczyk continue 40558b98cdb6SDarek Stojaczyk 40568b98cdb6SDarek Stojaczyk try: 40579c9f5151SEmilia Haligowska if use_go_client: 40589c9f5151SEmilia Haligowska tmp_args.client = rpc.client.JSONRPCGoClient(tmp_args.server_addr, 40599c9f5151SEmilia Haligowska log_level=getattr(logging, tmp_args.verbose.upper())) 40609c9f5151SEmilia Haligowska else: 40618b98cdb6SDarek Stojaczyk tmp_args.client = rpc.client.JSONRPCClient( 40628b98cdb6SDarek Stojaczyk tmp_args.server_addr, tmp_args.port, tmp_args.timeout, 406300b52bf5SDarek Stojaczyk log_level=getattr(logging, tmp_args.verbose.upper()), conn_retries=tmp_args.conn_retries) 40648b98cdb6SDarek Stojaczyk call_rpc_func(tmp_args) 40658b98cdb6SDarek Stojaczyk print("**STATUS=0", flush=True) 40668b98cdb6SDarek Stojaczyk except JSONRPCException as ex: 40678b98cdb6SDarek Stojaczyk print(ex.message) 40688b98cdb6SDarek Stojaczyk print("**STATUS=1", flush=True) 40698b98cdb6SDarek Stojaczyk exit(0) 40708b98cdb6SDarek Stojaczyk elif args.dry_run: 4071c47d6541SDarek Stojaczyk args.client = dry_run_client() 4072c47d6541SDarek Stojaczyk print_dict = null_print 4073c47d6541SDarek Stojaczyk print_json = null_print 4074c47d6541SDarek Stojaczyk print_array = null_print 40759c9f5151SEmilia Haligowska elif args.go_client or use_go_client: 4076a5ea50e7SMaciej Mis try: 4077a5ea50e7SMaciej Mis args.client = rpc.client.JSONRPCGoClient(args.server_addr, 4078a5ea50e7SMaciej Mis log_level=getattr(logging, args.verbose.upper())) 4079a5ea50e7SMaciej Mis except JSONRPCException as ex: 4080a5ea50e7SMaciej Mis print(ex.message) 4081a5ea50e7SMaciej Mis exit(1) 40826e4ea8fdSPawel Kaminski else: 40839713bfe9SJim Harris try: 408400b52bf5SDarek Stojaczyk args.client = rpc.client.JSONRPCClient(args.server_addr, args.port, args.timeout, 408500b52bf5SDarek Stojaczyk log_level=getattr(logging, args.verbose.upper()), 408600b52bf5SDarek Stojaczyk conn_retries=args.conn_retries) 40879713bfe9SJim Harris except JSONRPCException as ex: 40889713bfe9SJim Harris print(ex.message) 40899713bfe9SJim Harris exit(1) 40909713bfe9SJim Harris 4091363fe506SJim Harris if hasattr(args, 'func'): 4092535654f8SKarol Latecki try: 40936895f0f2SJim Harris call_rpc_func(args) 4094535654f8SKarol Latecki except JSONRPCException as ex: 40955bd76a10SJim Harris print(ex.message) 4096535654f8SKarol Latecki exit(1) 4097363fe506SJim Harris else: 40986121d38eSJim Harris execute_script(parser, args.client, args.timeout, sys.stdin) 4099