forked from M-Labs/artiq
artiq_client: remove custom input validation for built-in argparse (#1185)
This commit is contained in:
parent
721c6f3bcc
commit
99a0f61b35
|
@ -1,4 +1,10 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Client to send commands to :mod:`artiq_master` and display results locally.
|
||||||
|
|
||||||
|
The client can perform actions such as accessing/setting datasets,
|
||||||
|
scanning devices, scheduling experiments, and looking for experiments/devices.
|
||||||
|
"""
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import logging
|
import logging
|
||||||
|
@ -15,7 +21,7 @@ from artiq.protocols.pc_rpc import Client
|
||||||
from artiq.protocols.sync_struct import Subscriber
|
from artiq.protocols.sync_struct import Subscriber
|
||||||
from artiq.protocols.broadcast import Receiver
|
from artiq.protocols.broadcast import Receiver
|
||||||
from artiq.protocols import pyon
|
from artiq.protocols import pyon
|
||||||
from artiq.tools import short_format
|
from artiq.tools import short_format, parse_arguments
|
||||||
|
|
||||||
|
|
||||||
def clear_screen():
|
def clear_screen():
|
||||||
|
@ -46,7 +52,8 @@ def get_argparser():
|
||||||
"scheduling, default: %(default)s)")
|
"scheduling, default: %(default)s)")
|
||||||
parser_add.add_argument("-t", "--timed", default=None, type=str,
|
parser_add.add_argument("-t", "--timed", default=None, type=str,
|
||||||
help="set a due date for the experiment")
|
help="set a due date for the experiment")
|
||||||
parser_add.add_argument("-f", "--flush", default=False, action="store_true",
|
parser_add.add_argument("-f", "--flush", default=False,
|
||||||
|
action="store_true",
|
||||||
help="flush the pipeline before preparing "
|
help="flush the pipeline before preparing "
|
||||||
"the experiment")
|
"the experiment")
|
||||||
parser_add.add_argument("-R", "--repository", default=False,
|
parser_add.add_argument("-R", "--repository", default=False,
|
||||||
|
@ -80,10 +87,12 @@ def get_argparser():
|
||||||
help="name of the dataset")
|
help="name of the dataset")
|
||||||
parser_set_dataset.add_argument("value", metavar="VALUE",
|
parser_set_dataset.add_argument("value", metavar="VALUE",
|
||||||
help="value in PYON format")
|
help="value in PYON format")
|
||||||
parser_set_dataset.add_argument("-p", "--persist", action="store_true",
|
|
||||||
help="make the dataset persistent")
|
persist_group = parser_set_dataset.add_mutually_exclusive_group()
|
||||||
parser_set_dataset.add_argument("-n", "--no-persist", action="store_true",
|
persist_group.add_argument("-p", "--persist", action="store_true",
|
||||||
help="make the dataset non-persistent")
|
help="make the dataset persistent")
|
||||||
|
persist_group.add_argument("-n", "--no-persist", action="store_true",
|
||||||
|
help="make the dataset non-persistent")
|
||||||
|
|
||||||
parser_del_dataset = subparsers.add_parser(
|
parser_del_dataset = subparsers.add_parser(
|
||||||
"del-dataset", help="delete a dataset")
|
"del-dataset", help="delete a dataset")
|
||||||
|
@ -93,7 +102,8 @@ def get_argparser():
|
||||||
"show", help="show schedule, log, devices or datasets")
|
"show", help="show schedule, log, devices or datasets")
|
||||||
parser_show.add_argument(
|
parser_show.add_argument(
|
||||||
"what", metavar="WHAT",
|
"what", metavar="WHAT",
|
||||||
help="select object to show: schedule/log/devices/datasets")
|
choices=["schedule", "log", "ccb", "devices", "datasets"],
|
||||||
|
help="select object to show: %(choices)s")
|
||||||
|
|
||||||
subparsers.add_parser(
|
subparsers.add_parser(
|
||||||
"scan-devices", help="trigger a device database (re)scan")
|
"scan-devices", help="trigger a device database (re)scan")
|
||||||
|
@ -114,20 +124,11 @@ def get_argparser():
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
|
|
||||||
def _parse_arguments(arguments):
|
|
||||||
d = {}
|
|
||||||
for argument in arguments:
|
|
||||||
name, value = argument.split("=")
|
|
||||||
d[name] = pyon.decode(value)
|
|
||||||
return d
|
|
||||||
|
|
||||||
|
|
||||||
def _action_submit(remote, args):
|
def _action_submit(remote, args):
|
||||||
try:
|
try:
|
||||||
arguments = _parse_arguments(args.arguments)
|
arguments = parse_arguments(args.arguments)
|
||||||
except:
|
except Exception as err:
|
||||||
print("Failed to parse run arguments")
|
raise ValueError("Failed to parse run arguments") from err
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
expid = {
|
expid = {
|
||||||
"log_level": logging.WARNING + args.quiet*10 - args.verbose*10,
|
"log_level": logging.WARNING + args.quiet*10 - args.verbose*10,
|
||||||
|
@ -154,10 +155,6 @@ def _action_delete(remote, args):
|
||||||
|
|
||||||
|
|
||||||
def _action_set_dataset(remote, args):
|
def _action_set_dataset(remote, args):
|
||||||
if args.persist and args.no_persist:
|
|
||||||
print("Options --persist and --no-persist cannot be specified "
|
|
||||||
"at the same time")
|
|
||||||
sys.exit(1)
|
|
||||||
persist = None
|
persist = None
|
||||||
if args.persist:
|
if args.persist:
|
||||||
persist = True
|
persist = True
|
||||||
|
@ -190,13 +187,13 @@ def _action_ls(remote, args):
|
||||||
def _show_schedule(schedule):
|
def _show_schedule(schedule):
|
||||||
clear_screen()
|
clear_screen()
|
||||||
if schedule:
|
if schedule:
|
||||||
l = sorted(schedule.items(),
|
sorted_schedule = sorted(schedule.items(),
|
||||||
key=lambda x: (-x[1]["priority"],
|
key=lambda x: (-x[1]["priority"],
|
||||||
x[1]["due_date"] or 0,
|
x[1]["due_date"] or 0,
|
||||||
x[0]))
|
x[0]))
|
||||||
table = PrettyTable(["RID", "Pipeline", " Status ", "Prio",
|
table = PrettyTable(["RID", "Pipeline", " Status ", "Prio",
|
||||||
"Due date", "Revision", "File", "Class name"])
|
"Due date", "Revision", "File", "Class name"])
|
||||||
for rid, v in l:
|
for rid, v in sorted_schedule:
|
||||||
row = [rid, v["pipeline"], v["status"], v["priority"]]
|
row = [rid, v["pipeline"], v["status"], v["priority"]]
|
||||||
if v["due_date"] is None:
|
if v["due_date"] is None:
|
||||||
row.append("")
|
row.append("")
|
||||||
|
@ -252,6 +249,7 @@ def _run_subscriber(host, port, subscriber):
|
||||||
|
|
||||||
def _show_dict(args, notifier_name, display_fun):
|
def _show_dict(args, notifier_name, display_fun):
|
||||||
d = dict()
|
d = dict()
|
||||||
|
|
||||||
def init_d(x):
|
def init_d(x):
|
||||||
d.clear()
|
d.clear()
|
||||||
d.update(x)
|
d.update(x)
|
||||||
|
@ -299,8 +297,7 @@ def main():
|
||||||
elif args.what == "datasets":
|
elif args.what == "datasets":
|
||||||
_show_dict(args, "datasets", _show_datasets)
|
_show_dict(args, "datasets", _show_datasets)
|
||||||
else:
|
else:
|
||||||
print("Unknown object to show, use -h to list valid names.")
|
raise ValueError
|
||||||
sys.exit(1)
|
|
||||||
else:
|
else:
|
||||||
port = 3251 if args.port is None else args.port
|
port = 3251 if args.port is None else args.port
|
||||||
target_name = {
|
target_name = {
|
||||||
|
@ -318,5 +315,6 @@ def main():
|
||||||
finally:
|
finally:
|
||||||
remote.close_rpc()
|
remote.close_rpc()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
Loading…
Reference in New Issue