blob: 128e3cfa3ee0ef217ed52215a760387f5f4bd7d5 [file] [log] [blame]
#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
# sacctmgr dump test
############################################################################
# Copyright (C) 2008-2010 Lawrence Livermore National Security.
# Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
# Written by Joseph Donaghy <donaghy1@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_accounting
set file_in "$test_dir/input"
set file_in2 "$test_dir/input2"
set file_in3 "$test_dir/input3"
set file_out "$test_dir/output"
set file_out2 "$test_dir/output2"
set file_out3 "$test_dir/output3"
set file_out4 "$test_dir/output4"
set lis list
set as assoc
set fmt format
set cln clean
set tre tree
set was withassoc
set wco withcoordinator
set par Parent
set roo root
set clu Cluster
set tc1 "${test_name}-cluster-1"
set tc2 "${test_name}-cluster-2"
set tc3 "${test_name}-cluster-3"
set acc Account
set nams names
set ta1 "${test_name}-account.1"
set ta2 "${test_name}-account.2"
set ta3 "${test_name}-account.3"
set ta4 "${test_name}-account.4"
set dsc Description
set org Organization
set usr User
set tu1 "${test_name}-user.1"
set tu2 "${test_name}-user.2"
set tu3 "${test_name}-user.3"
set tu4 "${test_name}-user.4"
set qs QOS
set qs2 runfirst
set al AdminLevel
set aln None
set ala Administrator
set alo Operator
set coo Coordinator
set col CoordinatorList
set dac DefaultAccount
set pts Partitions
set pde pdebug
set pba pbatch
set dw DefaultWCKey
set wk WCKeys
set fs Fairshare
set gm GrpTRESMins
set gc GrpTRES
set gj GrpJobs
set gs GrpSubmitJobs
set gw GrpWall
set mm MaxTRESMins
set mp MaxTRESMinsPerJob
set mc MaxTRES
set mu MaxTRESPerJob
set mj MaxJobs
set ms MaxSubmitJobs
set mw MaxWall
set md MaxWallDurationPerJob
set wckey_check hole,latch,stone,turn
# Accounts
array set acct_req {
parent root
description appliedacct
organization organization
fairshare 5678
grptresmins cpu=5500
grptres cpu=50,node=530
grpjobs 510
grpsubmitjobs 520
grpwall 300
maxtres cpu=540,node=570
maxtresmins cpu=550000
maxjobs 550
maxsubmitjobs 560
maxnodes 570
maxwall 350
}
set acct_req(qos) $qs2
set acct_req(cluster) $tc3
array set acct_req2 {
description theoryacct
organization theoryorg
fairshare 4321
grptresmins cpu=4000
grptres cpu=40,node=430
grpjobs 410
grpsubmitjobs 420
grpwall 240
maxtresmins cpu=420000
maxtres cpu=440,node=470
maxjobs 450
maxsubmitjobs 460
maxwall 280
}
set acct_req2(qos) $qs2
set acct_req2(cluster) $tc3
set acct_req2(parent) $ta4
array set acct_req3 {
description physicsacct
organization physicsorg
fairshare 3240
grptresmins cpu=3300
grptres cpu=30,node=330
grpjobs 310
grpsubmitjobs 320
grpwall 180
maxtresmins cpu=330000
maxtres cpu=340,node=370
maxjobs 350
maxsubmitjobs 360
maxwall 210
}
set acct_req3(qos) $qs2
set acct_req3(cluster) $tc3
set acct_req3(parent) $ta3
# Users
array set user_req {
adminlevel Administrator
defaultwckey hole
wckey latch,stone,turn
fairshare 3240
grptresmins cpu=3300
grptres cpu=30,node=330
grpjobs 310
grpsubmitjobs 320
grpwall 180
maxtresmins cpu=330000
maxtres cpu=340,node=370
maxjobs 350
maxsubmitjobs 360
maxwall 210
}
set user_req(qos) $qs2
set user_req(cluster) $tc3
set user_req(account) $ta4
set user_req(defaultaccount) $ta3
array set user_req2 {
adminlevel Operator
defaultwckey stone
wckey latch,hole,turn
fairshare 2375
grptresmins cpu=2000
grptres cpu=20,node=230
grpjobs 210
grpsubmitjobs 220
grpwall 120
maxtresmins cpu=220000
maxtres cpu=240,node=270
maxjobs 250
maxsubmitjobs 260
maxwall 140
}
set user_req2(qos) $qs2
set user_req2(cluster) $tc3
set user_req2(account) $ta3
set user_req2(defaultaccount) $ta2
array set user_req3 {
adminlevel None
defaultwckey latch
wckey stone,hole,turn
fairshare 1000
grptresmins cpu=1100
grptres cpu=10,node=140
grpjobs 120
grpsubmitjobs 130
grpwall 60
maxtresmins cpu=110000
maxtres cpu=150,node=180
maxjobs 160
maxsubmitjobs 170
maxwall 70
}
set user_req3(qos) $qs2
set user_req3(cluster) $tc3
set user_req3(account) $ta2
set user_req3(defaultaccount) $ta2
# Clusters
array set clus_req {
fairshare 6789
grptres cpu=60,node=630
grpjob 610
grpsubmit 620
maxtres cpu=640,node=670
maxtresmin cpu=660000
maxjobs 650
maxsubmit 660
maxwall 2880
}
# I couldn't figure out how to make a variable in an array to = the value of
# another variable. If you figure this out just move this into the above
# array definition.
set clus_req(qos) $qs2
set timeout 60
set access_err 0
set timeout 60
#
# Check accounting config and bail if not found.
#
if {[get_config_param "AccountingStorageType"] ne "accounting_storage/slurmdbd"} {
skip "This test can't be run without a usable AccountStorageType"
}
if {[get_admin_level] ne "Administrator"} {
skip "This test can't be run without being an Accounting administrator.\nUse: sacctmgr mod user \$USER set admin=admin"
}
proc cleanup {} {
global qs2 ta2 ta3 ta4 tc1 tc2 tc3 tu1 tu2 tu3 tu4
remove_user "" "" "$tu1,$tu2,$tu3,$tu4"
remove_acct "" "$ta2,$ta3,$ta4"
remove_qos "$qs2"
remove_cluster "$tc1,$tc2,$tc3"
}
# Make sure we have a clean system and permission to do this work
cleanup
if {$access_err != 0} {
skip "Not authorized to perform this test"
}
# Add qos
if [add_qos "$qs2" ""] {
fail "Unable to add qos ($qs2)"
}
#
# Add cluster
if [add_cluster $tc3 [array get clus_req]] {
fail "Unable to add cluster ($tc3)"
}
# Add accounts
if [add_acct $ta4 [array get acct_req]] {
fail "Unable to add account ($ta4)"
}
if [add_acct $ta3 [array get acct_req2]] {
fail "Unable to add account ($ta3)"
}
if [add_acct $ta2 [array get acct_req3]] {
fail "Unable to add account ($ta2)"
}
# Add users
if [add_user $tu3 [array get user_req]] {
fail "Unable to add user ($tu3)"
}
if [add_user $tu2 [array get user_req2]] {
fail "Unable to add user ($tu2)"
}
if [add_user $tu1 [array get user_req3]] {
fail "Unable to add user ($tu1)"
}
set matches 0
spawn $sacctmgr -i dump $clu=$tc3 file=$file_out4
expect {
-re "(Cluster .* returned nothing)" {
fail "There was a problem with the dump"
}
-re "(No filename given)" {
fail "There was a problem with the file name"
}
-re "(Can only do one cluster at a time)" {
fail "There was a problem with the dump"
}
-re "too few arguments for keyword" {
fail "There was a problem with the dump request"
}
-re "Unknown option" {
fail "There was a problem with the request"
}
-re "(sacctmgr: QOS)" {
incr matches
exp_continue
}
-re "(Cluster - )" {
incr matches
exp_continue
}
timeout {
fail "sacctmgr list associations not responding"
}
eof {
wait
}
}
if {$matches != 2} {
fail "File dump 1 incorrect ($matches != 1)"
}
set matches 0
set tfile [open "$file_out4" r]
while {[gets $tfile line] != -1} {
if {$line eq "No such file or directory"} {
fail "There was a problem with the sacctmgr command"
} elseif {$line eq "$qs - '$qs2':$dsc='$qs2'"} {
log_debug "Match 0"
incr matches
} elseif {$line eq "$clu - '$tc3':$fs=$clus_req(fairshare):$gc=$clus_req(grptres):$gj=$clus_req(grpjob):$gs=$clus_req(grpsubmit):$mp=$clus_req(maxtresmin):$mu=$clus_req(maxtres):$mj=$clus_req(maxjobs):$ms=$clus_req(maxsubmit):$md=$clus_req(maxwall):$qs='$clus_req(qos)'"} {
log_debug "Match 1"
incr matches
} elseif {$line eq "$par - '$roo'"} {
log_debug "Match 2"
incr matches
} elseif {$line eq "$usr - '$roo':$dac='$roo':$al='$ala':$fs=1"} {
log_debug "Match 3"
incr matches
} elseif {$line eq "$acc - '$ta4':$dsc='$acct_req(description)':$org='$acct_req(organization)':$fs=$acct_req(fairshare):$gm=$acct_req(grptresmins):$gc=$acct_req(grptres):$gj=$acct_req(grpjobs):$gs=$acct_req(grpsubmitjobs):$gw=$acct_req(grpwall):$mp=$acct_req(maxtresmins):$mu=$acct_req(maxtres):$mj=$acct_req(maxjobs):$ms=$acct_req(maxsubmitjobs):$md=$acct_req(maxwall):$qs='$acct_req(qos)'"} {
log_debug "Match 4"
incr matches
} elseif {$line eq "$par - '$ta4'"} {
log_debug "Match 5"
incr matches
} elseif {$line eq "$usr - '$tu3':$dac='$user_req(defaultaccount)':$dw='$user_req(defaultwckey)':$al='$user_req(adminlevel)':$wk='$wckey_check':$fs=$user_req(fairshare):$gm=$user_req(grptresmins):$gc=$user_req(grptres):$gj=$user_req(grpjobs):$gs=$user_req(grpsubmitjobs):$gw=$user_req(grpwall):$mp=$user_req(maxtresmins):$mu=$user_req(maxtres):$mj=$user_req(maxjobs):$ms=$user_req(maxsubmitjobs):$md=$user_req(maxwall):$qs='$user_req(qos)'"} {
# should come through 2 times
log_debug "Match 6"
incr matches
} elseif {$line eq "$acc - '$ta3':$dsc='$acct_req2(description)':$org='$acct_req2(organization)':$fs=$acct_req2(fairshare):$gm=$acct_req2(grptresmins):$gc=$acct_req2(grptres):$gj=$acct_req2(grpjobs):$gs=$acct_req2(grpsubmitjobs):$gw=$acct_req2(grpwall):$mp=$acct_req2(maxtresmins):$mu=$acct_req2(maxtres):$mj=$acct_req2(maxjobs):$ms=$acct_req2(maxsubmitjobs):$md=$acct_req2(maxwall):$qs='$acct_req2(qos)'"} {
log_debug "Match 7"
incr matches
} elseif {$line eq "$par - '$ta3'"} {
log_debug "Match 8"
incr matches
} elseif {$line eq "$acc - '$ta2':$dsc='$acct_req3(description)':$org='$acct_req3(organization)':$fs=$acct_req3(fairshare):$gm=$acct_req3(grptresmins):$gc=$acct_req3(grptres):$gj=$acct_req3(grpjobs):$gs=$acct_req3(grpsubmitjobs):$gw=$acct_req3(grpwall):$mp=$acct_req3(maxtresmins):$mu=$acct_req3(maxtres):$mj=$acct_req3(maxjobs):$ms=$acct_req3(maxsubmitjobs):$md=$acct_req3(maxwall):$qs='$acct_req3(qos)'"} {
log_debug "Match 9"
incr matches
} elseif {$line eq "$par - '$ta2'"} {
log_debug "Match 10"
incr matches
} elseif {$line eq "$usr - '$tu1':$dac='$user_req3(defaultaccount)':$dw='$user_req3(defaultwckey)':$wk='$wckey_check':$fs=$user_req3(fairshare):$gm=$user_req3(grptresmins):$gc=$user_req3(grptres):$gj=$user_req3(grpjobs):$gs=$user_req3(grpsubmitjobs):$gw=$user_req3(grpwall):$mp=$user_req3(maxtresmins):$mu=$user_req3(maxtres):$mj=$user_req3(maxjobs):$ms=$user_req3(maxsubmitjobs):$md=$user_req3(maxwall):$qs='$user_req3(qos)'"} {
log_debug "Match 11"
incr matches
} elseif {$line eq "$usr - '$tu2':$dac='$user_req2(defaultaccount)':$dw='$user_req2(defaultwckey)':$al='$user_req2(adminlevel)':$wk='$wckey_check':$fs=$user_req2(fairshare):$gm=$user_req2(grptresmins):$gc=$user_req2(grptres):$gj=$user_req2(grpjobs):$gs=$user_req2(grpsubmitjobs):$gw=$user_req2(grpwall):$mp=$user_req2(maxtresmins):$mu=$user_req2(maxtres):$mj=$user_req2(maxjobs):$ms=$user_req2(maxsubmitjobs):$md=$user_req2(maxwall):$qs='$user_req2(qos)'"} {
# should come through 2 times
log_debug "Match 12"
incr matches
}
}
if {$matches != 15} {
fail "Parse of file for 15 entries incorrect ($matches != 15)"
}