Skip to content

Commit 45804fb

Browse files
authored
Merge pull request #6180 from grondo/issue#6166
flux-resource: fix missing queue in `flux resource list` output for states with no nodes
2 parents 72b2ab2 + 0a20853 commit 45804fb

File tree

2 files changed

+71
-19
lines changed

2 files changed

+71
-19
lines changed

src/cmd/flux-resource.py

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
resource_status,
2828
)
2929
from flux.rpc import RPC
30-
from flux.util import Deduplicator, UtilConfig
30+
from flux.util import Deduplicator, FilterActionSetUpdate, UtilConfig
3131

3232

3333
class FluxResourceConfig(UtilConfig):
@@ -198,7 +198,7 @@ def ranks_by_queue(resource_set, config, queues):
198198
"""
199199
queue_resources = QueueResources(resource_set, config)
200200
ranks = IDset()
201-
for queue in queues.split(","):
201+
for queue in queues:
202202
ranks.add(queue_resources.queue(queue).ranks)
203203
return ranks
204204

@@ -492,8 +492,9 @@ def drain_list(args):
492492

493493

494494
class ResourceSetExtra(ResourceSet):
495-
def __init__(self, arg=None, version=1, flux_config=None):
495+
def __init__(self, arg=None, version=1, flux_config=None, queue=None):
496496
self.flux_config = flux_config
497+
self._queue = queue
497498
if isinstance(arg, ResourceSet):
498499
self._rset = arg
499500
if arg.state:
@@ -517,6 +518,13 @@ def propertiesx(self):
517518

518519
@property
519520
def queue(self):
521+
# Note: queue may be set manually in self._queue for an empty
522+
# ResourceSet, which cannot otherwise have an associated queue.
523+
if self._queue is not None:
524+
return self._queue
525+
526+
# If self._queue is not set, then build list of queues from
527+
# set properties and queue configuration:
520528
queues = ""
521529
if self.flux_config and "queues" in self.flux_config:
522530
if not self.ranks:
@@ -558,7 +566,7 @@ def constraint_combinations(rset):
558566
return [rset.copy_constraint(x) for x in constraint_combinations(rset)]
559567

560568

561-
def resources_uniq_lines(resources, states, formatter, config):
569+
def resources_uniq_lines(resources, states, formatter, config, queues=None):
562570
"""
563571
Generate a set of resource sets that would produce unique lines given
564572
the ResourceSet formatter argument. Include only the provided states
@@ -583,6 +591,15 @@ def resources_uniq_lines(resources, states, formatter, config):
583591

584592
fmt = flux.util.OutputFormat(uniq_fmt, headings=formatter.headings)
585593

594+
# Get a list of configured queues if a specific list of queues
595+
# was not supplied by the caller. If no queues are configured then
596+
# one "anonymous" queue is simulated with [None]
597+
if not queues:
598+
if config and "queues" in config:
599+
queues = config["queues"].keys()
600+
else:
601+
queues = [None]
602+
586603
# Create a mapping of resources sets that generate uniq "lines":
587604
lines = {}
588605
for state in states:
@@ -592,13 +609,14 @@ def resources_uniq_lines(resources, states, formatter, config):
592609
# resource set for output purposes. O/w the output for this
593610
# state would be suppressed.
594611
#
595-
rset = ResourceSetExtra(flux_config=config)
596-
rset.state = state
597-
key = fmt.format(rset)
598-
if key not in lines:
599-
lines[key] = rset
600-
else:
601-
lines[key].add(rset)
612+
for queue in queues:
613+
rset = ResourceSetExtra(flux_config=config, queue=queue)
614+
rset.state = state
615+
key = fmt.format(rset)
616+
if key not in lines:
617+
lines[key] = rset
618+
else:
619+
lines[key].add(rset)
602620
continue
603621

604622
for rset in split_by_property_combinations(resources[state]):
@@ -684,7 +702,9 @@ def list_handler(args):
684702
fmt = FluxResourceConfig("list").load().get_format_string(args.format)
685703
formatter = flux.util.OutputFormat(fmt, headings=headings)
686704

687-
lines = resources_uniq_lines(resources, args.states, formatter, config)
705+
lines = resources_uniq_lines(
706+
resources, args.states, formatter, config, queues=args.queue
707+
)
688708
items = sort_output(args, lines.values())
689709
formatter.print_items(items, no_header=args.no_header)
690710

