#!/usr/bin/expect
############################################################################
# Purpose: Test of SLURM functionality
#          sacctmgr modify multiple users
#
#
# Output:  "TEST: #.#" followed by "SUCCESS" if test was successful, OR
#          "FAILURE: ..." otherwise with an explanation of the failure, OR
#          anything else indicates a failure mode that must be investigated.
############################################################################
# Copyright (C) 2008 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://computing.llnl.gov/linux/slurm/>.
# 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 test_id     "21.18"
set exit_code   0
set tc1		tcluster1
set tc2		tcluster2
set tc3		tcluster3
set fs1		2500
set fs2		1700
set fs3		1
set mc1		1000000
set mc2		700000
set mc3		1
set mj1		50
set mj2		70
set mj3		1
set mn1		300
set mn2		700
set mn3		1
set mw1		01:00:00
set mw2		00:07:00
set mw3		00:01:00
set clu		cluster
set cl1		1tmach
set cl2		2tmach
set cl3		3tmach
set acc		account
set acc		account
set nams	names
set nm1		testaccta1
set nm2		testaccta2
set nm3		testaccta3
set des		Description
set ds1		testaccounta1
set ds2		testacct
set org		Organization
set or1		accountorga1
set or2		acttrg
set qs		QosLevel
set qs1		normal
set par		parent
set usr		user
set us1		tuser1
set us2		tuser2
set us3		tuser3
set al		AdminLevel
set aln		None
set ala		Administrator
set alo		Operator
set dac		DefaultAccount
set pts		Partitions
set fs		fairshare
set mc		maxcpu
set mj		maxjob
set mn		maxnode
set mw		maxwall
set dbu		debug
set access_err  0


print_header $test_id

set timeout 60

#
# Check accounting config and bail if not found.
#
if { [test_account_storage] == 0 } {
	send_user "\nWARNING: This test can't be run without a usable AccountStorageType\n"
	exit 0
}

if { [string compare [check_accounting_admin_level] "Administrator"] } {
	send_user "\nWARNING: This test can't be run without being an Accounting administrator.\nUse sacctmgr mod user \$USER_NAME admin=admin.\n"
	exit 0
}

#make sure we have a clean system and permission to do this work
remove_user "" "" "$us1,$us2,$us3"
remove_acct "" "$nm1,$nm2,$nm3"
remove_cluster "$tc1,$tc2,$tc3"
if {$access_err != 0} {
	send_user "\nWARNING: not authorized to perform this test\n"
	exit $exit_code
}

#add cluster
incr exit_code [add_cluster "$tc1,$tc2,$tc3" "" "" "" "" "" "" "" "" "" "" "" ""]
if { $exit_code } {
	remove_user "" "" "$us1,$us2,$us3"
	remove_acct "" "$nm1,$nm2,$nm3"
	remove_cluster "$tc1,$tc2,$tc3"
	exit $exit_code
}

#add accounts
incr exit_code [add_acct "$tc1,$tc2,$tc3" "" "$nm1,$nm2,$nm3" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""]
if { $exit_code } {
	remove_user "" "" "$us1,$us2,$us3"
	remove_acct "" "$nm1,$nm2,$nm3"
	remove_cluster "$tc1,$tc2,$tc3"
	exit $exit_code
}

#add users
incr exit_code [add_user  "$tc1,$tc2,$tc3" "$nm1,$nm2,$nm3" "$us1,$us2,$us3" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""]
if { $exit_code } {
	remove_user "" "" "$us1,$us2,$us3"
	remove_acct "" "$nm1,$nm2,$nm3"
	remove_cluster "$tc1,$tc2,$tc3"
	exit $exit_code
}

