#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Test of contiguous option with multiple nodes (--contiguous option).
#
# 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-2009 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/none"} {
	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 job_id 0
set timeout $max_job_delay
spawn $salloc -N3-3 --contiguous -t1 $srun -l $bin_printenv SLURMD_NODENAME
expect {
	-re "Required node not available|Node count specification invalid|configuration not available" {
		skip "Can't test --contiguous distribution"
	}
	-re "Granted job allocation ($number)" {
		set job_id $expect_out(1,string)
		exp_continue
	}
	-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 "salloc not responding. This may not be a real failure if the system lacks three _contiguous_ nodes"
	}
	eof {
		wait
	}
}

if {$job_id == 0} {
	fail "Couldn't get an allocation"
}

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