@@ -759,6 +779,8 @@ def main():
759779
drain_parser.add_argument(
760780
"-q",
761781
"--queue",
782+
action=FilterActionSetUpdate,
783+
default=set(),
762784
metavar="QUEUE,...",
763785
help="Include only specified queues in output",
764786
)
@@ -824,6 +846,8 @@ def main():
824846
status_parser.add_argument(
825847
"-q",
826848
"--queue",
849+
action=FilterActionSetUpdate,
850+
default=set(),
827851
metavar="QUEUE,...",
828852
help="Include only specified queues in output",
829853
)
@@ -879,6 +903,8 @@ def main():
879903
list_parser.add_argument(
880904
"-q",
881905
"--queue",
906+
action=FilterActionSetUpdate,
907+
default=set(),
882908
metavar="QUEUE,...",
883909
help="Include only specified queues in output",
884910
)
@@ -911,6 +937,8 @@ def main():
911937
info_parser.add_argument(
912938
"-q",
913939
"--queue",
940+
action=FilterActionSetUpdate,
941+
default=set(),
914942
metavar="QUEUE,...",
915943
help="Include only specified queues in output",
916944
)
@@ -959,6 +987,8 @@ def main():
959987
R_parser.add_argument(
960988
"-q",
961989
"--queue",
990+
action=FilterActionSetUpdate,
991+
default=set(),
962992
metavar="QUEUE,...",
963993
help="Include only specified queues in output",
964994
)

t/t2350-resource-list.t

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -517,9 +517,7 @@ test_expect_success 'flux resource lists expected queues (every)' '
517517
flux resource list -o "{state} {nnodes} {queue}" > listqueue_every.out &&
518518
test $(grep "free 2" listqueue_every.out | grep -c batch) -eq 1 &&
519519
test $(grep "free 2" listqueue_every.out | grep -c debug) -eq 1 &&
520-
test $(grep "free 2" listqueue_every.out | grep -c every) -eq 2 &&
521-
test $(grep "allocated 0" listqueue_every.out | grep -c every) -eq 0 &&
522-
test $(grep "down 0" listqueue_every.out | grep -c every) -eq 0
520+
test $(grep "free 2" listqueue_every.out | grep -c every) -eq 2
523521
'
524522
test_expect_success 'run a few jobs (every)' '
525523
flux submit -q batch sleep 30 > job2A.id &&
@@ -532,8 +530,7 @@ test_expect_success 'flux resource lists expected queues in states (every)' '
532530
test $(grep "free 1" listqueue_every2.out | grep -c every) -eq 2 &&
533531
test $(grep "allocated 1" listqueue_every2.out | grep -c batch) -eq 1 &&
534532
test $(grep "allocated 1" listqueue_every2.out | grep -c debug) -eq 1 &&
535-
test $(grep "allocated 1" listqueue_every2.out | grep -c every) -eq 2 &&
536-
test $(grep "down 0" listqueue_every2.out | grep -c every) -eq 0
533+
test $(grep "allocated 1" listqueue_every2.out | grep -c every) -eq 2
537534
'
538535
test_expect_success 'flux resource list --queue works for a queue with no constraints' '
539536
flux resource list --queue=every -o "{state} {nnodes} {queue}" >queue-every.out &&
@@ -542,8 +539,33 @@ test_expect_success 'flux resource list --queue works for a queue with no constr
542539
test $(grep "free 1" queue-every.out | grep -c every) -eq 2 &&
543540
test $(grep "allocated 1" queue-every.out | grep -c batch) -eq 1 &&
544541
test $(grep "allocated 1" queue-every.out | grep -c debug) -eq 1 &&
545-
test $(grep "allocated 1" queue-every.out | grep -c every) -eq 2 &&
546-
test $(grep "down 0" queue-every.out | grep -c every) -eq 0
542+
test $(grep "allocated 1" queue-every.out | grep -c every) -eq 2
543+
'
544+
test_expect_success 'flux resource list includes queue names for empty sets' '
545+
# There are no nodes in 'down' state in this test, so use that:
546+
flux resource list -s down -no "{queue} {state} {nnodes}" \
547+
>queue-empty1.out &&
548+
cat <<-EOF >queue-empty1.expected &&
549+
every down 0
550+
batch down 0
551+
debug down 0
552+
EOF
553+
test_cmp queue-empty1.expected queue-empty1.out
554+
'
555+
test_expect_success 'flux resource list includes queue names for empty sets (single)' '
556+
flux resource list -q batch -s down -no "{queue} {state} {nnodes}" \
557+
>queue-batch-down.out &&
558+
cat <<-EOF >queue-batch-down.expected &&
559+
batch down 0
560+
EOF
561+
test_cmp queue-batch-down.expected queue-batch-down.out
562+
'
563+
test_expect_success 'flux resource list includes queue names for empty sets (multiple)' '
564+
flux resource list -q batch,debug \
565+
-s down -no "{queue} {state} {nnodes}" \
566+
>queue-batch,debug-down.out &&
567+
grep "debug down 0" queue-batch,debug-down.out &&
568+
grep "batch down 0" queue-batch,debug-down.out
547569
'
548570
test_expect_success 'cleanup jobs' '
549571
flux cancel $(cat job2A.id) $(cat job2B.id)

0 commit comments

Comments
 (0)