#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Test of partition specification on job submission (--partition
#          option).
############################################################################
# Copyright (C) 2002-2006 The Regents of the University of California.
# 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

set job_id           0
set other_part_name  $test_name
set def_part_name    [default_partition]

proc cleanup {} {
	global job_id scontrol other_part_name

	cancel_job $job_id
	run_command -none "$scontrol delete partition=$other_part_name"
}


#
# Submit a job explicitly to the default partition
#
set job_id  0
set timeout $max_job_delay
spawn $salloc --partition=$def_part_name -t1 $bin_sleep 1
expect {
	-re "Granted job allocation ($number)" {
		set job_id $expect_out(1,string)
		exp_continue
	}
	timeout {
		fail "salloc not responding"
	}
	eof {
		wait
	}
}
if {$job_id == 0} {
	fail "Job submit failure"
}

# Confirm the job's partition
set read_part [get_job_param $job_id "Partition"]
subtest {$read_part eq $def_part_name} "Confirm that the job used the default partition" "$read_part != $def_part_name"
cancel_job $job_id

#
# Create a test partition
#
run_command -none "$scontrol delete partition=$other_part_name"
run_command -fail "$scontrol create partition=$other_part_name nodes=[get_nodes_by_request -fail "-N1"]"

#
# Submit job explicitly to a non-default partition
#
set job_id          0
spawn $salloc --partition=$other_part_name -t1 $bin_sleep 1
expect {
	-re "Granted job allocation ($number)" {
		set job_id $expect_out(1,string)
		exp_continue
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
if {$job_id == 0} {
	fail "Job submit failure"
}

# Confirm the job's partition
set read_part [get_job_param $job_id "Partition"]
subtest {$read_part eq $other_part_name} "Confirm that the job used the other partition" "$read_part != $other_part_name"
