#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Validate scontrol displays and updates Allow/Deny accounts.
############################################################################
# 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 part_name      "${test_name}_part"
set acct_name      "${test_name}_acct"

#
# 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 set_part_val {part_type part_val} {
	global scontrol part_name

	spawn $scontrol update partitionname=$part_name $part_type=$part_val
	expect {
		-re "Error" {
			fail "$part_type was not set"
		}
		timeout {
			fail "scontrol is not responding"
		}
		eof {
			wait
		}
	}
}

proc check_part {part_type part_val} {
	global scontrol part_name

	set val_found 0
	spawn $scontrol show partition=$part_name
	expect {
		-re "$part_type=$part_val" {
			set val_found 1
			exp_continue
		}
		timeout {
			fail "scontrol is not responding"
		}
		eof {
			wait
		}
	}

	if {$val_found != 1} {
		fail "$part_type was not set to $part_val"
	}
}

proc delete_part { } {
	global scontrol sacctmgr part_name acct_name

	spawn $scontrol delete partition=$part_name
	expect {
		-re "error" {
			fail "scontrol did not remove partition"
			exp_continue
		}
		timeout {
			fail "scontrol is not responding"
		}
		eof {
			wait
		}
	}

	set del_acct 0
	spawn $sacctmgr -i delete account $acct_name
	expect {
		-re "Deleting accounts" {
			set del_acct 1
			exp_continue
		}
		timeout {
			fail "sacctmgr is not responding"
		}
		eof {
			wait
		}
	}

	if {$del_acct != 1} {
		fail "Account was not deleted"
	}

}

proc cleanup {} {
	#
	# Delete the partition and the Account
	#
	delete_part
}

spawn $scontrol create partition=$part_name
expect {
	-re "error" {
		fail "Partition was not created"
	}
	timeout {
		fail "scontrol is not responding"
	}
	eof {
		wait
	}
}

set make_acct 0
spawn $sacctmgr -i create account $acct_name
expect {
	-re "Adding Account" {
		set make_acct 1
		exp_continue
	}
	timeout {
		fail "sacctmgr is not responding"
	}
	eof {
		wait
	}
}
if { $make_acct != 1 } {
	fail "Account was not added"
}

#
# Set AllowAccount
#
set_part_val allowaccount $acct_name

#
# Check that AllowAccounts is set in the partition
#
check_part AllowAccounts $acct_name

#
# Set AllowAccounts back to all
#
set_part_val allowaccount ALL

#
# Check that AllowAccounts is set back to all
#
check_part AllowAccounts ALL

#
# Set DenyAccount
#
set_part_val denyaccount $acct_name

#
# Check that DenyAccount was set
#
check_part DenyAccounts $acct_name

#
# Set DenyAccount to none
#
set_part_val denyaccount none

#
# Check that DenyAccount was set to ALL
#
check_part DenyAccounts none
