| #!/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" |
| } |