#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Validate scontrol update size of running job.
############################################################################
# Copyright (C) 2010 Lawrence Livermore National Security.
# Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
# Written by Morris Jette <jette1@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

set file_in          "$test_dir/input"
set file_out         "$test_dir/output"
set file_out2        "$test_dir/output2"
set job_id           0
set node_cnt         2

set available [llength [get_nodes_by_state idle,alloc,comp]]
if {$available < $node_cnt} {
    skip "Not enough nodes currently available ($available avail, $node_cnt needed)"
}

proc cleanup {} {
	global job_id

	cancel_job $job_id
}

#
# Build input script file
#
make_bash_script $file_in "
	$srun -l $bin_id
	$scontrol show job \${SLURM_JOBID} >$file_out2
	$scontrol update JobId=\${SLURM_JOBID} NumNodes=1
	. slurm_job_\${SLURM_JOBID}_resize.sh
	$scontrol show job \${SLURM_JOBID} >>$file_out2
	$srun -l $bin_id
	echo SLURM_NNODES=\${SLURM_NNODES}
	$bin_rm -f slurm_job_\${SLURM_JOBID}_resize.csh
	$bin_rm -f slurm_job_\${SLURM_JOBID}_resize.sh"

#
# Run job to determine what nodes are available
#
set job_id [submit_job -fail "-N$node_cnt -J $test_name -t1 --output=$file_out $file_in"]

wait_for_job -fail $job_id "DONE"
wait_for_file -fail $file_out
set task_count 0
set node_count 0
spawn $bin_cat $file_out
expect {
	-re "slurm_allocation_lookup" {
		fail "Couldn't look up the job correctly"
	}
	-re "No such file or directory" {
		fail "For some reason the resize script wasn't found"
	}
	-re "($number): *uid=" {
		incr task_count
		exp_continue
	}
	-re "SLURM_NNODES=($number)" {
		set node_count $expect_out(1,string)
		exp_continue
	}
	eof {
		wait
	}
}
set task_target [expr $node_cnt + 1]
subtest {$task_count == $task_target} "Verify original task count" "$task_count != $task_target"
subtest {$node_count == 1} "Verify node count" "$node_count != 1"

wait_for_file -fail $file_out2
set node_count 0
spawn $bin_cat $file_out2
expect {
	-re "NumNodes=($number)" {
		incr node_count $expect_out(1,string)
		exp_continue
	}
	eof {
		wait
	}
}
subtest {$node_count == 3} "Verify updated node count" "$node_count != 3"
