xref: /spdk/examples/bdev/bdevperf/bdevperf.py (revision 784b9d48746955f210926648a0131f84f58de76f)
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