diff --git a/scripts/gen_nvme.sh b/scripts/gen_nvme.sh index ed450f68d..fa8a9242e 100755 --- a/scripts/gen_nvme.sh +++ b/scripts/gen_nvme.sh @@ -5,11 +5,42 @@ set -e rootdir=$(readlink -f $(dirname $0))/.. source "$rootdir/scripts/common.sh" -bdfs=$(iter_pci_class_code 01 08 02) +bdfs=($(iter_pci_class_code 01 08 02)) +function create_classic_config() +{ + echo "[Nvme]" + for (( i=0; i < ${#bdfs[@]}; i++)) + do + echo " TransportID \"trtype:PCIe traddr:${bdfs[i]}\" Nvme$i" + done +} -echo "[Nvme]" -i=0 -for bdf in $bdfs; do - echo " TransportID \"trtype:PCIe traddr:$bdf\" Nvme$i" - let i=i+1 -done +function create_json_config() +{ + echo "{" + echo '"subsystem": "bdev",' + echo '"config": [' + for (( i=0; i < ${#bdfs[@]}; i++)) + do + echo '{' + echo '"params": {' + echo '"trtype": "PCIe",' + echo "\"name\": \"Nvme$i\"," + echo "\"traddr\": \"${bdfs[i]}\"" + echo '},' + echo '"method": "construct_nvme_bdev"' + if [ -z ${bdfs[i+1]} ]; then + echo '}' + else + echo '},' + fi + done + echo ']' + echo '}' +} + +if [ "$1" = "--json" ]; then + create_json_config +else + create_classic_config +fi diff --git a/scripts/rpc.py b/scripts/rpc.py index fb991436e..67a0c8b26 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -75,6 +75,15 @@ if __name__ == "__main__": p.add_argument('-f', '--filename', help="""JSON Configuration file.""") p.set_defaults(func=load_config) + @call_cmd + def load_subsystem_config(args): + rpc.load_subsystem_config(args.client, args) + + p = subparsers.add_parser('load_subsystem_config', help="""Configure SPDK subsystem using JSON RPC. If no file is + provided or file is '-' read configuration from stdin.""") + p.add_argument('--filename', help="""JSON Configuration file.""") + p.set_defaults(func=load_subsystem_config) + # app @call_cmd def kill_instance(args): diff --git a/scripts/rpc/__init__.py b/scripts/rpc/__init__.py index f70fb01bb..fc9207090 100755 --- a/scripts/rpc/__init__.py +++ b/scripts/rpc/__init__.py @@ -90,3 +90,16 @@ def load_config(client, args): if subsystems and not allowed_found: raise JSONRPCException("Some config left but did not found any allowed method to execute") + + +def load_subsystem_config(client, args): + if not args.filename or args.filename == '-': + config = json.load(sys.stdin) + else: + with open(args.filename, 'r') as file: + config = json.load(file) + + for elem in config['config']: + if not elem or 'method' not in elem: + continue + client.call(elem['method'], elem['params']) diff --git a/test/vhost/common/common.sh b/test/vhost/common/common.sh index fc3e42d74..ff575747e 100644 --- a/test/vhost/common/common.sh +++ b/test/vhost/common/common.sh @@ -121,6 +121,7 @@ function spdk_vhost_run() assert_number "$vhost_num" ;; --conf-path=*) local vhost_conf_path="${param#*=}" ;; + --json-path=*) local vhost_json_path="${param#*=}" ;; --memory=*) local memory=${param#*=} ;; *) error "Invalid parameter '$param'" @@ -130,10 +131,6 @@ function spdk_vhost_run() done local vhost_dir="$(get_vhost_dir $vhost_num)" - if [[ -z "$vhost_conf_path" ]]; then - error "Missing mandatory parameter '--conf-path'" - return 1 - fi local vhost_app="$SPDK_BUILD_DIR/app/vhost/vhost" local vhost_log_file="$vhost_dir/vhost.log" local vhost_pid_file="$vhost_dir/vhost.pid" @@ -161,13 +158,14 @@ function spdk_vhost_run() return 1 fi - cp $vhost_conf_template $vhost_conf_file - $SPDK_BUILD_DIR/scripts/gen_nvme.sh >> $vhost_conf_file - - local cmd="$vhost_app -m $reactor_mask -p $master_core -c $vhost_conf_file -s $memory -r $vhost_dir/rpc.sock" + local cmd="$vhost_app -m $reactor_mask -p $master_core -s $memory -r $vhost_dir/rpc.sock" + if [[ -n "$vhost_conf_path" ]]; then + cp $vhost_conf_template $vhost_conf_file + $SPDK_BUILD_DIR/scripts/gen_nvme.sh >> $vhost_conf_file + cmd="$vhost_app -m $reactor_mask -p $master_core -c $vhost_conf_file -s $memory -r $vhost_dir/rpc.sock" + fi notice "Loging to: $vhost_log_file" - notice "Config file: $vhost_conf_file" notice "Socket: $vhost_socket" notice "Command: $cmd" @@ -178,10 +176,20 @@ function spdk_vhost_run() notice "waiting for app to run..." waitforlisten "$vhost_pid" "$vhost_dir/rpc.sock" + if [[ -z "$vhost_conf_path" ]]; then + $SPDK_BUILD_DIR/scripts/gen_nvme.sh "--json" | $SPDK_BUILD_DIR/scripts/rpc.py\ + -s $vhost_dir/rpc.sock load_subsystem_config + fi + + if [[ -n "$vhost_json_path" ]]; then + $SPDK_BUILD_DIR/scripts/rpc.py -s $vhost_dir/rpc.sock load_config\ + --filename "$vhost_json_path/conf.json" + fi + notice "vhost started - pid=$vhost_pid" timing_exit vhost_start - rm $vhost_conf_file + rm -f $vhost_conf_file } function spdk_vhost_kill()