| #!/usr/bin/expect |
| ############################################################################ |
| # Purpose: Test of Slurm functionality |
| # Confirm that FLEX flag of reservations works correctly |
| ############################################################################ |
| # Copyright (C) 2002 The Regents of the University of California. |
| # Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). |
| # CODE-OCEC-09-009. All rights reserved. |
| # |
| # 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 job_id 0 |
| set user_name [get_my_user_name] |
| set default_partition [default_partition] |
| set res_name "res_$test_name" |
| set resv_over_run false |
| set config_file [get_conf_path]/slurm.conf |
| |
| if { [get_config_param ResvOverRun] != "0 min" } { |
| set resv_over_run true |
| } |
| |
| proc cleanup {} { |
| global resv_over_run config_file |
| |
| subcleanup |
| |
| if { $resv_over_run } { |
| restore_conf $config_file |
| reconfigure -fail |
| } |
| } |
| |
| proc subcleanup {} { |
| global scontrol res_name job_id |
| |
| cancel_job $job_id |
| run_command "$scontrol delete reservation=$res_name" |
| } |
| |
| proc setup {use_flex {start_time ""}} { |
| global res_name user_name default_partition |
| |
| if {$use_flex} { |
| log_info "Creating a reservation with Flags=FLEX" |
| set flags "Flags=FLEX" |
| } else { |
| log_info "Creating a reservation WITHOUT Flags=FLEX" |
| set flags "" |
| } |
| if {[create_res $res_name "StartTime=now$start_time Duration=1 NodeCnt=1 partition=$default_partition user=$user_name $flags"]} { |
| fail "Unable to create a reservation with flags=FLEX" |
| } |
| } |
| |
| set nb_nodes [get_partition_param [default_partition] "TotalNodes"] |
| if {$nb_nodes < 2} { |
| skip "Need 2 or more nodes in default partition" |
| } |
| |
| if { $resv_over_run } { |
| save_conf $config_file |
| exec $bin_echo ResvOverRun=0 >> $config_file |
| reconfigure -fail |
| } |
| |
| proc test_flex {use_flex submit_active} { |
| global res_name job_id resv_over_run |
| |
| # Subtest job using more nodes than reservation |
| subcleanup |
| if {$submit_active} { |
| setup $use_flex "" |
| wait_for {[get_reservation_param $res_name State] eq "ACTIVE"} {} |
| } else { |
| setup $use_flex "+5" |
| } |
| set job_id [submit_job -none "-N2 --reservation=$res_name --wrap 'sleep 30' -o /dev/null -e /dev/null"] |
| if {$use_flex} { |
| subtest {![wait_for_job -timeout 30 $job_id RUNNING]} "Job should be running because with FLEX more nodes can be requested" |
| } else { |
| if {$submit_active} { |
| subtest {$job_id == 0} "Job shouldn't be running requested more nodes than in reservation without FLEX and ACTIVE" |
| } else { |
| subtest {[wait_for_job -timeout 30 $job_id RUNNING]} "Job shouldn't be running because requested more nodes than in reservation without FLEX" |
| } |
| } |
| |
| # Subtest job with EndTime after reservation end |
| subcleanup |
| if {$submit_active} { |
| setup $use_flex "" |
| wait_for {[get_reservation_param $res_name State] eq "ACTIVE"} {} |
| } else { |
| setup $use_flex "+5" |
| } |
| set job_id [submit_job -fail "-N1 --reservation=$res_name -t 120 --wrap 'sleep 100' -o /dev/null -e /dev/null"] |
| subtest {![wait_for_job -timeout 30 $job_id RUNNING]} "Job should be RUNNING" |
| subtest {![wait_for_job -timeout 200 -pollinterval 10 $job_id DONE]} "Job should be DONE" |
| |
| if {$use_flex} { |
| subtest {[get_job_param $job_id JobState] == "COMPLETED" } "Job should complete successfully after reservation end when it was FLEX" |
| } else { |
| subtest {[get_job_param $job_id JobState] == "TIMEOUT" } "Job should TIMEOUT with reservation end without FLEX" |
| } |
| |
| # Subtest Job start before reservation StartTime |
| subcleanup |
| setup $use_flex "+60" |
| set job_id [submit_job -fail "-N1 --reservation=$res_name -t 300 --wrap 'sleep 30' -o /dev/null -e /dev/null"] |
| if {$use_flex} { |
| subtest {![wait_for_job -timeout 30 $job_id RUNNING]} "Job should start before reservation since it's FLEX." |
| } else { |
| subtest {[wait_for_job -timeout 30 $job_id RUNNING]} "Job shouldn't started before reservation since it's not FLEX." |
| } |
| } |
| |
| # Test with FLEX flag and when reservation is ACTIVE |
| test_flex true true |
| # Test with FLEX flag and when reservation is INACTIVE |
| test_flex true false |
| # Test without FLEX flag and when reservation is ACTIVE |
| test_flex false true |
| # Test without FLEX flag and when reservation is INACTIVE |
| test_flex false false |