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