@@ -358,6 +358,229 @@ test_expect_success 'flux job list all jobs works' '
358358 test_cmp all.ids list_all_jobids.out
359359'
360360
361+ # do some more advanced constraint queries
362+
363+ test_expect_success ' flux job list hostname jobs' '
364+ id=$(id -u) &&
365+ constraint="{ and: [ {userid:[${id}]}, {name:[\"hostname\"]}] }" &&
366+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
367+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_hostname_jobs.out &&
368+ numlines=$(cat pending.ids completed.ids | wc -l) &&
369+ test $(cat list_constraint_hostname_jobs.out | wc -l) -eq ${numlines}
370+ '
371+
372+ test_expect_success ' flux job list active hostname jobs' '
373+ id=$(id -u) &&
374+ constraint="{ and: [ {userid:[${id}]}, {states:[\"active\"]}, {name:[\"hostname\"]}] }" &&
375+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
376+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_pending_hostname.out &&
377+ test_cmp list_constraint_pending_hostname.out pending.ids
378+ '
379+
380+ test_expect_success ' flux job list inactive hostname jobs' '
381+ id=$(id -u) &&
382+ constraint="{ and: [ {userid:[${id}]}, {states:[\"inactive\"]}, {name:[\"hostname\"]}] }" &&
383+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
384+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_inactive_hostname.out &&
385+ test_cmp list_constraint_inactive_hostname.out completed.ids
386+ '
387+
388+ test_expect_success ' flux job list invalid queue' '
389+ id=$(id -u) &&
390+ constraint="{ and: [ {userid:[${id}]}, {queue:[\"blarg\"]}] }" &&
391+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
392+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_invalid_queue.out &&
393+ test $(cat list_constraint_invalid_queue.out | wc -l) -eq 0
394+ '
395+
396+ test_expect_success ' flux job list active (1)' '
397+ state1=`${JOB_CONV} strtostate SCHED` &&
398+ state2=`${JOB_CONV} strtostate RUN` &&
399+ constraint="{ or: [ {states:[${state1}]}, {states:[${state2}]} ] }" &&
400+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
401+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_active1.out &&
402+ numlines=$(cat active.ids | wc -l) &&
403+ test $(cat list_constraint_active1.out | wc -l) -eq ${numlines}
404+ '
405+
406+ test_expect_success ' flux job list active (2)' '
407+ state1=`${JOB_CONV} strtostate INACTIVE` &&
408+ constraint="{ not: [ {states:[${state1}]} ] }" &&
409+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
410+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_active2.out &&
411+ numlines=$(cat active.ids | wc -l) &&
412+ test $(cat list_constraint_active2.out | wc -l) -eq ${numlines}
413+ '
414+
415+ test_expect_success ' flux job list pending jobs or inactive jobs (1)' '
416+ state1=`${JOB_CONV} strtostate SCHED` &&
417+ state2=`${JOB_CONV} strtostate INACTIVE` &&
418+ constraint="{ or: [ {states:[${state1}]}, {states:[${state2}]} ] }" &&
419+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
420+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_pending_inactive1.out &&
421+ numlines=$(cat pending.ids inactive.ids | wc -l) &&
422+ test $(cat list_constraint_pending_inactive1.out | wc -l) -eq ${numlines}
423+ '
424+
425+ test_expect_success ' flux job list pending jobs or inactive jobs (2)' '
426+ state1=`${JOB_CONV} strtostate SCHED` &&
427+ state2=`${JOB_CONV} strtostate INACTIVE` &&
428+ constraint="{ or: [ {states:[${state1}, ${state2}]} ] }" &&
429+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
430+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_pending_inactive2.out &&
431+ numlines=$(cat pending.ids inactive.ids | wc -l) &&
432+ test $(cat list_constraint_pending_inactive2.out | wc -l) -eq ${numlines}
433+ '
434+
435+ test_expect_success ' flux job list failed and canceled jobs (1)' '
436+ result1=`${JOB_CONV} strtoresult FAILED` &&
437+ result2=`${JOB_CONV} strtoresult CANCELED` &&
438+ constraint="{ or: [ {results:[${result1}]}, {results:[${result2}]} ] }" &&
439+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
440+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_failed_canceled1.out &&
441+ numlines=$(cat canceled.ids failed.ids | wc -l) &&
442+ test $(cat list_constraint_failed_canceled1.out | wc -l) -eq ${numlines}
443+ '
444+
445+ test_expect_success ' flux job list failed and canceled jobs (2)' '
446+ result1=`${JOB_CONV} strtoresult FAILED` &&
447+ result2=`${JOB_CONV} strtoresult CANCELED` &&
448+ constraint="{ and: [ {userid:[${id}]}, {results:[${result1}, ${result2}]}] }" &&
449+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
450+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_failed_canceled2.out &&
451+ numlines=$(cat canceled.ids failed.ids | wc -l) &&
452+ test $(cat list_constraint_failed_canceled2.out | wc -l) -eq ${numlines}
453+ '
454+
455+ test_expect_success ' flux job list pending jobs or failed jobs (1)' '
456+ state1=`${JOB_CONV} strtostate SCHED` &&
457+ state2=`${JOB_CONV} strtostate INACTIVE` &&
458+ result1=`${JOB_CONV} strtoresult FAILED` &&
459+ constraint="{ or: [ {states:[${state1}]}, {and: [ {states:[${state2}]}, {results:[${result1}]} ] } ] }" &&
460+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
461+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_pending_failed1.out &&
462+ numlines=$(cat pending.ids failed.ids | wc -l) &&
463+ test $(cat list_constraint_pending_failed1.out | wc -l) -eq ${numlines}
464+ '
465+
466+ test_expect_success ' flux job list pending jobs or failed jobs (2)' '
467+ state1=`${JOB_CONV} strtostate SCHED` &&
468+ result1=`${JOB_CONV} strtoresult FAILED` &&
469+ constraint="{ or: [ {states:[${state1}]}, {results:[${result1}]} ] }" &&
470+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
471+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_pending_failed2.out &&
472+ numlines=$(cat pending.ids failed.ids | wc -l) &&
473+ test $(cat list_constraint_pending_failed2.out | wc -l) -eq ${numlines}
474+ '
475+
476+ test_expect_success ' flux job list inactive (1)' '
477+ state1=`${JOB_CONV} strtostate INACTIVE` &&
478+ constraint="{ or: [ {states:[${state1}]} ] }" &&
479+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
480+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_inactive1.out &&
481+ numlines=$(cat inactive.ids | wc -l) &&
482+ test $(cat list_constraint_inactive1.out | wc -l) -eq ${numlines}
483+ '
484+
485+ test_expect_success ' flux job list inactive (2)' '
486+ state1=`${JOB_CONV} strtostate SCHED` &&
487+ state2=`${JOB_CONV} strtostate RUN` &&
488+ constraint="{ not: [ { or: [ {states:[${state1}]}, {states:[${state2}]} ] } ] }" &&
489+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
490+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_inactive2.out &&
491+ numlines=$(cat inactive.ids | wc -l) &&
492+ test $(cat list_constraint_inactive2.out | wc -l) -eq ${numlines}
493+ '
494+
495+ test_expect_success ' flux job list have run via t_run (1)' '
496+ constraint="{ or: [ {t_run:[\">=0\"]} ] }" &&
497+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
498+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_t_run1.out &&
499+ numlines=$(cat running.ids failed.ids timeout.ids completed.ids | wc -l) &&
500+ test $(cat list_constraint_t_run1.out | wc -l) -eq ${numlines}
501+ '
502+
503+ # use a floating point in this one
504+ test_expect_success ' flux job list have run via t_run (2)' '
505+ constraint="{ or: [ {t_run:[\">=1.0\"]} ] }" &&
506+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
507+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_t_run2.out &&
508+ numlines=$(cat running.ids failed.ids timeout.ids completed.ids | wc -l) &&
509+ test $(cat list_constraint_t_run2.out | wc -l) -eq ${numlines}
510+ '
511+
512+ test_expect_success ' flux job list have run via t_run (3)' '
513+ constraint="{ or: [ {t_run:[\">1.1\"]} ] }" &&
514+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
515+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_t_run3.out &&
516+ numlines=$(cat running.ids failed.ids timeout.ids completed.ids | wc -l) &&
517+ test $(cat list_constraint_t_run3.out | wc -l) -eq ${numlines}
518+ '
519+
520+ test_expect_success ' flux job list inactive via t_inactive (1)' '
521+ constraint="{ or: [ {t_inactive:[\">=0\"]} ] }" &&
522+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
523+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_t_inactive1.out &&
524+ numlines=$(cat inactive.ids | wc -l) &&
525+ test $(cat list_constraint_t_inactive1.out | wc -l) -eq ${numlines}
526+ '
527+
528+ # use a floating point in this one
529+ test_expect_success ' flux job list inactive via t_inactive (2)' '
530+ constraint="{ or: [ {t_inactive:[\">=1.0\"]} ] }" &&
531+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
532+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_t_inactive2.out &&
533+ numlines=$(cat inactive.ids | wc -l) &&
534+ test $(cat list_constraint_t_inactive2.out | wc -l) -eq ${numlines}
535+ '
536+
537+ test_expect_success ' flux job list inactive via t_inactive (3)' '
538+ constraint="{ or: [ {t_inactive:[\">1.1\"]} ] }" &&
539+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
540+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_t_inactive3.out &&
541+ numlines=$(cat inactive.ids | wc -l) &&
542+ test $(cat list_constraint_t_inactive3.out | wc -l) -eq ${numlines}
543+ '
544+
545+ test_expect_success ' flux job list none via t_inactive (1)' '
546+ constraint="{ or: [ {t_inactive:[\"<0\"]} ] }" &&
547+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
548+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_none1.out &&
549+ test $(cat list_constraint_none1.out | wc -l) -eq 0
550+ '
551+
552+ test_expect_success ' flux job list none via t_inactive (2)' '
553+ constraint="{ or: [ {t_inactive:[\"<=0\"]} ] }" &&
554+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
555+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_none1.out &&
556+ test $(cat list_constraint_none1.out | wc -l) -eq 0
557+ '
558+
559+ test_expect_success ' flux job list all via t_depend (1)' '
560+ constraint="{ or: [ {t_depend:[\">=0\"]} ] }" &&
561+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
562+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_all1.out &&
563+ numlines=$(cat all.ids | wc -l) &&
564+ test $(cat list_constraint_all1.out | wc -l) -eq ${numlines}
565+ '
566+
567+ # use a floating point in this one
568+ test_expect_success ' flux job list all via t_depend (2)' '
569+ constraint="{ or: [ {t_depend:[\">=1.0\"]} ] }" &&
570+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
571+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_all2.out &&
572+ numlines=$(cat all.ids | wc -l) &&
573+ test $(cat list_constraint_all2.out | wc -l) -eq ${numlines}
574+ '
575+
576+ test_expect_success ' flux job list all via t_depend (3)' '
577+ constraint="{ or: [ {t_depend:[\">1.1\"]} ] }" &&
578+ $jq -j -c -n "{max_entries:1000, attrs:[], constraint:${constraint}}" \
579+ | $RPC job-list.list | $jq .jobs | $jq -c ' .[]' | $jq .id > list_constraint_all3.out &&
580+ numlines=$(cat all.ids | wc -l) &&
581+ test $(cat list_constraint_all3.out | wc -l) -eq ${numlines}
582+ '
583+
361584# with single anonymous queue, queues arrays should be zero length
362585test_expect_success ' job stats lists jobs in correct state (mix)' '
363586 flux job stats | jq -e ".job_states.depend == 0" &&
0 commit comments