#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          sacctmgr add multiple accounts
############################################################################
# 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
source ./globals_accounting

set almatches   0
set damatches   0
set dcmatches   0
# Cluster Names #
set tc1                 "${test_name}-cluster-1"
set tc2                 "${test_name}-cluster-2"
# Cluster values #
array set cluster {}
set cluster(Fairshare)  2500
set cluster(MaxCPUs)    100
set cluster(MaxJobs)    50
set cluster(MaxNodes)   300
set cluster(MaxWall)    01:00:00
# Account Name #
set ta1                 "${test_name}-account.1"
set ta2                 "${test_name}-account.2"
# Account Limits #
array set acct {}
set acct(Cluster)       $tc1
set acct(Fairshare)     2500
set acct(GrpCPUMins)    100
set acct(GrpCPURunMins) 150
set acct(GrpCPUs)       50
set acct(GrpJobs)       100
set acct(GrpMemory)     60
set acct(GrpSubmitJobs) 500
set acct(GrpNodes)      100
set acct(GrpWall)       00:45:00
set acct(MaxCPUMins)    100000
set acct(MaxCPUs)       100
set acct(MaxJobs)       50
set acct(MaxSubmitJobs) 60
set acct(MaxNodes)      300
set acct(MaxWall)       01:00:00
set acct(DefaultQos)    "${test_name}_qos"
set acct(Organization)  "Account_Org_A1"
set acct(Description)   "Test_Account_A1"

set access_err  0
set timeout 60

if {[get_config_param "AccountingStorageType"] ne "accounting_storage/slurmdbd"} {
	skip "This test can't be run without a usable AccountStorageType"
}

#
# Verify if have administrator privileges
#
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 sacctmgr ta1 ta2 tc1 tc2 acct

	run_command "$sacctmgr -i delete account $ta1,$ta2"
	run_command "$sacctmgr -i delete cluster $tc1,$tc2"
	run_command "$sacctmgr -i delete qos $acct(DefaultQos)"
}

# 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 test Cluster
#
add_cluster "$tc1,$tc2" [array get cluster]

if {$access_err != 0} {
	skip "Not authorized to perform this test"
}

if {![check_acct_associations]} {
	fail "Our associations don't line up"
}

#
# Create tmp QOS
#
set qos_set 0
spawn $sacctmgr -i add qos $acct(DefaultQos)
expect {
	-re "Adding QOS" {
		set qos_set 1
		exp_continue
	}
	timeout {
		fail "sacctmgr is not responding"
	}
	eof {
		wait
	}
}
if {$qos_set != 1} {
	fail "QOS ($acct(DefaultQos)) was not created"
}

#
# Add test Account
#
add_acct "$ta1,$ta2" [array get acct]

#
# Use sacctmgr to list the test associations
#
spawn $sacctmgr -p list associations cluster=$tc1,$tc2
expect {
	-re "$tc1.$ta1" {
		incr almatches
		exp_continue
	}
	-re "$tc1.$ta2" {
		incr almatches
		exp_continue
	}
	-re "$tc2.$ta1" {
		fail "Account 1 ($ta1) erroneously added to cluster 2 ($tc2)"
	}
	-re "$tc2.$ta2" {
		fail "Account 2 ($ta2) erroneously added to cluster 2 ($tc2)"
	}
	timeout {
		fail "sacctmgr list associations not responding"
	}
	eof {
		wait
	}
}

if {$almatches != 2} {
	fail "Added associations not found (Need 2 matches and got $almatches instead)"
}
# Check that the Association was set correctly
if {![check_assoc_limit 2 account $ta1 [array get acct]]} {
	fail "The association limits for account 1 ($ta1) were not set correctly"
}
if {![check_assoc_limit 2 account $ta2 [array get acct]]} {
	fail "The association limits for account 2 ($ta2) were not set correctly"
}

if {![check_acct_associations]} {
	fail "Our associations don't line up"
}
