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