blob: 073760e2ffd0e81c40dcd1bb4432fc352ec59b30 [file] [log] [blame]
# shellcheck shell=bash
################################################################################
# slurm_completion.sh - bash completion script for Slurm client commands.
#
# Setting environment variables can control additional behaviors:
# - SLURM_COMP_VALUE=[0-1]
# - Description: Toggles value completion from slurmctld, slurmdbd.
# - Accepted values:
# - 0 = Disabled -- no call to slurm{ctl,db}d for value completion.
# - 1 = Enabled -- will make call to slurm{ctl,db}d. (default)
# - SLURM_COMP_HOSTLIST=[0-1]
# - Description: Alter slurm hostlist comprehension completion behavior.
# - Accepted values:
# - 0 = Disabled -- will not convert to hostlist notation.
# - 1 = Enabled -- will convert to hostlist notation. (default)
# - SLURM_COMPLOG_FILE=</path/to/file.log>
# - Description: File for script logging to write to.
# - SLURM_COMPLOG_LEVEL=[0-5]
# - Description: Script will log at this level of detail to specified file.
# - Accepted values:
# - 0 = QUIET
# - 1 = ERROR
# - 2 = WARN
# - 3 = INFO (default)
# - 4 = DEBUG
# - 5 = TRACE
################################################################################
# Copyright (C) SchedMD LLC.
# Written by Skyler Malinowski <skyler@schedmd.com>
#
# This file is part of Slurm, a resource management program.
# For details, see <https://slurm.schedmd.com/>.
# Please also read the included file: DISCLAIMER.
#
# Slurm is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option)
# any later version.
#
# In addition, as a special exception, the copyright holders give permission
# to link the code of portions of this program with the OpenSSL library under
# certain conditions as described in each individual source file, and
# distribute linked combinations including the two. You must obey the GNU
# General Public License in all respects for all of the code used other than
# OpenSSL. If you modify file(s) with this exception, you may extend this
# exception to your version of the file(s), but you are not obligated to do
# so. If you do not wish to do so, delete this exception statement from your
# version. If you delete this exception statement from all source files in
# the program, then also delete it here.
#
# Slurm is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along
# with Slurm; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
################################################################################
# Source guard
(return 0 2>/dev/null) && SOURCED=1 || SOURCED=0
if [ "$SOURCED" -eq 0 ]; then
echo "FATAL: this script (slurm_completion.sh) is meant to be sourced." 1>&2
exit 1
elif [[ -z $BASH_VERSION ]] && [[ -z ${BASH_SOURCE[-1]} ]]; then
echo "FATAL: this script (slurm_completion.sh) only supports bash." 1>&2
return
elif ! [[ -f "/usr/share/bash-completion/bash_completion" ]] ||
! declare -F _completion_loader >/dev/null 2>&1; then
cat <<-EOF 1>&2
FATAL: Missing required source file.
(1) Install package 'bash-completion'
(2) $ source /usr/share/bash-completion/bash_completion
(3) $ source slurm_completion.sh
EOF
return
fi
# Enable shell options
shopt -s extglob
################################################################################
# Slurm Completion Logger Functions
################################################################################
# Log at trace level
function __slurm_log_trace() {
local message="$1"
local level="5"
__slurm_comp_logger "${level}" "${message}"
}
# Log at debug level
function __slurm_log_debug() {
local message="$1"
local level="4"
__slurm_comp_logger "${level}" "${message}"
}
# Log at info level
function __slurm_log_info() {
local message="$1"
local level="3"
__slurm_comp_logger "${level}" "${message}"
}
# Log at warn level
function __slurm_log_warn() {
local message="$1"
local level="2"
__slurm_comp_logger "${level}" "${message}"
}
# Log at error level
function __slurm_log_error() {
local message="$1"
local level="1"
__slurm_comp_logger "${level}" "${message}"
}
# Logger function for debugging script
#
# $1: log level
# $2: message
function __slurm_comp_logger() {
local level="${1-1}"
local message="$2"
local loglevels=(
"QUIET"
"ERROR"
" WARN"
" INFO"
"DEBUG"
"TRACE"
)
local logfile="${SLURM_COMPLOG_FILE:-}"
local loglevel="${SLURM_COMPLOG_LEVEL:-1}"
if [[ -n $logfile ]] && ((level <= loglevel)); then
local fmt
fmt="[$(date)][${loglevels[level]}]"
printf '%s %s\n' "${fmt}" "${message}" >>"${SLURM_COMPLOG_FILE}"
fi
}
# Get the name of the current function
function __func__() {
if [[ -n ${FUNCNAME[1]} ]]; then
echo "${FUNCNAME[1]}"
else
echo "unknown"
fi
}
################################################################################
# Slurm Shell Completion Functions
################################################################################
# Generate completion reply. Appends a space to completion word if necessary.
# Based on __gitcomp().
#
# $1: List of completion words.
# $2: Prefix to be pre-appended to each completion word (optional).
# $3: Generate possible completion matches for this word (optional).
# $4: Suffix to be appended to each completion word (optional).
# $5: Separator for completion words (optional).
function __slurm_comp() {
local options="$1"
local prefix="$2"
local _cur="${3-$cur}"
local suffix="$4"
local ifs="${5-" "}"
local IFS=$' \t\n'
__slurm_comp_reset
__slurm_log_debug "$(__func__): prefix='$prefix' _cur='$_cur' suffix='$suffix' ifs='$ifs'"
__slurm_log_debug "$(__func__): options='$options'"
local c
for c in $options; do
c="$c${suffix-}"
__slurm_log_trace "$(__func__): for loop: c='$c'"
if [[ $c == "$_cur"* ]]; then
case $c in
*=) ;; # parameter
- | --) ;; # flag stub
*,) ;; # slurm list notation
*) c="${c}${ifs}" ;;
esac
COMPREPLY+=("${prefix-}$c")
fi
done
__ltrim_colon_completions "${_cur}"
__slurm_log_info "$(__func__): #COMPREPLY[@]='${#COMPREPLY[@]}'"
__slurm_log_info "$(__func__): COMPREPLY[*]='${COMPREPLY[*]}'"
}
function __slurm_comp_reset() {
COMPREPLY=()
}
# Slurm completion helper for count notation
# Example:
# BB = name[[:type]:count][,name[[:type]:count]...]
# GRES = name[[:type]:count][,name[[:type]:count]...]
# LICENSE = license[@db][:count][,license[@db][:count]...]
#
# $1: list of items for completion
# $2: list of units to suffix the count with (optional)
function __slurm_compreply_count() {
local options="$1"
local units="$2"
local prefix=""
local suffix=","
local curlist="${cur%"$suffix"*}"
local curitem="${cur##*"$suffix"}"
local compreply=()
if [[ $curitem == "$curlist" ]]; then
curlist=""
elif [[ -n $curlist ]]; then
prefix="${curlist}${suffix}"
fi
__slurm_log_debug "$(__func__): cur='$cur' curitem='$curitem' curlist='$curlist'"
case "${curitem}" in
*:)
__slurm_log_debug "$(__func__): expect count spec"
;;
*:+([[:digit:]])+([[:alpha:]]))
__slurm_log_debug "$(__func__): found count unit spec"
local item=""
item="$(echo "$curitem" | sed -E "s/[[:alpha:]]+$//g")"
options="$(compgen -P "${item}" -W "${units[*]}")"
__slurm_comp "${options[*]}" "${prefix-}" "${curitem}" "${suffix-}" ""
;;
*:+([[:digit:]]))
__slurm_log_debug "$(__func__): found count spec"
if [[ -n $units ]]; then
options="$(compgen -P "${curitem}" -W "${units[*]}")"
__slurm_comp "${options[*]}" "${prefix-}" "${curitem}" "${suffix-}" ""
else
__slurm_comp "${curitem[*]}" "${prefix-}" "${curitem}" "${suffix-}" ""
fi
;;
*)
__slurm_log_debug "$(__func__): expect item spec"
options="$(compgen -W "${options[*]}" -S ":" -- "${curitem}")"
# build array without seen items
for item in $options; do
__slurm_log_trace "$(__func__): for loop: item='$item'"
[[ $item =~ ^[[:space:]]*$ ]] && continue
[[ $curlist =~ "${item}"[[:digit:]]+"${suffix}"? ]] && continue
compreply+=("$item")
done
__slurm_comp "${compreply[*]}" "${prefix-}" "${curitem}" "" ""
;;
esac
}
# Completion function for parameters
function __slurm_compreply_param() {
local options="$1"
local compreply=()
local IFS=$' \t\n'
local p=""
__slurm_log_debug "$(__func__): cur='$cur'"
__slurm_log_debug "$(__func__): options='$options'"
# build array without seen items
for param in $options; do
p="${param%%?(\\)=*}"
__slurm_log_trace "$(__func__): for loop: param='$param' p*='$p'"
[[ $p != "$param" ]] && [[ ${words[*]} =~ [[:space:]]+${param}[^[:space:]]*[[:space:]]+ ]] && continue
[[ $p == "$param" ]] && [[ ${words[*]} =~ [[:space:]]+${p}[[:space:]]+ ]] && continue
compreply+=("$param")
done
__slurm_log_trace "$(__func__): #words[@]='${#words[@]}'"
__slurm_log_trace "$(__func__): words[*]='${words[*]}'"
__slurm_log_trace "$(__func__): #compreply[@]='${#compreply[@]}'"
__slurm_log_trace "$(__func__): compreply[*]='${compreply[*]}'"
__slurm_comp "$(compgen -W "${compreply[*]}" -- "$cur")"
}
# Value completion function for (comma) delimited items
#
# $1: word list for completions
# $2: reserved words, complete not in list (optional)
# $3: can use hostlist compression (optional)
function __slurm_compreply_list() {
local options="$1"
local reserved_words="$2"
local hostlist_compression="${3-"false"}"
local _mode="automatic"
local prefix=""
local suffix=","
local curlist="${cur%"$suffix"*}"
local curitem="${cur##*"$suffix"}"
local compreply=()
local IFS=$' \t\n'
local ifs=" "
local curlist_hostnames=""
local curlist_hostlist=""
# append $reserved_words to $options
if [[ $cur == "$curitem" ]]; then
options="${options} ${reserved_words}"
fi
if [[ $curitem == "$curlist" ]]; then
curlist=""
elif [[ -n $curlist ]]; then
prefix="${curlist}${suffix}"
fi
__slurm_log_debug "$(__func__): cur='$cur' curitem='$curitem' curlist='$curlist'"
__slurm_log_trace "$(__func__): reserved_words='$reserved_words'"
__slurm_log_trace "$(__func__): options='$options'"
if [[ $hostlist_compression == "true" ]]; then
if ((SLURM_COMP_HOSTLIST == 1)); then
__slurm_log_info "$(__func__): Slurm hostlist completion is enabled."
fi
curlist_hostnames="$(__slurm_hostnames "$curlist")"
__slurm_log_trace "$(__func__): curlist_hostnames='$curlist_hostnames'"
fi
# build array without seen items
for item in $options; do
__slurm_log_trace "$(__func__): for loop: item='$item'"
[[ $item =~ ^[[:space:]]*$ ]] && continue
[[ $curlist =~ "${item}${suffix}"? ]] && continue
[[ $curlist_hostnames =~ "${item}${suffix}"? ]] && continue
compreply+=("$item")
done
# compress to hostlist
if ((SLURM_COMP_HOSTLIST == 1)) && [[ $hostlist_compression == "true" ]]; then
curlist_hostlist="$(__slurm_hostlist "$curlist_hostnames")"
if [[ -n $curlist_hostlist ]]; then
prefix="${curlist_hostlist}${suffix}"
fi
local found=0
local filter=()
filter=("$(compgen -W "${compreply[*]}" -- "${curitem}")")
((${#filter[@]} == 1)) && [[ ${filter[0]} == "$curitem" ]] && found=1
__slurm_log_trace "$(__func__): found='$found' #filter[@]='${#filter[@]}' filter[*]='${filter[*]}'"
if ((found == 1)); then
curlist_hostlist="$(__slurm_hostlist "${curlist_hostnames},${curitem}")"
prefix=""
curitem="$curlist_hostlist"
compreply=("$curlist_hostlist")
fi
__slurm_log_trace "$(__func__): curlist_hostlist='$curlist_hostlist'"
fi
__slurm_log_info "$(__func__): Slurm list completion is in $_mode mode."
__slurm_log_debug "$(__func__): prefix='$prefix' suffix='$suffix' ifs='$ifs'"
__slurm_log_debug "$(__func__): #compreply[@]='${#compreply[@]}'"
__slurm_log_debug "$(__func__): compreply[*]='${compreply[*]}'"
if [[ $cur != "" ]] &&
[[ " ${reserved_words} " =~ [[:space:]]+"${cur//$suffix/}"[[:space:]]+ ]]; then
cur="${cur//$suffix/}"
__slurm_log_info "$(__func__): reserved word '$cur' detected."
__slurm_compreply "$reserved_words"
else
__slurm_comp "$(compgen -W "${compreply[*]}" -- "${curitem}")" "${prefix-}" "${curitem}" "${suffix-}" "${ifs-}"
fi
}
# Completion function for an item
#
# $1: options for single completion
function __slurm_compreply() {
local options="$1"
__slurm_log_debug "$(__func__): cur='$cur'"
__slurm_log_debug "$(__func__): #options[@]='${#options[@]}'"
__slurm_log_debug "$(__func__): options[*]='${options[*]}'"
__slurm_comp "$(compgen -W "${options[*]}" -- "$cur")"
}
# Generic flag completion function
#
# $1: client command context
# STDOUT: results
function __slurm_autocompletion() {
local context="$1"
local query="$cur"
local output=""
if [[ -z $cmd ]]; then
__slurm_log_error "$(__func__): client command context is empty."
echo ""
return 1
fi
local cmd="$context --autocomplete=\"$query\""
output="$(__slurm_func_wrapper "$cmd")"
__slurm_log_trace "$(__func__): output='$output'"
echo "${output}"
}
# Generic slurm command completion function
#
# $1: function name
# RET: 0 = success, 1 = failure
function __slurm_comp_command() {
local completion_func="$1"
__slurm_log_debug "$(__func__): completion_func='$completion_func'."
if declare -f -- "$completion_func" >/dev/null 2>&1; then
__slurm_log_trace "$(__func__): function '$completion_func' is defined."
$completion_func
return $?
else
__slurm_log_error "$(__func__): function '$completion_func' is not defined."
return 1
fi
}
# Search words[@] for an item from input array
#
# $1: array of strings
# RET: found subcommand
function __slurm_find_subcmd() {
local items=("$1")
local item=""
local IFS=$' \t\n'
local c=1 word=""
while [[ $c -lt ${cword-1} ]]; do
word="${words[c]}"
__slurm_log_trace "$(__func__): while loop: c='$c' word='$word'"
if [[ " ${items[*]} " =~ [[:space:]]+"${word}"[[:space:]]+ ]]; then
item="$word"
break
fi
((c++))
done
__slurm_log_debug "$(__func__): item='$item'"
__slurm_log_trace "$(__func__): #words[@]='${#words[@]}'"
__slurm_log_trace "$(__func__): words[*]='${words[*]}'"
__slurm_log_trace "$(__func__): #items[@]='${#items[@]}'"
__slurm_log_trace "$(__func__): items[*]='${items[*]}'"
echo "${item}"
}
# Search words[@] for an item from input array
#
# $1: string to find position of
# RET: subcommand position
function __slurm_find_subcmd_pos() {
local item="$1"
local found=false
local IFS=$' \t\n'
__slurm_log_debug "$(__func__): item='$item'"
__slurm_log_trace "$(__func__): #words[@]='${#words[@]}'"
__slurm_log_trace "$(__func__): words[*]='${words[*]}'"
local c=1 word=""
while [[ $c -lt ${cword-1} ]]; do
word="${words[c]}"
__slurm_log_trace "$(__func__): while loop: c='$c' word='$word'"
if [[ ${item} == "${word}" ]]; then
found=true
break
fi
((c++))
done
if [[ $found == true ]]; then
echo "${c}"
else
echo "-1"
return 1
fi
}
# Search words[@] for any parameters from given array
#
# $1: parameter array
# RET: found parameter
function __slurm_find_param() {
local params="$1"
local param=""
local IFS=$' \t\n'
for p in $params; do
__slurm_log_trace "$(__func__): for loop: p='$p' p*='${p%%=*}'"
if [[ ${words[*]} =~ ${p%%?(\\)=*} ]]; then
param="$p"
break
fi
done
__slurm_log_debug "$(__func__): param='$param'"
__slurm_log_trace "$(__func__): #words[@]='${#words[@]}'"
__slurm_log_trace "$(__func__): words[*]='${words[*]}'"
__slurm_log_trace "$(__func__): params='$params'"
echo "${param}"
}
# Adapted from bash-completion _split_longopt()
#
# RET: 0 = made split, 1 = no split
function __slurm_split_opt() {
__slurm_log_trace "$(__func__): prev='$prev' cur='$cur'"
case "${cur}" in
--?*=* | ?*=*)
prev="${cur%%?(\\)=*}"
cur="${cur#*?(\\)=}"
;;
*) return 1 ;;
esac
__slurm_log_trace "$(__func__): prev='$prev' cur='$cur'"
return 0
}
# Determine if we are completing a long opt
#
# 0 = yes, 1 = no
function __slurm_is_long_opt() {
__slurm_log_trace "$(__func__): prev='$prev' cur='$cur' split='$split'"
if [[ $prev =~ ^--[[:alnum:]][-[:alnum:]]+$ ]] && $split; then
return 0
elif [[ $prev =~ ^--[[:alnum:]][-[:alnum:]]+=*$ ]]; then
return 0
else
return 1
fi
}
# Determine if we are completing a short opt
#
# 0 = yes, 1 = no
function __slurm_is_short_opt() {
__slurm_log_trace "$(__func__): prev='$prev' cur='$cur'"
if [[ $prev =~ ^-[[:alnum:]]+=* ]]; then
return 0
else
return 1
fi
}
# Determine if we are completing an opt (e.g. short, long)
#
# 0 = yes, 1 = no
function __slurm_is_opt() {
local is_short=false
local is_long=false
__slurm_is_short_opt && is_short=true
__slurm_is_long_opt && $split && is_long=true
__slurm_log_trace "$(__func__): prev='$prev' cur='$cur' split='$split'"
__slurm_log_debug "$(__func__): is_short='$is_short' is_long='$is_long'"
if $is_long || $is_short; then
return 0
else
return 1
fi
}
# _init_completion() wrapper
#
# RET: 0 = success, 1 = failure
function __slurm_init_completion() {
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD - 1]}"
cword="${#COMP_CWORD[@]}"
words=("${COMP_WORDS[@]}")
split=false
_init_completion -s -n "=:" || return 1
__slurm_split_opt && split=true
__slurm_log_debug "$(__func__): prev='$prev'"
__slurm_log_debug "$(__func__): cur='$cur'"
__slurm_log_debug "$(__func__): split='$split'"
__slurm_log_debug "$(__func__): cword='$cword'"
__slurm_log_debug "$(__func__): #words[@]='${#words[@]}'"
__slurm_log_debug "$(__func__): words[*]='${words[*]}'"
__slurm_log_trace "$(__func__): COMP_CWORD='$COMP_CWORD'"
__slurm_log_trace "$(__func__): COMP_LINE='$COMP_LINE'"
__slurm_log_trace "$(__func__): COMP_POINT='$COMP_POINT'"
__slurm_log_trace "$(__func__): COMP_WORDBREAKS='${COMP_WORDBREAKS}'"
__slurm_log_trace "$(__func__): COMP_WORDS[*]='${COMP_WORDS[*]}'"
__slurm_log_trace "$(__func__): COMPREPLY[*]='${COMPREPLY[*]}'"
return 0
}
# Initialize shell completion
#
# RET: 0 = success, 1 = failure
function __slurm_compinit() {
# default environment variable values
SLURM_COMPLOG_FILE="${SLURM_COMPLOG_FILE:-""}"
SLURM_COMPLOG_LEVEL="${SLURM_COMPLOG_LEVEL:-3}"
SLURM_COMP_VALUE="${SLURM_COMP_VALUE:-1}"
SLURM_COMP_HOSTLIST="${SLURM_COMP_HOSTLIST:-1}"
__slurm_log_info ""
__slurm_log_info "$(__func__): ========== COMPLETION LOGIC START ==========="
__slurm_log_info "$(__func__): SLURM_COMPLOG_LEVEL='${SLURM_COMPLOG_LEVEL}'"
__slurm_log_info "$(__func__): SLURM_COMPLOG_FILE='$SLURM_COMPLOG_FILE'"
__slurm_log_info "$(__func__): SLURM_COMP_VALUE='${SLURM_COMP_VALUE}'"
__slurm_log_info "$(__func__): SLURM_COMP_HOSTLIST='${SLURM_COMP_HOSTLIST}'"
# Ensure case sensitive case matching
shopt -u nocasematch
__slurm_init_completion || return 1
return 0
}
################################################################################
# Slurm Helper Completion Functions
################################################################################
# Check if slurm value completions are enabled
#
# RET 0 = enabled, 1 = disabled
function __slurm_comp_slurm_value() {
if ((SLURM_COMP_VALUE == 0)); then
__slurm_log_warn "$(__func__): Slurm value completion is disabled."
return 1
fi
__slurm_log_info "$(__func__): Slurm value completion is enabled."
return 0
}
# Filter and normalize completion items
#
# $@: array of items
function __slurm_comp_filter() {
local input=("$@")
local output
output="$(echo "${input[*]}" | awk NF | sort -u | paste -s -d' ')"
__slurm_log_trace "$(__func__): #input[@]='${#input[@]}'"
__slurm_log_trace "$(__func__): input[*]='${input[*]}'"
__slurm_log_trace "$(__func__): output='$output'"
echo "${output}"
}
# Determine if a slurmctld will respond
function __slurm_ctld_status() {
local output exit_code
output=$(scontrol ping >/dev/null 2>&1)
exit_code=$?
if ((exit_code == 0)); then
__slurm_log_debug "$(__func__): exit_code='$exit_code'"
else
__slurm_log_error "$(__func__): exit_code='$exit_code'"
fi
return $exit_code
}
# Determine if a slurmdbd will respond
function __slurm_dbd_status() {
local output exit_code
output=$(sacctmgr ping >/dev/null 2>&1)
exit_code=$?
if ((exit_code == 0)); then
__slurm_log_debug "$(__func__): exit_code='$exit_code'"
else
__slurm_log_error "$(__func__): exit_code='$exit_code'"
fi
return $exit_code
}
# Slurm helper function for running slurm functions
function __slurm_func_wrapper() {
local cmd="$1"
local output=""
local exit_code=0
if [[ -z $cmd ]]; then
__slurm_log_error "$(__func__): no command given"
echo ""
return 1
fi
__slurm_log_debug "$(__func__): $cmd"
output="$(eval "$cmd" 2>/dev/null)"
exit_code=$?
if ((exit_code == 0)); then
__slurm_log_trace "$(__func__): output='$output'"
output="$(__slurm_comp_filter "${output}")"
else
__slurm_log_error "$(__func__): command failed, ignoring output"
output=""
fi
if [[ -n $output ]]; then
__slurm_log_debug "$(__func__): output='$output'"
else
__slurm_log_warn "$(__func__): output is empty"
fi
echo "${output}"
}
# Slurm helper function to get accounts list
#
# RET: space delimited list
function __slurm_accounts() {
__slurm_comp_slurm_value || return
__slurm_dbd_status || return
local cmd="sacctmgr -Pn list accounts format=account"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get burst buffer list
#
# RET: space delimited list
function __slurm_burstbuffers() {
__slurm_comp_slurm_value || return
__slurm_ctld_status || return
local cmd="scontrol -o show burstbuffer | grep -E -o 'Name=\S+' | cut -d= -f2 | tr ',' '\n'"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get associations list
#
# RET: space delimited list
function __slurm_associations() {
__slurm_comp_slurm_value || return
__slurm_dbd_status || return
local cmd="sacctmgr -Pn list associations format=id"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to return accepted boolean values
#
# RET: boolean list
function __slurm_boolean() {
local boolean=(
"no"
"yes"
)
local output
output="${boolean[*]}"
__slurm_log_trace "$(__func__): output='$output'"
echo "${output}"
}
# Slurm helper function to return accepted compress type values
#
# RET: compress_types list
function __slurm_compress_types() {
local compress_types=(
"lz4"
"none"
)
local output="${compress_types[*]}"
__slurm_log_trace "$(__func__): output='$output'"
echo "${output}"
}
# Slurm helper function to return accepted cpu bind type values
#
# RET: cpubind_types list
function __slurm_cpubind_types() {
local cpubind_types=(
"board"
"core"
"ldom"
"none"
"off"
"socket"
"thread"
)
local output="${cpubind_types[*]}"
__slurm_log_trace "$(__func__): output='$output'"
echo "${output}"
}
# Slurm helper function to get clusters list
#
# RET: space delimited list
function __slurm_clusters() {
__slurm_comp_slurm_value || return
__slurm_dbd_status || return
local cmd="sacctmgr -Pn list clusters format=clusters"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get cluster features list
#
# RET: space delimited list
function __slurm_clusters_feature() {
__slurm_comp_slurm_value || return
__slurm_dbd_status || return
local cmd="sacctmgr -Pn list federation format=features"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get clusters RPC list
#
# RET: space delimited list
function __slurm_clusters_rpc() {
__slurm_comp_slurm_value || return
__slurm_dbd_status || return
local cmd="sacctmgr -Pn list clusters format=rpc"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get features list
#
# RET: space delimited list
function __slurm_features() {
__slurm_comp_slurm_value || return
__slurm_ctld_status || return
local cmd="scontrol -o show nodes | grep -E -o 'AvailableFeatures=\S+' | cut -d= -f2 | tr ',' '\n'"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get active features list
#
# RET: space delimited list
function __slurm_features_active() {
__slurm_comp_slurm_value || return
__slurm_ctld_status || return
local cmd="scontrol -o show nodes | grep -E -o 'ActiveFeatures=\S+' | cut -d= -f2 | tr ',' '\n'"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get federations list
#
# RET: space delimited list
function __slurm_federations() {
__slurm_comp_slurm_value || return
__slurm_dbd_status || return
local cmd="sacctmgr -Pn list federation format=federation"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get format list
#
# $1: slurm command to run helpformat against
# RET: space delimited list
function __slurm_helpformat() {
local cmd="$1"
local output=""
if [[ -z $cmd ]]; then
__slurm_log_error "$(__func__): command context is empty"
return 1
fi
output="$(__slurm_func_wrapper "$cmd --helpformat")"
output=${output,,} # force lowercase
echo "${output}"
}
# Slurm helper function to get format list
#
# $1: slurm command to run helpFormat against
# $2: output case
# RET: space delimited list
function __slurm_helpformat2() {
local cmd="$1"
local case="${2:-lower}"
local output=""
if [[ -z $cmd ]]; then
__slurm_log_error "$(__func__): command context is empty"
return 1
fi
output="$(__slurm_func_wrapper "$cmd --helpFormat")"
if [[ $case == "lower" ]]; then
output=${output,,} # force lowercase
elif [[ $case == "upper" ]]; then
output=${output^^} # force uppercase
fi
echo "${output}"
}
# Slurm helper function to get job reason list
#
# $1: slurm command to run --helpreason against
# RET: space delimited list
function __slurm_helpreason() {
local cmd="$1"
local output=""
if [[ -z $cmd ]]; then
__slurm_log_error "$(__func__): command context is empty"
return 1
fi
output="$(__slurm_func_wrapper "$cmd --helpreason")"
output=${output,,} # force lowercase
echo "${output}"
}
# Slurm helper function to get state list
#
# $1: slurm command to run --helpstate against
# RET: space delimited list
function __slurm_helpstate() {
local cmd="$1"
local output=""
if [[ -z $cmd ]]; then
__slurm_log_error "$(__func__): command context is empty"
return 1
fi
output="$(__slurm_func_wrapper "$cmd --helpstate")"
output=${output,,} # force lowercase
echo "${output}"
}
# Slurm helper function to get sorted hostlist list
#
# RET: space delimited list
function __slurm_hostlist() {
local hostnames="$1"
local cmd="scontrol -o show hostlistsorted \"$hostnames\""
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get hostnames list
#
# RET: space delimited list
function __slurm_hostnames() {
local hostlist="${1-}"
local cmd="scontrol -o show hostnames \"$hostlist\""
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get GRES list
#
# RET: space delimited list
function __slurm_gres() {
__slurm_comp_slurm_value || return
__slurm_ctld_status || return
local cmd="scontrol -o show config | grep 'GresTypes' | tr -d '[:space:]' | cut -d= -f2 | tr ',' '\n'"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get instance extra list
#
# RET: space delimited list
function __slurm_instances_extra() {
__slurm_comp_slurm_value || return
__slurm_dbd_status || return
local cmd="sacctmgr -Pn list instances format=extra"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get instance id list
#
# RET: space delimited list
function __slurm_instances_id() {
__slurm_comp_slurm_value || return
__slurm_dbd_status || return
local cmd="sacctmgr -Pn list instances format=instanceid"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get instance type list
#
# RET: space delimited list
function __slurm_instances_type() {
__slurm_comp_slurm_value || return
__slurm_dbd_status || return
local cmd="sacctmgr -Pn list instances format=instancetype"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get recent jobs list
#
# RET: space delimited list
function __slurm_jobs() {
__slurm_comp_slurm_value || return
__slurm_ctld_status || return
local cmd="scontrol -o show jobs | grep -Po 'JobId=\S+' | cut -d'=' -f2"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get recent jobstep tasks list
#
# RET: space delimited list
function __slurm_jobsteps_tasks() {
__slurm_comp_slurm_value || return
__slurm_ctld_status || return
local cmd="scontrol -o show step | grep -Po 'StepId=\d+\.\d+' | cut -d'=' -f2"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get recent jobsteps list
#
# RET: space delimited list
function __slurm_jobsteps() {
__slurm_comp_slurm_value || return
__slurm_ctld_status || return
local cmd="scontrol -o show step | grep -Po 'StepId=\d+\.\S+' | cut -d'=' -f2"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get recent job name list
#
# RET: space delimited list
function __slurm_jobnames() {
__slurm_comp_slurm_value || return
__slurm_ctld_status || return
local cmd="scontrol -o show jobs | grep -Po 'JobName=\S+' | cut -d'=' -f2"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get license list
#
# RET: space delimited list
function __slurm_licenses() {
__slurm_comp_slurm_value || return
__slurm_ctld_status || return
local cmd="scontrol -o show license | grep -Po 'LicenseName=\S+' | cut -d'=' -f2"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get node list
#
# RET: space delimited list
function __slurm_nodes() {
__slurm_comp_slurm_value || return
__slurm_ctld_status || return
local cmd="scontrol -o show nodes | grep -Po 'NodeName=\S+' | cut -d'=' -f2"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get frontend node list
#
# RET: space delimited list
function __slurm_nodes_frontend() {
__slurm_comp_slurm_value || return
__slurm_ctld_status || return
local cmd="scontrol -o show frontend | grep -Po 'FrontendName=\S+' | cut -d'=' -f2"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get node hostname list
#
# RET: space delimited list
function __slurm_nodes_hostname() {
__slurm_comp_slurm_value || return
__slurm_ctld_status || return
local cmd="scontrol -o show nodes | grep -Po 'NodeHostName=\S+' | cut -d'=' -f2"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get organizations list
#
# RET: space delimited list
function __slurm_organizations() {
__slurm_comp_slurm_value || return
__slurm_dbd_status || return
local cmd="sacctmgr -Pn list accounts format=organization"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get partition list
#
# RET: space delimited list
function __slurm_partitions() {
__slurm_comp_slurm_value || return
__slurm_ctld_status || return
local cmd="scontrol -o show partitions | grep -Po 'PartitionName=\S+' | cut -d'=' -f2"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get QOS list
#
# RET: space delimited list
function __slurm_qos() {
__slurm_comp_slurm_value || return
__slurm_dbd_status || return
local cmd="sacctmgr -Pn list qos format=name"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get QOS ID list
#
# RET: space delimited list
function __slurm_qosid() {
__slurm_comp_slurm_value || return
__slurm_dbd_status || return
local cmd="sacctmgr -Pn list qos format=id"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get reservation list
#
# RET: space delimited list
function __slurm_reservations() {
__slurm_comp_slurm_value || return
__slurm_ctld_status || return
local cmd="scontrol -o show reservations | grep -Po 'ReservationName=\S+' | cut -d= -f2"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get resources list
#
# RET: space delimited list
function __slurm_resources() {
__slurm_comp_slurm_value || return
__slurm_dbd_status || return
local cmd="sacctmgr -Pn list resource format=name"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get resource servers list
#
# RET: space delimited list
function __slurm_resources_servers() {
__slurm_comp_slurm_value || return
__slurm_dbd_status || return
local cmd="sacctmgr -Pn list resource format=server"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function for client data parser (json) plugin list
#
# RET: space delimited list
function __slurm_dataparser_json() {
local ctx="$1"
local cmd="$ctx --json=list 2>&1 | tail -n +2 | sed 's/$ctx: //g'"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function for client data parser (yaml) plugin list
#
# RET: space delimited list
function __slurm_dataparser_yaml() {
local ctx="$1"
local cmd="$ctx --yaml=list 2>&1 | tail -n +2 | sed 's/$ctx: //g'"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to return accepted signals list
#
# RET: signals
function __slurm_signals() {
local signals=(
"SIGHUP"
"SIGINT"
"SIGQUIT"
"SIGKILL"
"SIGKILL"
"SIGALRM"
"SIGTERM"
"SIGUSR1"
"SIGUSR2"
"SIGURG"
"SIGCONT"
"SIGSTOP"
"SIGTSTP"
"SIGTTIN"
"SIGTTOU"
"SIGXCPU"
)
local output="${signals[*]}"
__slurm_log_trace "$(__func__): output='$output'"
echo "${output}"
}
# Slurm helper function to get TRES list
#
# RET: space delimited list
function __slurm_tres() {
__slurm_comp_slurm_value || return
__slurm_dbd_status || return
local cmd="scontrol -o show config | grep 'AccountingStorageTRES' | cut -d= -f2 | tr -d '[:space:]' | tr ',' '\n'"
__slurm_func_wrapper "$cmd"
}
function __slurm_units() {
local units=(
"K"
"KB"
"KiB"
"M"
"MB"
"MiB"
"G"
"GB"
"GiB"
"T"
"TB"
"TiB"
"P"
"PB"
"PiB"
)
local output="${units[*]}"
__slurm_log_trace "$(__func__): output='$output'"
echo "${output}"
}
# Slurm helper function to get user list
#
# RET: space delimited list
function __slurm_users() {
__slurm_comp_slurm_value || return
__slurm_dbd_status || return
local cmd="sacctmgr -Pn list users format=user"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get user group list
#
# RET: space delimited list
function __slurm_wckeys() {
__slurm_comp_slurm_value || return
__slurm_dbd_status || return
local cmd="sacctmgr -Pn list wckeys format=wckey"
__slurm_func_wrapper "$cmd"
}
# Slurm completion helper for flag completion
#
# $1: slurm command being completed
# RET: 0 = did completion; 1 = no completion
function __slurm_comp_flags() {
local cmd="$1"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): cmd='$cmd'"
case "${cur}" in
-*) __slurm_compreply_param "$(__slurm_autocompletion "$cmd")" ;;
*) return 1 ;;
esac
return 0
}
# Slurm completion helper for job dependency spec
function __slurm_comp_dependency() {
local prefix=""
local suffix=","
if [[ $cur == *"?"* ]] && [[ $cur != *","* ]]; then
# Dependency expression can use either ',' or '?' as the
# separator, but not both in the same expression.
# , = logical and (all must be satisfied)
# ? = logical or (any may be satisfied)
suffix="?"
fi
local curlist="${cur%"$suffix"*}"
local curitem="${cur##*"$suffix"}"
local curitem2="${curitem##*:}"
local curverb="${curitem%:*}:"
local compreply=()
local dependency_types=(
"after:"
"afterany:"
"afterburstbuffer:"
"aftercorr:"
"afternotok:"
"afterok:"
"singleton"
)
if [[ $curitem == "$curlist" ]]; then
curlist=""
elif [[ -n $curlist ]]; then
prefix="${curlist}${suffix}"
fi
__slurm_log_debug "$(__func__): cur='$cur' curitem='$curitem' curlist='$curlist'"
__slurm_log_debug "$(__func__): curitem2='$curitem2' prefix='$prefix' suffix='$suffix'"
case "${curitem}" in
*:*) ;;
*)
__slurm_log_debug "$(__func__): expect verb spec"
compreply=("$(compgen -W "${dependency_types[*]}" -- "${curitem}")")
__slurm_comp "${compreply[*]}" "${prefix-}" "${curitem}" "" ""
return
;;
esac
case "${curitem2}" in
*+)
__slurm_log_debug "$(__func__): expect time spec"
;;
*++([0-9]))
__slurm_log_debug "$(__func__): found time spec"
compreply+=("$(compgen -W "${curitem}" -S "${suffix}" -- "${curitem}")")
compreply+=("$(compgen -W "${curitem}" -S ":" -- "${curitem}")")
if [[ $cur != *","* ]]; then
compreply+=("$(compgen -W "${curitem}" -S "?" -- "${curitem}")")
fi
__slurm_comp "${compreply[*]}" "${prefix-}" "${curitem}" "" ""
;;
*)
__slurm_log_debug "$(__func__): expect job spec"
local jobs=()
local options=""
options="$(__slurm_jobs)"
# build array without seen items
for item in $options; do
__slurm_log_trace "$(__func__): for loop: item='$item'"
[[ $curitem =~ :"${item}". ]] && continue
jobs+=("$item")
done
compreply+=("$(compgen -W "${jobs[*]}" -P "${curverb}" -S "${suffix}" -- "${curitem2}")")
compreply+=("$(compgen -W "${jobs[*]}" -P "${curverb}" -S ":" -- "${curitem2}")")
compreply+=("$(compgen -W "${jobs[*]}" -P "${curverb}" -S "+" -- "${curitem2}")")
if [[ $cur != *","* ]]; then
compreply+=("$(compgen -W "${jobs[*]}" -P "${curverb}" -S "?" -- "${curitem2}")")
fi
__slurm_comp "${compreply[*]}" "${prefix-}" "${curitem}" "" ""
;;
esac
}
# Slurm completion helper for salloc, sbatch, srun
#
# $1: slurm command being completed
# RET: 0 = did completion; 1 = no completion
function __slurm_comp_common_flags() {
local cmd="$1"
local accelbind_types=(
"g"
"n"
"v"
)
local acctgfreq_types=(
"energy="
"filesystem="
"network="
"task="
)
local binary=(
"0"
"1"
)
local cpubind_types=(
"cores"
"help"
"ldoms"
"map_cpu:"
"map_ldom:"
"mask_cpu:"
"mask_ldom:"
"none"
"quiet"
"rank"
"rank_ldom"
"sockets"
"threads"
"verbose"
)
local cpufreq_types=(
"low"
"medium"
"high"
"highm1"
"conservative"
"ondemand"
"performance"
"powersave"
)
local distribution_types=(
"arbitrary"
"block"
"cyclic"
"plane="
)
local env_modes=(
"L"
"S"
)
local exclusive_types=(
"exclusive"
"mcs"
"oversubscribe"
"user"
)
local export_types=(
"all"
"none"
)
local gpubind_types=(
"closest"
"map_gpu:"
"mask_gpu:"
"none"
"per_task:"
"single:"
)
local gpufreq_types=(
"low"
"medium"
"high"
"highm1"
)
local gres_flags=(
"allow-task-sharing"
"disable-binding"
"enforce-binding"
"multiple-tasks-per-sharing"
"one-task-per-sharing"
)
local hints=(
"compute_bound"
"help"
"memory_bound"
"multithread"
"nomultithread"
)
local mail_types=(
"all"
"array_tasks"
"begin"
"end"
"fail"
"invalid_depend"
"none"
"requeue"
"stage_out"
"time_limit"
"time_limit_90"
"time_limit_80"
"time_limit_50"
)
local membind_types=(
"help"
"local"
"map_mem:"
"mask_mem:"
"none"
"prefer"
"rank"
"sort"
)
local mpi_types=(
"list"
"none"
"pmi2"
"pmix"
)
local network_types=(
"blade"
"system"
)
local open_modes=(
"append"
"truncate"
)
local profile_types=(
"all"
"energy"
"filesystem"
"network"
"none"
"task"
)
local propagate_types=(
"all"
"as"
"core"
"cpu"
"data"
"fsize"
"memlock"
"nofile"
"none"
"nproc"
"rss"
"stack"
)
local slurmd_levels=(
"quiet"
"fatal"
"error"
"info"
"verbose"
)
local x11_modes=(
"all"
"first"
"last"
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur' cmd='$cmd'"
__slurm_comp_flags "$cmd" && return 0
__slurm_is_opt || return 1
case "${prev}" in
--accel-bind) __slurm_compreply "${accelbind_types[*]}" ;;
-A | --account?(s)) __slurm_compreply "$(__slurm_accounts)" ;;
--acctg-freq) __slurm_compreply_list "${acctgfreq_types[*]}" ;;
--batch) __slurm_compreply_list "$(__slurm_features)" ;;
--bcast) _filedir -d ;;
--bcast-exclude) _filedir -d ;;
-D | --chdir) _filedir -d ;;
--cluster-constraint?(s)) __slurm_compreply_list "$(__slurm_clusters_feature)" ;;
-M | --cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
--compress) __slurm_compreply "$(__slurm_compress_types)" ;;
-C | --constraint) __slurm_compreply_list "$(__slurm_features)" ;;
--container) _filedir ;;
--cpu-bind) __slurm_compreply "${cpubind_types[*]}" ;;
--cpu-freq) __slurm_compreply "${cpufreq_types[*]}" ;;
-d | --dependency) __slurm_comp_dependency ;;
-m | --distribution) __slurm_compreply "${distribution_types[*]}" ;;
--epilog) _filedir ;;
-e | --error) _filedir ;;
-x | --exclude) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
--exclusive) __slurm_compreply "${exclusive_types[*]}" ;;
--export) __slurm_compreply "${export_types[*]}" ;;
--export-file) _filedir ;;
--get-user-env) __slurm_compreply "${env_modes[*]}" ;;
--gid) __slurm_compreply "$(__slurm_linux_groups) $(__slurm_linux_gids)" ;;
--gpu-bind) __slurm_compreply "${gpubind_types[*]}" ;;
--gpu-freq) __slurm_compreply "${gpufreq_types[*]}" ;;
--gres) __slurm_compreply_count "$(__slurm_gres)" ;;
--gres-flag?(s)) __slurm_compreply "${gres_flags[*]}" ;;
--hint) __slurm_compreply "${hints[*]}" ;;
-i | --input) _filedir ;;
--jobid) __slurm_compreply "$(__slurm_jobs)" ;;
-K)
# warning: salloc and srun overload -K
case "${cmd}" in
salloc) __slurm_compreply "$(__slurm_signals)" ;;
srun) __slurm_compreply "${binary[*]}" ;;
*) return 1 ;;
esac
;;
--kill-command) __slurm_compreply "$(__slurm_signals)" ;;
--kill-on-bad-exit) __slurm_compreply "${binary[*]}" ;;
--kill-on-invalid-dep) __slurm_compreply "$(__slurm_boolean)" ;;
-L | --license?(s)) __slurm_compreply_count "$(__slurm_licenses)" ;;
--mail-type) __slurm_compreply_list "${mail_types[*]}" ;;
--mail-user) __slurm_compreply "$(__slurm_users)" ;;
--mem-bind) __slurm_compreply "${membind_types[*]}" ;;
--mpi) __slurm_compreply "${mpi_types[*]}" ;;
--network) __slurm_compreply "${network_types[*]}" ;;
-F | --nodefile) _filedir ;;
-w | --nodelist) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
--open-mode?(s)) __slurm_compreply "${open_modes[*]}" ;;
-o | --output) _filedir ;;
-p | --partition?(s)) __slurm_compreply_list "$(__slurm_partitions)" ;;
--prefer?(s)) __slurm_compreply_list "$(__slurm_features)" ;;
--profile?(s)) __slurm_compreply_list "${profile_types[*]}" ;;
--prolog) _filedir ;;
--propagate?(s)) __slurm_compreply_list "${propagate_types[*]}" ;;
-q | --qos?(s)) __slurm_compreply "$(__slurm_qos)" ;;
--reservation?(s)) __slurm_compreply_list "$(__slurm_reservations)" ;;
--send-lib?(s)) __slurm_compreply "$(__slurm_boolean)" ;;
--signal) __slurm_compreply "$(__slurm_signals)" ;;
--slurmd-debug) __slurm_compreply "${slurmd_levels[*]}" ;;
--task-epilog) _filedir ;;
--task-prolog) _filedir ;;
--tres-per-task) __slurm_compreply_count "$(__slurm_tres | tr '/' ':')" ;;
--uid?(s)) __slurm_compreply "$(__slurm_users) $(__slurm_linux_uids)" ;;
--wait-all-node?(s)) __slurm_compreply "${binary[*]}" ;;
--wckey?(s)) __slurm_compreply "$(__slurm_wckeys)" ;;
--x11) __slurm_compreply "${x11_modes[*]}" ;;
*) return 1 ;;
esac
return 0
}
################################################################################
# Linux Helper Completion Functions
################################################################################
# Returns list of linux users from passwd
#
# RET: space delimited list
function __slurm_linux_users() {
local output
output="$(getent passwd | cut -d: -f1)"
__slurm_log_trace "$(__func__): output='$output'"
echo "${output}"
}
# Returns list of linux groups from group
#
# RET: space delimited list
function __slurm_linux_groups() {
local output
output="$(getent group | cut -d: -f1)"
__slurm_log_trace "$(__func__): output='$output'"
echo "${output}"
}
# Returns list of linux UIDs from passwd
#
# RET: space delimited list
function __slurm_linux_uids() {
local output
output="$(getent passwd | cut -d: -f3)"
__slurm_log_trace "$(__func__): output='$output'"
echo "${output}"
}
# Returns list of linux GIDs from passwd
#
# RET: space delimited list
function __slurm_linux_gids() {
local output
output="$(getent passwd | cut -d: -f4)"
__slurm_log_trace "$(__func__): output='$output'"
echo "${output}"
}
# Returns list of linux hostname and IP
#
# RET: space delimited list
function __slurm_linux_hostnames() {
local output=""
local commands=(
"hostname --short"
"hostname --fqdn"
"hostname --all-ip-addresses"
)
for cmd in "${commands[@]}"; do
output+="$(eval "${cmd}") "
done
__slurm_log_trace "$(__func__): output='$output'"
echo "${output}"
}
################################################################################
# SACCT Completion Functions
################################################################################
# Slurm completion helper for sacct flag completion
#
# RET: 0 = did completion; 1 = no completion
function __slurm_comp_sacct_flags() {
local cmd="$1"
local sched_flags=(
"schedsubmit"
"schedmain"
"schedbackfill"
)
local units=(
"K"
"M"
"G"
"T"
"P"
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur' cmd='$cmd'"
__slurm_comp_flags "$cmd" && return 0
__slurm_is_opt || return 1
case "${prev}" in
-A | --account?(s)) __slurm_compreply_list "$(__slurm_accounts)" ;;
-x | --association?(s)) __slurm_compreply_list "$(__slurm_associations)" ;;
-M | --clusters) __slurm_compreply_list "$(__slurm_clusters)" ;;
-C | --constraint?(s)) __slurm_compreply_list "$(__slurm_features)" ;;
-f | --file) _filedir ;;
-F | --flag?(s)) __slurm_compreply_list "${sched_flags[*]}" ;; # TODO: want --helpsched
-o | --format | --field?(s)) __slurm_compreply_list "$(__slurm_helpformat "$cmd")" ;;
-g | --gid?(s) | --group) __slurm_compreply_list "$(__slurm_linux_groups) $(__slurm_linux_gids)" ;;
-j | --job?(s)) __slurm_compreply "$(__slurm_jobs) $(__slurm_jobsteps)" ;;
--name?(s)) __slurm_compreply_list "$(__slurm_jobnames)" ;;
-N | --nodelist) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
-r | --partition?(s)) __slurm_compreply_list "$(__slurm_partitions)" ;;
-q | --qos?(s)) __slurm_compreply_list "$(__slurm_qos)" ;;
-R | --reason) __slurm_compreply_list "$(__slurm_helpreason "$cmd")" ;;
-s | --state) __slurm_compreply_list "$(__slurm_helpstate "$cmd")" ;;
-u | --uid?(s) | --user?(s)) __slurm_compreply_list "$(__slurm_linux_users) $(__slurm_linux_uids)" ;;
--units) __slurm_compreply "${units[*]}" ;;
-W | --wckey?(s)) __slurm_compreply_list "$(__slurm_wckeys)" ;;
--whole-hetjob) __slurm_compreply "$(__slurm_boolean)" ;;
--json) __slurm_compreply "list $(__slurm_dataparser_json "$cmd")" ;;
--yaml) __slurm_compreply "list $(__slurm_dataparser_yaml "$cmd")" ;;
*) return 1 ;;
esac
return 0
}
# sacct completion handler
# https://slurm.schedmd.com/sacct.html
function _sacct() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
__slurm_comp_sacct_flags "$1" && return
$split && return
if ((${#COMPREPLY[@]} == 0)) && [[ $cur == "" ]]; then
__slurm_compreply "--"
fi
}
complete -o nospace -F _sacct sacct
################################################################################
# SACCTMGR Completion Functions
################################################################################
# helper function for __slurm_comp_sacctmgr_spec_*()
#
# $1 - mode selector
# 0 = where parameters (delete/remove)
# 1 = where+option parameters (list/show)
# 2 = where+set parameters (add/create)
# 3 = where, set parameters (modify/update)
# RET: 0 = parameters updated, 1 = nothing updated
function __slurm_comp_mode_select() {
local mode="$1"
local conditions=(
"where"
"set"
)
local condition_where
condition_where="$(__slurm_find_subcmd "${conditions[0]}")"
local condition_set
condition_set="$(__slurm_find_subcmd "${conditions[1]}")"
local where_pos="-1"
where_pos="$(__slurm_find_subcmd_pos "${conditions[0]}")"
local set_pos="-1"
set_pos="$(__slurm_find_subcmd_pos "${conditions[1]}")"
__slurm_log_debug "$(__func__): mode='$mode' condition_where='$condition_where' condition_set='$condition_set'"
__slurm_log_trace "$(__func__): #parameters_where[@]='${#parameters_where[@]}'"
__slurm_log_trace "$(__func__): parameters_where[*]='${parameters_where[*]}'"
__slurm_log_trace "$(__func__): #parameters_set[@]='${#parameters_set[@]}'"
__slurm_log_trace "$(__func__): parameters_set[*]='${parameters_set[*]}'"
__slurm_log_trace "$(__func__): #conditions[@]='${#conditions[@]}'"
__slurm_log_trace "$(__func__): conditions[*]='${conditions[*]}'"
__slurm_log_trace "$(__func__): #options[@]='${#options[@]}'"
__slurm_log_trace "$(__func__): options[*]='${options[*]}'"
case "${mode}" in
0) # sacctmgr delete/remove <ENTITY> where <SPECS>
# only use 'where' parameters
parameters+=("${conditions[0]}")
if [[ -n $condition_where ]]; then
parameters+=("${parameters_where[@]}")
fi
;;
1) # sacctmgr list/show <ENTITY> [<SPECS>]
# use 'where' parameters and 'options'
parameters+=("${parameters_where[@]}")
parameters+=("${options[@]}")
parameters+=("format=")
;;
2) # sacctmgr add/create <ENTITY> <SPECS>
# use 'where' and 'set' parameters
parameters+=("${parameters_where[@]}")
parameters+=("${parameters_set[@]}")
;;
3) # sacctmgr modify/update <ENTITY> where <SPECS> set <SPECS>
# use 'where' parameters, or 'set' parameters
parameters+=("${conditions[@]}")
if [[ -n $condition_set ]] && ((set_pos > where_pos)); then
parameters+=("${parameters_set[@]}")
elif [[ -n $condition_where ]] && ((where_pos > set_pos)); then
parameters+=("${parameters_where[@]}")
fi
;;
*) return 1 ;;
esac
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
return 0
}
# completion helper for sacctmgr association specifications
# https://slurm.schedmd.com/sacctmgr.html#SECTION_SPECIFICATIONS-FOR-ASSOCIATIONS
# https://slurm.schedmd.com/sacctmgr.html#SECTION_GENERAL-SPECIFICATIONS-FOR-ASSOCIATION-BASED-ENTITIES
# https://slurm.schedmd.com/sacctmgr.html#SECTION_LIST/SHOW-ASSOCIATION-FORMAT-OPTIONS
#
# RET: 0 = did completion, 1 = did not do completion
function __slurm_comp_sacctmgr_spec_associations() {
local mode="$1"
if [[ -z ${parameters[0]} ]]; then
local parameters=()
fi
local parameters_where=(
"account="
"cluster="
"partition="
"parent="
"qos="
"user="
)
local parameters_set=(
"defaultqos="
"fairshare="
"grpjobs="
"grpjobsaccrue="
"grpsubmitjobs="
"grptres="
"grptresmins="
"grptresrunmins="
"grpwall="
"maxjobs="
"maxjobsaccrue="
"maxsubmitjobs="
"maxtresminsperjob="
"maxtresperjob="
"maxwalldurationperjob="
"priority="
"qos="
"qos\+="
"qos\-="
"qoslevel="
"qoslevel\+="
"qoslevel\-="
)
local options=(
"onlydefaults"
"tree"
"withdeleted"
"withrawqoslevel"
"withsubaccounts"
"wolimits"
"wopinfo"
"woplimits"
)
__slurm_log_debug "$(__func__): mode='$mode'"
__slurm_comp_mode_select "$mode" || return
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
__slurm_compreply_param "${parameters[*]}"
$split && __slurm_comp_reset || return 1
case "${prev}" in
account?(s)) __slurm_compreply_list "$(__slurm_accounts)" ;;
cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
defaultqos) __slurm_compreply "$(__slurm_qos)" ;;
partition?(s)) __slurm_compreply_list "$(__slurm_partitions)" ;;
parent?(s)) __slurm_compreply_list "$(__slurm_accounts)" ;;
qos?(s)?(+|-)) __slurm_compreply_list "$(__slurm_qos)" ;;
qoslevel?(s)?(+|-)) __slurm_compreply_list "$(__slurm_qos)" ;;
user?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
*)
$split && return 1
__slurm_compreply_param "${parameters[*]}"
return 1
;;
esac
return 0
}
# completion helper for sacctmgr account specifications
# https://slurm.schedmd.com/sacctmgr.html#SECTION_SPECIFICATIONS-FOR-ACCOUNTS
# https://slurm.schedmd.com/sacctmgr.html#SECTION_LIST/SHOW-ACCOUNT-FORMAT-OPTIONS
function __slurm_comp_sacctmgr_spec_accounts() {
local mode="$1"
local parameters=()
local parameters_where=(
"cluster="
"name="
"parent="
)
local parameters_set=(
"description="
"organization="
"rawusage="
)
local options=(
"withassoc"
"withcoord"
"withdeleted"
)
__slurm_log_debug "$(__func__): mode='$mode'"
__slurm_comp_mode_select "$mode" || return
__slurm_comp_sacctmgr_spec_associations "$mode" && return
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
__slurm_compreply_param "${parameters[*]}"
$split && __slurm_comp_reset || return 1
case "${prev}" in
cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
name?(s)) __slurm_compreply_list "$(__slurm_accounts)" ;;
organization?(s)) __slurm_compreply "$(__slurm_organizations)" ;;
parent?(s)) __slurm_compreply "$(__slurm_accounts)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion helper for sacctmgr cluster specifications
# https://slurm.schedmd.com/sacctmgr.html#SECTION_SPECIFICATIONS-FOR-CLUSTERS
# https://slurm.schedmd.com/sacctmgr.html#SECTION_LIST/SHOW-CLUSTER-FORMAT-OPTIONS
function __slurm_comp_sacctmgr_spec_clusters() {
local mode="$1"
local parameters=()
local parameters_where=(
"cluster="
"flags="
"name="
"rpc="
)
local parameters_set=(
"classification="
"features="
"federation="
"fedstate="
)
local options=(
"withdeleted"
"withfed"
"wolimits"
)
local fed_states=(
"active"
"inactive"
"drain"
"drain+remove"
)
local flags=(
"cray"
"external"
"frontend"
"multipleslurmd"
"none"
)
__slurm_log_debug "$(__func__): mode='$mode'"
__slurm_comp_mode_select "$mode" || return
__slurm_comp_sacctmgr_spec_associations "$mode" && return
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
__slurm_compreply_param "${parameters[*]}"
$split && __slurm_comp_reset || return 1
case "${prev}" in
cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
feature?(s)) __slurm_compreply_list "$(__slurm_features)" ;;
federation?(s)) __slurm_compreply_list "$(__slurm_federations)" ;;
fedstate) __slurm_compreply "${fed_states[*]}" ;;
flag?(s)) __slurm_compreply_list "${flags[*]}" ;;
name?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
rpc) __slurm_compreply_list "$(__slurm_clusters_rpc)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion helper for sacctmgr coordinator specifications
# https://slurm.schedmd.com/sacctmgr.html#SECTION_SPECIFICATIONS-FOR-COORDINATOR
function __slurm_comp_sacctmgr_spec_coordinators() {
local mode="$1"
local parameters=()
local parameters_where=(
"account="
"name="
)
local parameters_set=(
)
local options=(
)
__slurm_log_debug "$(__func__): mode='$mode'"
__slurm_comp_mode_select "$mode" || return
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
__slurm_compreply_param "${parameters[*]}"
$split && __slurm_comp_reset || return 1
case "${prev}" in
account?(s)) __slurm_compreply_list "$(__slurm_accounts)" ;;
coordinator?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
name?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion helper for sacctmgr event specifications
# https://slurm.schedmd.com/sacctmgr.html#SECTION_SPECIFICATIONS-FOR-EVENTS
# https://slurm.schedmd.com/sacctmgr.html#SECTION_LIST/SHOW-EVENT-FORMAT-OPTIONS
function __slurm_comp_sacctmgr_spec_events() {
local mode="$1"
local parameters=()
local parameters_where=(
"clusters="
"condflags="
"end="
"events="
"maxcpus="
"mincpus="
"nodes="
"reason="
"start="
"states="
"users="
)
local parameters_set=(
)
local options=(
"all_clusters"
"all_time"
)
local cond_flags=(
"open"
)
local event_types=(
"cluster"
"node"
)
local states=(
"down"
"drain"
"fail"
"future"
"idle"
"mixed"
"unknown"
)
__slurm_log_debug "$(__func__): mode='$mode'"
__slurm_comp_mode_select "$mode" || return
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
__slurm_compreply_param "${parameters[*]}"
$split && __slurm_comp_reset || return 1
case "${prev}" in
cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
condflag?(s)) __slurm_compreply_list "${cond_flags[*]}" ;;
event?(s)) __slurm_compreply_list "${event_types[*]}" ;;
node?(s)) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
state?(s)) __slurm_compreply_list "${states[*]}" ;;
user?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion helper for sacctmgr federation specifications
# https://slurm.schedmd.com/sacctmgr.html#SECTION_SPECIFICATIONS-FOR-FEDERATION
function __slurm_comp_sacctmgr_spec_federations() {
local mode="$1"
local parameters=()
local parameters_where=(
"name="
)
local parameters_set=(
"clusters="
"clusters\+="
"clusters\-="
)
local options=(
"tree"
"withdeleted"
)
__slurm_log_debug "$(__func__): mode='$mode'"
__slurm_comp_mode_select "$mode" || return
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
__slurm_compreply_param "${parameters[*]}"
$split && __slurm_comp_reset || return 1
case "${prev}" in
cluster?(s)?(+|-)) __slurm_compreply_list "$(__slurm_clusters)" ;;
feature) __slurm_compreply_list "$(__slurm_features)" ;;
federation?(s)) __slurm_compreply_list "$(__slurm_federations)" ;;
name?(s)) __slurm_compreply_list "$(__slurm_federations)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion helper for sacctmgr instance specifications
# https://slurm.schedmd.com/sacctmgr.html#SECTION_SPECIFICATIONS-FOR-INSTANCES
# https://slurm.schedmd.com/sacctmgr.html#SECTION_LIST/SHOW-INSTANCE-FORMAT-OPTIONS
function __slurm_comp_sacctmgr_spec_instances() {
local mode="$1"
local parameters=()
local parameters_where=(
"clusters="
"end="
"extra="
"instanceid="
"instancetype="
"nodes="
"start="
)
local parameters_set=(
)
__slurm_log_debug "$(__func__): mode='$mode'"
__slurm_comp_mode_select "$mode" || return
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
__slurm_compreply_param "${parameters[*]}"
$split && __slurm_comp_reset || return 1
case "${prev}" in
cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
extra) __slurm_compreply_list "$(__slurm_instances_extra)" ;;
instanceid) __slurm_compreply_list "$(__slurm_instances_id)" ;;
instancetype) __slurm_compreply_list "$(__slurm_instances_type)" ;;
node?(s)) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion helper for sacctmgr job specifications
# https://slurm.schedmd.com/sacctmgr.html#SECTION_SPECIFICATIONS-FOR-JOB
function __slurm_comp_sacctmgr_spec_jobs() {
local mode="$1"
local parameters=()
local parameters_where=(
"cluster="
"jobid="
)
local parameters_set=(
"admincomment="
"comment="
"derivedexitcode="
"endtime="
"extra="
"newwckey="
"starttime="
"systemcomment="
"tres="
"wckey="
"user="
)
local options=(
)
__slurm_log_debug "$(__func__): mode='$mode'"
__slurm_comp_mode_select "$mode" || return
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
__slurm_compreply_param "${parameters[*]}"
$split && __slurm_comp_reset || return 1
case "${prev}" in
cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
jobid?(s)) __slurm_compreply_list "$(__slurm_jobs)" ;;
newwckey?(s)) __slurm_compreply "$(__slurm_wckeys)" ;;
tres?(s)) __slurm_compreply_list "$(__slurm_tres)" ;;
user?(s)) __slurm_compreply "$(__slurm_users)" ;;
wckey?(s)) __slurm_compreply_list "$(__slurm_wckeys)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion helper for sacctmgr QOS specifications
# https://slurm.schedmd.com/sacctmgr.html#SECTION_SPECIFICATIONS-FOR-QOS
# https://slurm.schedmd.com/sacctmgr.html#SECTION_LIST/SHOW-QOS-FORMAT-OPTIONS
function __slurm_comp_sacctmgr_spec_qos() {
local mode="$1"
local parameters=()
local parameters_where=(
"id="
"name="
)
local parameters_set=(
"flags="
"flags\-="
"flags\+="
"gracetime="
"grpjobs="
"grpjobsaccrue="
"grpsubmitjobs="
"grptres="
"grptresmins="
"grptresrunmins="
"grpwall="
"limitfactor="
"maxjobsaccrueperaccount="
"maxjobsaccrueperuser="
"maxjobsperaccount="
"maxjobsperuser="
"maxsubmitjobsperaccount="
"maxsubmitjobsperuser="
"maxtresperjob="
"maxtresminsperjob="
"maxtresperaccount="
"maxtrespernode="
"maxtresperuser="
"maxtresrunminsperaccount="
"maxtresrunminsperuser="
"maxwalldurationperjob="
"minpriothreshold="
"mintresperjob="
"preempt="
"preemptexempttime="
"preemptmode="
"priority="
"rawusage="
"usagefactor="
"usagethreshold="
)
local options=(
"withdeleted"
)
local flags=(
"denyonlimit"
"enforceusagethreshold"
"nodecay"
"noreserve"
"overpartqos"
"partitionmaxnodes"
"partitionminnodes"
"partitiontimelimit"
"relative"
"requiresreservation"
"usagefactorsafe"
)
local preempt_modes=(
"cancel"
"gang"
"off"
"requeue"
"suspend"
"within"
)
__slurm_log_debug "$(__func__): mode='$mode'"
__slurm_comp_mode_select "$mode" || return
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
__slurm_compreply_param "${parameters[*]}"
$split && __slurm_comp_reset || return 1
case "${prev}" in
flag?(s)?(+|-)) __slurm_compreply_list "${flags[*]}" ;;
id?(s)) __slurm_compreply_list "$(__slurm_qosid)" ;;
name?(s)) __slurm_compreply_list "$(__slurm_qos)" ;;
preempt?(s)) __slurm_compreply_list "$(__slurm_qos)" ;;
preemptmode) __slurm_compreply "${preempt_modes[*]}" ;;
rawusage) __slurm_compreply "0" ;;
qos?(s)) __slurm_compreply_list "$(__slurm_qos)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion helper for sacctmgr reservation specifications
# https://slurm.schedmd.com/sacctmgr.html#SECTION_SPECIFICATIONS-FOR-RESERVATIONS
# https://slurm.schedmd.com/sacctmgr.html#SECTION_LIST/SHOW-RESERVATION-FORMAT-OPTIONS
function __slurm_comp_sacctmgr_spec_reservations() {
local mode="$1"
local parameters=()
local parameters_where=(
"clusters="
"end="
"id="
"name="
"nodes="
"start="
)
local parameters_set=(
)
local options=(
)
__slurm_log_debug "$(__func__): mode='$mode'"
__slurm_comp_mode_select "$mode" || return
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
__slurm_compreply_param "${parameters[*]}"
$split && __slurm_comp_reset || return 1
case "${prev}" in
cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
name?(s)) __slurm_compreply_list "$(__slurm_reservations)" ;;
node?(s)) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion helper for sacctmgr resource specifications
# https://slurm.schedmd.com/sacctmgr.html#SECTION_SPECIFICATIONS-FOR-RESOURCE
# https://slurm.schedmd.com/sacctmgr.html#SECTION_LIST/SHOW-RESOURCE-FORMAT-OPTIONS
function __slurm_comp_sacctmgr_spec_resources() {
local mode="$1"
local parameters=()
local parameters_where=(
"name="
"server="
)
local parameters_set=(
"allowed="
"cluster="
"count="
"description="
"flags="
"servertype="
"type="
)
local options=(
"withclusters"
"withdeleted"
)
local condition_set
condition_set="$(__slurm_find_subcmd "${conditions[1]}")"
local flags=(
)
local types=(
"license"
)
__slurm_log_debug "$(__func__): mode='$mode'"
__slurm_comp_mode_select "$mode" || return
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
__slurm_compreply_param "${parameters[*]}"
$split && __slurm_comp_reset || return 1
case "${prev}" in
cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
flag?(s)) __slurm_compreply_list "${flags[*]}" ;;
name?(s)) __slurm_compreply_list "$(__slurm_resources)" ;;
server?(s)) __slurm_compreply_list "$(__slurm_resources_servers)" ;;
type?(s)) __slurm_compreply "${types[*]}" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion helper for sacctmgr transaction specifications
# https://slurm.schedmd.com/sacctmgr.html#SECTION_SPECIFICATIONS-FOR-TRANSACTIONS
# https://slurm.schedmd.com/sacctmgr.html#SECTION_LIST/SHOW-TRANSACTIONS-FORMAT-OPTIONS
function __slurm_comp_sacctmgr_spec_transactions() {
local mode="$1"
local parameters=()
local parameters_where=(
"account="
"action="
"actor="
"cluster="
"end="
"start="
"user="
)
local parameters_set=(
)
local options=(
"withassoc"
)
__slurm_log_debug "$(__func__): mode='$mode'"
__slurm_comp_mode_select "$mode" || return
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
__slurm_compreply_param "${parameters[*]}"
$split && __slurm_comp_reset || return 1
case "${prev}" in
account?(s)) __slurm_compreply_list "$(__slurm_accounts)" ;;
actor?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
user?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion helper for sacctmgr tres specifications
# https://slurm.schedmd.com/sacctmgr.html#SECTION_LIST/SHOW-TRES
function __slurm_comp_sacctmgr_spec_tres() {
local mode="$1"
local parameters=()
local parameters_where=(
"id="
"name="
"type="
)
local parameters_set=(
)
local options=(
)
local types=(
"bb"
"cpu"
"energy"
"gres"
"license"
"memory"
"node"
)
__slurm_log_debug "$(__func__): mode='$mode'"
__slurm_comp_mode_select "$mode" || return
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
__slurm_compreply_param "${parameters[*]}"
$split && __slurm_comp_reset || return 1
case "${prev}" in
type?(s)) __slurm_compreply "${types[*]}" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion helper for sacctmgr user specifications
# https://slurm.schedmd.com/sacctmgr.html#SECTION_SPECIFICATIONS-FOR-USERS
# https://slurm.schedmd.com/sacctmgr.html#SECTION_LIST/SHOW-USER-FORMAT-OPTIONS
function __slurm_comp_sacctmgr_spec_users() {
local mode="$1"
local parameters=()
local parameters_where=(
"account="
"cluster="
"name="
"partition="
)
local parameters_set=(
"account="
"adminlevel="
"clusters="
"defaultaccount="
"defaultwckey="
"newname="
"partition="
"rawusage="
"wckey="
)
local options=(
"withassoc"
"withcoord"
"withdeleted"
)
local admin_levels=(
"admin"
"none"
"operator"
)
__slurm_log_debug "$(__func__): mode='$mode'"
__slurm_comp_mode_select "$mode" || return
__slurm_comp_sacctmgr_spec_associations "$mode" && return
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
__slurm_compreply_param "${parameters[*]}"
$split && __slurm_comp_reset || return 1
case "${prev}" in
account?(s)) __slurm_compreply "$(__slurm_accounts)" ;;
adminlevel?(s)) __slurm_compreply "${admin_levels[*]}" ;;
cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
defaultaccount) __slurm_compreply "$(__slurm_accounts)" ;;
defaultwckey?(s)) __slurm_compreply "$(__slurm_wckeys)" ;;
name?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
newname?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
partition?(s)) __slurm_compreply_list "$(__slurm_partitions)" ;;
rawusage) __slurm_compreply "0" ;;
wckey?(s)) __slurm_compreply "$(__slurm_wckeys)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion helper for sacctmgr wckeys specifications
# https://slurm.schedmd.com/sacctmgr.html#SECTION_LIST/SHOW-WCKey
function __slurm_comp_sacctmgr_spec_wckeys() {
local mode="$1"
local parameters=()
local parameters_where=(
"cluster="
"id="
"name="
"user="
)
local parameters_set=(
)
local options=(
"withdeleted"
)
__slurm_log_debug "$(__func__): mode='$mode'"
__slurm_comp_mode_select "$mode" || return
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
__slurm_compreply_param "${parameters[*]}"
$split && __slurm_comp_reset || return 1
case "${prev}" in
cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
name?(s)) __slurm_compreply_list "$(__slurm_wckeys)" ;;
user?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: sacctmgr add account [key=val]...
function __sacctmgr_add_account() {
__slurm_comp_sacctmgr_spec_accounts 2
}
# completion handler for: sacctmgr add cluster [key=val]...
function __sacctmgr_add_cluster() {
__slurm_comp_sacctmgr_spec_clusters 2
}
# completion handler for: sacctmgr add coordinator [key=val]...
function __sacctmgr_add_coordinator() {
__slurm_comp_sacctmgr_spec_coordinators 2
}
# completion handler for: sacctmgr add federation [key=val]...
function __sacctmgr_add_federation() {
__slurm_comp_sacctmgr_spec_federations 2
}
# completion handler for: sacctmgr add qos [key=val]...
function __sacctmgr_add_qos() {
__slurm_comp_sacctmgr_spec_qos 2
}
# completion handler for: sacctmgr add resource [key=val]...
function __sacctmgr_add_resource() {
__slurm_comp_sacctmgr_spec_resources 2
}
# completion handler for: sacctmgr add user [key=val]...
function __sacctmgr_add_user() {
__slurm_comp_sacctmgr_spec_users 2
}
# completion handler for: sacctmgr add *
function __sacctmgr_add() {
local subcmds=(
"account"
"cluster"
"coordinator"
"federation"
"qos"
"resource"
"user"
)
local subcmd
subcmd="$(__slurm_find_subcmd "${subcmds[*]}")"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): subcmd='$subcmd'"
__slurm_log_trace "$(__func__): #subcmds[@]='${#subcmds[@]}'"
__slurm_log_trace "$(__func__): subcmds[*]='${subcmds[*]}'"
if [[ -z ${subcmd-} ]]; then
__slurm_compreply "${subcmds[*]}"
else
comp_cmd="${comp_cmd}_${subcmd//[^[:alnum:]]/}"
__slurm_comp_command "${comp_cmd}"
fi
}
# completion handler for: sacctmgr archive dump *
function __sacctmgr_archive_dump() {
local parameters=(
"directory="
"events"
"purgeeventafter="
"purgejobafter="
"purgestepafter="
"purgesuspendafter="
"script="
"steps"
"suspend"
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
directory) _filedir ;;
script) _filedir ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: sacctmgr archive load *
function __sacctmgr_archive_load() {
local parameters=(
"file="
"insert="
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
file) _filedir ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: sacctmgr archive *
function __sacctmgr_archive() {
local subcmds=(
"dump"
"load"
)
local subcmd
subcmd="$(__slurm_find_subcmd "${subcmds[*]}")"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): subcmd='$subcmd'"
__slurm_log_trace "$(__func__): #subcmds[@]='${#subcmds[@]}'"
__slurm_log_trace "$(__func__): subcmds[*]='${subcmds[*]}'"
if [[ -z ${subcmd-} ]]; then
__slurm_compreply "${subcmds[*]}"
else
comp_cmd="${comp_cmd}_${subcmd//[^[:alnum:]]/}"
__slurm_comp_command "${comp_cmd}"
fi
}
# completion handler for: sacctmgr create *
function __sacctmgr_create() {
comp_cmd="${comp_cmd//_create/_add}"
__sacctmgr_add
}
# completion handler for: sacctmgr clear *
function __sacctmgr_clear() {
local subcmds=(
"stats"
)
local subcmd
subcmd="$(__slurm_find_subcmd "${subcmds[*]}")"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): subcmd='$subcmd'"
__slurm_log_trace "$(__func__): #subcmds[@]='${#subcmds[@]}'"
__slurm_log_trace "$(__func__): subcmds[*]='${subcmds[*]}'"
if [[ -z ${subcmd-} ]]; then
__slurm_compreply "${subcmds[*]}"
else
comp_cmd="${comp_cmd}_${subcmd//[^[:alnum:]]/}"
__slurm_comp_command "${comp_cmd}"
fi
}
# completion handler for: sacctmgr delete *
function __sacctmgr_delete() {
comp_cmd="${comp_cmd//_delete/_remove}"
__sacctmgr_remove
}
# completion handler for: sacctmgr dump [key=val]...
function __sacctmgr_dump() {
local parameters=(
"cluster="
"file="
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
cluster) __slurm_compreply "$(__slurm_clusters)" ;;
file) _filedir ;;
*)
[[ $split == "true" ]] && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: sacctmgr list account [key=val]...
function __sacctmgr_list_account() {
__slurm_comp_sacctmgr_spec_accounts 1
}
# completion handler for: sacctmgr list association [key=val]...
function __sacctmgr_list_association() {
__slurm_comp_sacctmgr_spec_associations 1
}
# completion handler for: sacctmgr list cluster [key=val]...
function __sacctmgr_list_cluster() {
__slurm_comp_sacctmgr_spec_clusters 1
}
# completion handler for: sacctmgr list event [key=val]...
function __sacctmgr_list_event() {
__slurm_comp_sacctmgr_spec_events 1
}
# completion handler for: sacctmgr list federation [key=val]...
function __sacctmgr_list_federation() {
__slurm_comp_sacctmgr_spec_federations 1
}
# completion handler for: sacctmgr list instance [key=val]...
function __sacctmgr_list_instance() {
__slurm_comp_sacctmgr_spec_instances 1
}
# completion handler for: sacctmgr list qos [key=val]...
function __sacctmgr_list_qos() {
__slurm_comp_sacctmgr_spec_qos 1
}
# completion handler for: sacctmgr list resource [key=val]...
function __sacctmgr_list_resource() {
__slurm_comp_sacctmgr_spec_resources 1
}
# completion handler for: sacctmgr list reservation [key=val]...
function __sacctmgr_list_reservation() {
__slurm_comp_sacctmgr_spec_reservations 1
}
# completion handler for: sacctmgr list transaction [key=val]...
function __sacctmgr_list_transaction() {
__slurm_comp_sacctmgr_spec_transactions 1
}
# completion handler for: sacctmgr list tres [key=val]...
function __sacctmgr_list_tres() {
__slurm_comp_sacctmgr_spec_tres 1
}
# completion handler for: sacctmgr list user [key=val]...
function __sacctmgr_list_user() {
__slurm_comp_sacctmgr_spec_users 1
}
# completion handler for: sacctmgr list wckey [key=val]...
function __sacctmgr_list_wckey() {
__slurm_comp_sacctmgr_spec_wckeys 1
}
# completion handler for: sacctmgr list [key=val]...
function __sacctmgr_list() {
local subcmds=(
"account"
"association"
"cluster"
"configuration"
"event"
"federation"
"instance"
"problem"
"qos"
"resource"
"reservation"
"runawayjobs"
"stat"
"transaction"
"tres"
"user"
"wckey"
)
local subcmd
subcmd="$(__slurm_find_subcmd "${subcmds[*]}")"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): subcmd='$subcmd'"
__slurm_log_trace "$(__func__): #subcmds[@]='${#subcmds[@]}'"
__slurm_log_trace "$(__func__): subcmds[*]='${subcmds[*]}'"
if [[ -z ${subcmd-} ]]; then
__slurm_compreply "${subcmds[*]}"
else
comp_cmd="${comp_cmd}_${subcmd//[^[:alnum:]]/}"
__slurm_comp_command "${comp_cmd}"
fi
}
# completion handler for: sacctmgr load [key=val]...
function __sacctmgr_load() {
local parameters=(
"clean"
"cluster="
"file="
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
cluster) __slurm_compreply "$(__slurm_clusters)" ;;
file) _filedir ;;
*)
[[ $split == "true" ]] && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: sacctmgr modify account [key=val]...
function __sacctmgr_modify_account() {
__slurm_comp_sacctmgr_spec_accounts 3
}
# completion handler for: sacctmgr modify cluster [key=val]...
function __sacctmgr_modify_cluster() {
__slurm_comp_sacctmgr_spec_clusters 3
}
# completion handler for: sacctmgr modify federation [key=val]...
function __sacctmgr_modify_federation() {
__slurm_comp_sacctmgr_spec_federations 3
}
# completion handler for: sacctmgr modify job [key=val]...
function __sacctmgr_modify_job() {
__slurm_comp_sacctmgr_spec_jobs 3
}
# completion handler for: sacctmgr modify qos [key=val]...
function __sacctmgr_modify_qos() {
__slurm_comp_sacctmgr_spec_qos 3
}
# completion handler for: sacctmgr modify resource [key=val]...
function __sacctmgr_modify_resource() {
__slurm_comp_sacctmgr_spec_resources 3
}
# completion handler for: sacctmgr modify user [key=val]...
function __sacctmgr_modify_user() {
__slurm_comp_sacctmgr_spec_users 3
}
# completion handler for: sacctmgr modify [key=val]...
function __sacctmgr_modify() {
local subcmds=(
"account"
"cluster"
"federation"
"job"
"qos"
"resource"
"user"
)
local subcmd
subcmd="$(__slurm_find_subcmd "${subcmds[*]}")"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): subcmd='$subcmd'"
__slurm_log_trace "$(__func__): #subcmds[@]='${#subcmds[@]}'"
__slurm_log_trace "$(__func__): subcmds[*]='${subcmds[*]}'"
if [[ -z ${subcmd-} ]]; then
__slurm_compreply "${subcmds[*]}"
else
comp_cmd="${comp_cmd}_${subcmd//[^[:alnum:]]/}"
__slurm_comp_command "${comp_cmd}"
fi
}
# completion handler for: sacctmgr remove account [key=val]...
function __sacctmgr_remove_account() {
__slurm_comp_sacctmgr_spec_accounts 0
}
# completion handler for: sacctmgr remove cluster [key=val]...
function __sacctmgr_remove_cluster() {
__slurm_comp_sacctmgr_spec_clusters 0
}
# completion handler for: sacctmgr remove coordinator [key=val]...
function __sacctmgr_remove_coordinator() {
__slurm_comp_sacctmgr_spec_coordinators 0
}
# completion handler for: sacctmgr remove federation [key=val]...
function __sacctmgr_remove_federation() {
__slurm_comp_sacctmgr_spec_federations 0
}
# completion handler for: sacctmgr remove qos [key=val]...
function __sacctmgr_remove_qos() {
__slurm_comp_sacctmgr_spec_qos 0
}
# completion handler for: sacctmgr remove resource [key=val]...
function __sacctmgr_remove_resource() {
__slurm_comp_sacctmgr_spec_resources 0
}
# completion handler for: sacctmgr remove user [key=val]...
function __sacctmgr_remove_user() {
__slurm_comp_sacctmgr_spec_users 0
}
# completion handler for: sacctmgr remove *
function __sacctmgr_remove() {
local subcmds=(
"account"
"cluster"
"coordinator"
"federation"
"qos"
"resource"
"user"
)
local subcmd
subcmd="$(__slurm_find_subcmd "${subcmds[*]}")"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): subcmd='$subcmd'"
__slurm_log_trace "$(__func__): #subcmds[@]='${#subcmds[@]}'"
__slurm_log_trace "$(__func__): subcmds[*]='${subcmds[*]}'"
if [[ -z ${subcmd-} ]]; then
__slurm_compreply "${subcmds[*]}"
else
comp_cmd="${comp_cmd}_${subcmd//[^[:alnum:]]/}"
__slurm_comp_command "${comp_cmd}"
fi
}
# completion handler for: sacctmgr list *
function __sacctmgr_show() {
comp_cmd="${comp_cmd//_show/_list}"
__sacctmgr_list
}
# completion handler for: sacctmgr update *
function __sacctmgr_update() {
comp_cmd="${comp_cmd//_update/_modify}"
__sacctmgr_modify
}
# Slurm completion helper for sacctmgr flag completion
#
# RET: 0 = did completion; 1 = no completion
function __slurm_comp_sacctmgr_flags() {
local cmd="$1"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur' cmd='$cmd'"
__slurm_comp_flags "$cmd" && return 0
__slurm_is_opt || return 1
case "${prev}" in
--json) __slurm_compreply "list $(__slurm_dataparser_json "$cmd")" ;;
--yaml) __slurm_compreply "list $(__slurm_dataparser_yaml "$cmd")" ;;
*) return 1 ;;
esac
# return 0
}
# sacctmgr completion handler
# https://slurm.schedmd.com/sacctmgr.html
function _sacctmgr() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
local comp_cmd="$1"
local subcmds=(
"add" "create"
"archive"
"clear"
"dump"
"help"
"list" "show"
"load"
"modify" "update"
"ping"
"reconfigure"
"remove" "delete"
"shutdown"
"version"
)
local subcmd
subcmd="$(__slurm_find_subcmd "${subcmds[*]}")"
__slurm_log_debug "$(__func__): subcmd='$subcmd'"
__slurm_log_trace "$(__func__): #subcmds[@]='${#subcmds[@]}'"
__slurm_log_trace "$(__func__): subcmds[*]='${subcmds[*]}'"
__slurm_comp_sacctmgr_flags "$1" && return
if [[ -z ${subcmd-} ]]; then
__slurm_compreply "${subcmds[*]}"
else
comp_cmd="__${comp_cmd}_${subcmd//[^[:alnum:]]/}"
__slurm_comp_command "${comp_cmd}"
fi
}
complete -o nospace -F _sacctmgr sacctmgr
################################################################################
# SALLOC Completion Functions
################################################################################
# salloc completion handler
# https://slurm.schedmd.com/salloc.html
function _salloc() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
__slurm_comp_common_flags "$1" && return
$split && return
_filedir
}
complete -o nospace -F _salloc salloc
################################################################################
# SATTACH Completion Functions
################################################################################
# sattach completion handler
# https://slurm.schedmd.com/sattach.html
function _sattach() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_comp_flags "$1" && return
$split && return
__slurm_compreply "$(__slurm_jobsteps_tasks)"
}
complete -o nospace -F _sattach sattach
################################################################################
# SBATCH Completion Functions
################################################################################
# sbatch completion handler
# https://slurm.schedmd.com/sbatch.html
function _sbatch() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
__slurm_comp_common_flags "$1" && return
$split && return
_filedir
}
complete -o nospace -F _sbatch sbatch
################################################################################
# SBCAST Completion Functions
################################################################################
# Slurm completion helper for sbcast flag completion
#
# RET: 0 = did completion; 1 = no completion
function __slurm_comp_sbcast_flags() {
local cmd="$1"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur' cmd='$cmd'"
__slurm_comp_flags "$cmd" && return 0
__slurm_is_opt || return 1
case "${prev}" in
-C | --compress) __slurm_compreply "$(__slurm_compress_types)" ;;
--exclude?(s)) _filedir -d ;;
-j | --jobid?(s)) __slurm_compreply "$(__slurm_jobs) $(__slurm_jobsteps)" ;;
--send-lib?(s)) __slurm_compreply "$(__slurm_boolean)" ;;
-s | --size) ;;
-t | --timeout) ;;
-F | --treewidth) ;;
*) return 1 ;;
esac
return 0
}
# sbcast completion handler
# https://slurm.schedmd.com/sbcast.html
function _sbcast() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
__slurm_comp_sbcast_flags "$1" && return
$split && return
_filedir
}
complete -o nospace -F _sbcast sbcast
################################################################################
# SCANCEL Completion Functions
################################################################################
# Slurm completion helper for scancel flag completion
#
# RET: 0 = did completion; 1 = no completion
function __slurm_comp_scancel_flags() {
local cmd="$1"
local states=(
"pending"
"running"
"suspended"
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur' cmd='$cmd'"
__slurm_comp_flags "$cmd" && return 0
__slurm_is_opt || return 1
case "${prev}" in
-A | --account?(s)) __slurm_compreply_list "$(__slurm_accounts)" ;;
-M | --cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
-n | --name | --jobname) __slurm_compreply "$(__slurm_jobnames)" ;;
-w | --nodelist) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
-p | --partition?(s)) __slurm_compreply_list "$(__slurm_partitions)" ;;
-q | --qos?(s)) __slurm_compreply_list "$(__slurm_qos)" ;;
-R | --reservation?(s)) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
--sibling?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
-s | --signal) __slurm_compreply "$(__slurm_signals)" ;;
-t | --state?(s)) __slurm_compreply "${states[*]}" ;;
-u | --user?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
--wckey?(s)) __slurm_compreply_list "$(__slurm_wckeys)" ;;
*) return 1 ;;
esac
return 0
}
# scancel completion handler
# https://slurm.schedmd.com/scancel.html
function _scancel() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
__slurm_comp_scancel_flags "$1" && return
$split && return
__slurm_compreply "$(__slurm_jobs) $(__slurm_jobsteps)"
}
complete -o nospace -F _scancel scancel
################################################################################
# SCONTROL Completion Functions
################################################################################
# completion handler for: scontrol cancel_reboot *
function __scontrol_cancel_reboot() {
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
case "${prev}" in
cancel_reboot) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
esac
}
# completion handler for: scontrol cluster *
function __scontrol_cluster() {
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
case "${prev}" in
cluster) __slurm_compreply "$(__slurm_clusters)" ;;
esac
}
# completion handler for: scontrol create nodename=* *
function __scontrol_create_nodename() {
local parameters=(
"bcastaddr="
"boards="
"corespeccount="
"corespersocket="
"cpubind="
"cpus="
"cpuspeclist="
"features="
"gres="
"memspeclimit="
"nodeaddr="
"nodehostname="
"nodename=" # meta
"port="
"procs="
"realmemory="
"reason="
"sockets="
"socketsperboard="
"state="
"threadspercore="
"tmpdisk="
"topology="
"weight="
)
local states=(
"cloud"
"future"
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
cpubind) __slurm_compreply "$(__slurm_cpubind_types)" ;;
feature?(s)) __slurm_compreply "$(__slurm_features)" ;;
gres) __slurm_compreply "$(__slurm_gres)" ;;
nodename?(s)) __slurm_compreply_list "$(__slurm_nodes)" "" "true" ;;
state) __slurm_compreply "${states[*]}" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol create partitionname=* [key=val]...
function __scontrol_create_partitionname() {
__scontrol_update_partitionname
}
# completion handler for: scontrol create reservation [key=val]...
function __scontrol_create_reservation() {
__scontrol_update_reservationname
}
# completion handler for: scontrol create reservationname=* [key=val]...
function __scontrol_create_reservationname() {
__scontrol_update_reservationname
}
# completion handler for: scontrol create *
function __scontrol_create() {
local parameters=(
"nodename="
"partitionname="
"reservation "
"reservationname="
)
local param
param="$(__slurm_find_param "${parameters[*]}")"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): param='$param'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
if [[ -z ${param-} ]]; then
__slurm_compreply "${parameters[*]}"
else
comp_cmd="${comp_cmd}_${param//[^[:alnum:]]/}"
__slurm_comp_command "${comp_cmd}"
fi
}
# completion handler for: scontrol delete *
function __scontrol_delete() {
local parameters=(
"nodename="
"partitionname="
"reservationname="
)
local param
param="$(__slurm_find_param "${parameters[*]}")"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): param='$param'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
if [[ -z ${param-} ]]; then
__slurm_compreply "${parameters[*]}"
else
case "${prev}" in
nodename?(s)) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
partitionname?(s)) __slurm_compreply "$(__slurm_partitions)" ;;
reservationname?(s)) __slurm_compreply "$(__slurm_reservations)" ;;
esac
fi
}
# completion handler for: scontrol hold *
function __scontrol_hold() {
local parameters=(
"jobid="
"jobname="
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
jobid) __slurm_compreply_list "$(__slurm_jobs)" ;;
jobname) __slurm_compreply_list "$(__slurm_jobnames)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol notify *
function __scontrol_notify() {
case "${prev}" in
notify) __slurm_compreply "$(__slurm_jobs)" ;;
esac
}
# completion handler for: scontrol pidinfo *
function __scontrol_pidinfo() {
_pids # TODO: return only slurm pids
}
# completion handler for: scontrol power up *
function __scontrol_power_up() {
local parameters=(
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
up) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol power down *
function __scontrol_power_down() {
local parameters=(
"reason="
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
down) __slurm_compreply_list "$(__slurm_nodes)" "ALL asap force" "true" ;;
asap | force) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol power *
function __scontrol_power() {
local subcmds=(
"up"
"down"
)
local subcmd
subcmd="$(__slurm_find_subcmd "${subcmds[*]}")"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): subcmd='$subcmd'"
__slurm_log_trace "$(__func__): #subcmds[@]='${#subcmds[@]}'"
__slurm_log_trace "$(__func__): subcmds[*]='${subcmds[*]}'"
if [[ -z ${subcmd-} ]]; then
__slurm_compreply "${subcmds[*]}"
else
comp_cmd="${comp_cmd}_${subcmd//[^[:alnum:]]/}"
__slurm_comp_command "${comp_cmd}"
fi
}
# completion handler for: scontrol listpids *
function __scontrol_listpids() {
__slurm_compreply_list "$(__slurm_jobs)"
}
# completion handler for: scontrol reboot *
function __scontrol_reboot() {
local parameters=(
"asap"
"nextstate="
"reason="
)
local states=(
"down"
"resume"
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
nextstate) __slurm_compreply "${states[*]}" ;;
reboot) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol release *
function __scontrol_release() {
local parameters=(
"jobid="
"jobname="
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
jobid) __slurm_compreply_list "$(__slurm_jobs)" ;;
jobname) __slurm_compreply_list "$(__slurm_jobnames)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol requeue *
function __scontrol_requeue() {
local parameters=(
"incomplete"
"jobid="
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
jobid) __slurm_compreply_list "$(__slurm_jobs)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol requeuehold *
function __scontrol_requeuehold() {
local parameters=(
"incomplete"
"jobid="
"state="
)
local states=(
"specialexit"
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
jobid) __slurm_compreply_list "$(__slurm_jobs)" ;;
state) __slurm_compreply "${states[*]}" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol resume *
function __scontrol_resume() {
__slurm_compreply_list "$(__slurm_jobs)"
}
# completion handler for: scontrol schedloglevel *
function __scontrol_schedloglevel() {
local schedlog_levels=(
"disable"
"enable"
)
__slurm_compreply "${schedlog_levels[*]}"
}
# completion handler for: scontrol setdebug *
function __scontrol_setdebug() {
local parameters=(
"nodes="
)
local debug_levels=(
"quiet"
"fatal"
"error"
"info"
"verbose"
"debug"
"debug2"
"debug3"
"debug4"
"debug5"
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
setdebug) __slurm_compreply "${debug_levels[*]}" ;;
node?(s)) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol setdebugflags * [key=val]...
function __scontrol_setdebugflags() {
local debug_flags=(
"accrue"
"agent"
"backfill"
"backfillmap"
"burstbuffer"
"cgroup"
"cpu_bind"
"cpufrequency"
"data"
"dependency"
"elasticsearch"
"energy"
"federation"
"frontend"
"gang"
"gres"
"hetjob"
"jobaccountgather"
"jobcontainer"
"license"
"network"
"networkraw"
"nodefeatures"
"no_conf_hash"
"power"
"priority"
"profile"
"protocol"
"reservation"
"route"
"script"
"selecttype"
"steps"
"switch"
"tracejobs"
"triggers"
"conmgr"
)
local _debug_flags=()
local parameters=(
"nodes="
)
case "${prev}" in
setdebugflag?(s))
_debug_flags+=("$(compgen -P "+" -W "${debug_flags[*]}")")
_debug_flags+=("$(compgen -P "-" -W "${debug_flags[*]}")")
__slurm_compreply_list "${_debug_flags[*]}"
;;
node?(s)) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol show aliases *
function __scontrol_show_aliases() {
local parameters=(
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
aliases) __slurm_compreply "$(__slurm_nodes_hostname)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol show assoc_mgr *
function __scontrol_show_assocmgr() {
local parameters=(
"accounts="
"flags="
"qos="
"users="
)
local flags=(
"assoc"
"users"
"qos"
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
account?(s)) __slurm_compreply_list "$(__slurm_accounts)" ;;
flag?(s)) __slurm_compreply_list "${flags[*]}" ;;
qos?(s)) __slurm_compreply_list "$(__slurm_qos)" ;;
user?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol show hostlist *
function __scontrol_show_hostlist() {
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
if [[ $cur =~ ^/ ]]; then
_filedir
else
__slurm_compreply_list "$(__slurm_nodes)" "" "true"
fi
}
# completion handler for: scontrol show hostlistsorted *
function __scontrol_show_hostlistsorted() {
__scontrol_show_hostlist
}
# completion handler for: scontrol show hostnames *
function __scontrol_show_hostnames() {
__slurm_compreply_list "$(__slurm_nodes)" "" "true"
}
# completion handler for: scontrol show jobs *
function __scontrol_show_jobs() {
__slurm_compreply "$(__slurm_jobs)"
}
# completion handler for: scontrol show licenses *
function __scontrol_show_licenses() {
__slurm_compreply "$(__slurm_licenses)"
}
# completion handler for: scontrol show nodes *
function __scontrol_show_nodes() {
__slurm_compreply_list "$(__slurm_nodes)" "" "true"
}
# completion handler for: scontrol show partitions *
function __scontrol_show_partitions() {
__slurm_compreply "$(__slurm_partitions)"
}
# completion handler for: scontrol show reservations *
function __scontrol_show_reservations() {
__slurm_compreply "$(__slurm_reservations)"
}
# completion handler for: scontrol show step *
function __scontrol_show_steps() {
__slurm_compreply "$(__slurm_jobs) $(__slurm_jobsteps)"
}
# completion handler for: scontrol show topology *
function __scontrol_show_topology() {
local parameters=(
"block="
"node="
"unit="
"switch="
)
param="$(__slurm_find_param "${parameters[*]}")"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): param='$param'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
if [[ -z $param ]]; then
__slurm_compreply "${parameters[*]}"
fi
}
# completion handler for: scontrol show *
function __scontrol_show() {
local subcmds=(
"aliases"
"assoc_mgr"
"bbstat"
"burstbuffer"
"config"
"daemons"
"dwstat"
"federations"
"frontend"
"hostlist"
"hostlistsorted"
"hostnames"
"jobs"
"licenses"
"nodes"
"partitions"
"reservations"
"slurmd"
"steps"
"topoconf"
"topology"
)
local subcmd
subcmd="$(__slurm_find_subcmd "${subcmds[*]}")"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): subcmd='$subcmd'"
__slurm_log_trace "$(__func__): #subcmds[@]='${#subcmds[@]}'"
__slurm_log_trace "$(__func__): subcmds[*]='${subcmds[*]}'"
if [[ -z ${subcmd-} ]]; then
__slurm_compreply "${subcmds[*]}"
else
comp_cmd="${comp_cmd}_${subcmd//[^[:alnum:]]/}"
__slurm_comp_command "${comp_cmd}"
fi
}
# completion handler for: scontrol shutdown *
function __scontrol_shutdown() {
local parameters=(
"slurmctld" "controller"
)
param="$(__slurm_find_param "${parameters[*]}")"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): param='$param'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
if [[ -z $param ]]; then
__slurm_compreply "${parameters[*]}"
fi
}
# completion handler for: scontrol suspend *
function __scontrol_suspend() {
__slurm_compreply_list "$(__slurm_jobs)"
}
# completion handler for: scontrol top *
function __scontrol_top() {
__slurm_compreply_list "$(__slurm_jobs)"
}
# completion handler for: scontrol token *
function __scontrol_token() {
local parameters=(
"lifespan="
"username="
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
lifespan) ;;
username?(s)) __slurm_compreply "$(__slurm_users)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol uhold *
function __scontrol_uhold() {
__scontrol_release
}
# completion handler for: scontrol update frontendname=* [key=val]...
function __scontrol_update_frontendname() {
local parameters=(
"frontendname=" # meta
"reason="
"state="
)
local states=(
"down"
"drain"
"resume"
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
frontendname) __slurm_compreply "$(__slurm_nodes_frontend)" ;;
state?(s)) __slurm_compreply "${states[*]}" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol update jobname=* [key=val]...
function __scontrol_update_jobname() {
__scontrol_update_jobid
}
# completion handler for: scontrol update jobid=* [key=val]...
function __scontrol_update_jobid() {
local parameters=(
"account="
"admincomment="
"arraytaskthrottle="
"burstbuffer="
"clusters="
"clusterfeatures="
"comment="
"contiguous="
"corespec="
"cpuspertask="
"deadline="
"delayboot="
"dependency="
"eligibletime="
"endtime="
"excnodelist="
"extra="
"features="
"gres="
"jobid=" # meta
"jobname=" # meta
"licenses="
"mailtype="
"mailuser="
"mincpusnode="
"minmemorycpu="
"minmemorynode="
"mintmpdisknode="
"mcslabel="
"name="
"nice="
"nodelist="
"numcpus="
"numnodes="
"numtasks="
"oversubscribe="
"partition="
"prefer="
"priority="
"qos="
"reboot="
"reqcores="
"reqnodelist="
"reqnodes="
"reqprocs="
"reqsockets="
"reqthreads="
"irequeue="
"reservationname="
"resetaccruetime="
"sitefactor="
"stderr="
"stdin="
"stdout="
"shared="
"starttime="
"switches="
"taskspernode="
"threadspec="
"timelimit="
"timemin="
"userid="
"wait-for-switch="
"wckey="
"workdir="
)
local binary=(
"0"
"1"
)
local mail_types=(
"all"
"array_tasks"
"begin"
"end"
"fail"
"none"
"requeue"
"stage_out"
"time_limit"
"time_limit_90"
"time_limit_80"
"time_limit_50"
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
account?(s)) __slurm_compreply "$(__slurm_accounts)" ;;
cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
clusterfeature?(s)) __slurm_compreply_list "$(__slurm_features)" ;;
contiguous) __slurm_compreply "$(__slurm_boolean)" ;;
dependency) __slurm_comp_dependency ;;
excnodelist) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
feature?(s)) __slurm_compreply_list "$(__slurm_features)" ;;
gres) __slurm_compreply_list "$(__slurm_gres)" ;;
jobid?(s)) __slurm_compreply "$(__slurm_jobs)" ;;
jobname?(s)) __slurm_compreply "$(__slurm_jobnames)" ;;
license?(s)) __slurm_compreply_list "$(__slurm_licenses)" ;;
mailtype?(s)) __slurm_compreply_list "${mail_types[*]}" ;;
mailuser?(s)) __slurm_compreply "$(__slurm_users)" ;;
nodelist) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
oversubscribe) __slurm_compreply "$(__slurm_boolean)" ;;
partition) __slurm_compreply_list "$(__slurm_partitions)" ;;
prefer) __slurm_compreply "$(__slurm_features)" ;;
qos?(s)) __slurm_compreply "$(__slurm_qos)" ;;
reboot) __slurm_compreply "$(__slurm_boolean)" ;;
reqnodelist) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
irequeue) __slurm_compreply "${binary[*]}" ;;
reservationname?(s)) __slurm_compreply_list "$(__slurm_reservations)" ;;
stderr) _filedir ;;
stdin) _filedir ;;
stdout) _filedir ;;
shared) __slurm_compreply "$(__slurm_boolean)" ;;
userid?(s)) __slurm_compreply "$(__slurm_users)" ;;
wckey?(s)) __slurm_compreply "$(__slurm_wckeys)" ;;
workdir) _filedir -d ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol update nodename=* [key=val]...
function __scontrol_update_nodename() {
local parameters=(
"activefeatures="
"availablefeatures="
"certtoken="
"comment="
"cpubind="
"extra="
"gres="
"instanceid="
"instancetype="
"nodeaddr="
"nodehostname="
"nodename=" # meta
"reason="
"resumeafter="
"state="
"topology="
"weight="
)
local states=(
"cancel_reboot"
"down"
"drain"
"fail"
"future"
"idle"
"noresp"
"power_down"
"power_down_asap"
"power_down_force"
"power_up"
"resume"
"undrain"
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
activefeature?(s)) __slurm_compreply_list "$(__slurm_features_active)" ;;
availablefeature?(s)) __slurm_compreply_list "$(__slurm_features)" ;;
cpubind) __slurm_compreply "$(__slurm_cpubind_types)" ;;
gres) __slurm_compreply "$(__slurm_gres)" ;;
nodename?(s)) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
state?(s)) __slurm_compreply "${states[*]}" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol update partitionname=* [key=val]...
function __scontrol_update_partitionname() {
local parameters=(
"allowaccounts="
"allowgroups="
"allowqos="
"allocnodes="
"alternate="
"cpubind="
"default="
"defaulttime="
"defmempercpu="
"defmempernode="
"denyaccounts="
"denyqos="
"disablerootjobs="
"exclusiveuser="
"gracetime="
"hidden="
"jobdefaults="
"lln="
"maxcpuspernode="
"maxcpuspersocket="
"maxmempercpu="
"maxmempernode="
"maxnodes="
"maxtime="
"minnodes="
"nodes="
"nodes\+="
"nodes\-="
"overtimelimit="
"oversubscribe="
"partitionname=" # meta
"powerdownonidle="
"preemptmode="
"priority="
"priorityjobfactor="
"prioritytier="
"qos="
"rootonly="
"reqresv="
"shared="
"state="
"topology="
"tresbillingweights="
)
local job_defaults=(
"defcpupergpu="
"defmempergpu="
)
local oversubscribe_types=(
"exclusive"
"force"
"no"
"yes"
)
local states=(
"down"
"drain"
"inactive"
"up"
)
local preempt_modes=(
"cancel"
"off"
"requeue"
"suspend"
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
allowaccount?(s)) __slurm_compreply_list "$(__slurm_accounts)" "ALL" ;;
allowgroup?(s)) __slurm_compreply_list "$(__slurm_linux_groups)" "ALL" ;;
allowqos) __slurm_compreply_list "$(__slurm_qos)" "ALL" ;;
allocnode?(s)) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
alternate) __slurm_compreply "$(__slurm_partitions) NONE" ;;
cpubind) __slurm_compreply "$(__slurm_cpubind_types)" ;;
default) __slurm_compreply "$(__slurm_boolean)" ;;
denyaccount?(s)) __slurm_compreply_list "$(__slurm_accounts)" ;;
denyqos) __slurm_compreply_list "$(__slurm_qos)" ;;
disablerootjob?(s)) __slurm_compreply "$(__slurm_boolean)" ;;
exclusiveuser) __slurm_compreply "$(__slurm_boolean)" ;;
hidden) __slurm_compreply "$(__slurm_boolean)" ;;
jobdefault?(s)) __slurm_compreply "${job_defaults[*]}" ;;
lln) __slurm_compreply "$(__slurm_boolean)" ;;
node?(s)?(+|-)) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
oversubscribe) __slurm_compreply "${oversubscribe_types[*]}" ;;
partitionname) __slurm_compreply "$(__slurm_partitions)" ;;
powerdownonidle) __slurm_compreply "$(__slurm_boolean)" ;;
preemptmode) __slurm_compreply "${preempt_modes[*]}" ;;
qos?(s)) __slurm_compreply "$(__slurm_qos)" ;;
rootonly) __slurm_compreply "$(__slurm_boolean)" ;;
reqresv) __slurm_compreply "$(__slurm_boolean)" ;;
shared) __slurm_compreply "${oversubscribe_types[*]}" ;;
state) __slurm_compreply "${states[*]}" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol update reservationname=* [key=val]...
function __scontrol_update_reservationname() {
local parameters=(
"accounts="
"burstbuffer="
"corecnt="
"duration="
"endtime="
"features="
"flags="
"groups="
"licenses="
"maxstartdelay="
"nodecnt="
"nodes="
"partition="
"reservation" # meta
"reservationname=" # meta
"skip"
"starttime="
"tres="
"users="
)
local flags=(
"any_nodes"
"daily"
"flex"
"ignore_jobs"
"license_only"
"hourly"
"maint"
"magnetic"
"no_hold_jobs_after"
"overlap"
"part_nodes"
"purge_comp"
"replace"
"replace_down"
"spec_nodes"
"static_alloc"
"time_float"
"weekday"
"weekend"
"weekly"
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
account?(s)) __slurm_compreply_list "$(__slurm_accounts)" ;;
burstbuffer?(s)) __slurm_compreply_count "$(__slurm_burstbuffers)" "$(__slurm_units)" ;;
feature?(s)) __slurm_compreply_list "$(__slurm_features)" ;;
flag?(s)) __slurm_compreply_list "${flags[*]}" ;;
group?(s)) __slurm_compreply_list "$(__slurm_linux_groups)" ;;
license?(s)) __slurm_compreply_list "$(__slurm_licenses)" ;;
node?(s)) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
partition?(s)) __slurm_compreply "$(__slurm_partitions)" ;;
reservationname?(s)) __slurm_compreply "$(__slurm_reservations)" ;;
user?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol update stepid=* [key=val]...
function __scontrol_update_stepid() {
local parameters=(
"stepid=" # meta
"timelimit="
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
stepid) __slurm_compreply "$(__slurm_jobsteps)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol update suspendexcnodes=*
function __scontrol_update_suspendexcnodes() {
local parameters=(
"suspendexcnodes=" # meta
"suspendexcnodes\+=" # meta
"suspendexcnodes\-=" # meta
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
suspendexcnode?(s)?(+|-)) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol update suspendexcparts=*
function __scontrol_update_suspendexcparts() {
local parameters=(
"suspendexcparts=" # meta
"suspendexcparts\+=" # meta
"suspendexcnodes\-=" # meta
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
suspendexcpart?(s)?(+|-)) __slurm_compreply_list "$(__slurm_partitions)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol update suspendexcstates=*
function __scontrol_update_suspendexcstates() {
local parameters=(
"suspendexcstates=" # meta
"suspendexcstates\+=" # meta
"suspendexcstates\-=" # meta
)
local states=(
"CLOUD"
"DOWN"
"DRAIN"
"DYNAMIC_FUTURE"
"DYNAMIC_NORM"
"FAIL"
"INVALID_REG"
"MAINTENANCE"
"NOT_RESPONDING"
"PERFCTRS"
"PLANNED"
"RESERVED"
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
suspendexcstate?(s)?(+|-)) __slurm_compreply_list "${states[*],,}" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: scontrol update *
function __scontrol_update() {
local parameters=(
"frontendname="
"jobid="
"jobname="
"nodename="
"partitionname="
"reservationname="
"stepid="
"suspendexcnodes="
"suspendexcnodes\+="
"suspendexcnodes\-="
"suspendexcparts="
"suspendexcparts\+="
"suspendexcparts\-="
"suspendexcstates="
"suspendexcstates\+="
"suspendexcstates\-="
)
local param
param="$(__slurm_find_param "${parameters[*]}")"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): param='$param'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
if [[ -z ${param-} ]]; then
__slurm_compreply "${parameters[*]}"
else
comp_cmd="${comp_cmd}_${param//[^[:alnum:]]/}"
__slurm_comp_command "${comp_cmd}"
fi
}
# completion handler for: scontrol wait_job *
function __scontrol_wait_job() {
__slurm_compreply "$(__slurm_jobs)"
}
# completion handler for: scontrol write *
function __scontrol_write() {
local subcmds=(
"batch_script"
"config"
)
local subcmd
subcmd="$(__slurm_find_subcmd "${subcmds[*]}")"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): subcmd='$subcmd'"
__slurm_log_trace "$(__func__): #subcmds[@]='${#subcmds[@]}'"
__slurm_log_trace "$(__func__): subcmds[*]='${subcmds[*]}'"
case "${subcmd}" in
batch_script) __slurm_compreply "$(__slurm_jobs)" ;;
config) _filedir ;;
*) __slurm_compreply "${subcmds[*]}" ;;
esac
}
# Slurm completion helper for scontrol flag completion
#
# RET: 0 = did completion; 1 = no completion
function __slurm_comp_scontrol_flags() {
local cmd="$1"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur' cmd='$cmd'"
__slurm_comp_flags "$cmd" && return 0
__slurm_is_opt || return 1
case "${prev}" in
-M | --cluster?(s)) __slurm_compreply "$(__slurm_clusters)" ;;
-u | --uid?(s)) __slurm_compreply "$(__slurm_users)" ;;
--json) __slurm_compreply "$(__slurm_dataparser_json "$ctx")" ;;
--yaml) __slurm_compreply "$(__slurm_dataparser_yaml "$ctx")" ;;
*) return 1 ;;
esac
return 0
}
# scontrol completion handler
# https://slurm.schedmd.com/scontrol.html
function _scontrol() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
local comp_cmd="$1"
local subcmds=(
"cancel_reboot"
"create"
"completing"
"delete"
"errnumstr"
"fsdampeningfactor"
"help"
"hold"
"notify"
"pidinfo"
"listjobs"
"listpids"
"liststeps"
"ping"
"power"
"reboot"
"reconfigure"
"release"
"requeue"
"requeuehold"
"resume"
"schedloglevel"
"setdebug"
"setdebugflags"
"show"
"shutdown"
"suspend"
"takeover"
"top"
"token"
"uhold"
"update"
"version"
"wait_job"
"write"
)
local subcmd
subcmd="$(__slurm_find_subcmd "${subcmds[*]}")"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): subcmd='$subcmd'"
__slurm_log_trace "$(__func__): #subcmds[@]='${#subcmds[@]}'"
__slurm_log_trace "$(__func__): subcmds[*]='${subcmds[*]}'"
__slurm_comp_scontrol_flags "$comp_cmd" && return
if [[ -z ${subcmd-} ]]; then
__slurm_compreply "${subcmds[*]}"
else
comp_cmd="__${comp_cmd}_${subcmd//[^[:alnum:]]/}"
__slurm_comp_command "${comp_cmd}"
fi
}
complete -o nospace -F _scontrol scontrol
################################################################################
# SCRONTAB Completion Functions
################################################################################
# Slurm completion helper for scrontab flag completion
#
# RET: 0 = did completion; 1 = no completion
function __slurm_comp_scrontab_flags() {
local cmd="$1"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur' cmd='$cmd'"
__slurm_comp_flags "$cmd" && return 0
__slurm_is_opt || return 1
case "${prev}" in
-u) __slurm_compreply "$(__slurm_users)" ;;
*) return 1 ;;
esac
return 0
}
# scrontab completion handler
# https://slurm.schedmd.com/scrontab.html
function _scrontab() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
__slurm_comp_scrontab_flags "$1" && return
$split && return
if ((${#COMPREPLY[@]} == 0)) && [[ $cur == "" ]]; then
__slurm_compreply "-"
fi
}
complete -o nospace -F _scrontab scrontab
################################################################################
# SDIAG Completion Functions
################################################################################
# Slurm completion helper for sdiag flag completion
#
# RET: 0 = did completion; 1 = no completion
function __slurm_comp_sdiag_flags() {
local cmd="$1"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur' cmd='$cmd'"
__slurm_comp_flags "$cmd" && return 0
__slurm_is_opt || return 1
case "${prev}" in
-M | --cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
--json) __slurm_compreply "list $(__slurm_dataparser_json "$cmd")" ;;
--yaml) __slurm_compreply "list $(__slurm_dataparser_yaml "$cmd")" ;;
*) return 1 ;;
esac
return 0
}
# sdiag completion handler
# https://slurm.schedmd.com/sdiag.html
function _sdiag() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
__slurm_comp_sdiag_flags "$1" && return
$split && return
if ((${#COMPREPLY[@]} == 0)) && [[ $cur == "" ]]; then
__slurm_compreply "--"
fi
}
complete -o nospace -F _sdiag sdiag
################################################################################
# SINFO Completion Functions
################################################################################
# Slurm completion helper for sinfo flag completion
#
# RET: 0 = did completion; 1 = no completion
function __slurm_comp_sinfo_flags() {
local cmd="$1"
local _options=()
local _compreply=()
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur' cmd='$cmd'"
__slurm_comp_flags "$cmd" && return 0
__slurm_is_opt || return 1
case "${prev}" in
-i | --iterate) ;;
-M | --cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
-o | --format) __slurm_compreply_list "$(__slurm_helpformat "$cmd" "nocase")" "%ALL" ;;
-O | --Format) __slurm_compreply_list "$(__slurm_helpformat2 "$cmd")" "ALL" ;;
-n | --node?(s)) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
-p | --partition?(s)) __slurm_compreply_list "$(__slurm_partitions)" ;;
-S | --sort)
_options=("$(__slurm_helpformat "$cmd" "nocase")")
_options=("${_options//%/}") # remove '%' prefix
_compreply+=("$(compgen -W "${_options[*]}" -P "+")") # ascending
_compreply+=("$(compgen -W "${_options[*]}" -P "-")") # descending
__slurm_compreply_list "${_compreply[*]}"
;;
-t | --state?(s)) __slurm_compreply_list "$(__slurm_helpstate "$cmd")" "ALL" ;;
--json) __slurm_compreply "list $(__slurm_dataparser_json "$cmd")" ;;
--yaml) __slurm_compreply "list $(__slurm_dataparser_yaml "$cmd")" ;;
*) return 1 ;;
esac
return 0
}
# sinfo completion handler
# https://slurm.schedmd.com/sinfo.html
function _sinfo() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
__slurm_comp_sinfo_flags "$1" && return
$split && return
if ((${#COMPREPLY[@]} == 0)) && [[ $cur == "" ]]; then
__slurm_compreply "--"
fi
}
complete -o nospace -F _sinfo sinfo
################################################################################
# SPRIO Completion Functions
################################################################################
# Slurm completion helper for sprio flag completion
#
# RET: 0 = did completion; 1 = no completion
function __slurm_comp_sprio_flags() {
local cmd="$1"
local _options=()
local _compreply=()
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur' cmd='$cmd'"
__slurm_comp_flags "$cmd" && return 0
__slurm_is_opt || return 1
case "${prev}" in
-M | --cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
-o | --format) __slurm_compreply_list "$(__slurm_helpformat "$cmd" "nocase")" ;;
-j | --job?(s)) __slurm_compreply_list "$(__slurm_jobs)" ;;
-S | --sort)
_options=("$(__slurm_helpformat "$cmd" "nocase")")
_options=("${_options//%/}") # remove '%' prefix
_compreply+=("$(compgen -W "${_options[*]}" -P "+")") # ascending
_compreply+=("$(compgen -W "${_options[*]}" -P "-")") # descending
__slurm_compreply_list "${_compreply[*]}"
;;
-u) __slurm_compreply_list "$(__slurm_users)" ;;
*) return 1 ;;
esac
return 0
}
# sprio completion handler
# https://slurm.schedmd.com/sprio.html
function _sprio() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
__slurm_comp_sprio_flags "$1" && return
$split && return
if ((${#COMPREPLY[@]} == 0)) && [[ $cur == "" ]]; then
__slurm_compreply "--"
fi
}
complete -o nospace -F _sprio sprio
################################################################################
# SQUEUE Completion Functions
################################################################################
# Slurm completion helper for squeue flag completion
#
# RET: 0 = did completion; 1 = no completion
function __slurm_comp_squeue_flags() {
local cmd="$1"
local _options=()
local _compreply=()
local steps_flag
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur' cmd='$cmd'"
__slurm_comp_flags "$cmd" && return 0
__slurm_is_opt || return 1
case "${prev}" in
-A | --account?(s)) __slurm_compreply_list "$(__slurm_accounts)" ;;
-i | --iterate) ;;
-o | --format)
steps_flag="$(__slurm_find_param "-s --steps")"
__slurm_compreply_list "$(__slurm_helpformat "$cmd $steps_flag" "nocase")" "%ALL"
;;
-O | --Format)
steps_flag="$(__slurm_find_param "-s --steps")"
__slurm_compreply_list "$(__slurm_helpformat2 "$cmd $steps_flag")"
;;
-j | --job?(s)) __slurm_compreply_list "$(__slurm_jobs)" ;;
-L | --license?(s)) __slurm_compreply_list "$(__slurm_licenses)" ;;
-w | --nodelist) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
-p | --partition?(s)) __slurm_compreply_list "$(__slurm_partitions)" ;;
-q | --qos?(s)) __slurm_compreply_list "$(__slurm_qos)" ;;
-R | --reservation?(s)) __slurm_compreply_list "$(__slurm_reservations)" ;;
-s | --steps) __slurm_compreply_list "$(__slurm_jobsteps)" ;;
-S | --sort)
_options=("$(__slurm_helpformat "$cmd" "nocase")")
_options=("${_options//%/}") # remove '%' prefix
_compreply+=("$(compgen -W "${_options[*]}" -P "+")") # ascending
_compreply+=("$(compgen -W "${_options[*]}" -P "-")") # descending
__slurm_compreply_list "${_compreply[*]}"
;;
-t | --state?(s)) __slurm_compreply_list "$(__slurm_helpstate "$cmd")" "ALL" ;;
-u | --user?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
--json) __slurm_compreply "list $(__slurm_dataparser_json "$cmd")" ;;
--yaml) __slurm_compreply "list $(__slurm_dataparser_yaml "$cmd")" ;;
*) return 1 ;;
esac
return 0
}
# squeue completion handler
# https://slurm.schedmd.com/squeue.html
function _squeue() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
__slurm_comp_squeue_flags "$1" && return
$split && return
if ((${#COMPREPLY[@]} == 0)) && [[ $cur == "" ]]; then
__slurm_compreply "--"
fi
}
complete -o nospace -F _squeue squeue
################################################################################
# SREPORT Completion Functions
################################################################################
# completion helper for sreport global specifications
#
# RET: 0 = did completion, 1 = did not do completion
function __slurm_comp_sreport_spec_all() {
if [[ -z ${parameters[0]} ]]; then
local parameters=()
fi
parameters+=(
"clusters="
"end="
"format="
"start="
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_trace "$(__func__): #parameters[@]='${#parameters[@]}'"
__slurm_log_trace "$(__func__): parameters[*]='${parameters[*]}'"
case "${prev}" in
cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
*) return 1 ;;
esac
return 0
}
# completion handler for: sreport cluster *
function __sreport_cluster() {
local subcmds=(
"accountutilizationbyuser"
"accountutilizationbyqos"
"userutilizationbyaccount"
"userutilizationbywckey"
"utilization"
"wckeyutilizationbyuser"
)
local subcmd
subcmd="$(__slurm_find_subcmd "${subcmds[*]}")"
parameters=(
"accounts="
"tree"
"qos="
"users="
"wckeys="
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): subcmd='$subcmd'"
__slurm_log_trace "$(__func__): #subcmds[@]='${#subcmds[@]}'"
__slurm_log_trace "$(__func__): subcmds[*]='${subcmds[*]}'"
if [[ -z ${subcmd-} ]]; then
__slurm_compreply "${subcmds[*]}"
return
fi
__slurm_comp_sreport_spec_all && return
case "${prev}" in
account?(s)) __slurm_compreply_list "$(__slurm_accounts)" ;;
qos?(s)) __slurm_compreply_list "$(__slurm_qos)" ;;
user?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
wckey?(s)) __slurm_compreply_list "$(__slurm_wckeys)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: sreport job *
function __sreport_job() {
local subcmds=(
"sizesbyaccount"
"sizesbyaccountandwckey"
"sizesbywckey"
)
local subcmd
subcmd="$(__slurm_find_subcmd "${subcmds[*]}")"
parameters=(
"accounts="
"acctasparent"
"flatview"
"gid="
"grouping="
"jobs="
"nodes="
"partitions="
"printjobcount="
"users="
"wckeys="
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): subcmd='$subcmd'"
__slurm_log_trace "$(__func__): #subcmds[@]='${#subcmds[@]}'"
__slurm_log_trace "$(__func__): subcmds[*]='${subcmds[*]}'"
if [[ -z ${subcmd-} ]]; then
__slurm_compreply "${subcmds[*]}"
return
fi
__slurm_comp_sreport_spec_all && return
case "${prev}" in
account?(s)) __slurm_compreply_list "$(__slurm_accounts)" ;;
gid?(s)) __slurm_compreply_list "$(__slurm_linux_gids)" ;;
job?(s)) __slurm_compreply_list "$(__slurm_jobs) $(__slurm_jobsteps)" ;;
node?(s)) __slurm_compreply_list "$(__slurm_nodes)" ;;
partition?(s)) __slurm_compreply_list "$(__slurm_partitions)" ;;
user?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
wckey?(s)) __slurm_compreply_list "$(__slurm_wckeys)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: sreport reservation *
function __sreport_reservation() {
local subcmds=(
"utilization"
)
local subcmd
subcmd="$(__slurm_find_subcmd "${subcmds[*]}")"
parameters=(
"names="
"nodes="
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): subcmd='$subcmd'"
__slurm_log_trace "$(__func__): #subcmds[@]='${#subcmds[@]}'"
__slurm_log_trace "$(__func__): subcmds[*]='${subcmds[*]}'"
if [[ -z ${subcmd-} ]]; then
__slurm_compreply "${subcmds[*]}"
return
fi
__slurm_comp_sreport_spec_all && return
case "${prev}" in
name?(s)) __slurm_compreply_list "$(__slurm_reservations)" ;;
node?(s)) __slurm_compreply_list "$(__slurm_nodes)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# completion handler for: sreport user *
function __sreport_user() {
local subcmds=(
"topusage"
)
local subcmd
subcmd="$(__slurm_find_subcmd "${subcmds[*]}")"
parameters=(
"accounts="
"group"
"topcount="
"users="
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur'"
__slurm_log_debug "$(__func__): subcmd='$subcmd'"
__slurm_log_trace "$(__func__): #subcmds[@]='${#subcmds[@]}'"
__slurm_log_trace "$(__func__): subcmds[*]='${subcmds[*]}'"
if [[ -z ${subcmd-} ]]; then
__slurm_compreply "${subcmds[*]}"
return
fi
__slurm_comp_sreport_spec_all && return
case "${prev}" in
account?(s)) __slurm_compreply_list "$(__slurm_accounts)" ;;
user?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
*)
$split && return
__slurm_compreply_param "${parameters[*]}"
;;
esac
}
# Slurm completion helper for sreport flag completion
#
# RET: 0 = did completion; 1 = no completion
function __slurm_comp_sreport_flags() {
local cmd="$1"
local time_format=(
"secper"
"minper"
"hourper"
"seconds"
"minutes"
"hours"
"percent"
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur' cmd='$cmd'"
__slurm_comp_flags "$cmd" && return 0
__slurm_is_opt || return 1
case "${prev}" in
-M | --cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
-t) __slurm_compreply "${time_format[*]}" ;;
-T | --tres) __slurm_compreply_list "$(__slurm_tres)" ;;
*) return 1 ;;
esac
return 0
}
# sreport completion handler
# https://slurm.schedmd.com/sreport.html
function _sreport() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
local comp_cmd="$1"
local subcmds=(
"cluster"
"job"
"reservation"
"user"
)
local subcmd
subcmd="$(__slurm_find_subcmd "${subcmds[*]}")"
__slurm_log_debug "$(__func__): subcmd='$subcmd'"
__slurm_log_trace "$(__func__): #subcmds[@]='${#subcmds[@]}'"
__slurm_log_trace "$(__func__): subcmds[*]='${subcmds[*]}'"
__slurm_comp_sreport_flags "$1" && return
if [[ -z ${subcmd-} ]]; then
__slurm_compreply "${subcmds[*]}"
else
comp_cmd="__${comp_cmd}_${subcmd//[^[:alnum:]]/}"
__slurm_comp_command "${comp_cmd}"
fi
}
complete -o nospace -F _sreport sreport
################################################################################
# SRUN Completion Functions
################################################################################
# srun completion handler
# https://slurm.schedmd.com/srun.html
function _srun() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
__slurm_comp_common_flags "$1" && return
$split && return
_filedir
}
complete -o nospace -F _srun srun
################################################################################
# SSHARE Completion Functions
################################################################################
# Slurm completion helper for sshare flag completion
#
# RET: 0 = did completion; 1 = no completion
function __slurm_comp_sshare_flags() {
local cmd="$1"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur' cmd='$cmd'"
__slurm_comp_flags "$cmd" && return 0
__slurm_is_opt || return 1
case "${prev}" in
-A | --account?(s)) __slurm_compreply_list "$(__slurm_accounts)" ;;
-M | --cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
-o | --format) __slurm_compreply_list "$(__slurm_helpformat "$cmd")" ;;
-u | --user?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
--json) __slurm_compreply "list $(__slurm_dataparser_json "$cmd")" ;;
--yaml) __slurm_compreply "list $(__slurm_dataparser_yaml "$cmd")" ;;
*) return 1 ;;
esac
return 0
}
# sshare completion handler
# https://slurm.schedmd.com/sshare.html
function _sshare() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
__slurm_comp_sshare_flags "$1" && return
$split && return
if ((${#COMPREPLY[@]} == 0)) && [[ $cur == "" ]]; then
__slurm_compreply "--"
fi
}
complete -o nospace -F _sshare sshare
################################################################################
# SSTAT Completion Functions
################################################################################
# Slurm completion helper for sstat flag completion
#
# RET: 0 = did completion; 1 = no completion
function __slurm_comp_sstat_flags() {
local cmd="$1"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur' cmd='$cmd'"
__slurm_comp_flags "$cmd" && return 0
__slurm_is_opt || return 1
case "${prev}" in
-o | --format | --field?(s)) __slurm_compreply_list "$(__slurm_helpformat "$cmd")" ;;
-j | --job?(s)) __slurm_compreply_list "$(__slurm_jobs) $(__slurm_jobsteps)" ;;
*) return 1 ;;
esac
return 0
}
# sstat completion handler
# https://slurm.schedmd.com/sstat.html
function _sstat() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
__slurm_comp_sstat_flags "$1" && return
$split && return
if ((${#COMPREPLY[@]} == 0)) && [[ $cur == "" ]]; then
__slurm_compreply "--"
fi
}
complete -o nospace -F _sstat sstat
################################################################################
# STRIGGER Completion Functions
################################################################################
# Slurm completion helper for strigger flag completion
#
# RET: 0 = did completion; 1 = no completion
function __slurm_comp_strigger_flags() {
local cmd="$1"
local flags=(
"perm"
)
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur' cmd='$cmd'"
__slurm_comp_flags "$cmd" && return 0
__slurm_is_opt || return 1
case "${prev}" in
-M | --cluster?(s)) __slurm_compreply_list "$(__slurm_clusters)" ;;
--flag?(s)) __slurm_compreply_list "${flags[*]}" ;;
-j | --jobid?(s)) __slurm_compreply_list "$(__slurm_jobs)" ;;
-n | --node?(s)) __slurm_compreply_list "$(__slurm_nodes)" "ALL" "true" ;;
-p | --program) _filedir ;;
--user?(s)) __slurm_compreply_list "$(__slurm_users)" ;;
*) return 1 ;;
esac
return 0
}
# strigger completion handler
# https://slurm.schedmd.com/strigger.html
function _strigger() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
local subcmds=(
"--clear"
"--get"
"--set"
)
local subcmd
subcmd="$(__slurm_find_subcmd "${subcmds[*]}")"
__slurm_log_debug "$(__func__): subcmd='$subcmd'"
__slurm_log_trace "$(__func__): #subcmds[@]='${#subcmds[@]}'"
__slurm_log_trace "$(__func__): subcmds[*]='${subcmds[*]}'"
__slurm_comp_strigger_flags "$1" && return
if [[ -z ${subcmd-} ]]; then
__slurm_compreply "${subcmds[*]}"
return
fi
}
complete -o nospace -F _strigger strigger
################################################################################
# SLURMRESTD Completion Functions
################################################################################
# Slurm helper function to get slurmrestd auth plugin list
#
# RET: space delimited list
function __slurm_restd_auth() {
local ctx="slurmrestd"
local cmd="$ctx -a list 2>&1 | tail -n +2 | sed 's/$ctx: //g'"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get slurmrestd data parser plugin list
#
# RET: space delimited list
function __slurm_restd_dataparser() {
local ctx="slurmrestd"
local cmd="$ctx -d list 2>&1 | tail -n +2 | sed 's/$ctx: //g'"
__slurm_func_wrapper "$cmd"
}
# Slurm helper function to get slurmrestd openapi plugin list
#
# RET: space delimited list
function __slurm_restd_openapi() {
local ctx="slurmrestd"
local cmd="$ctx -s list 2>&1 | tail -n +2 | sed 's/$ctx: //g'"
__slurm_func_wrapper "$cmd"
}
# Slurm completion helper for slurmrestd flag completion
#
# $1: slurm command being completed
# RET: 0 = did completion; 1 = no completion
function __slurm_comp_slurmrestd_flags() {
local cmd="$1"
__slurm_log_debug "$(__func__): prev='$prev' cur='$cur' cmd='$cmd'"
__slurm_comp_flags "$1" && return 0
__slurm_is_opt || return 1
case "${prev}" in
-a) __slurm_compreply_list "$(__slurm_restd_auth)" ;;
-d) __slurm_compreply_list "$(__slurm_restd_dataparser)" ;;
-f) _filedir ;;
-g) __slurm_compreply "$(__slurm_linux_groups)" ;;
-s) __slurm_compreply_list "$(__slurm_restd_openapi)" ;;
-u) __slurm_compreply "$(__slurm_linux_users)" ;;
esac
return 0
}
# slurmrestd completion handler
# https://slurm.schedmd.com/slurmrestd.html
function _slurmrestd() {
local cur prev words cword split
__slurm_compinit "$1" || return
__slurm_log_info "$(__func__): prev='$prev' cur='$cur'"
local _compreply=()
local _options=()
__slurm_comp_slurmrestd_flags "$1" && return
# Split on ':' to make value completion easier
case "${cur}" in
--?*:* | ?*:*)
prev="${cur%%?(\\):*}"
cur="${cur#*?(\\):}"
split=true
;;
esac
case "${prev}" in
unix) _filedir ;;
esac
$split && return
_options=("localhost $(__slurm_linux_hostnames) unix")
_compreply+=("$(compgen -W "${_options[*]}" -S ":" -- "${cur}")")
__slurm_comp "${_compreply[*]}" "" "${cur}" "" ""
}
complete -o nospace -F _slurmrestd slurmrestd