|
| 1 | +# |
| 2 | +# Basic job-exec sdexec / systemd tests |
| 3 | +# |
| 4 | + |
| 5 | +test_expect_success 'job-exec: setup system instance to use systemd' ' |
| 6 | + method=$(sudo -u flux flux config get --default=notset exec.method) |
| 7 | + if test "${method}" != "systemd" |
| 8 | + then |
| 9 | + if ! sudo test -f /etc/flux/system/conf.d/exec.toml |
| 10 | + then |
| 11 | + sudo touch /etc/flux/system/conf.d/exec.toml |
| 12 | + sudo bash -c "echo [exec] >> /etc/flux/system/conf.d/exec.toml" |
| 13 | + fi |
| 14 | + sudo bash -c "echo method = \\\"systemd\\\" >> /etc/flux/system/conf.d/exec.toml" |
| 15 | + sudo systemctl restart flux |
| 16 | + until flux mini run hostname 2>/dev/null; do |
| 17 | + sleep 1 |
| 18 | + done |
| 19 | + fi |
| 20 | +' |
| 21 | +test_expect_success 'job-exec: verify system instance using systemd' ' |
| 22 | + jobid=$(flux mini submit sleep 100) && |
| 23 | + flux job wait-event -v -t 60 $jobid start && |
| 24 | + jobiddec=`flux job id --to=dec $jobid` && |
| 25 | + rank=`flux getattr rank` && |
| 26 | + sudo -u flux systemctl list-units --user | grep "flux-sdexec-${rank}-${jobiddec}" && |
| 27 | + flux job cancel ${jobid} |
| 28 | +' |
| 29 | +test_expect_success 'job-exec: simple job exits 0 on success' ' |
| 30 | + jobid=$(flux mini submit /bin/true) && |
| 31 | + test_expect_code 0 flux job status $jobid |
| 32 | +' |
| 33 | +test_expect_success 'job-exec: simple job exits 1 on failure' ' |
| 34 | + jobid=$(flux mini submit /bin/false) && |
| 35 | + test_expect_code 1 flux job status -vv $jobid |
| 36 | +' |
| 37 | +test_expect_success 'job-exec: simple job exits 127 on bad command' ' |
| 38 | + jobid=$(flux mini submit /bin/foobar) && |
| 39 | + test_expect_code 127 flux job status $jobid |
| 40 | +' |
| 41 | +# When sending a signal very shortly after a job is started, there is |
| 42 | +# a small race where we don't know where the signal is actually sent. |
| 43 | +# It could be sent to the imp or job shell before actual job tasks are |
| 44 | +# started. To ensure consistent test results, wait for shell.start in |
| 45 | +# guest.exec.eventlog. |
| 46 | +test_expect_success 'job-exec: simple job exits 138 on signaled job' ' |
| 47 | + jobid=$(flux mini submit sleep 30) && |
| 48 | + flux job wait-event -t 10 ${jobid} start && |
| 49 | + flux job wait-event -p guest.exec.eventlog -t 10 ${jobid} shell.start && |
| 50 | + flux job kill --signal=SIGUSR1 $jobid && |
| 51 | + test_expect_code 138 flux job status $jobid |
| 52 | +' |
| 53 | +# Similar to above test, wait for shell.start in guest.exec.eventlog |
| 54 | +# to ensure consistent test results. The job cancel will send a |
| 55 | +# SIGTERM to the shell/tasks. |
| 56 | +test_expect_success 'job-exec: simple job can be canceled' ' |
| 57 | + jobid=$(flux mini submit sleep 30) && |
| 58 | + flux job wait-event -t 10 ${jobid} start && |
| 59 | + flux job wait-event -p guest.exec.eventlog -t 10 ${jobid} shell.start && |
| 60 | + flux job cancel $jobid && |
| 61 | + flux job wait-event -t 10 ${jobid} clean && |
| 62 | + test_expect_code 143 flux job status $jobid |
| 63 | +' |
| 64 | +test_expect_success 'job-exec: job fails correctly if user service not setup' ' |
| 65 | + jobid=$(flux mini submit \ |
| 66 | + --setattr=system.exec.sd.test_exec_fail=true \ |
| 67 | + hostname) && |
| 68 | + flux job wait-event -v -t 60 $jobid clean && |
| 69 | + flux job eventlog ${jobid} | grep "test sdprocess_exec" \ |
| 70 | + | grep "Operation not permitted" |
| 71 | +' |
0 commit comments