blob: b210c7a2f449b0e82315f011996ac728f6486266 [file] [log] [blame]
#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
# Validate scontrol create, delete, and update for reservations.
############################################################################
# Copyright (C) 2009 Lawrence Livermore National Security
# Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
# Written by Dave Bremer <dbremer@llnl.gov>
# 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
source ./inc3.11.1
source ./inc3.11.2
source ./inc3.11.3
source ./inc3.11.4
source ./inc3.11.5
source ./inc3.11.6
source ./inc3.11.7
source ./inc3.11.8
source ./inc3.11.9
source ./inc3.11.10
source ./inc3.11.11
set file_in "$test_dir/input"
set res_name ""
set res_name_save ""
set res_nodes ""
set res_nodecnt 0
set res_thread_cnt 0
set res_partition ""
set res_flags ""
set user_name ""
set def_oversubscribe_force 0
set def_partition ""
set def_node ""
set def_node_name ""
set def_node_inx_min_int -1
set def_node_inx_max_int -1
set def_node_inx_min ""
set def_node_inx_max ""
set ii 0
set log_cpu_cnt 0
if {![is_super_user]} {
skip "This test can't be run except as SlurmUser"
}
set select_type_parameters [get_config_param "SelectTypeParameters"]
if {[param_contains $select_type_parameters "CR_ONE_TASK_PER_CORE"]} {
skip "This test is incompatible SelectTypeParameters=CR_ONE_TASK_PER_CORE"
}
set have_resv 0
spawn $scontrol show res $res_name
expect {
-re "ReservationName=($re_word_str)" {
incr have_resv
exp_continue
}
eof {
wait
}
}
if {$have_resv != 0} {
log_warn "$have_resv reservations exist at start of test which may interfere with the test"
}
#
# Identify usable nodes in default partition
#
set def_partition [default_partition]
if {$def_partition eq ""} {
fail "Failed to find default partition"
}
spawn $scontrol show partition $def_partition
expect {
-re " OverSubscribe=FORCE" {
set def_oversubscribe_force 1
exp_continue
}
eof {
wait
}
}
spawn $sinfo -h -o "=%N=" -tIDLE -p $def_partition
expect {
-re "=(.+)=" {
set def_node $expect_out(1,string)
exp_continue
}
eof {
wait
}
}
if {$def_node eq ""} {
fail "Default partition seems to have no nodes"
}
# Some tests need nodenames in the regular form of node[min-max]
# Note that the regular form needs to end with the number range
set irregular_node_name 0
set first_nodes [lindex [split $def_node ","] 0]
if {![regexp -line {^([^[]+)\[(\d+)-(\d+)\]$} $first_nodes - def_node_name def_node_inx_min def_node_inx_max]} {
log_warn "Node name format not supported for all test"
set irregular_node_name 1
} else {
# Avoid Octals
set def_node_inx_min_int [scan $def_node_inx_min "%d"]
set def_node_inx_max_int [scan $def_node_inx_max "%d"]
}
#
# Determine system size
#
set core_spec 0
set cores_per_socket 0
set sockets_per_node 0
set heterogeneous 0
log_user 0
spawn $scontrol show node $def_node -o
expect {
-re "CoresPerSocket=($number)" {
if {$cores_per_socket == 0} {
set cores_per_socket $expect_out(1,string)
} elseif {$cores_per_socket != $expect_out(1,string)} {
set heterogeneous 1
}
exp_continue
}
-re "Sockets=($number)" {
if {$sockets_per_node == 0} {
set sockets_per_node $expect_out(1,string)
} elseif {$sockets_per_node != $expect_out(1,string)} {
set heterogeneous 1
}
exp_continue
}
-re "CoreSpecCount=($number)" {
if {$expect_out(1,string) > 0} {
set core_spec 1
}
exp_continue
}
-re "CPUSpecList=($number)" {
set core_spec 1
exp_continue
}
eof {
wait
}
}
log_user 1
if {$heterogeneous != 0} {
log_warn "Cluster is heterogeneous and some tests may fail"
}
set cores_per_node [expr $cores_per_socket * $sockets_per_node]
set node_count [llength [get_nodes_by_state idle,alloc,comp]]
set cluster_cpus [expr $cores_per_node * $node_count]
set cr_socket 0
if {[param_contains $select_type_parameters "CR_SOCKET*"]} {
set cr_socket 1
}
# Retrieve a node from partition and total cores in partition
set states "idle"
set node_list [get_nodes_by_state $states $def_partition]
set part_node_cnt [llength $node_list]
if {$part_node_cnt == 0} {
fail "Unable to get $states nodes in default partition ($def_partition)"
}
set part_node [lindex $node_list 0]
set part_node_cores [get_node_cores $part_node]
if {$part_node_cores == -1} {
fail "Unable to get cores from node ($part_node)"
}
set part_cores [get_part_total_cores $def_partition $states]
if {$part_cores == 0} {
fail "Unable to get cores from $states nodes in default partition ($def_partition"
}
#
# Get the user name
#
set user_name [get_my_user_name]
set cons_tres_actived 0
if {$def_oversubscribe_force == 0} {
if {[check_config_select "cons_tres"]} {
set cons_tres_actived 1
}
}
set exclusive [default_part_exclusive]
if {$cons_tres_actived == 1} {
inc3_11_1
} else {
subskip "TEST 3.11.1 skipped because it needs cons_tres"
}
inc3_11_2
inc3_11_3
inc3_11_4
inc3_11_5
inc3_11_6
if {$cons_tres_actived == 1 && $part_node_cores > 1 && $core_spec == 0 && $exclusive == 0 && $cr_socket == 0} {
inc3_11_7
inc3_11_8
} else {
subskip "TEST 3.11.7 skipped because it needs cons_tres and other conditions ($cons_tres_actived == 1 && $part_node_cores > 1 && $core_spec == 0 && $exclusive == 0 && $cr_socket == 0)"
subskip "TEST 3.11.8 skipped because it needs cons_tres and other conditions ($cons_tres_actived == 1 && $part_node_cores > 1 && $core_spec == 0 && $exclusive == 0 && $cr_socket == 0)"
}
if {$cons_tres_actived == 1 && $part_node_cores > 1 && $core_spec == 0 && $exclusive == 0 && $cr_socket == 0 && $irregular_node_name == 0 && $heterogeneous == 0} {
inc3_11_9
} else {
subskip "TEST 3.11.9 skipped because it needs cons_tres and other conditions ($cons_tres_actived == 1 && $part_node_cores > 1 && $core_spec == 0 && $exclusive == 0 && $cr_socket == 0 && $irregular_node_name == 0 && $heterogeneous == 0)"
}
inc3_11_10
inc3_11_11