xref: /spdk/scripts/gen_nvme.sh (revision eb53c23236cccb6b698b7ca70ee783da1c574b5f)
10829424eSBen Walker#!/usr/bin/env bash
2*eb53c232Spaul luse#  SPDX-License-Identifier: BSD-3-Clause
3*eb53c232Spaul luse#  Copyright (C) 2017 Intel Corporation
4*eb53c232Spaul luse#  All rights reserved.
5*eb53c232Spaul luse#
60829424eSBen Walkerset -e
70829424eSBen Walker
8f0c20934SDaniel Verkamprootdir=$(readlink -f $(dirname $0))/..
9f0c20934SDaniel Verkampsource "$rootdir/scripts/common.sh"
10f0c20934SDaniel Verkamp
1161f3c72cSKarol Lateckigen_subsystems=false
12faaa9dd5SKarol Lateckigen_mode="local"
13faaa9dd5SKarol Lateckigen_function="create_local_json_config"
14faaa9dd5SKarol Lateckigen_args=()
1561f3c72cSKarol Latecki
1661f3c72cSKarol Lateckifunction usage() {
1761f3c72cSKarol Latecki	echo "Script for generating JSON configuration file for attaching"
1861f3c72cSKarol Latecki	echo "local userspace NVMe drives."
1961f3c72cSKarol Latecki	echo "Usage: ${0##*/} [OPTIONS]"
2061f3c72cSKarol Latecki	echo
2161f3c72cSKarol Latecki	echo "-h, --help                     Print help and exit"
22faaa9dd5SKarol Latecki	echo "    --mode                     Generate 'local' or 'remote' NVMe JSON configuration. Default is 'local'."
23faaa9dd5SKarol Latecki	echo "                               Remote needs --trid option to be present."
24faaa9dd5SKarol Latecki	echo "    --trid                     Comma separated list target subsystem information containing transport type,"
25faaa9dd5SKarol Latecki	echo "                               IP addresses, port numbers and NQN names."
26faaa9dd5SKarol Latecki	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"
2761f3c72cSKarol Latecki	echo "    --json-with-subsystems     Wrap bdev subsystem JSON configuration with higher level 'subsystems' dictionary."
28eb662394SMichal Berger	echo "-n, --bdev-count               Defines number of nvme bdevs to use in the configuration."
2961f3c72cSKarol Latecki	exit 0
3061f3c72cSKarol Latecki}
3161f3c72cSKarol Latecki
32faaa9dd5SKarol Lateckifunction create_local_json_config() {
330e91da2fSGangCao	local bdev_json_cfg=()
3465b3c34bSKarol Latecki	local bdfs=()
35eb662394SMichal Berger	local max_bdfs
3665b3c34bSKarol Latecki
3765b3c34bSKarol Latecki	bdfs=($(nvme_in_userspace))
38eb662394SMichal Berger	max_bdfs=$((bdev_count > 0 && bdev_count < ${#bdfs[@]} ? bdev_count : ${#bdfs[@]}))
390e91da2fSGangCao
40eb662394SMichal Berger	for ((i = 0; i < max_bdfs; i++)); do
410e91da2fSGangCao		bdev_json_cfg+=("$(
420e91da2fSGangCao			cat <<- JSON
430e91da2fSGangCao				{
440e91da2fSGangCao					"method": "bdev_nvme_attach_controller",
450e91da2fSGangCao					"params": {
460e91da2fSGangCao						"trtype": "PCIe",
470e91da2fSGangCao						"name":"Nvme${i}",
480e91da2fSGangCao						"traddr":"${bdfs[i]}"
490e91da2fSGangCao					}
500e91da2fSGangCao				}
510e91da2fSGangCao			JSON
520e91da2fSGangCao		)")
5343c5429dSPawel Niedzwiecki	done
540e91da2fSGangCao
550e91da2fSGangCao	local IFS=","
560e91da2fSGangCao	cat <<- JSON
570e91da2fSGangCao		{
580e91da2fSGangCao			"subsystem": "bdev",
590e91da2fSGangCao			"config": [
600e91da2fSGangCao				${bdev_json_cfg[*]}
610e91da2fSGangCao			]
620e91da2fSGangCao		}
630e91da2fSGangCao	JSON
6443c5429dSPawel Niedzwiecki}
6543c5429dSPawel Niedzwiecki
66faaa9dd5SKarol Lateckifunction create_remote_json_config() {
67faaa9dd5SKarol Latecki	local trids
68faaa9dd5SKarol Latecki	local bdev_json_cfg=()
69faaa9dd5SKarol Latecki
70faaa9dd5SKarol Latecki	IFS="," read -r -a trids <<< $1
71faaa9dd5SKarol Latecki	for ((i = 0; i < ${#trids[@]}; i++)); do
72faaa9dd5SKarol Latecki		local transport
73faaa9dd5SKarol Latecki		local ip_addr
74faaa9dd5SKarol Latecki		local svc_port
75faaa9dd5SKarol Latecki		local nqn
76faaa9dd5SKarol Latecki
77faaa9dd5SKarol Latecki		IFS=":" read -r transport ip_addr svc_port nqn <<< ${trids[i]}
78faaa9dd5SKarol Latecki		bdev_json_cfg+=("$(
79faaa9dd5SKarol Latecki			cat <<- JSON
80faaa9dd5SKarol Latecki				{
81faaa9dd5SKarol Latecki					"method": "bdev_nvme_attach_controller",
82faaa9dd5SKarol Latecki					"params": {
83faaa9dd5SKarol Latecki						"trtype": "$transport",
84faaa9dd5SKarol Latecki						"adrfam": "IPv4",
85faaa9dd5SKarol Latecki						"name": "Nvme${i}",
86faaa9dd5SKarol Latecki						"subnqn": "$nqn",
87faaa9dd5SKarol Latecki						"traddr": "$ip_addr",
88faaa9dd5SKarol Latecki						"trsvcid": "$svc_port"
89faaa9dd5SKarol Latecki					}
90faaa9dd5SKarol Latecki				}
91faaa9dd5SKarol Latecki			JSON
92faaa9dd5SKarol Latecki		)")
93faaa9dd5SKarol Latecki	done
94faaa9dd5SKarol Latecki
95faaa9dd5SKarol Latecki	local IFS=","
96faaa9dd5SKarol Latecki	cat <<- JSON
97faaa9dd5SKarol Latecki		{
98faaa9dd5SKarol Latecki			"subsystem": "bdev",
99faaa9dd5SKarol Latecki			"config": [
100faaa9dd5SKarol Latecki				${bdev_json_cfg[*]}
101faaa9dd5SKarol Latecki			]
102faaa9dd5SKarol Latecki		}
103faaa9dd5SKarol Latecki	JSON
104faaa9dd5SKarol Latecki}
105faaa9dd5SKarol Latecki
106eb662394SMichal Bergerwhile getopts 'hn:-:' optchar; do
10761f3c72cSKarol Latecki	case "$optchar" in
10861f3c72cSKarol Latecki		-)
10961f3c72cSKarol Latecki			case "$OPTARG" in
11061f3c72cSKarol Latecki				help) usage ;;
111faaa9dd5SKarol Latecki				mode=*)
112faaa9dd5SKarol Latecki					gen_mode="${OPTARG#*=}"
113faaa9dd5SKarol Latecki					gen_function="create_${OPTARG#*=}_json_config"
114faaa9dd5SKarol Latecki					;;
115faaa9dd5SKarol Latecki				trid=*) remote_trid="${OPTARG#*=}" ;;
11661f3c72cSKarol Latecki				json-with-subsystems) gen_subsystems=true ;;
117eb662394SMichal Berger				bdev-count=*) bdev_count=${OPTARG#*=} ;;
11861f3c72cSKarol Latecki				*) echo "Invalid argument '$OPTARG'" && usage ;;
11961f3c72cSKarol Latecki			esac
12061f3c72cSKarol Latecki			;;
12161f3c72cSKarol Latecki		h) usage ;;
122eb662394SMichal Berger		n) bdev_count=$OPTARG ;;
12361f3c72cSKarol Latecki		*) echo "Invalid argument '$OPTARG'" && usage ;;
12461f3c72cSKarol Latecki	esac
12561f3c72cSKarol Lateckidone
12661f3c72cSKarol Latecki
127faaa9dd5SKarol Lateckiif [[ "$gen_mode" == "remote" ]] && [[ -z "$remote_trid" ]]; then
128faaa9dd5SKarol Latecki	echo "For $gen_mode --trid argument must be provided."
129faaa9dd5SKarol Latecki	exit 1
130faaa9dd5SKarol Lateckifi
131faaa9dd5SKarol Latecki
132faaa9dd5SKarol Lateckiif [[ "$gen_mode" == "remote" ]]; then
133faaa9dd5SKarol Latecki	gen_args+=("$remote_trid")
134faaa9dd5SKarol Lateckifi
135faaa9dd5SKarol Latecki
136faaa9dd5SKarol Lateckibdev_json_cfg=$("$gen_function" "${gen_args[@]}")
13761f3c72cSKarol Lateckiif [[ $gen_subsystems == true ]]; then
138f60b99b1SKarol Latecki	bdev_json_cfg=$(
139f60b99b1SKarol Latecki		cat <<- JSON
140f60b99b1SKarol Latecki			{
141f60b99b1SKarol Latecki				"subsystems": [
142f60b99b1SKarol Latecki					$bdev_json_cfg
143f60b99b1SKarol Latecki				]
144f60b99b1SKarol Latecki			}
145f60b99b1SKarol Latecki		JSON
146f60b99b1SKarol Latecki	)
14743c5429dSPawel Niedzwieckifi
148f60b99b1SKarol Latecki
149f60b99b1SKarol Lateckiecho "$bdev_json_cfg"
150