1#!/usr/bin/env python3 2import logging 3import argparse 4import sys 5import shlex 6 7try: 8 from rpc.client import print_dict, JSONRPCException 9 import rpc 10except ImportError: 11 print("SPDK RPC library missing. Please add spdk/scripts/ directory to PYTHONPATH:") 12 print("'export PYTHONPATH=$PYTHONPATH:./spdk/scripts/'") 13 exit(1) 14 15try: 16 from shlex import quote 17except ImportError: 18 from pipes import quote 19 20 21def print_array(a): 22 print(" ".join((quote(v) for v in a))) 23 24 25def perform_tests_func(client, name=None): 26 """ 27 28 Args: 29 name: bdev name to perform bdevio tests on (optional; if omitted, test all bdevs) 30 31 Returns: 32 Number of failures in tests. 0 means no errors found. 33 """ 34 params = {} 35 if name: 36 params['name'] = name 37 return client.call('perform_tests', params) 38 39 40if __name__ == "__main__": 41 parser = argparse.ArgumentParser( 42 description='SPDK RPC command line interface. NOTE: spdk/scripts/ is expected in PYTHONPATH') 43 parser.add_argument('-s', dest='server_addr', 44 help='RPC domain socket path or IP address', default='/var/tmp/spdk.sock') 45 parser.add_argument('-p', dest='port', 46 help='RPC port number (if server_addr is IP address)', 47 default=5260, type=int) 48 parser.add_argument('-t', dest='timeout', 49 help='Timeout as a floating point number expressed in seconds waiting for response. Default: 60.0', 50 default=60.0, type=float) 51 parser.add_argument('-v', dest='verbose', action='store_const', const="INFO", 52 help='Set verbose mode to INFO', default="ERROR") 53 parser.add_argument('--verbose', dest='verbose', choices=['DEBUG', 'INFO', 'ERROR'], 54 help="""Set verbose level. """) 55 subparsers = parser.add_subparsers(help='RPC methods') 56 57 def perform_tests(args): 58 print_dict(perform_tests_func(args.client, name=args.name)) 59 60 p = subparsers.add_parser('perform_tests', help='Perform all bdevio tests on select bdev') 61 p.add_argument('-b', '--name', help="Name of the Blockdev. Example: Nvme0n1") 62 p.set_defaults(func=perform_tests) 63 64 def call_rpc_func(args): 65 try: 66 args.func(args) 67 except JSONRPCException as ex: 68 print(ex.message) 69 exit(1) 70 71 def execute_script(parser, client, fd): 72 for rpc_call in map(str.rstrip, fd): 73 if not rpc_call.strip(): 74 continue 75 args = parser.parse_args(shlex.split(rpc_call)) 76 args.client = client 77 call_rpc_func(args) 78 79 args = parser.parse_args() 80 args.client = rpc.client.JSONRPCClient(args.server_addr, args.port, args.timeout, log_level=getattr(logging, args.verbose.upper())) 81 if hasattr(args, 'func'): 82 call_rpc_func(args) 83 elif sys.stdin.isatty(): 84 # No arguments and no data piped through stdin 85 parser.print_help() 86 exit(1) 87 else: 88 execute_script(parser, args.client, sys.stdin) 89