forked from M-Labs/artiq
gui/explorer: support requesting termination of all instances
This commit is contained in:
parent
976e13639e
commit
a7c9c95085
|
@ -116,6 +116,7 @@ def main():
|
||||||
loop.run_until_complete(d_schedule.sub_connect(
|
loop.run_until_complete(d_schedule.sub_connect(
|
||||||
args.server, args.port_notify))
|
args.server, args.port_notify))
|
||||||
atexit.register(lambda: loop.run_until_complete(d_schedule.sub_close()))
|
atexit.register(lambda: loop.run_until_complete(d_schedule.sub_close()))
|
||||||
|
d_explorer.get_current_schedule = d_schedule.get_current_schedule
|
||||||
|
|
||||||
d_log = LogDock()
|
d_log = LogDock()
|
||||||
smgr.register(d_log)
|
smgr.register(d_log)
|
||||||
|
|
|
@ -263,8 +263,7 @@ class ExplorerDock(dockarea.Dock):
|
||||||
grid.addWidget(self.log_level, 3, 3)
|
grid.addWidget(self.log_level, 3, 3)
|
||||||
|
|
||||||
submit = QtGui.QPushButton("Submit")
|
submit = QtGui.QPushButton("Submit")
|
||||||
submit.setShortcut("CTRL+RETURN")
|
submit.setToolTip("Schedule the selected experiment (Ctrl+Return)")
|
||||||
submit.setToolTip("Schedule the selected experiment (CTRL+ENTER)")
|
|
||||||
grid.addWidget(submit, 4, 0, colspan=4)
|
grid.addWidget(submit, 4, 0, colspan=4)
|
||||||
submit.clicked.connect(self.submit_clicked)
|
submit.clicked.connect(self.submit_clicked)
|
||||||
|
|
||||||
|
@ -276,6 +275,19 @@ class ExplorerDock(dockarea.Dock):
|
||||||
self.shortcuts = ShortcutManager(self.main_window, self)
|
self.shortcuts = ShortcutManager(self.main_window, self)
|
||||||
|
|
||||||
self.el.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
|
self.el.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
|
||||||
|
submit_action = QtGui.QAction("Submit", self.el)
|
||||||
|
submit_action.triggered.connect(self.submit_clicked)
|
||||||
|
submit_action.setShortcut("CTRL+RETURN")
|
||||||
|
self.el.addAction(submit_action)
|
||||||
|
reqterm_action = QtGui.QAction("Request termination of instances", self.el)
|
||||||
|
reqterm_action.triggered.connect(self.request_inst_term)
|
||||||
|
reqterm_action.setShortcut("CTRL+BACKSPACE")
|
||||||
|
self.el.addAction(reqterm_action)
|
||||||
|
|
||||||
|
sep = QtGui.QAction(self.el)
|
||||||
|
sep.setSeparator(True)
|
||||||
|
self.el.addAction(sep)
|
||||||
|
|
||||||
edit_shortcuts_action = QtGui.QAction("Edit shortcuts", self.el)
|
edit_shortcuts_action = QtGui.QAction("Edit shortcuts", self.el)
|
||||||
edit_shortcuts_action.triggered.connect(self.edit_shortcuts)
|
edit_shortcuts_action.triggered.connect(self.edit_shortcuts)
|
||||||
self.el.addAction(edit_shortcuts_action)
|
self.el.addAction(edit_shortcuts_action)
|
||||||
|
@ -392,6 +404,28 @@ class ExplorerDock(dockarea.Dock):
|
||||||
due_date,
|
due_date,
|
||||||
self.flush.isChecked())
|
self.flush.isChecked())
|
||||||
|
|
||||||
|
async def request_term_multiple(self, rids):
|
||||||
|
for rid in rids:
|
||||||
|
try:
|
||||||
|
await self.schedule_ctl.request_termination(rid)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def request_inst_term(self):
|
||||||
|
if self.selected_key is not None:
|
||||||
|
expinfo = self.explist_model.backing_store[self.selected_key]
|
||||||
|
# attribute get_current_schedule must be set externally after
|
||||||
|
# instance creation
|
||||||
|
current_schedule = self.get_current_schedule()
|
||||||
|
rids = []
|
||||||
|
for rid, desc in current_schedule.items():
|
||||||
|
expid = desc["expid"]
|
||||||
|
if ("repo_rev" in expid # only consider runs from repository
|
||||||
|
and expid["file"] == expinfo["file"]
|
||||||
|
and expid["class_name"] == expinfo["class_name"]):
|
||||||
|
rids.append(rid)
|
||||||
|
asyncio.ensure_future(self.request_term_multiple(rids))
|
||||||
|
|
||||||
def edit_shortcuts(self):
|
def edit_shortcuts(self):
|
||||||
experiments = sorted(self.explist_model.backing_store.keys())
|
experiments = sorted(self.explist_model.backing_store.keys())
|
||||||
self.shortcuts.edit(experiments)
|
self.shortcuts.edit(experiments)
|
||||||
|
|
|
@ -82,7 +82,6 @@ class ScheduleDock(dockarea.Dock):
|
||||||
delete_action.setShortcut("SHIFT+DELETE")
|
delete_action.setShortcut("SHIFT+DELETE")
|
||||||
self.table.addAction(delete_action)
|
self.table.addAction(delete_action)
|
||||||
|
|
||||||
|
|
||||||
async def sub_connect(self, host, port):
|
async def sub_connect(self, host, port):
|
||||||
self.subscriber = Subscriber("schedule", self.init_schedule_model)
|
self.subscriber = Subscriber("schedule", self.init_schedule_model)
|
||||||
await self.subscriber.connect(host, port)
|
await self.subscriber.connect(host, port)
|
||||||
|
@ -90,6 +89,13 @@ class ScheduleDock(dockarea.Dock):
|
||||||
async def sub_close(self):
|
async def sub_close(self):
|
||||||
await self.subscriber.close()
|
await self.subscriber.close()
|
||||||
|
|
||||||
|
def get_current_schedule(self):
|
||||||
|
try:
|
||||||
|
table_model = self.table_model
|
||||||
|
except AttributeError:
|
||||||
|
return dict()
|
||||||
|
return table_model.backing_store
|
||||||
|
|
||||||
def init_schedule_model(self, init):
|
def init_schedule_model(self, init):
|
||||||
self.table_model = _ScheduleModel(self.table, init)
|
self.table_model = _ScheduleModel(self.table, init)
|
||||||
self.table.setModel(self.table_model)
|
self.table.setModel(self.table_model)
|
||||||
|
|
Loading…
Reference in New Issue