#!/usr/bin/env expect
############################################################################
# Purpose: Test label option with hetjob allocation.
############################################################################
# Copyright (C) SchedMD LLC.
# 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 timeout	60

if {[get_config_param "SchedulerType"] ne "sched/backfill"} {
	skip "This test requires SchedulerType = sched/backfill"
}

set nb_nodes [get_partition_param [default_partition] "TotalNodes"]
if {$nb_nodes < 3} {
	skip "Need 3 or more nodes in default partition"
}

proc cleanup {} {
	global het_job_id scancel

	if {$het_job_id > 0} {
		exec $scancel $het_job_id
	}
}

set het_job_id 0
set component(0) 0
set matches 0
set timeout $max_job_delay
spawn $salloc -t1 -N1 : -N1 : -N1 $bin_bash
expect {
	-re "job ($number) has been allocated resources" {
		set het_job_id $expect_out(1,string)
		reset_bash_prompt
		exp_continue
	}
	-re "$test_prompt" {
		#log_debug "Job initiated"
	}
	timeout {
		fail "salloc: allocation not granted in $timeout seconds"
	}
	eof {
		wait
	}
}
if {$het_job_id == 0} {
	fail "salloc failure"
}

log_debug "Collect Nodenames"

send "$squeue -j $het_job_id -o\"%N,%i\" --noheader\r"
expect {
	-re "--noheader" {
		exp_continue
	}
	-re "($re_word_str),$het_job_id\\+($number)" {
		set node_name $expect_out(1,string)
		set index $expect_out(2,string)
		set component($index) $node_name
		exp_continue
	}
	-re "$test_prompt" {
		#break
	}
	timeout {
		fail "squeue not responding"
	}
}
if {[array size component] != 3} {
	fail "squeue failure ([array size component] != 3)"
}

log_info "Test Sending Srun w/ --label To Various Components"

set matches 0
send "$srun --label --mpi=none --het-group=0-2 printenv SLURMD_NODENAME\r"
expect {
	-re "2: $component(2)" {
		incr matches
		exp_continue
	}
	-re "$test_prompt" {
		#break
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
if {$matches != 1} {
	fail "srun failure ($matches != 1)"
}

set matches 0
send "$srun --label --mpi=none --het-group=1-2 printenv SLURMD_NODENAME\r"
expect {
	-re "1: $component(2)" {
		incr matches
		exp_continue
	}
	-re "$test_prompt" {
		#break
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
if {$matches != 1} {
	fail "srun failure ($matches != 1)"
}

set matches 0
send "$srun --label --mpi=none -O -n3 : -O -n4 : -n1 printenv SLURMD_NODENAME\r"
expect {
	-re "7: $component(2)" {
		incr matches
		exp_continue
	}
	-re "$test_prompt" {
		#break
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
if {$matches != 1} {
	fail "srun failure ($matches != 1)"
}

set matches 0
send "$srun --label --mpi=none -O -n3 : -O -n4 : -n1 printenv SLURMD_NODENAME\r"
expect {
	-re "\[3-6\]: $component(1)" {
		incr matches
		exp_continue
	}
	-re "$test_prompt" {
		#break
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
if {$matches != 4} {
	fail "srun failure ($matches != 4)"
}

set matches 0
send "$srun --label --mpi=none -O -n3 : -O -n4 : -n1 printenv SLURMD_NODENAME\r"
expect {
	-re "\[0-2\]: $component(0)" {
		incr matches
		exp_continue
	}
	-re "$test_prompt" {
		#break
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
if {$matches != 3} {
	fail "srun failure ($matches != 3)"
}


for {set inx 0} {$inx < 3} {incr inx} {
	set matches 0
	send "$srun -O -n3 --label --mpi=none --het-group=$inx printenv SLURMD_NODENAME\r"
	expect {
		-re "\[0-2\]: $component($inx)" {
			incr matches
			exp_continue
		}
		-re "$test_prompt" {
			#break
		}
		timeout {
			fail "srun not responding"
		}
		eof {
			wait
		}
	}
	if {$matches != 3} {
		fail "srun failure ($matches != 3)"
	}
}

send "exit\r"
expect {
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
