#!/usr/bin/env expect
############################################################################
# Purpose: Test of srun functionality
#          Test of hostfile option (-hostfile).
############################################################################
# Copyright (C) 2002-2007 The Regents of the University of California.
# Copyright (C) 2008-2009  Lawrence Livermore National Security.
# Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
# Written by Danny Auble <da@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 num_nodes   2
set num_tasks   2
set idle_nodes  0
set max_nodes   0
set task_count  0
set hostfile    "$test_dir/hostfile"

# Determine if we have enough nodes to test functionality
spawn $scontrol show partition [default_partition]
expect {
	-re "not found" {
		fail "Default partition doesn't exist"
	}
	-re "MaxNodes=($number)" {
		set max_nodes $expect_out(1,string)
		exp_continue
	}
	-re "MaxNodes=UNLIMITED" {
		set max_nodes 999999
		exp_continue
	}
	timeout {
		fail "scontrol not responding"
	}
	eof {
		wait
	}
}

set idle_nodes [llength [get_nodes_by_state]]
if { ($idle_nodes < 3) || ($max_nodes < 3) } {
	if { $max_nodes == 999999 } {
		skip "Default partition must have at least 3 idle nodes and MaxNodes >= 3 to run this test on. IDLE:$idle_nodes MaxNodes:UNLIMITED"
	} else {
		skip "Default partition must have at least 3 idle nodes and MaxNodes >= 3 to run this test on. IDLE:$idle_nodes MaxNodes:$max_nodes"
	}
}

exec $bin_rm -f %hostfile
set node0       0
set node1       0
set node2       0
set timeout $max_job_delay
for {set i 0} {$i<3} {incr i} {
	if { $i==1 } {
		if { $node0 == 0 || $node1 == 0 || $node2 == 0 } {
			fail "Node names not set from previous srun"
		}
		set env(SLURM_HOSTFILE) $hostfile
		set 1node0 $node2
		set 1node1 $node0
		set 1node2 $node1
		set file [open $hostfile "w"]
		puts $file "$node2\n$node0\n$node1"
		close $file
	} elseif { $i==2 } {
		if { $node0 == 0 || $node1 == 0 || $node2 == 0 } {
			fail "Node names not set from previous srun"
		}
		set env(SLURM_HOSTFILE) $hostfile
		set 2node0 $node1
		set 2node1 $node0
		set 2node2 $node2
		set file [open $hostfile "w"]
		puts $file "$node1\n$node0\n$node2"
		close $file
	}

	#
	# execute srun with a specific node count
	#
	set node0  0
	set node1  0
	set node2  0
	set task_cnt 0
	if { $i == 0} {
		spawn $srun -N3 -t1 -l $bin_printenv SLURMD_NODENAME
	} else {
		spawn $srun -t1 -l --distribution=arbitrary $bin_printenv SLURMD_NODENAME
	}
	expect {
		-re "($number): ($re_word_str)" {
			incr task_cnt
			set task_id $expect_out(1,string)
			if {$task_id == 0} {
				set node0 $expect_out(2,string)
			} elseif {$task_id == 1} {
				set node1 $expect_out(2,string)
			} else {
				set node2 $expect_out(2,string)
			}
			exp_continue
		}
		timeout {
			fail "srun not responding"
		}
		eof {
			wait
		}
	}
	if { $task_cnt != 3 } {
		log_warn "No worries, test just can not run here"
	} elseif { $i == 1 } {
		if {$node0 ne $1node0} {
			fail "Task 0 not distributed by hostfile ($node0 != $1node0)"
		} elseif {$node1 ne $1node1} {
			fail "Task 1 not distributed by hostfile ($node1 != $1node1)"
		} elseif {$node2 ne $1node2} {
			fail "Task 2 not distributed by hostfile ($node2 != $1node2)"
		}
	} elseif { $i == 2 } {
		if {$node0 ne $2node0} {
			fail "Task 0 not distributed by hostfile ($node0 != $2node0)"
		} elseif {$node1 ne $2node1} {
			fail "Task 1 not distributed by hostfile ($node1 != $2node1)"
		} elseif {$node2 ne $2node2} {
			fail "Task 2 not distributed by hostfile ($node2 != $2node2)"
		}
	}
}
