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