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