#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Confirm that a job executes with the proper node count
#          (--nodes option).
############################################################################
# Copyright (C) 2002-2007 The Regents of the University of California.
# Copyright (C) 2008 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

# find out if we have enough nodes to test functionality
set node_count [get_partition_param [default_partition] "TotalNodes"]
if { $node_count < 2 } {
	skip "Insufficient nodes in default partition ($node_count < 2)"
}

#
# Submit a 1 node job and validate that we don't get more than one
#
set host_0      ""
set task_cnt    0
set timeout $max_job_delay

spawn $srun -N1-1 -c 1 -l -t1 $bin_printenv SLURM_NODEID
expect {
	-re "(Task count specification invalid|configuration is not available)" {
		fail "Error unexpected, not able to submit job"
	}
	-re "($number):" {
		if {$task_cnt == 0} {
			set host_0 $expect_out(1,string)
		}
		incr task_cnt
		exp_continue
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}

subtest {$host_0 ne ""} "Should get SLURM_NODEID of task 0"

set alloc_fail 0
set task_cnt2  0
spawn $srun -N1-1 -w $host_0 -n [expr $task_cnt + 1] -l -t1 $bin_printenv SLURM_NODEID
expect {
	-re "($number):" {
		incr task_cnt2
		exp_continue
	}
	-re "Unable to allocate resources" {
		log_debug "This error is expected, no worries"
		set alloc_fail 1
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
subtest { $alloc_fail != 0 } "Should generate expected error message"
subtest { $task_cnt2 == 0 } "Should allocate more tasks than processors"

#
# Submit a 1 node job
#
set host_0      ""
set host_1      ""

spawn $srun -N1-1 -l -t1 $bin_printenv SLURM_NODEID
expect {
	-re "($number): *($re_word_str)" {
		if {$expect_out(1,string) == 0} {
			set host_0 $expect_out(2,string)
		}
		if {$expect_out(1,string) == 1} {
			set host_1 $expect_out(2,string)
		}
		exp_continue
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}

#
# Verify node count
#
subtest {$host_0 ne ""} "Should get SLURM_NODEID of task 0"
subtest {$host_1 eq ""} "Should start just one task"

#
# Submit a 1 to 3 node job
#
set host_0      ""
set host_1      ""
set host_2      ""
set host_3      ""
set timeout $max_job_delay
spawn $srun -N1-3 -l -t1 $bin_printenv SLURM_NODEID
expect {
	-re "($number): *($re_word_str)" {
		if {$expect_out(1,string) == 0} {
			set host_0 $expect_out(2,string)
		}
		if {$expect_out(1,string) == 1} {
			set host_1 $expect_out(2,string)
		}
		if {$expect_out(1,string) == 2} {
			set host_2 $expect_out(2,string)
		}
		if {$expect_out(1,string) == 3} {
			set host_3 $expect_out(2,string)
		}
		exp_continue
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}

#
# Verify node count
#
subtest {$host_0 ne ""} "Should get SLURM_NODEID of task 0"
subtest {$host_3 eq ""} "Should start no more than three tasks"
set dup_host 0
if {$host_0 eq $host_1} {
	set dup_host 1
}
if {$host_0 eq $host_2} {
	set dup_host 1
}
if {$host_0 eq $host_3} {
	set dup_host 1
}
subtest {$dup_host != 1} "Should not reuse a node in the allocation"

#
# Submit a 2 to 3 node job
#
set host_0      ""
set host_1      ""
set host_2      ""
set host_3      ""
set timeout $max_job_delay
spawn $srun -N2-3 -l -t1 $bin_printenv SLURM_NODEID
expect {
	-re "srun: error" {
		skip "Can't test srun task distribution"
	}
	-re "($number): *($re_word_str)" {
		if {$expect_out(1,string) == 0} {
			set host_0 $expect_out(2,string)
		}
		if {$expect_out(1,string) == 1} {
			set host_1 $expect_out(2,string)
		}
		if {$expect_out(1,string) == 2} {
			set host_2 $expect_out(2,string)
		}
		if {$expect_out(1,string) == 3} {
			set host_3 $expect_out(1,string)
		}
		exp_continue
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}

#
# Verify node count
#
subtest {$host_0 ne ""} "Should get SLURM_NODEID of task 0"
subtest {$host_1 ne ""} "Should get SLURM_NODEID of task 1"
subtest {$host_3 eq ""} "Should start no more that three tasks"
set dup_host 0
if {$host_0 eq $host_1} {
	set dup_host 1
}
if {$host_0 eq $host_2} {
	set dup_host 1
}
if {$host_0 eq $host_3} {
	set dup_host 1
}
subtest {$dup_host != 1} "Should not reuse a node in the allocation"
