We don't use this script to create qcow2 images for our tests in CI. Also this script is using random vagrant box images, and we don't know what is inside them. Script maintenance is a tedious affair because fedora boxes use xfs file system, and we can not shrink them virtual disk to minimal size, and this will caused fails in tests in future. Signed-off-by: Maciej Wawryk <maciejx.wawryk@intel.com> Change-Id: I7b35f16bbfd6135377995f7b20e1402d14b2b1b1 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4738 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Paul Luse <paul.e.luse@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
269 lines
6.0 KiB
Plaintext
269 lines
6.0 KiB
Plaintext
# shellcheck disable=SC2016,SC2207
|
|
|
|
_get_help() {
|
|
"$@" -h 2>&1
|
|
}
|
|
|
|
_get_help_opt() {
|
|
# Fetch all the optional parameters with help from _parse_help()
|
|
_parse_help - < <(printf '%s\n' "$@")
|
|
}
|
|
|
|
_get_help_pos() {
|
|
local pos
|
|
|
|
# Fetch all the positional parameters, i.e. get first word prefixed
|
|
# with 20h x 2. This may not be 100% accurate. Also, it won't return
|
|
# any usuable strings, it's just meant to point out what type of
|
|
# mandatory argument given method depends on, like bdev_name, etc.
|
|
# TODO: separate completion for such arguments, e.g., get all bdevs
|
|
# for parameter like bdev_name?
|
|
while read -r; do
|
|
[[ $REPLY =~ ^\ {2}[^\ -] ]] || continue
|
|
read -r pos _ <<< "$REPLY" && echo "$pos"
|
|
done < <(printf '%s\n' "$@")
|
|
}
|
|
|
|
_get_default_rpc_methods() {
|
|
if [[ -S $rpc_sock ]]; then
|
|
_get_supported_methods "$1"
|
|
return 0
|
|
fi
|
|
|
|
local aliases method names
|
|
# Don't squash whitespaces, slurp the entire line
|
|
while read -r; do
|
|
# Each method name seems to be prefixed with 20h x 4. Then it can
|
|
# be followed with list of aliases enclosed inside (). Example:
|
|
# ioat_scan_accel_engine (ioat_scan_copy_engine, scan_ioat_copy_engine)
|
|
[[ $REPLY =~ ^\ {4}([a-z]+(_[a-z]+)*)(\ *\((.+)\))? ]] || continue
|
|
|
|
names=("${BASH_REMATCH[1]}")
|
|
if [[ $SPDK_RPC_ALIASES == yes ]] && [[ -n ${BASH_REMATCH[4]} ]]; then
|
|
IFS=", " read -ra aliases <<< "${BASH_REMATCH[4]}"
|
|
names+=("${aliases[@]}")
|
|
fi
|
|
|
|
for method in "${names[@]}"; do
|
|
rpc_methods["$method"]=1
|
|
done
|
|
done < <(_get_help "$1" 2> /dev/null)
|
|
}
|
|
|
|
_get_supported_methods() {
|
|
local method methods
|
|
|
|
mapfile -t methods < <("$1" -s "$rpc_sock" rpc_get_methods 2> /dev/null)
|
|
((${#methods[@]} > 0)) || return 0
|
|
|
|
# Kill the json flavor
|
|
methods=("${methods[@]//+(\"|,| )/}")
|
|
unset -v "methods[0]" "methods[-1]" # []
|
|
|
|
for method in "${methods[@]}"; do
|
|
rpc_methods["$method"]=1
|
|
done
|
|
}
|
|
|
|
_get_help_rpc_method() {
|
|
local rpc=$1
|
|
local method=$2
|
|
local rpc_help opt
|
|
|
|
mapfile -t rpc_help < <(_get_help "$rpc" "$method")
|
|
|
|
_get_help_pos "${rpc_help[@]}"
|
|
_get_help_opt "${rpc_help[@]}"
|
|
}
|
|
|
|
_is_rpc_method() {
|
|
local word=$1
|
|
|
|
[[ -v rpc_methods["$word"] ]]
|
|
}
|
|
|
|
_method_in_words() {
|
|
for word in "${words[@]}"; do
|
|
if _is_rpc_method "$word"; then
|
|
echo "$word"
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
_set_rpc_sock() {
|
|
# Look for unix sock each app creates upon its execution. In
|
|
# first instance, check the cmdline for an -s arg, if it's
|
|
# followed by the path to the sock, use it.
|
|
|
|
local word
|
|
for ((word = 0; word < ${#words[@]}; word++)); do
|
|
if [[ ${words[word]} == -s && -S ${words[word + 1]} ]]; then
|
|
rpc_sock=${words[word + 1]}
|
|
return 0
|
|
fi
|
|
done
|
|
|
|
# default .sock
|
|
[[ -S /var/tmp/spdk.sock ]] && rpc_sock=/var/tmp/spdk.sock
|
|
|
|
return 0
|
|
}
|
|
|
|
_spdk_opt_to_complete() {
|
|
local opt=$1
|
|
|
|
case "$opt" in
|
|
--pci-blacklist | -B | --pci-whitelist | -W)
|
|
local pcis
|
|
if [[ -e /sys/bus/pci/devices ]]; then
|
|
pcis=(/sys/bus/pci/devices/*)
|
|
pcis=("${pcis[@]##*/}")
|
|
fi
|
|
COMPREPLY=($(compgen -W '${pcis[*]}' -- "$cur"))
|
|
compopt -o filenames
|
|
;;
|
|
--master-core | -p) # FIXME: Is this meant to be an actual core id or thread id? Assume the latter
|
|
local cpus
|
|
if [[ -e /sys/devices/system/cpu ]]; then
|
|
cpus=(/sys/devices/system/cpu/cpu+([0-9]))
|
|
cpus=("${cpus[@]##*cpu}")
|
|
fi
|
|
COMPREPLY=($(compgen -W '${cpus[*]}' -- "$cur"))
|
|
;;
|
|
--iova-mode)
|
|
COMPREPLY=($(compgen -W 'pa va' -- "$cur"))
|
|
;;
|
|
--tpoint-group-mask | -e)
|
|
COMPREPLY=($(compgen -W '$(_get_tpoint_g_masks)' -- "$cur"))
|
|
compopt -o nosort
|
|
;;
|
|
--logflag)
|
|
COMPREPLY=($(compgen -W '$(_get_log_flags)' -- "$cur"))
|
|
;;
|
|
--huge-dir)
|
|
COMPREPLY=($(compgen -W '$(_get_fs_mounts "hugetlbfs")' -- "$cur"))
|
|
compopt -o filenames
|
|
;;
|
|
--iflag | --oflag) # spdk_dd specific
|
|
if [[ ${app##*/} == spdk_dd ]]; then
|
|
COMPREPLY=($(compgen -W '$(_get_help_pos "${app_help[@]}")' -- "$cur"))
|
|
fi
|
|
;;
|
|
*) return 1 ;;
|
|
esac
|
|
return 0
|
|
}
|
|
|
|
_get_fs_mounts() {
|
|
[[ $(< /proc/filesystems) == *"$1"* ]] || return 0
|
|
|
|
local mount fs mounts
|
|
while read -r _ mount fs _; do
|
|
[[ $fs == "$1" ]] && mounts+=("$mount")
|
|
done < /proc/mounts
|
|
|
|
if ((${#mounts[@]} > 0)); then
|
|
printf '%s\n' "${mounts[@]}"
|
|
fi
|
|
}
|
|
|
|
_get_from_spdk_help() {
|
|
_get_help "$app" |& grep "$1"
|
|
}
|
|
|
|
_get_tpoint_g_masks() {
|
|
local g_masks
|
|
|
|
g_masks=$(_get_from_spdk_help "tracepoint group mask for spdk trace buffers") || return 0
|
|
[[ $g_masks =~ \((.+)\) ]] || return 0
|
|
|
|
IFS=", " read -ra g_masks <<< "${BASH_REMATCH[1]}"
|
|
printf '%s\n' "${g_masks[@]}"
|
|
}
|
|
|
|
_get_log_flags() {
|
|
local logflags
|
|
|
|
logflags=$(_get_from_spdk_help "enable debug log flag") || return 0
|
|
[[ $logflags =~ \((.+)\) ]] || return 0
|
|
|
|
if [[ -n ${BASH_REMATCH[1]} && ${BASH_REMATCH[1]} != "not supported"* ]]; then
|
|
IFS=", " read -ra logflags <<< "${BASH_REMATCH[1]}"
|
|
printf '%s\n' "${logflags[@]}"
|
|
fi
|
|
}
|
|
|
|
_is_app() {
|
|
type -P "$1" > /dev/null
|
|
}
|
|
|
|
_rpc() {
|
|
local cur prev words
|
|
|
|
_init_completion || return
|
|
_is_app "$1" || return
|
|
|
|
local rpc=$1 rpc_sock="" method=""
|
|
local -A rpc_methods=()
|
|
|
|
_set_rpc_sock
|
|
_get_default_rpc_methods "$rpc"
|
|
|
|
if method=$(_method_in_words); then
|
|
COMPREPLY=($(compgen -W '$(_get_help_rpc_method "$rpc" "$method")' -- "$cur"))
|
|
compopt -o nosort
|
|
elif [[ $cur == -* ]]; then
|
|
COMPREPLY=($(compgen -W '$(_parse_help "$rpc")' -- "$cur"))
|
|
elif [[ $prev == --verbose ]]; then
|
|
COMPREPLY=($(compgen -W 'DEBUG INFO ERROR' -- "$cur"))
|
|
elif [[ $prev == -s ]]; then
|
|
_filedir
|
|
else
|
|
COMPREPLY=($(compgen -W '${!rpc_methods[*]}' -- "$cur"))
|
|
fi
|
|
}
|
|
|
|
_spdk_app() {
|
|
local cur prev
|
|
|
|
_init_completion || return
|
|
_is_app "$1" || return
|
|
|
|
local app=$1 app_help
|
|
|
|
mapfile -t app_help < <(_get_help "$app")
|
|
|
|
if [[ $cur == -* ]]; then
|
|
COMPREPLY=($(compgen -W '$(_get_help_opt "${app_help[@]}")' -- "$cur"))
|
|
else
|
|
_spdk_opt_to_complete "$prev" || _filedir
|
|
fi
|
|
}
|
|
|
|
# Build simple completion for some common spdk apps|tools
|
|
_spdk_apps() {
|
|
local apps
|
|
|
|
apps=(
|
|
iscsi_tgt
|
|
iscsi_top
|
|
nvmf_tgt
|
|
spdk_dd
|
|
spdk_tgt
|
|
spdk_top
|
|
spdk_trace_record
|
|
vhost
|
|
create_vbox.sh
|
|
pkgdep.sh
|
|
run-autorun.sh
|
|
vm_setup.sh
|
|
) # TODO: Add more?
|
|
|
|
complete -F _spdk_app "${apps[@]}"
|
|
complete -F _rpc rpc.py
|
|
}
|
|
|
|
_spdk_apps
|