#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Test of contiguous option with multiple nodes (--contiguous option).
#          Also see test1.14.
#
# NOTE:    This assumes node names are of the form <alpha><number>, where
#          the value of <number> indicates the nodes relative location.
#          Change the node name parsing logic as needed for other formats.
############################################################################
# Copyright (C) 2002-2007 The Regents of the University of California.
# Copyright (C) 2008-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

if {[get_config_param "TopologyPlugin"] ne "topology/flat"} {
	skip "This test is incompatible with topology configured systems"
}

set available [llength [get_nodes_by_state idle,alloc,comp]]
if {$available < 3} {
	skip "This test requires 3 nodes, but only $available available"
}

#
# Submit a 3 contiguous node job
#
set host_0_name      ""
set host_1_name      ""
set host_2_name      ""
set host_0_num       0
set host_1_num       0
set host_2_num       0
set timeout $max_job_delay
spawn $srun -N3-3 --contiguous -l -t1 $bin_printenv SLURMD_NODENAME
expect {
	-re "Required node not available|Node count specification invalid|configuration not available" {
		skip "Can't test srun task distribution"
	}
	-re "($number): *($re_word_str)" {
		set task_id $expect_out(1,string)
		if {$task_id == 0} {
			set host_0_name $expect_out(2,string)
		}
		if {$task_id == 1} {
			set host_1_name $expect_out(2,string)
		}
		if {$task_id == 2} {
			set host_2_name $expect_out(2,string)
		}
		exp_continue
	}
	timeout {
		fail "srun not responding. This may not be a real failure if the system  lacks three _contiguous_ nodes"
	}
	eof {
		wait
	}
}

if {$host_0_name eq ""} {
	fail "Did not get hostname of task 0"
}
if {$host_1_name eq ""} {
	fail "Did not get hostname of task 1"
}
if {$host_2_name eq ""} {
	fail "Did not get hostname of task 2"
}

lappend check_hosts_list $host_0_name $host_1_name $host_2_name

if {![check_hosts_contiguous $check_hosts_list]} {
	fail "Hosts were not contiguous ($check_hosts_list)"
}
