#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Test of --deadline option and time limit partition
############################################################################
# Copyright (C) 2015 CEA/DAM/DIF
# Written by Aline Roy <aline.roy@cea.fr>
#
# 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 file_in        "$test_dir/input"
set test_salloc    "$test_dir/test_salloc"
set job_id         0
set authorized     1
set part_name      $test_name

proc cleanup {} {
	global job_id scontrol part_name

	cancel_job $job_id
	run_command "$scontrol delete PartitionName=$part_name"
}

if {![is_super_user]} {
	skip "Can not test more unless SlurmUser or root"
}

#
# Confirm the partition name does not already exist
#
if {[dict exists [get_partitions] $part_name]} {
	fail "Partition ($part_name) already exists"
}

#
# Identify usable nodes in default partition
#
set def_node [lindex [get_nodes_by_state] 0]
if {$def_node eq ""} {
#	Wait for possible Epilog
	sleep 10
	set def_node [lindex [get_nodes_by_state] 0]
}
if {$def_node eq ""} {
	fail "Default partition seems to have no nodes"
}

#
# Create a new partition with a MaxTime
#
run_command -fail "$scontrol create PartitionName=$part_name Nodes=$def_node MaxTime=30"

#
# Confirm the partition now exists
#
if {![dict exists [get_partitions] $part_name]} {
	fail "Partition ($part_name) was not created"
}

set found 0

# Check EnforcePartLimits value
set enforcepartlimits [get_config_param "EnforcePartLimits"]
log_debug "EnforcePartLimits=$enforcepartlimits"

#
# Run a job in this new partition and validate the time limit
#
make_bash_script $test_salloc "
set -m
$salloc --no-shell -N1 --deadline now+1hour -p $part_name -t45 $bin_sleep 1 &
"

make_bash_script $file_in "
bash -i $test_salloc
"

set timeout $max_job_delay
spawn bash -i $file_in
if {$enforcepartlimits eq "NO"} {
	expect {
		-re "Pending job allocation ($number)" {
			set job_id $expect_out(1,string)
		}

		timeout {
			fail "salloc not responding"
		}
		eof {
			wait
		}
	}
	if {$job_id == 0} {
		fail "Job not submitted"
	}

	#
	# verify time limit
	#
	subtest {![wait_job_reason -timeout 10 $job_id "PENDING" "PartitionTimeLimit"]} "Job should be PENDING with reason PartitionTimeLimit"
} else {
	#
	# Job should be rejected at submit time
	#
	expect {
		-re "Requested time limit is invalid (missing or exceeds some limit)" {
			exp_continue
		}
		-re "unrecognized option '--deadline'" {
			fail "unrecognized option '--deadline'"
		}
		timeout {
			fail "salloc not responding"
		}
		eof {
			wait
		}
	}
}
