#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          strigger --clear and --get (with filtering)
############################################################################
# Copyright (C) 2007 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 file_in          "$test_dir/input"
set file_in_fini     "$test_dir/fini_input"
set file_in_time     "$test_dir/time_input"
set file_in_up       "$test_dir/up_input"
set file_in_down     "$test_dir/down_input"
set file_in_reconfig "$test_dir/reconfig_input"
set job_id           0

#
# get my uid and clear any vestigial triggers
#
set uid [get_my_uid]
if {$uid == 0} {
	skip "This test can't be run as user root"
}

proc cleanup {} {
	global job_id

	cancel_job $job_id
}

exec $strigger --clear --quiet --user=$uid

#
# Build input script files and submit a job
#
make_bash_script $file_in          "sleep 60"
make_bash_script $file_in_fini     "sleep 1"
make_bash_script $file_in_time     "sleep 1"
make_bash_script $file_in_up       "sleep 1"
make_bash_script $file_in_down     "sleep 1"
make_bash_script $file_in_reconfig "sleep 1"

spawn $sbatch --output=/dev/null -t1 $file_in
expect {
	-re "Submitted batch job ($number)" {
		set job_id $expect_out(1,string)
		exp_continue
	}
	timeout {
		kill_srun
		fail "srun not responding"
	}
	eof {
		wait
	}
}
if {$job_id == 0} {
	fail "Batch submit failure"
}

#
# Now add a couple of triggers for that job
#
set disabled 0
set matches  0
spawn $strigger --set -v --time --jobid=$job_id --offset=-30 --program=$file_in_time
expect {
	-re "permission denied" {
		set disabled 1
		exp_continue
	}
	-re "trigger set" {
		incr matches
		exp_continue
	}
	timeout {
		fail "strigger not responding"
	}
	eof {
		wait
	}
}
if {$disabled == 1} {
	skip "Current configuration prevents setting triggers. Need to run as SlurmUser or make SlurmUser=root"
}
if {$matches == 0} {
	fail "Trigger creation failure"
}

set matches 0
spawn $strigger --set -v --fini --jobid=$job_id --program=$file_in_fini
expect {
	-re "trigger set" {
		incr matches
		exp_continue
	}
	timeout {
		fail "strigger not responding"
	}
	eof {
		wait
	}
}
if {$matches == 0} {
	fail "Trigger creation failure"
}

set matches 0
spawn $strigger --set -v --time --jobid=$job_id --offset=-40 --program=$file_in_time
expect {
	-re "trigger set" {
		incr matches
		exp_continue
	}
	timeout {
		fail "strigger not responding"
	}
	eof {
		wait
	}
}
if {$matches == 0} {
	fail "Trigger creation failure"
}

#
# Now add some node up/down and reconfig triggers
#
set matches 0
spawn $strigger --set -v --up --program=$file_in_up
expect {
	-re "trigger set" {
		incr matches
		exp_continue
	}
	timeout {
		fail "strigger not responding"
	}
	eof {
		wait
	}
}
if {$matches == 0} {
	fail "Trigger creation failure"
}

set matches 0
spawn $strigger --set -v --down --program=$file_in_down
expect {
	-re "trigger set" {
		incr matches
		exp_continue
	}
	timeout {
		fail "strigger not responding"
	}
	eof {
		wait
	}
}
if {$matches == 0} {
	fail "Trigger creation failure"
}
set matches 0
spawn $strigger --set -v --reconfig --program=$file_in_reconfig
expect {
	-re "trigger set" {
		incr matches
		exp_continue
	}
	timeout {
		fail "strigger not responding"
	}
	eof {
		wait
	}
}
if {$matches == 0} {
	fail "Trigger creation failure"
}

#
# Look for these triggers
#
set job_matches 0
spawn $strigger --get -v --user=$uid
expect {
	-re "(?n)^ +\\d+ job +$job_id \\w+" {
		incr job_matches
		exp_continue
	}
	timeout {
		fail "strigger not responding"
	}
	eof {
		wait
	}
}
if {$job_matches != 3} {
	fail "Trigger get failure ($job_matches != 3)"
}

#
# Delete the triggers for this job
#
set matches 0
spawn $strigger --clear -v --jobid=$job_id
expect {
	-re "triggers for job $job_id cleared" {
		incr matches
		exp_continue
	}
	timeout {
		fail "strigger not responding"
	}
	eof {
		wait
	}
}
if {$matches == 0} {
	fail "Trigger clear failure"
}

#
# Check that no triggers remains for this job
#
set job_matches  0
set node_matches 0
set trigger_id   0
spawn $strigger --get -v --user=$uid
expect {
	-re "job * $job_id " {
		incr job_matches
		exp_continue
	}
	-re "($number) *node *. *($re_word_str)" {
		incr node_matches
		set trigger_id $expect_out(1,string)
		exp_continue
	}
	timeout {
		fail "strigger not responding"
	}
	eof {
		wait
	}
}
if {$job_matches != 0} {
	fail "Trigger get failure: job triggers not cleared"
}
if {$node_matches != 3} {
	fail "Trigger get failure: node triggers cleared"
}

#
# Delete specific trigger id
#
set matches 0
spawn $strigger --clear -v --id=$trigger_id
expect {
	-re "trigger $trigger_id cleared" {
		incr matches
		exp_continue
	}
	timeout {
		fail "strigger not responding"
	}
	eof {
		wait
	}
}
if {$matches == 0} {
	fail "Trigger clear failure"
}

#
# Check for cleared trigger
#
set node_matches 0
spawn $strigger --get -v --user=$uid
expect {
	-re "($number) *node *. *($re_word_str)" {
		incr node_matches
		if {$trigger_id == $expect_out(1,string)} {
			fail "Failed to clear specific trigger"
		}
		exp_continue
	}
	timeout {
		fail "strigger not responding"
	}
	eof {
		wait
	}
}
if {$node_matches != 2} {
	fail "Trigger get failure: node triggers cleared"
}

#
# Clear all triggers for this user
set matches 0
spawn $strigger --clear -v --user=$uid
expect {
	-re "triggers for user $uid cleared" {
		incr matches
		exp_continue
	}
	timeout {
		fail "strigger not responding"
	}
	eof {
		wait
	}
}
if {$matches == 0} {
	fail "Trigger clear failure"
}

#
# Check for any remaining triggers
#
set node_matches 0
spawn $strigger --get -v --user=$uid
expect {
	-re "node" {
		incr node_matches
		exp_continue
	}
	timeout {
		fail "strigger not responding"
	}
	eof {
		wait
	}
}
if {$node_matches != 0} {
	fail "Trigger get failure: node triggers remain"
}
