#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Validate that scontrol show assoc_mgr shows the data cached in
#          the slurmctld
############################################################################
# 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 test_acct    "${test_name}_acct"
set test_user    ""

if {![is_super_user]} {
	skip "This test can't be run except as SlurmUser or root"
} elseif {![param_contains [get_config_param "AccountingStorageEnforce"] "limits"]} {
	skip "AccountingStorageEnforce limits must be set"
}

proc mod_assoc_vals { } {
	global sacctmgr test_acct test_user

	set modified 0
	spawn $sacctmgr mod -i account $test_acct where user=$test_user set \
	    GrpCpus=3 MaxJobs=2 MaxCPUs=6 Priority=9
	expect {
		-re "Modified account associations" {
			set modified 1
			exp_continue
		}
		timeout {
			fail "sacctmgr is not responding"
		}
		eof {
			wait
		}
	}

	if {!$modified} {
		fail "Account limits were not modified"
	}
}

proc clear_assoc_vals { } {
	global sacctmgr test_acct test_user

	set modified 0
	spawn $sacctmgr mod -i account $test_acct where user=$test_user set \
	    GrpCpus=-1 MaxJobs=-1 MaxCPUs=-1 Priority=-1
	expect {
		-re "Modified account associations" {
			set modified 1
			exp_continue
		}
		timeout {
			fail "sacctmgr is not responding"
		}
		eof {
			wait
		}
	}

	if {!$modified} {
		fail "Account limits were not modified"
	}
}

proc delete_test_acct { } {
	global test_acct sacctmgr

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

# Remove any vestigial accounts
delete_test_acct

# Get username
set test_user [get_my_user_name]

if {[get_config_param "AccountingStorageType"] eq "accounting_storage/slurmdbd"} {
	# Add test Account
	set acct_added 0
	set cluster [get_config_param "ClusterName"]
	spawn $sacctmgr add -i account $test_acct cluster=$cluster
	expect {
		-re "Adding Account" {
			set acct_added 1
			exp_continue
		}
		timeout {
			fail "sacctmgr is not responding"
		}
		eof {
			wait
		}
	}

	if {!$acct_added} {
		fail "Could not add test account ($test_acct)"
	}

	# Add user to test account
	set user_added 0
	spawn $sacctmgr add -i user $test_user account=$test_acct
	expect {
		-re "Associations" {
			set user_added 1
			exp_continue
		}
		timeout {
			fail "sacctmgr is not responding"
		}
		eof {
			wait
		}
	}

	if {!$user_added} {
		fail "Could not add user to test account"
	}

	set match 0
	spawn $bin_bash -c "exec $scontrol -o show assoc_mgr | $bin_grep Account=$test_acct| $bin_grep UserName=$test_user"
	expect {
		-re " Account=$test_acct" {
			incr match
			exp_continue
		}
		-re " UserName=$test_user" {
			incr match
			exp_continue
		}
		-re " GrpTRES=" {
			incr match
			exp_continue
		}
		-re " MaxJobs=" {
			incr match
			exp_continue
		}
		-re " MaxTRESPJ=" {
			incr match
			exp_continue
		}
		timeout {
			fail "scontrol is not responding"
		}
		eof {
			wait
		}
	}

	subtest {$match == 5} "1. Verify scontrol show assoc_mgr shows correct information" "$match != 5"

	# Set association limits and check that controller is updated
	mod_assoc_vals

	set match 0
	spawn $bin_bash -c "exec $scontrol -o show assoc_mgr | $bin_grep Account=$test_acct| $bin_grep UserName=$test_user"
	expect {
		-re " Account=$test_acct" {
			incr match
			exp_continue
		}
		-re " UserName=$test_user" {
			incr match
			exp_continue
		}
		-re " Priority=9" {
			incr match
			exp_continue
		}
		-re " GrpTRES=cpu=3" {
			incr match
			exp_continue
		}
		-re " MaxJobs=2" {
			incr match
			exp_continue
		}
		-re " MaxTRESPJ=cpu=6" {
			incr match
			exp_continue
		}
		timeout {
			fail "scontrol is not responding"
		}
		eof {
			wait
		}
	}

	subtest {$match == 6} "2. Verify scontrol show assoc_mgr shows correct information" "$match != 6"

	# Clear associtation limits and check controller is updated
	clear_assoc_vals

	set match 0
	set limit_match 0
	spawn $bin_bash -c "exec $scontrol show assoc_mgr | $bin_grep Account=$test_acct| $bin_grep UserName=$test_user"
	expect {
		-re " Account=$test_acct" {
			incr match
			exp_continue
		}
		-re " UserName=$test_user" {
			incr match
			exp_continue
		}
		-re " Priority=0" {
			incr match
			exp_continue
		}
		-re " GrpTRES=cpu=3" {
			incr limit_match
			exp_continue
		}
		-re " MaxJobs=2" {
			incr limit_match
			exp_continue
		}
		-re " MaxTRESPJ=cpu=6" {
			incr limit_match
			exp_continue
		}
		timeout {
			fail "scontrol is not responding"
		}
		eof {
			wait
		}
	}

	subtest {$match == 3 || ! $limit_match} "3. Verify scontrol show assoc_mgr shows correct information" "$match != 3"

	delete_test_acct

} else {

	set match 0
	spawn $scontrol show assoc_mgr
	expect {
		-re "Current Association Manager state" {
			incr match
			exp_continue
		}
		-re "No users currently cached in Slurm" {
			incr match
			exp_continue
		}
		-re "No associations currently cached in Slurm" {
			incr match
			exp_continue
		}
		-re "No QOS currently cached in Slurm" {
			incr match
			exp_continue
		}
		timeout {
			fail "scontrol is not responding"
		}
		eof {
			wait
		}
	}

	subtest {$match == 4} "4. Verify scontrol show assoc_mgr shows correct information" "$match != 4"
}
