#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Confirm that a job executes with the proper task distribution
#          (--nodes and --distribution options).
############################################################################
# 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

# 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 two node job with block distribution
#
# Task layout depends upon how many tasks/CPUs are allocated per node
# One task on node zero,    layout: 0 0 0 1
# Two tasks on node zero,   layout: 0 0 1 1	<< Optimal
# Three tasks on node zero, layout: 0 1 1 1
#
set expected_layout1 [list 0 0 0 1]
set expected_layout2 [list 0 0 1 1]
set expected_layout3 [list 0 1 1 1]
set tested_layout [list -1 -1 -1 -1]
set timeout $max_job_delay
spawn $srun -O -N2 --ntasks-per-node=2 -l --distribution=block -t1 $bin_printenv SLURM_NODEID
expect {
	-re "srun: error" {
		skip "Can't test srun task distribution"
	}
	-re "($number): ($number)" {
		set index $expect_out(1,string)
		set value $expect_out(2,string)
		lset tested_layout $index $value
		exp_continue
	}
	-re "($number)\\.($number):($re_word_str)" {
		set index $expect_out(1,string)
		set index2 $expect_out(2,string)
		if { $index == 0 } {
			set value 0
		} else {
			set value 1
		}
		lset tested_layout $index $value
		lset tested_layout $index2 $value
		exp_continue
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}

#
# Verify block distribution of tasks
#

log_debug "Optimal task layout was: $expected_layout2"
log_debug "Actual task layout was : $tested_layout"
if {$tested_layout ne $expected_layout1 &&
	$tested_layout ne $expected_layout2 &&
	$tested_layout ne $expected_layout3} {
	fail "Failed to distribute tasks in block fashion"
}

#
# Submit a two node job with cyclic distribution
#
# Task layout depends upon how many tasks/CPUs are allocated per node
# One task on node zero,    layout: 0 1 1 1
# Two tasks on node zero,   layout: 0 1 0 1	<< Optimal
# Three tasks on node zero, layout: 0 1 0 0
#
set expected_layout1 [list 0 1 1 1]
set expected_layout2 [list 0 1 0 1]
set expected_layout3 [list 0 1 0 0]
set tested_layout [list -1 -1 -1 -1]
spawn $srun -O -N2 --ntasks-per-node=2 -l --distribution=cyclic -t1 $bin_printenv SLURM_NODEID
expect {
	-re "More processors requested than permitted" {
		skip "Can't test srun task distribution"
	}
	-re "Node count specification invalid" {
		skip "Can't test srun task distribution"
	}
	-re "($number): ($number)" {
		set index $expect_out(1,string)
		set value $expect_out(2,string)
		lset tested_layout $index $value
		exp_continue
	}
	-re "($number)\\.($number):($re_word_str)" {
		set index $expect_out(1,string)
		set index2 $expect_out(2,string)
		if { $index == 0 } {
			set value 0
		} else {
			set value 1
		}
		lset tested_layout $index $value
		lset tested_layout $index2 $value
		exp_continue
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}

#
# Verify cyclic distribution of tasks
#
log_debug "Optimal task layout was: $expected_layout2"
log_debug "Actual task layout was : $tested_layout"
if {$tested_layout ne $expected_layout1 &&
	$tested_layout ne $expected_layout2 &&
	$tested_layout ne $expected_layout3} {
	fail "Failed to distribute tasks in cyclic fashion"
}
