#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Test --gpus-per-tres with --overcommit option
############################################################################
# Copyright (C) SchedMD LLC.
#
# 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.
#
# 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.,
# 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
############################################################################
source ./globals

set file_in        "$test_dir/input"
set number_commas  "\[0-9_,\]+"

if {![check_config_select "cons_tres"]} {
	skip "This test is only compatible with select/cons_tres"
}

set nb_nodes [get_partition_param [default_partition] "TotalNodes"]
if {$nb_nodes < 2} {
	skip "This test is 2 or more nodes in the default partition"
}
set nb_nodes 2
set nb_tasks 3

set gpu_cnt [get_highest_gres_count $nb_nodes "gpu"]
if {$gpu_cnt < 2} {
	skip "This test requires 2 or more GPUs on $nb_nodes nodes of the default partition"
}

set node_name [get_nodes_by_request "--gres=gpu:1 -n1 -t1"]
if { [llength $node_name] != 1 } {
	skip "This test need to be able to submit jobs with at least --gres=gpu:1"
}
set cpus_per_node     [get_node_param $node_name "CPUTot"]
set sockets_per_node  [get_node_param $node_name "Sockets"]
set cpus_per_socket   [expr $cpus_per_node / $sockets_per_node]

log_debug "GPU count is $gpu_cnt"
log_debug "Sockets per node is $sockets_per_node"
log_debug "CPUs per socket is $cpus_per_socket"

if {$cpus_per_node < 2} {
	skip "This test requires 2 or more CPUs per node in the default partition"
}
if {$gpu_cnt > $cpus_per_node} {
	set gpu_cnt $cpus_per_node
}

#
# Build input script files
#
make_bash_script $file_in "
echo HOST:\$SLURMD_NODENAME CUDA_VISIBLE_DEVICES:\$CUDA_VISIBLE_DEVICES
if \[ \$SLURM_PROCID -eq 0 \]; then
$scontrol -dd show job \$SLURM_JOB_ID | grep \"GRES=\"
fi
exit 0"

set match 0
set timeout $max_job_delay
spawn $srun --cpus-per-gpu=1 --gpus-per-task=1 --nodes=$nb_nodes --overcommit --ntasks=$nb_tasks -t1 -J $test_name -l $file_in
expect {
	-re "CUDA_VISIBLE_DEVICES:($number_commas)" {
		incr match [cuda_count $expect_out(1,string)]
		exp_continue
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
# NOTE: 2 tasks run on one node, so we should see 2 tasks with 2 GPUs each and 1 task with 1 GPU
if {$match != $nb_tasks} {
	fail "srun --gpus-per-task with --overcommit failure ($match != $nb_tasks)"
}
