#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Test that a job executes with the specified nodes, requires multiple
#          nodes (--nodes, --nodelist and --exclude options).
############################################################################
# Copyright (C) 2002-2006 The Regents of the University of California.
# 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 job_id           0

proc cleanup {} {
	global job_id

	cancel_job $job_id
}

#
# Submit a 3+ node job
#
set host_0      ""
set host_1      ""
set host_2      ""
set host_3      ""
set node_cnt 3

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)"
}

#
# Build input script file
#
make_bash_script $file_in "$srun -l $bin_printenv SLURMD_NODENAME"

#
# Run job to determine what nodes are available
#
spawn $sbatch -N$node_cnt -vv -t1 --output=$file_out $file_in
expect {
	-re "nodes *: ($number)" {
		if {$expect_out(1,string) != $node_cnt} {
			fail "Failed to process --nodes option ($expect_out(1,string) != $node_cnt)"
		}
		exp_continue
	}
	-re "Submitted batch job ($number)" {
		set job_id $expect_out(1,string)
		exp_continue
	}
	timeout {
		fail "sbatch not responding"
	}
	eof {
		wait
	}
}
if {$job_id == 0} {
	fail "Job not submitted"
}
wait_for_job -fail $job_id "DONE"
wait_for_file -fail $file_out
spawn $bin_cat $file_out
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
	}
	eof {
		wait
	}
}

#
# Verify node count
#
subtest {$host_0 ne ""} "Verify that we got hostname of task 0"
subtest {$host_1 ne ""} "Verify that we got hostname of task 1"
subtest {$host_2 ne ""} "Verify that we got hostname of task 2"

subtest {$host_3 eq ""} "Verify that we did not start more than three tasks"

set dup_hostname 0
if {$host_0 eq $host_1} {
	incr dup_hostname
}
if {$host_0 eq $host_2} {
	incr dup_hostname 1
}
if {$dup_hostname == 1} {
	fail "Re-used a node in the allocation"
}

#
# Submit a job explicitly excluding a node
#
set exclude_node $host_0
set include_node $host_2
set job_id      0
set host_0      ""
set host_1      ""
set host_2      ""
file delete $file_out
spawn $sbatch -N2 --exclude=$exclude_node -t1 --output=$file_out $file_in
expect {
	-re "Submitted batch job ($number)" {
		set job_id $expect_out(1,string)
		exp_continue
	}
	timeout {
		fail "sbatch not responding"
	}
	eof {
		wait
	}
}
wait_for_job -fail $job_id "DONE"
wait_for_file -fail $file_out
spawn $bin_cat $file_out
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)
		}
		exp_continue
	}
	eof {
		wait
	}
}

#
# Verify node count and names
#
subtest {$host_0 ne ""} "Verify that we got hostname of task 0"
subtest {$host_1 ne ""} "Verify that we got hostname of task 1"
subtest {$host_2 eq ""} "Verify that we did not start more than two tasks"
set dup_hostname 0
if {$host_0 eq $exclude_node} {
	set dup_hostname 1
}
if {$host_1 eq $exclude_node} {
	set dup_hostname 1
}
if {$dup_hostname == 1} {
	fail "Allocated an excluded node"
}

#
# Submit a job explicitly including a node
#
set job_id      0
set host_0      ""
set host_1      ""
file delete $file_out
spawn $sbatch -N1 --nodelist=$include_node -t1 --output=$file_out $file_in
expect {
	-re "Submitted batch job ($number)" {
		set job_id $expect_out(1,string)
		exp_continue
	}
	timeout {
		fail "sbatch not responding"
	}
	eof {
		wait
	}
}
wait_for_job -fail $job_id "DONE"
wait_for_file -fail $file_out
spawn $bin_cat $file_out
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
	}
	eof {
		wait
	}
}

#
# Verify node count and names
#
subtest {$host_0 ne ""} "Verify that we got hostname of task 0"
subtest {$host_1 eq ""} "Verify that we did not start more than one task"
set dup_hostname 0
if {$host_0 eq $include_node} {
	set dup_hostname 1
}
if {$dup_hostname == 0} {
	fail "Allocation lacked an included node"
}
