#!/usr/bin/env expect ############################################################################ # Purpose: Test of Slurm functionality # Validate that Allow/Deny accounts are enforced. ############################################################################ # Copyright (C) 2013 SchedMD LLC # Written by Nathan Yee # # This file is part of Slurm, a resource management program. # For details, see . # 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 user_name "" set node_name "" set cluster_name "" set acct_good "test${test_id}_acct_good" set acct_bad "test${test_id}_acct_bad" set part_name "test${test_id}_part" set exit_code 0 # # Check accounting config and bail if not found. # if { [test_account_storage] == 0 } { skip "This test can't be run without a usable AccountStorageType" } if { [string compare [check_accounting_admin_level] "Administrator"] } { skip "This test can't be run without being an Accounting administrator.\nUse: sacctmgr mod user \$USER set admin=admin" } proc set_part_val {part_type part_val} { global scontrol part_name exit_code spawn $scontrol update partitionname=$part_name $part_type=$part_val expect { -re "Error" { log_error "$part_type was not set" set exit_code 1 } timeout { log_error "scontrol is not responding" set exit_code 1 } eof { wait } } } proc cleanup { } { global scancel scontrol sacctmgr part_name acct_good acct_bad exit_code set del_part 0 spawn $scancel -p $part_name expect { timeout { log_error "scancel is not responding" set exit_code 1 } eof { wait } } log_debug "Any error, except for unresponsiveness, from the previous scancel is expected and should be ignored" spawn $scontrol delete partition=$part_name expect { -re "error" { log_error "scontrol did not remove partition $part_name" set exit_code 1 exp_continue } timeout { log_error "scontrol is not responding" set exit_code 1 } eof { wait } } spawn $sacctmgr -i delete account $acct_good $acct_bad expect { -re "Deleting accounts" { set del_part 1 exp_continue } timeout { log_error "sacctmgr is not responding" set exit_code 1 } eof { wait } } return $del_part } proc create_acct { acct } { global sacctmgr exit_code user_name cluster_name set create_acct 0 spawn $sacctmgr -i create account $acct cluster=$cluster_name expect { -re "Adding Account" { set create_acct 1 exp_continue } timeout { log_error "sacctmgr is not responding" set exit_code 1 } eof { wait } } spawn $sacctmgr -i create user $user_name account=$acct cluster=$cluster_name expect { timeout { log_error "sacctmgr is not responding" set exit_code 1 } eof { wait } } if {$create_acct !=1 } { log_error "Account was not added" set exit_code 1 } } proc test_part { acct part acct_con } { global srun exit_code set sub_job 0 spawn $srun -I5 -A $acct -p $part true expect { -re "error" { if { $acct_con == 1 } { log_debug "This error is expected" } else { log_error "This error should not have occured" set exit_code 1 } exp_continue } timeout { log_error "srun is not responding" set exit_code 1 } eof { wait } } } # Remove any vestigial accounts or partitions cleanup set user_name [get_my_user_name] set node_name [get_idle_node_in_part] set cluster_name [get_cluster_name] # NOTE: acct_good should always work and # acct_bad should always cause an error # # Create good account # create_acct $acct_good # # Create bad account # create_acct $acct_bad # Create partition spawn $scontrol create partition=$part_name nodes=$node_name expect { -re "error" { log_error "Partition was not created" set exit_code 1 } timeout { log_error "scontrol is not reponding" set exit_code 1 } eof { wait } } # # Set Allow Account to good values # set_part_val allowaccount $acct_good ######Testing AllowAccount##### log_info "Testing AllowAccount" # # Test partition with good values # 0 = good test / 1 = bad test # test_part $acct_good $part_name 0 # # Test partition with bad values # 0 = good test / 1 = bad test # test_part $acct_bad $part_name 1 # # Set Allow Accounts to all and # set Deny Account to bad value # set_part_val allowaccount ALL set_part_val denyaccount $acct_bad ######Testing DenyAccount##### log_info "Testing DenyAccount" # # Test partition with good values # 0 = good test / 1 = bad test # test_part $acct_good $part_name 0 # # Test partition with bad values # 0 = good test / 1 = bad test # test_part $acct_bad $part_name 1 sleep 5 # Delete partition and accounts if {[cleanup] != 1} { fail "Account was not deleted" } if {$exit_code != 0} { fail "Test failed due to previous errors (\$exit_code = $exit_code)" }