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