numam-spdk/scripts/gen_nvme.sh

142 lines
3.0 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
set -e
rootdir=$(readlink -f $(dirname $0))/..
source "$rootdir/scripts/common.sh"
gen_subsystems=false
gen_mode="local"
gen_function="create_local_json_config"
gen_args=()
function usage() {
echo "Script for generating JSON configuration file for attaching"
echo "local userspace NVMe drives."
echo "Usage: ${0##*/} [OPTIONS]"
echo
echo "-h, --help Print help and exit"
echo " --mode Generate 'local' or 'remote' NVMe JSON configuration. Default is 'local'."
echo " Remote needs --trid option to be present."
echo " --trid Comma separated list target subsystem information containing transport type,"
echo " IP addresses, port numbers and NQN names."
echo " Example: tcp:127.0.0.1:4420:nqn.2016-06.io.spdk:cnode1,tcp:127.0.0.1:4421:nqn.2016-06.io.spdk:cnode2"
echo " --json-with-subsystems Wrap bdev subsystem JSON configuration with higher level 'subsystems' dictionary."
exit 0
}
function create_local_json_config() {
local bdev_json_cfg=()
local bdfs=()
bdfs=($(nvme_in_userspace))
for i in "${!bdfs[@]}"; do
bdev_json_cfg+=("$(
cat <<- JSON
{
"method": "bdev_nvme_attach_controller",
"params": {
"trtype": "PCIe",
"name":"Nvme${i}",
"traddr":"${bdfs[i]}"
}
}
JSON
)")
done
local IFS=","
cat <<- JSON
{
"subsystem": "bdev",
"config": [
${bdev_json_cfg[*]}
]
}
JSON
}
function create_remote_json_config() {
local trids
local bdev_json_cfg=()
IFS="," read -r -a trids <<< $1
for ((i = 0; i < ${#trids[@]}; i++)); do
local transport
local ip_addr
local svc_port
local nqn
IFS=":" read -r transport ip_addr svc_port nqn <<< ${trids[i]}
bdev_json_cfg+=("$(
cat <<- JSON
{
"method": "bdev_nvme_attach_controller",
"params": {
"trtype": "$transport",
"adrfam": "IPv4",
"name": "Nvme${i}",
"subnqn": "$nqn",
"traddr": "$ip_addr",
"trsvcid": "$svc_port"
}
}
JSON
)")
done
local IFS=","
cat <<- JSON
{
"subsystem": "bdev",
"config": [
${bdev_json_cfg[*]}
]
}
JSON
}
while getopts 'h-:' optchar; do
case "$optchar" in
-)
case "$OPTARG" in
help) usage ;;
mode=*)
gen_mode="${OPTARG#*=}"
gen_function="create_${OPTARG#*=}_json_config"
;;
trid=*) remote_trid="${OPTARG#*=}" ;;
json-with-subsystems) gen_subsystems=true ;;
*) echo "Invalid argument '$OPTARG'" && usage ;;
esac
;;
h) usage ;;
*) echo "Invalid argument '$OPTARG'" && usage ;;
esac
done
if [[ "$gen_mode" == "remote" ]] && [[ -z "$remote_trid" ]]; then
echo "For $gen_mode --trid argument must be provided."
exit 1
fi
if [[ "$gen_mode" == "remote" ]]; then
gen_args+=("$remote_trid")
fi
bdev_json_cfg=$("$gen_function" "${gen_args[@]}")
if [[ $gen_subsystems == true ]]; then
bdev_json_cfg=$(
cat <<- JSON
{
"subsystems": [
$bdev_json_cfg
]
}
JSON
)
fi
echo "$bdev_json_cfg"