rpc.py: add --dry-run option to print the json request and exit

Change-Id: If20c10cb74e3825fc29b9d45524353f77b832e4f
Signed-off-by: Pawel Kaminski <pawelx.kaminski@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/457145
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Pawel Kaminski 2019-06-06 13:41:10 -04:00 committed by Darek Stojaczyk
parent 5468acd898
commit 6e4ea8fdb4
2 changed files with 99 additions and 79 deletions

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from rpc.client import print_dict, JSONRPCException from rpc.client import print_dict, print_string, JSONRPCException
from rpc.helpers import deprecated_aliases from rpc.helpers import deprecated_aliases
import logging import logging
@ -8,6 +8,7 @@ import argparse
import rpc import rpc
import sys import sys
import shlex import shlex
import json
try: try:
from shlex import quote from shlex import quote
@ -34,6 +35,8 @@ if __name__ == "__main__":
help='Set verbose mode to INFO', default="ERROR") help='Set verbose mode to INFO', default="ERROR")
parser.add_argument('--verbose', dest='verbose', choices=['DEBUG', 'INFO', 'ERROR'], parser.add_argument('--verbose', dest='verbose', choices=['DEBUG', 'INFO', 'ERROR'],
help="""Set verbose level. """) help="""Set verbose level. """)
parser.add_argument('--dry_run', dest='dry_run', action='store_true', help="Display request and exit")
parser.set_defaults(dry_run=False)
subparsers = parser.add_subparsers(help='RPC methods', dest='called_rpc_name') subparsers = parser.add_subparsers(help='RPC methods', dest='called_rpc_name')
def start_subsystem_init(args): def start_subsystem_init(args):
@ -57,7 +60,7 @@ if __name__ == "__main__":
p.set_defaults(func=rpc_get_methods) p.set_defaults(func=rpc_get_methods)
def get_spdk_version(args): def get_spdk_version(args):
print(rpc.get_spdk_version(args.client)) print_string(rpc.get_spdk_version(args.client))
p = subparsers.add_parser('get_spdk_version', help='Get SPDK version') p = subparsers.add_parser('get_spdk_version', help='Get SPDK version')
p.set_defaults(func=get_spdk_version) p.set_defaults(func=get_spdk_version)
@ -134,7 +137,7 @@ if __name__ == "__main__":
p.set_defaults(func=set_bdev_options) p.set_defaults(func=set_bdev_options)
def construct_compress_bdev(args): def construct_compress_bdev(args):
print(rpc.bdev.construct_compress_bdev(args.client, print_string(rpc.bdev.construct_compress_bdev(args.client,
base_bdev_name=args.base_bdev_name, base_bdev_name=args.base_bdev_name,
pm_path=args.pm_path, pm_path=args.pm_path,
comp_pmd=args.comp_pmd)) comp_pmd=args.comp_pmd))
@ -154,7 +157,7 @@ if __name__ == "__main__":
p.set_defaults(func=delete_compress_bdev) p.set_defaults(func=delete_compress_bdev)
def construct_crypto_bdev(args): def construct_crypto_bdev(args):
print(rpc.bdev.construct_crypto_bdev(args.client, print_string(rpc.bdev.construct_crypto_bdev(args.client,
base_bdev_name=args.base_bdev_name, base_bdev_name=args.base_bdev_name,
name=args.name, name=args.name,
crypto_pmd=args.crypto_pmd, crypto_pmd=args.crypto_pmd,
@ -176,7 +179,7 @@ if __name__ == "__main__":
p.set_defaults(func=delete_crypto_bdev) p.set_defaults(func=delete_crypto_bdev)
def construct_ocf_bdev(args): def construct_ocf_bdev(args):
print(rpc.bdev.construct_ocf_bdev(args.client, print_string(rpc.bdev.construct_ocf_bdev(args.client,
name=args.name, name=args.name,
mode=args.mode, mode=args.mode,
cache_bdev_name=args.cache_bdev_name, cache_bdev_name=args.cache_bdev_name,
@ -216,7 +219,7 @@ if __name__ == "__main__":
def construct_malloc_bdev(args): def construct_malloc_bdev(args):
num_blocks = (args.total_size * 1024 * 1024) // args.block_size num_blocks = (args.total_size * 1024 * 1024) // args.block_size
print(rpc.bdev.construct_malloc_bdev(args.client, print_string(rpc.bdev.construct_malloc_bdev(args.client,
num_blocks=int(num_blocks), num_blocks=int(num_blocks),
block_size=args.block_size, block_size=args.block_size,
name=args.name, name=args.name,
@ -240,7 +243,7 @@ if __name__ == "__main__":
def construct_null_bdev(args): def construct_null_bdev(args):
num_blocks = (args.total_size * 1024 * 1024) // args.block_size num_blocks = (args.total_size * 1024 * 1024) // args.block_size
print(rpc.bdev.construct_null_bdev(args.client, print_string(rpc.bdev.construct_null_bdev(args.client,
num_blocks=num_blocks, num_blocks=num_blocks,
block_size=args.block_size, block_size=args.block_size,
name=args.name, name=args.name,
@ -264,7 +267,7 @@ if __name__ == "__main__":
p.set_defaults(func=delete_null_bdev) p.set_defaults(func=delete_null_bdev)
def construct_aio_bdev(args): def construct_aio_bdev(args):
print(rpc.bdev.construct_aio_bdev(args.client, print_string(rpc.bdev.construct_aio_bdev(args.client,
filename=args.filename, filename=args.filename,
name=args.name, name=args.name,
block_size=args.block_size)) block_size=args.block_size))
@ -381,7 +384,7 @@ if __name__ == "__main__":
if len(parts) != 2: if len(parts) != 2:
raise Exception('--config %s not in key=value form' % entry) raise Exception('--config %s not in key=value form' % entry)
config[parts[0]] = parts[1] config[parts[0]] = parts[1]
print(rpc.bdev.construct_rbd_bdev(args.client, print_string(rpc.bdev.construct_rbd_bdev(args.client,
name=args.name, name=args.name,
user=args.user, user=args.user,
config=config, config=config,
@ -409,7 +412,7 @@ if __name__ == "__main__":
p.set_defaults(func=delete_rbd_bdev) p.set_defaults(func=delete_rbd_bdev)
def bdev_delay_create(args): def bdev_delay_create(args):
print(rpc.bdev.bdev_delay_create(args.client, print_string(rpc.bdev.bdev_delay_create(args.client,
base_bdev_name=args.base_bdev_name, base_bdev_name=args.base_bdev_name,
name=args.name, name=args.name,
avg_read_latency=args.avg_read_latency, avg_read_latency=args.avg_read_latency,
@ -436,7 +439,7 @@ if __name__ == "__main__":
p.set_defaults(func=bdev_delay_delete) p.set_defaults(func=bdev_delay_delete)
def construct_error_bdev(args): def construct_error_bdev(args):
print(rpc.bdev.construct_error_bdev(args.client, print_string(rpc.bdev.construct_error_bdev(args.client,
base_name=args.base_name)) base_name=args.base_name))
p = subparsers.add_parser('construct_error_bdev', p = subparsers.add_parser('construct_error_bdev',
@ -453,7 +456,7 @@ if __name__ == "__main__":
p.set_defaults(func=delete_error_bdev) p.set_defaults(func=delete_error_bdev)
def construct_iscsi_bdev(args): def construct_iscsi_bdev(args):
print(rpc.bdev.construct_iscsi_bdev(args.client, print_string(rpc.bdev.construct_iscsi_bdev(args.client,
name=args.name, name=args.name,
url=args.url, url=args.url,
initiator_iqn=args.initiator_iqn)) initiator_iqn=args.initiator_iqn))
@ -474,7 +477,7 @@ if __name__ == "__main__":
p.set_defaults(func=delete_iscsi_bdev) p.set_defaults(func=delete_iscsi_bdev)
def construct_pmem_bdev(args): def construct_pmem_bdev(args):
print(rpc.bdev.construct_pmem_bdev(args.client, print_string(rpc.bdev.construct_pmem_bdev(args.client,
pmem_file=args.pmem_file, pmem_file=args.pmem_file,
name=args.name)) name=args.name))
@ -492,7 +495,7 @@ if __name__ == "__main__":
p.set_defaults(func=delete_pmem_bdev) p.set_defaults(func=delete_pmem_bdev)
def construct_passthru_bdev(args): def construct_passthru_bdev(args):
print(rpc.bdev.construct_passthru_bdev(args.client, print_string(rpc.bdev.construct_passthru_bdev(args.client,
base_bdev_name=args.base_bdev_name, base_bdev_name=args.base_bdev_name,
name=args.name)) name=args.name))
@ -1093,7 +1096,7 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
# lvol # lvol
def construct_lvol_store(args): def construct_lvol_store(args):
print(rpc.lvol.construct_lvol_store(args.client, print_string(rpc.lvol.construct_lvol_store(args.client,
bdev_name=args.bdev_name, bdev_name=args.bdev_name,
lvs_name=args.lvs_name, lvs_name=args.lvs_name,
cluster_sz=args.cluster_sz, cluster_sz=args.cluster_sz,
@ -1118,7 +1121,7 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
p.set_defaults(func=rename_lvol_store) p.set_defaults(func=rename_lvol_store)
def construct_lvol_bdev(args): def construct_lvol_bdev(args):
print(rpc.lvol.construct_lvol_bdev(args.client, print_string(rpc.lvol.construct_lvol_bdev(args.client,
lvol_name=args.lvol_name, lvol_name=args.lvol_name,
size=args.size * 1024 * 1024, size=args.size * 1024 * 1024,
thin_provision=args.thin_provision, thin_provision=args.thin_provision,
@ -1137,7 +1140,7 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
p.set_defaults(func=construct_lvol_bdev) p.set_defaults(func=construct_lvol_bdev)
def snapshot_lvol_bdev(args): def snapshot_lvol_bdev(args):
print(rpc.lvol.snapshot_lvol_bdev(args.client, print_string(rpc.lvol.snapshot_lvol_bdev(args.client,
lvol_name=args.lvol_name, lvol_name=args.lvol_name,
snapshot_name=args.snapshot_name)) snapshot_name=args.snapshot_name))
@ -1147,7 +1150,7 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
p.set_defaults(func=snapshot_lvol_bdev) p.set_defaults(func=snapshot_lvol_bdev)
def clone_lvol_bdev(args): def clone_lvol_bdev(args):
print(rpc.lvol.clone_lvol_bdev(args.client, print_string(rpc.lvol.clone_lvol_bdev(args.client,
snapshot_name=args.snapshot_name, snapshot_name=args.snapshot_name,
clone_name=args.clone_name)) clone_name=args.clone_name))
@ -1631,7 +1634,7 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
p.set_defaults(func=construct_vhost_scsi_controller) p.set_defaults(func=construct_vhost_scsi_controller)
def add_vhost_scsi_lun(args): def add_vhost_scsi_lun(args):
print(rpc.vhost.add_vhost_scsi_lun(args.client, print_string(rpc.vhost.add_vhost_scsi_lun(args.client,
ctrlr=args.ctrlr, ctrlr=args.ctrlr,
scsi_target_num=args.scsi_target_num, scsi_target_num=args.scsi_target_num,
bdev_name=args.bdev_name)) bdev_name=args.bdev_name))
@ -1803,6 +1806,13 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
if name in deprecated_aliases: if name in deprecated_aliases:
print("{} is deprecated, use {} instead.".format(name, deprecated_aliases[name]), file=sys.stderr) print("{} is deprecated, use {} instead.".format(name, deprecated_aliases[name]), file=sys.stderr)
class mock_client:
def call(self, method, params=None):
print("Request:\n" + json.dumps({"method": method, "params": params}, indent=2))
def mock_print(arg):
pass
def call_rpc_func(args): def call_rpc_func(args):
args.func(args) args.func(args)
check_called_name(args.called_rpc_name) check_called_name(args.called_rpc_name)
@ -1824,6 +1834,12 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
exit(1) exit(1)
args = parser.parse_args() args = parser.parse_args()
if args.dry_run:
args.client = mock_client()
print_dict = mock_print
print_string = mock_print
print_array = mock_print
else:
args.client = rpc.client.JSONRPCClient(args.server_addr, args.port, args.timeout, log_level=getattr(logging, args.verbose.upper())) args.client = rpc.client.JSONRPCClient(args.server_addr, args.port, args.timeout, log_level=getattr(logging, args.verbose.upper()))
if hasattr(args, 'func'): if hasattr(args, 'func'):
try: try:

View File

@ -10,6 +10,10 @@ def print_dict(d):
print(json.dumps(d, indent=2)) print(json.dumps(d, indent=2))
def print_string(s):
print(json.dumps(s, indent=2).strip('"'))
class JSONRPCException(Exception): class JSONRPCException(Exception):
def __init__(self, message): def __init__(self, message):
self.message = message self.message = message