#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Checks that scontrol write config creates a slurm.conf
#          with the correct values
############################################################################
# Copyright (C) 2014 SchedMD LLC
# Written by Nathan Yee <nyee32@schedmd.com>
#
# 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 option        ""
set value         ""
array set conf_val {}
set new_conf      ""
set opt_cnt       0

if {![is_super_user]} {
	skip "This test requires that the user be root or the SlurmUser"
}

proc cleanup {} {
	global bin_rm new_conf

	if {$new_conf ne ""} {
		run_command "$bin_rm -f $new_conf"
	}
}

#
# User scontrol show config to get some values to check
# against the new created file
#
log_user 0
set val ""
set option ""
spawn $scontrol show config
expect {
	-re "^$" {
		# break here since other config files are listed here
		# scontrol write config only prints out the normal slurm.conf
	}
	-re "($re_word_str) *= ($format_time)" {
		set option $expect_out(1,string)
		set val $expect_out(2,string)
		set conf_val($option) $val
		incr opt_cnt
		exp_continue
	}
	-re "($re_word_str) *= ($re_word_str)" {
		set option $expect_out(1,string)
		set val $expect_out(2,string)

		# Exclude ENV variable that appear in scontrol show config
		# Also "SuspendTime=NONE" gets written as "SuspendTime=0"
		if {$option != "BOOT_TIME" &&
		    $option != "HASH_VAL"  &&
		    $option != "MULTIPLE_SLURMD" &&
		    $option != "NEXT_JOB_ID" &&
		    $option != "SLURM_CONF" &&
		    $option != "SLURM_VERSION"} {
			set conf_val($option) $val
			incr opt_cnt
		}
		exp_continue
	}
	timeout {
		fail "scontrol is not responding"
	}
	eof {
		wait
	}
}
log_user 1

#
# Execute scontrol write config and get the filename of the created file
#
regexp {Slurm config saved to (\S+)} [run_command_output -fail "$scontrol write config"] {} new_conf

#
# Loop through the hash and check that the parameters exist within
# the new conf file
#
set tot_match 0
foreach opt [array names conf_val] {

	log_user 0
	set match 0

	spawn $bin_cat $new_conf
	expect {
		-re "$opt=$conf_val($opt)" {
			set match 1
			exp_continue
		}
		-re "#$opt=" {
			set match 1
			exp_continue
		}
		timeout {
			fail "scontrol is not responding"
		}
		eof {
			wait
		}
	}
	log_user 1

	if {$match != 1} {
		fail "$opt = $conf_val($opt) was not found in new config file"
	} else {
		incr tot_match
	}
}
subtest {$tot_match == $opt_cnt} "Verify all values found in the new config file" "$tot_match != $opt_cnt"