# First test change the AdminLevel and DefaultAccount of the accounts
# cluster account name part wadmin wdacct wdwckey qos fairshare grpcpumin grpcpu grpjob grpnode grpsubmit grpwall maxcpumin maxcpu maxjob maxnode maxsubmit maxwall admin dacct dwckey
incr exit_code [mod_user "$tc1,$tc2,$tc3" "" "$us1,$us2,$us3" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" $alo $nm2 ""]
if { $exit_code } {
	remove_user "" "" "$us1,$us2,$us3"
	remove_acct "" "$nm1,$nm2,$nm3"
	remove_cluster "$tc1,$tc2,$tc3"
	exit $exit_code
}

#
# Use sacctmgr to list the test account modifications
#
set matches 0
set my_pid [spawn $sacctmgr -n -p list user names=$us1,$us2,$us3 format="User,DefaultA,Admin" cluster=$tc1]
expect {
	-re "There was a problem" {
	        send_user "FAILURE: there was a problem with the sacctmgr command\n"
	    	incr exit_code 1
	}
	-re "($us1|$us2|$us3).$nm2.$alo." {
		incr matches
		exp_continue
	}
	timeout {
		send_user "\nFAILURE: sacctmgr list associations not responding\n"
		slow_kill $my_pid
		incr exit_code 1
	}
	eof {
		wait
	}
}

if {$matches != 3} {
	send_user "\nFAILURE:  Account modification 1 incorrect with only $matches.\n"
	incr exit_code 1
}

# Test change the AdminLevel and DefaultAccount of two accounts
# cluster account name part wadmin wdacct wdwckey qos fairshare grpcpumin grpcpu grpjob grpnode grpsubmit grpwall maxcpumin maxcpu maxjob maxnode maxsubmit maxwall admin dacct dwckey
incr exit_code [mod_user "$tc1,$tc2,$tc3" "" "$us1,$us3" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" $ala $nm3 ""]
if { $exit_code } {
	remove_user "" "" "$us1,$us2,$us3"
	remove_acct "" "$nm1,$nm2,$nm3"
	remove_cluster "$tc1,$tc2,$tc3"
	exit $exit_code
}

#
# Use sacctmgr to list the test account modifications
#
set matches 0
set my_pid [spawn $sacctmgr -n -p list user names=$us1,$us2,$us3 format="User,DefaultA,Admin" cluster=$tc1]
expect {
	-re "There was a problem" {
	        send_user "FAILURE: there was a problem with the sacctmgr command\n"
	    	incr exit_code 1
	}
	-re "(($us1|$us3).$nm3.$ala.|$us2.$nm2.$alo.)" {
		incr matches
		exp_continue
	}
	timeout {
		send_user "\nFAILURE: sacctmgr list associations not responding\n"
		slow_kill $my_pid
		incr exit_code 1
	}
	eof {
		wait
	}
}

if {$matches != 3} {
	send_user "\nFAILURE:  Account modification 1 incorrect with only $matches.\n"
	incr exit_code 1
}

# Next, test change the limits of the users
# cluster account name part wadmin wdacct wdwckey qos fairshare grpcpumin grpcpu grpjob grpnode grpsubmit grpwall maxcpumin maxcpu maxjob maxnode maxsubmit maxwall admin dacct dwckey

incr exit_code [mod_user "$tc1,$tc2" "" "$us1,$us2,$us3" "" "" "" "" "" $fs2 "" "" "" "" "" "" $mc2 "" $mj2 $mn2 "" $mw2 "" "" ""]
if { $exit_code } {
	remove_user "" "" "$us1,$us2,$us3"
	remove_acct "" "$nm1,$nm2,$nm3"
	remove_cluster "$tc1,$tc2,$tc3"
	exit $exit_code
}

#
# Use sacctmgr to list the test user modifications
#
set matches 0
set my_pid [spawn $sacctmgr -n -p list assoc users=$us1,$us2,$us3 format="User,Cluster,Fairshare,Maxcpum,MaxJ,MaxN,MaxW"]
expect {
	-re "There was a problem" {
	        send_user "FAILURE: there was a problem with the sacctmgr command\n"
	    	incr exit_code 1
	}
	-re "(($us1|$us2|$us3).($tc1|$tc2).$fs2.$mc2.$mj2.$mn2.$mw2.)" {
		incr matches
		exp_continue
	}
	timeout {
		send_user "\nFAILURE: sacctmgr list associations not responding\n"
		slow_kill $my_pid
		incr exit_code 1
	}
	eof {
		wait
	}
}

if {$matches != 18} {
	send_user "\nFAILURE:  User modification 2 incorrect with only $matches.\n"
	incr exit_code 1
}

# Next, test change the limits of two users
# adminlevel defaultaccount fs maxcpu maxjob maxnodes maxwall waccounts wcluster wnames

incr exit_code [mod_user "$tc1,$tc2,$tc3" "" "$us1,$us3" "" "" "" "" "" $fs3 "" "" "" "" "" "" $mc3 "" $mj3 $mn3 "" $mw3 "" "" ""]
if { $exit_code } {
	remove_user "" "" "$us1,$us2,$us3"
	remove_acct "" "$nm1,$nm2,$nm3"
	remove_cluster "$tc1,$tc2,$tc3"
	exit $exit_code
}

#
# Use sacctmgr to list the test user modifications
#
set matches 0
set my_pid [eval spawn $sacctmgr -n -p list assoc user=$us1,$us2,$us3 format="User,Cluster,Fairshare,Maxcpum,MaxJ,MaxN,MaxW"]
expect {
	-re "There was a problem" {
	        send_user "FAILURE: there was a problem with the sacctmgr command\n"
	    	incr exit_code 1
	}
	# Any time you use () around something you need to combine all
	# those things together since you can miss some and they be thrown away
	-re "(($us1|$us3).($tc1|$tc2).$fs3.$mc3.$mj3.$mn3.$mw3.|$us2.($tc1|$tc2).$fs2.$mc2.$mj2.$mn2.$mw2.)" {
		incr matches
		exp_continue
	}
	timeout {
		send_user "\nFAILURE: sacctmgr list associations not responding\n"
		slow_kill $my_pid
		incr exit_code 1
	}
	eof {
		wait
	}
}

if {$matches != 18} {
	send_user "\nFAILURE:  User modification 2 incorrect with $matches.\n"
	incr exit_code 1
}

# This is the end below here

incr exit_code [remove_user "" "" "$us1,$us2,$us3"]
incr exit_code [remove_acct "" "$nm1,$nm2,$nm3"]
incr exit_code [remove_cluster "$tc1,$tc2,$tc3"]

if {$exit_code == 0} {
	send_user "\nSUCCESS\n"
} else {
	send_user "\nFAILURE\n"
}
exit $exit_code

