blob: e91907df0f927b6c9d62494799bd47f9c2456553 [file] [log] [blame]
#!/usr/bin/expect
############################################################################
# Purpose: Test of Slurm functionality
# Confirm that sbatch/salloc/srun option --reservation
# can now include a comma separated list
############################################################################
# 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.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
############################################################################
source ./globals
set nodes_min 3
set resv_name1 "resv1_$test_name"
set resv_name2 "resv2_$test_name"
set resv_name3 "resv3_$test_name"
set wrong_resv_name "wrong_resv_$test_name"
set job_list [list]
set user_name [get_my_user_name]
# Make sure there are 3 nodes to create reservations
set nodes_avail [llength [get_nodes_by_state]]
if {$nodes_avail < $nodes_min} {
skip "Not enough nodes currently available ($nodes_avail avail < $nodes_min needed)."
}
proc cleanup {} {
global resv_name1 resv_name2 resv_name3 user_name job_list scontrol
run_command "$scontrol delete reservation=$resv_name3"
run_command "$scontrol delete reservation=$resv_name2"
run_command "$scontrol delete reservation=$resv_name1"
cancel_job $job_list
}
# Create reservations
run_command -fail "$scontrol create reservation=$resv_name1 starttime=now duration=60 nodecnt=1 user=$user_name"
run_command -fail "$scontrol create reservation=$resv_name2 starttime=now duration=60 nodecnt=1 user=$user_name"
run_command -fail "$scontrol create reservation=$resv_name3 starttime=now duration=60 nodecnt=1 user=$user_name"
# Test srun got all 3 reservations
set result [run_command "$srun --reservation=$resv_name1,$resv_name2,$resv_name3 printenv SLURM_JOB_ID"]
set status [dict get $result "exit_code"]
set output [dict get $result "output"]
set job_id [string trimright $output "\n"]
lappend job_list $job_id
subtest {$status == 0} "Verify srun --reservation succeeds for job ($job_id)"
subtest {[get_job_param $job_id "Reservation"] eq "$resv_name1,$resv_name2,$resv_name3"} "Verify srun job got reservation" "Reservation = $resv_name1,$resv_name2,$resv_name3"
# Test sbatch got all 3 reservations
set job_id [submit_job "--reservation=$resv_name1,$resv_name2,$resv_name3 --wrap=\"sleep 1\""]
lappend job_list $job_id
subtest {$job_id != 0} "Verify sbatch --reservation succeeds for job ($job_id)"
subtest {[get_job_param $job_id "Reservation"] eq "$resv_name1,$resv_name2,$resv_name3"} "Verify sbatch job got reservation" "Reservation = $resv_name1,$resv_name2,$resv_name3"
# Test salloc got all 3 reservations
set result [run_command "$salloc --reservation=$resv_name1,$resv_name2,$resv_name3 sleep 1"]
set status [dict get $result "exit_code"]
set output [dict get $result "output"]
regexp {\S+ job (\d+)} $output - job_id
lappend job_list $job_id
subtest {$status == 0} "Verify salloc --reservation succeeds for job ($job_id)"
subtest {[get_job_param $job_id "Reservation"] eq "$resv_name1,$resv_name2,$resv_name3"} "Verify salloc job got reservation" "Reservation = $resv_name1,$resv_name2,$resv_name3"
# Test reservation order is consistent
set job_id [submit_job "--reservation=$resv_name2,$resv_name3,$resv_name1 --wrap=\"sleep 1\""]
lappend job_list $job_id
subtest {$job_id != 0} "Verify sbatch --reservation succeeds for job ($job_id)"
subtest {[get_job_param $job_id "Reservation"] eq "$resv_name2,$resv_name3,$resv_name1"} "Verify reservation order is consistent" "Reservation = $resv_name2,$resv_name3,$resv_name1"
# Test job fails when at least 1 reservation is wrong
set job_id [submit_job -xfail "--reservation=$resv_name1,$resv_name2,$resv_name3,wrong_resv_$test_name --wrap=\"sleep 1\""]
lappend job_list $job_id
subtest {$job_id == 0} "Verify job fails when at least 1 reservation is wrong"
# Test jobs landed on a reservation's node
set res1_nodes [get_reservation_param $resv_name1 Nodes]
set res2_nodes [get_reservation_param $resv_name2 Nodes]
set res3_nodes [get_reservation_param $resv_name3 Nodes]
foreach job_id $job_list {
if {!$job_id} {
continue
}
# Wait for job to run to get the actual Nodes allocated
wait_for_job -fail $job_id "DONE"
set job_nodes [get_job_param $job_id "Nodes"]
subtest {$job_nodes == $res2_nodes || $job_nodes == $res1_nodes || $job_nodes == $res3_nodes} "Verify job ($job_id) landed on a reservation's node" "$job_nodes not a resv node"
}