#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Submit job directly to slurmd without use of slurmctld scheduler.
#          (--no-allocate option). NOTE: Needs to run as SlurmUser or root.
############################################################################
# Copyright (C) 2002-2007 The Regents of the University of California.
# Copyright (C) 2008 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 {![is_super_user]} {
	skip "This test can't be run except as SlurmUser"
}

#
# Submit a 1 node job and record the node name
#
set output [run_command_output -fail "$srun -v -N1 -l -t1 $bin_printenv SLURMD_NODENAME"]
if {![regexp {on host (\S+),} $output - nodelist_name]} {
	fail "Unable to parse assigned task host name from srun output"
}
if {![regexp -line {^0: (\S+)} $output - host_0]} {
	fail "Unable to parse value of SLURMD_NODENAME from srun output"
}

#
# Verify node count
#
if {$host_0 eq ""} {
	fail "Did not get hostname of task 0"
}
if {$nodelist_name eq ""} {
	fail "Did not get nodelist_name of task 0"
}
if {$host_0 ne $nodelist_name} {
	log_warn "Hostname inconsistency"
}
set include_node $host_0

#
# Submit a job directly to that node
#
set output [run_command_output -fail "$srun -N1 -l --nodelist=$include_node --no-allocate -t1 $bin_printenv SLURMD_NODENAME"]
if {![regexp -line {^0: (\S+)} $output - host_1]} {
	fail "Unable to parse value of SLURMD_NODENAME from srun output"
}
subtest {$host_1 eq $include_node} "Allocation was on included host" "$host_1 !=$include_node"
