@@ -548,6 +548,27 @@ test_expect_success 'flux job list-ids fails with one bad ID out of several' '
548548 grep "No such file or directory" list_ids_error4.out
549549'
550550
551+ test_expect_success ' flux job list-ids works with --wait-state' '
552+ id=`head -n 1 pending.ids` &&
553+ flux job list-ids --wait-state=sched $id > /dev/null &&
554+ id=`head -n 1 running.ids` &&
555+ flux job list-ids --wait-state=sched $id > /dev/null &&
556+ flux job list-ids --wait-state=run $id > /dev/null &&
557+ id=`head -n 1 completed.ids` &&
558+ flux job list-ids --wait-state=sched $id > /dev/null &&
559+ flux job list-ids --wait-state=run $id > /dev/null &&
560+ flux job list-ids --wait-state=inactive $id > /dev/null &&
561+ id=`head -n 1 canceled.ids` &&
562+ flux job list-ids --wait-state=sched $id > /dev/null &&
563+ flux job list-ids --wait-state=run $id > /dev/null &&
564+ flux job list-ids --wait-state=inactive $id > /dev/null
565+ '
566+
567+ test_expect_success ' flux job list-ids fail with bad --wait-state' '
568+ id=`head -n 1 pending.ids` &&
569+ test_must_fail flux job list-ids --wait-state=foo $id > /dev/null
570+ '
571+
551572# In order to test potential racy behavior, use job state pause/unpause to pause
552573# the handling of job state transitions from the job-manager.
553574#
@@ -613,6 +634,125 @@ test_expect_success NO_CHAIN_LINT 'flux job list-ids waits for job ids (same id)
613634 cat list_id_wait3B.out | jq -e ".id == ${jobid}"
614635'
615636
637+ test_expect_success NO_CHAIN_LINT ' flux job list-ids waits for job id state (depend)' '
638+ ${RPC} job-list.job-state-pause 0 </dev/null
639+ jobid=`flux submit --wait-event=start sleep inf | flux job id`
640+ flux job list-ids --wait-state=depend ${jobid} > list_id_wait_state_depend.out &
641+ pid=$!
642+ wait_idsync 1 &&
643+ ${RPC} job-list.job-state-unpause 0 </dev/null &&
644+ wait $pid &&
645+ flux cancel $jobid &&
646+ fj_wait_event $jobid clean >/dev/null &&
647+ cat list_id_wait_state_depend.out | jq -e ".id == ${jobid}"
648+ '
649+
650+ test_expect_success NO_CHAIN_LINT ' flux job list-ids waits for job id state (run)' '
651+ ${RPC} job-list.job-state-pause 0 </dev/null
652+ jobid=`flux submit --wait-event=start sleep inf | flux job id`
653+ flux job list-ids --wait-state=run ${jobid} > list_id_wait_state_run.out &
654+ pid=$!
655+ wait_idsync 1 &&
656+ ${RPC} job-list.job-state-unpause 0 </dev/null &&
657+ wait $pid &&
658+ flux cancel $jobid &&
659+ fj_wait_event $jobid clean >/dev/null &&
660+ cat list_id_wait_state_run.out | jq -e ".id == ${jobid}" &&
661+ cat list_id_wait_state_run.out | jq .state | ${JOB_CONV} statetostr > list_id_state_run.out &&
662+ grep RUN list_id_state_run.out
663+ '
664+
665+ test_expect_success NO_CHAIN_LINT ' flux job list-ids waits for job id state (cleanup)' '
666+ ${RPC} job-list.job-state-pause 0 </dev/null
667+ jobid=`flux submit --wait-event=start sleep inf | flux job id`
668+ flux job list-ids --wait-state=cleanup ${jobid} > list_id_wait_state_cleanup.out &
669+ pid=$!
670+ wait_idsync 1 &&
671+ ${RPC} job-list.job-state-unpause 0 </dev/null &&
672+ flux cancel $jobid &&
673+ fj_wait_event $jobid clean >/dev/null &&
674+ wait $pid &&
675+ cat list_id_wait_state_cleanup.out | jq -e ".id == ${jobid}" &&
676+ cat list_id_wait_state_cleanup.out | jq .state | ${JOB_CONV} statetostr > list_id_state_cleanup.out &&
677+ grep CLEANUP list_id_state_cleanup.out
678+ '
679+
680+ test_expect_success NO_CHAIN_LINT ' flux job list-ids waits for job id state (inactive)' '
681+ ${RPC} job-list.job-state-pause 0 </dev/null
682+ jobid=`flux submit --wait-event=start sleep inf | flux job id`
683+ flux job list-ids --wait-state=inactive ${jobid} > list_id_wait_state_inactive.out &
684+ pid=$!
685+ wait_idsync 1 &&
686+ ${RPC} job-list.job-state-unpause 0 </dev/null &&
687+ flux cancel $jobid &&
688+ fj_wait_event $jobid clean >/dev/null &&
689+ wait $pid &&
690+ cat list_id_wait_state_inactive.out | jq -e ".id == ${jobid}" &&
691+ cat list_id_wait_state_inactive.out | jq .state | ${JOB_CONV} statetostr > list_id_state_inactive.out &&
692+ grep INACTIVE list_id_state_inactive.out
693+ '
694+
695+ # The job should never reach job state b/c we cancel it before it can
696+ # run, so will return when job becomes inactive
697+ test_expect_success NO_CHAIN_LINT ' flux job list-ids waits for job id state (run - cancel)' '
698+ ${RPC} job-list.job-state-pause 0 </dev/null
699+ flux queue stop &&
700+ jobid=`flux submit sleep inf | flux job id`
701+ flux job list-ids --wait-state=run ${jobid} > list_id_wait_state_run_cancel.out &
702+ pid=$!
703+ wait_idsync 1 &&
704+ flux cancel $jobid &&
705+ fj_wait_event $jobid clean >/dev/null &&
706+ flux queue start &&
707+ ${RPC} job-list.job-state-unpause 0 </dev/null &&
708+ wait $pid &&
709+ cat list_id_wait_state_run_cancel.out | jq -e ".id == ${jobid}" &&
710+ cat list_id_wait_state_run_cancel.out | jq .state | ${JOB_CONV} statetostr > list_id_state_run_cancel.out &&
711+ grep INACTIVE list_id_state_run_cancel.out
712+ '
713+
714+ # Can't guarantee output order, so grep for jobid instead of match jobid
715+ test_expect_success NO_CHAIN_LINT ' flux job list-ids waits for job ids state (different ids)' '
716+ ${RPC} job-list.job-state-pause 0 </dev/null
717+ jobid1=`flux submit --wait-event=start sleep inf | flux job id`
718+ jobid2=`flux submit --wait-event=start sleep inf | flux job id`
719+ flux job list-ids --wait-state=run ${jobid1} ${jobid2} > list_id_wait_state_different_ids.out &
720+ pid=$!
721+ wait_idsync 2 &&
722+ ${RPC} job-list.job-state-unpause 0 </dev/null &&
723+ wait $pid &&
724+ flux cancel $jobid1 $jobid2 &&
725+ fj_wait_event $jobid1 clean >/dev/null &&
726+ fj_wait_event $jobid2 clean >/dev/null &&
727+ grep ${jobid1} list_id_wait_state_different_ids.out &&
728+ grep ${jobid2} list_id_wait_state_different_ids.out &&
729+ head -n1 list_id_wait_state_different_ids.out | jq .state | ${JOB_CONV} statetostr > list_id_state_different_idsA.out &&
730+ tail -n1 list_id_wait_state_different_ids.out | jq .state | ${JOB_CONV} statetostr > list_id_state_different_idsB.out &&
731+ grep RUN list_id_state_different_idsA.out &&
732+ grep RUN list_id_state_different_idsB.out
733+ '
734+
735+ test_expect_success NO_CHAIN_LINT ' flux job list-ids waits for job ids state (same id)' '
736+ ${RPC} job-list.job-state-pause 0 </dev/null
737+ jobid=`flux submit --wait-event=start sleep inf | flux job id`
738+ flux job list-ids --wait-state=run ${jobid} > list_id_wait_state_same_idsA.out &
739+ pid1=$!
740+ flux job list-ids --wait-state=cleanup ${jobid} > list_id_wait_state_same_idsB.out &
741+ pid2=$!
742+ wait_idsync 1 &&
743+ ${RPC} job-list.job-state-unpause 0 </dev/null &&
744+ wait ${pid1} &&
745+ flux cancel $jobid &&
746+ fj_wait_event $jobid clean >/dev/null &&
747+ wait ${pid2} &&
748+ cat list_id_wait_state_same_idsA.out | jq -e ".id == ${jobid}" &&
749+ cat list_id_wait_state_same_idsB.out | jq -e ".id == ${jobid}" &&
750+ cat list_id_wait_state_same_idsA.out | jq .state | ${JOB_CONV} statetostr > list_id_state_same_idsA.out &&
751+ grep RUN list_id_state_same_idsA.out &&
752+ cat list_id_wait_state_same_idsB.out | jq .state | ${JOB_CONV} statetostr > list_id_state_same_idsB.out &&
753+ grep CLEANUP list_id_state_same_idsB.out
754+ '
755+
616756#
617757# job list timing
618758#
0 commit comments