@@ -342,6 +342,157 @@ test_expect_success 'flux job list all jobs works' '
342342 test_cmp all.ids list_all_jobids.out
343343'
344344
345+ # do some more advanced constraint queries
346+
347+ test_expect_success ' flux job list hostname jobs' '
348+ id=$(id -u) &&
349+ constraint="{ and: [ {userid:[${id}]}, {name:[\"hostname\"]}] }" &&
350+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
351+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_hostname_jobs.out &&
352+ numlines=$(cat pending.ids completed.ids | wc -l) &&
353+ test $(cat list_constraint_hostname_jobs.out | wc -l) -eq ${numlines}
354+ '
355+
356+ test_expect_success ' flux job list active hostname jobs' '
357+ id=$(id -u) &&
358+ constraint="{ and: [ {userid:[${id}]}, {states:[\"active\"]}, {name:[\"hostname\"]}] }" &&
359+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
360+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_pending_hostname.out &&
361+ test_cmp list_constraint_pending_hostname.out pending.ids
362+ '
363+
364+ test_expect_success ' flux job list inactive hostname jobs' '
365+ id=$(id -u) &&
366+ constraint="{ and: [ {userid:[${id}]}, {states:[\"inactive\"]}, {name:[\"hostname\"]}] }" &&
367+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
368+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_inactive_hostname.out &&
369+ test_cmp list_constraint_inactive_hostname.out completed.ids
370+ '
371+
372+ test_expect_success ' flux job list invalid queue' '
373+ id=$(id -u) &&
374+ constraint="{ and: [ {userid:[${id}]}, {queue:[\"blarg\"]}] }" &&
375+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
376+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_invalid_queue.out &&
377+ test $(cat list_constraint_invalid_queue.out | wc -l) -eq 0
378+ '
379+
380+ test_expect_success ' flux job list active (1)' '
381+ state1=`${JOB_CONV} strtostate SCHED` &&
382+ state2=`${JOB_CONV} strtostate RUN` &&
383+ constraint="{ or: [ {states:[${state1}]}, {states:[${state2}]} ] }" &&
384+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
385+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_active1.out &&
386+ numlines=$(cat active.ids | wc -l) &&
387+ test $(cat list_constraint_active1.out | wc -l) -eq ${numlines}
388+ '
389+
390+ test_expect_success ' flux job list active (2)' '
391+ state1=`${JOB_CONV} strtostate INACTIVE` &&
392+ constraint="{ not: [ {states:[${state1}]} ] }" &&
393+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
394+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_active2.out &&
395+ numlines=$(cat active.ids | wc -l) &&
396+ test $(cat list_constraint_active2.out | wc -l) -eq ${numlines}
397+ '
398+
399+ test_expect_success ' flux job list pending jobs or inactive jobs (1)' '
400+ state1=`${JOB_CONV} strtostate SCHED` &&
401+ state2=`${JOB_CONV} strtostate INACTIVE` &&
402+ constraint="{ or: [ {states:[${state1}]}, {states:[${state2}]} ] }" &&
403+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
404+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_pending_inactive1.out &&
405+ numlines=$(cat pending.ids inactive.ids | wc -l) &&
406+ test $(cat list_constraint_pending_inactive1.out | wc -l) -eq ${numlines}
407+ '
408+
409+ test_expect_success ' flux job list pending jobs or inactive jobs (2)' '
410+ state1=`${JOB_CONV} strtostate SCHED` &&
411+ state2=`${JOB_CONV} strtostate INACTIVE` &&
412+ constraint="{ or: [ {states:[${state1}, ${state2}]} ] }" &&
413+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
414+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_pending_inactive2.out &&
415+ numlines=$(cat pending.ids inactive.ids | wc -l) &&
416+ test $(cat list_constraint_pending_inactive2.out | wc -l) -eq ${numlines}
417+ '
418+
419+ test_expect_success ' flux job list failed and canceled jobs (1)' '
420+ result1=`${JOB_CONV} strtoresult FAILED` &&
421+ result2=`${JOB_CONV} strtoresult CANCELED` &&
422+ constraint="{ or: [ {results:[${result1}]}, {results:[${result2}]} ] }" &&
423+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
424+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_failed_canceled1.out &&
425+ numlines=$(cat canceled.ids failed.ids | wc -l) &&
426+ test $(cat list_constraint_failed_canceled1.out | wc -l) -eq ${numlines}
427+ '
428+
429+ test_expect_success ' flux job list failed and canceled jobs (2)' '
430+ result1=`${JOB_CONV} strtoresult FAILED` &&
431+ result2=`${JOB_CONV} strtoresult CANCELED` &&
432+ constraint="{ and: [ {userid:[${id}]}, {results:[${result1}, ${result2}]}] }" &&
433+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
434+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_failed_canceled2.out &&
435+ numlines=$(cat canceled.ids failed.ids | wc -l) &&
436+ test $(cat list_constraint_failed_canceled2.out | wc -l) -eq ${numlines}
437+ '
438+
439+ test_expect_success ' flux job list pending jobs or failed jobs (1)' '
440+ state1=`${JOB_CONV} strtostate SCHED` &&
441+ state2=`${JOB_CONV} strtostate INACTIVE` &&
442+ result1=`${JOB_CONV} strtoresult FAILED` &&
443+ constraint="{ or: [ {states:[${state1}]}, {and: [ {states:[${state2}]}, {results:[${result1}]} ] } ] }" &&
444+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
445+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_pending_failed1.out &&
446+ numlines=$(cat pending.ids failed.ids | wc -l) &&
447+ test $(cat list_constraint_pending_failed1.out | wc -l) -eq ${numlines}
448+ '
449+
450+ test_expect_success ' flux job list pending jobs or failed jobs (2)' '
451+ state1=`${JOB_CONV} strtostate SCHED` &&
452+ result1=`${JOB_CONV} strtoresult FAILED` &&
453+ constraint="{ or: [ {states:[${state1}]}, {results:[${result1}]} ] }" &&
454+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
455+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_pending_failed2.out &&
456+ numlines=$(cat pending.ids failed.ids | wc -l) &&
457+ test $(cat list_constraint_pending_failed2.out | wc -l) -eq ${numlines}
458+ '
459+
460+ test_expect_success ' flux job list inactive (1)' '
461+ state1=`${JOB_CONV} strtostate INACTIVE` &&
462+ constraint="{ or: [ {states:[${state1}]} ] }" &&
463+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
464+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_inactive1.out &&
465+ numlines=$(cat inactive.ids | wc -l) &&
466+ test $(cat list_constraint_inactive1.out | wc -l) -eq ${numlines}
467+ '
468+
469+ test_expect_success ' flux job list inactive (2)' '
470+ state1=`${JOB_CONV} strtostate SCHED` &&
471+ state2=`${JOB_CONV} strtostate RUN` &&
472+ constraint="{ not: [ { or: [ {states:[${state1}]}, {states:[${state2}]} ] } ] }" &&
473+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
474+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_inactive2.out &&
475+ numlines=$(cat inactive.ids | wc -l) &&
476+ test $(cat list_constraint_inactive2.out | wc -l) -eq ${numlines}
477+ '
478+
479+ test_expect_success ' flux job list all via since (1)' '
480+ constraint="{ or: [ {since:[0]} ] }" &&
481+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
482+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_all1.out &&
483+ numlines=$(cat all.ids | wc -l) &&
484+ test $(cat list_constraint_all1.out | wc -l) -eq ${numlines}
485+ '
486+
487+ # use a floating point in this one
488+ test_expect_success ' flux job list all via since (2)' '
489+ constraint="{ or: [ {since:[1.1]} ] }" &&
490+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
491+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_all2.out &&
492+ numlines=$(cat all.ids | wc -l) &&
493+ test $(cat list_constraint_all2.out | wc -l) -eq ${numlines}
494+ '
495+
345496# with single anonymous queue, queues arrays should be zero length
346497test_expect_success ' job stats lists jobs in correct state (mix)' '
347498 flux job stats | jq -e ".job_states.depend == 0" &&
0 commit comments