test/spdkcli: Add load and save config commands.
Change-Id: I499f54b025080ad1916acc0cf265a58c806da002 Signed-off-by: Pawel Kaminski <pawelx.kaminski@intel.com> Reviewed-on: https://review.gerrithub.io/428494 Reviewed-by: Pawel Wodkowski <pawelx.wodkowski@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Paul Luse <paul.e.luse@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
parent
36cc61388c
commit
09a9130ed2
@ -4,6 +4,7 @@ from rpc.client import print_dict, JSONRPCException
|
|||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import rpc
|
import rpc
|
||||||
|
import sys
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from shlex import quote
|
from shlex import quote
|
||||||
@ -59,6 +60,7 @@ if __name__ == "__main__":
|
|||||||
@call_cmd
|
@call_cmd
|
||||||
def save_config(args):
|
def save_config(args):
|
||||||
rpc.save_config(args.client,
|
rpc.save_config(args.client,
|
||||||
|
sys.stdout,
|
||||||
indent=args.indent)
|
indent=args.indent)
|
||||||
|
|
||||||
p = subparsers.add_parser('save_config', help="""Write current (live) configuration of SPDK subsystems and targets to stdout.
|
p = subparsers.add_parser('save_config', help="""Write current (live) configuration of SPDK subsystems and targets to stdout.
|
||||||
@ -69,7 +71,7 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
@call_cmd
|
@call_cmd
|
||||||
def load_config(args):
|
def load_config(args):
|
||||||
rpc.load_config(args.client)
|
rpc.load_config(args.client, sys.stdin)
|
||||||
|
|
||||||
p = subparsers.add_parser('load_config', help="""Configure SPDK subsystems and targets using JSON RPC read from stdin.""")
|
p = subparsers.add_parser('load_config', help="""Configure SPDK subsystems and targets using JSON RPC read from stdin.""")
|
||||||
p.set_defaults(func=load_config)
|
p.set_defaults(func=load_config)
|
||||||
@ -77,6 +79,7 @@ if __name__ == "__main__":
|
|||||||
@call_cmd
|
@call_cmd
|
||||||
def save_subsystem_config(args):
|
def save_subsystem_config(args):
|
||||||
rpc.save_subsystem_config(args.client,
|
rpc.save_subsystem_config(args.client,
|
||||||
|
sys.stdout,
|
||||||
indent=args.indent,
|
indent=args.indent,
|
||||||
name=args.name)
|
name=args.name)
|
||||||
|
|
||||||
@ -89,7 +92,8 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
@call_cmd
|
@call_cmd
|
||||||
def load_subsystem_config(args):
|
def load_subsystem_config(args):
|
||||||
rpc.load_subsystem_config(args.client)
|
rpc.load_subsystem_config(args.client,
|
||||||
|
sys.stdin)
|
||||||
|
|
||||||
p = subparsers.add_parser('load_subsystem_config', help="""Configure SPDK subsystem using JSON RPC read from stdin.""")
|
p = subparsers.add_parser('load_subsystem_config', help="""Configure SPDK subsystem using JSON RPC read from stdin.""")
|
||||||
p.set_defaults(func=load_subsystem_config)
|
p.set_defaults(func=load_subsystem_config)
|
||||||
|
@ -34,18 +34,19 @@ def get_rpc_methods(client, current=None):
|
|||||||
return client.call('get_rpc_methods', params)
|
return client.call('get_rpc_methods', params)
|
||||||
|
|
||||||
|
|
||||||
def _json_dump(config, indent):
|
def _json_dump(config, fd, indent):
|
||||||
if indent is None:
|
if indent is None:
|
||||||
indent = 2
|
indent = 2
|
||||||
elif indent < 0:
|
elif indent < 0:
|
||||||
indent = None
|
indent = None
|
||||||
json.dump(config, sys.stdout, indent=indent)
|
json.dump(config, fd, indent=indent)
|
||||||
sys.stdout.write('\n')
|
fd.write('\n')
|
||||||
|
|
||||||
|
|
||||||
def save_config(client, indent=2):
|
def save_config(client, fd, indent=2):
|
||||||
"""Write current (live) configuration of SPDK subsystems and targets to stdout.
|
"""Write current (live) configuration of SPDK subsystems and targets to stdout.
|
||||||
Args:
|
Args:
|
||||||
|
fd: opened file descriptor where data will be saved
|
||||||
indent: Indent level. Value less than 0 mean compact mode.
|
indent: Indent level. Value less than 0 mean compact mode.
|
||||||
Default indent level is 2.
|
Default indent level is 2.
|
||||||
"""
|
"""
|
||||||
@ -60,15 +61,15 @@ def save_config(client, indent=2):
|
|||||||
}
|
}
|
||||||
config['subsystems'].append(cfg)
|
config['subsystems'].append(cfg)
|
||||||
|
|
||||||
_json_dump(config, indent)
|
_json_dump(config, fd, indent)
|
||||||
|
|
||||||
|
|
||||||
def load_config(client):
|
def load_config(client, fd):
|
||||||
"""Configure SPDK subsystems and targets using JSON RPC read from stdin.
|
"""Configure SPDK subsystems and targets using JSON RPC read from stdin.
|
||||||
Args:
|
Args:
|
||||||
none
|
fd: opened file descriptor where data will be taken from
|
||||||
"""
|
"""
|
||||||
json_config = json.load(sys.stdin)
|
json_config = json.load(fd)
|
||||||
|
|
||||||
# remove subsystems with no config
|
# remove subsystems with no config
|
||||||
subsystems = json_config['subsystems']
|
subsystems = json_config['subsystems']
|
||||||
@ -112,9 +113,10 @@ def load_config(client):
|
|||||||
print("Some configs were skipped because the RPC state that can call them passed over.")
|
print("Some configs were skipped because the RPC state that can call them passed over.")
|
||||||
|
|
||||||
|
|
||||||
def save_subsystem_config(client, indent=2, name=None):
|
def save_subsystem_config(client, fd, indent=2, name=None):
|
||||||
"""Write current (live) configuration of SPDK subsystem to stdout.
|
"""Write current (live) configuration of SPDK subsystem to stdout.
|
||||||
Args:
|
Args:
|
||||||
|
fd: opened file descriptor where data will be saved
|
||||||
indent: Indent level. Value less than 0 mean compact mode.
|
indent: Indent level. Value less than 0 mean compact mode.
|
||||||
Default is indent level 2.
|
Default is indent level 2.
|
||||||
"""
|
"""
|
||||||
@ -123,15 +125,15 @@ def save_subsystem_config(client, indent=2, name=None):
|
|||||||
'config': client.call('get_subsystem_config', {"name": name})
|
'config': client.call('get_subsystem_config', {"name": name})
|
||||||
}
|
}
|
||||||
|
|
||||||
_json_dump(cfg, indent)
|
_json_dump(cfg, fd, indent)
|
||||||
|
|
||||||
|
|
||||||
def load_subsystem_config(client):
|
def load_subsystem_config(client, fd):
|
||||||
"""Configure SPDK subsystem using JSON RPC read from stdin.
|
"""Configure SPDK subsystem using JSON RPC read from stdin.
|
||||||
Args:
|
Args:
|
||||||
none
|
fd: opened file descriptor where data will be taken from
|
||||||
"""
|
"""
|
||||||
subsystem = json.load(sys.stdin)
|
subsystem = json.load(fd)
|
||||||
|
|
||||||
if not subsystem['config']:
|
if not subsystem['config']:
|
||||||
return
|
return
|
||||||
|
@ -63,6 +63,22 @@ class UIRoot(UINode):
|
|||||||
self.is_init = True
|
self.is_init = True
|
||||||
self.refresh()
|
self.refresh()
|
||||||
|
|
||||||
|
def ui_command_load_config(self, filename):
|
||||||
|
with open(filename, "r") as fd:
|
||||||
|
rpc.load_config(self.client, fd)
|
||||||
|
|
||||||
|
def ui_command_load_subsystem_config(self, filename):
|
||||||
|
with open(filename, "r") as fd:
|
||||||
|
rpc.load_subsystem_config(self.client, fd)
|
||||||
|
|
||||||
|
def ui_command_save_config(self, filename, indent=2):
|
||||||
|
with open(filename, "w") as fd:
|
||||||
|
rpc.save_config(self.client, fd, indent)
|
||||||
|
|
||||||
|
def ui_command_save_subsystem_config(self, filename, subsystem, indent=2):
|
||||||
|
with open(filename, "w") as fd:
|
||||||
|
rpc.save_subsystem_config(self.client, fd, indent, subsystem)
|
||||||
|
|
||||||
def get_rpc_methods(self, current=False):
|
def get_rpc_methods(self, current=False):
|
||||||
return rpc.get_rpc_methods(self.client, current=current)
|
return rpc.get_rpc_methods(self.client, current=current)
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ set -xe
|
|||||||
MATCH_FILE="spdkcli_vhost.test"
|
MATCH_FILE="spdkcli_vhost.test"
|
||||||
SPDKCLI_BRANCH="/"
|
SPDKCLI_BRANCH="/"
|
||||||
testdir=$(readlink -f $(dirname $0))
|
testdir=$(readlink -f $(dirname $0))
|
||||||
|
. $testdir/../json_config/common.sh
|
||||||
. $testdir/common.sh
|
. $testdir/common.sh
|
||||||
|
|
||||||
timing_enter spdk_cli_vhost
|
timing_enter spdk_cli_vhost
|
||||||
@ -47,6 +48,12 @@ timing_enter spdkcli_check_match
|
|||||||
check_match
|
check_match
|
||||||
timing_exit spdkcli_check_match
|
timing_exit spdkcli_check_match
|
||||||
|
|
||||||
|
timing_enter spdkcli_save_config
|
||||||
|
$spdkcli_job "save_config $testdir/config.json"
|
||||||
|
$spdkcli_job "save_subsystem_config $testdir/config_bdev.json bdev"
|
||||||
|
$spdkcli_job "save_subsystem_config $testdir/config_vhost.json vhost"
|
||||||
|
timing_exit spdkcli_save_config
|
||||||
|
|
||||||
timing_enter spdkcli_check_match_details
|
timing_enter spdkcli_check_match_details
|
||||||
$SPDKCLI_BUILD_DIR/scripts/spdkcli.py bdevs/split_disk/Nvme0n1p0 show_details | jq -r -S '.' > $testdir/match_files/spdkcli_details_vhost.test
|
$SPDKCLI_BUILD_DIR/scripts/spdkcli.py bdevs/split_disk/Nvme0n1p0 show_details | jq -r -S '.' > $testdir/match_files/spdkcli_details_vhost.test
|
||||||
$SPDKCLI_BUILD_DIR/test/app/match/match -v $testdir/match_files/spdkcli_details_vhost.test.match
|
$SPDKCLI_BUILD_DIR/test/app/match/match -v $testdir/match_files/spdkcli_details_vhost.test.match
|
||||||
@ -72,9 +79,27 @@ $spdkcli_job "/bdevs/malloc delete Malloc0" "Malloc0"
|
|||||||
$spdkcli_job "/bdevs/malloc delete Malloc1" "Malloc1"
|
$spdkcli_job "/bdevs/malloc delete Malloc1" "Malloc1"
|
||||||
$spdkcli_job "/bdevs/malloc delete Malloc2" "Malloc2"
|
$spdkcli_job "/bdevs/malloc delete Malloc2" "Malloc2"
|
||||||
$spdkcli_job "/bdevs/malloc delete Malloc3" "Malloc3"
|
$spdkcli_job "/bdevs/malloc delete Malloc3" "Malloc3"
|
||||||
rm -f /tmp/sample_aio
|
|
||||||
timing_exit spdkcli_clear_config
|
timing_exit spdkcli_clear_config
|
||||||
|
|
||||||
|
timing_enter spdkcli_load_config
|
||||||
|
$spdkcli_job "load_config $testdir/config.json"
|
||||||
|
$spdkcli_job "/lvol_stores create lvs Malloc0" "lvs" True
|
||||||
|
$spdkcli_job "/bdevs/logical_volume create lvol 16 lvs" "lvs/lvol" True
|
||||||
|
check_match
|
||||||
|
$spdk_clear_config_py clear_config
|
||||||
|
# FIXME: remove this sleep when NVMe driver will be fixed to wait for reset to complete
|
||||||
|
sleep 2
|
||||||
|
$spdkcli_job "load_subsystem_config $testdir/config_bdev.json"
|
||||||
|
$spdkcli_job "load_subsystem_config $testdir/config_vhost.json"
|
||||||
|
$spdkcli_job "/lvol_stores create lvs Malloc0" "lvs" True
|
||||||
|
$spdkcli_job "/bdevs/logical_volume create lvol 16 lvs" "lvs/lvol" True
|
||||||
|
check_match
|
||||||
|
rm -f $testdir/config.json
|
||||||
|
rm -f $testdir/config_bdev.json
|
||||||
|
rm -f $testdir/config_vhost.json
|
||||||
|
rm -f /tmp/sample_aio
|
||||||
|
timing_exit spdkcli_load_config
|
||||||
|
|
||||||
killprocess $spdk_tgt_pid
|
killprocess $spdk_tgt_pid
|
||||||
|
|
||||||
timing_exit spdk_cli_vhost
|
timing_exit spdk_cli_vhost
|
||||||
|
Loading…
Reference in New Issue
Block a user