gui/schedule: support terminating all experiments in a pipeline. Closes #262

This commit is contained in:
Sebastien Bourdeauducq 2016-03-29 17:34:38 +08:00
parent b59283f85e
commit dc2c19f08f
1 changed files with 30 additions and 0 deletions

View File

@ -83,6 +83,10 @@ class ScheduleDock(QtWidgets.QDockWidget):
delete_action.setShortcut("SHIFT+DELETE")
delete_action.setShortcutContext(QtCore.Qt.WidgetShortcut)
self.table.addAction(delete_action)
terminate_pipeline = QtWidgets.QAction(
"Gracefully terminate all in pipeline", self.table)
terminate_pipeline.triggered.connect(self.terminate_pipeline_clicked)
self.table.addAction(terminate_pipeline)
self.table_model = Model(dict())
schedule_sub.add_setmodel_callback(self.set_model)
@ -120,6 +124,32 @@ class ScheduleDock(QtWidgets.QDockWidget):
self.status_bar.showMessage(msg)
asyncio.ensure_future(self.delete(rid, graceful))
async def request_term_multiple(self, rids):
for rid in rids:
try:
await self.schedule_ctl.request_termination(rid)
except:
# May happen if the experiment has terminated by itself
# while we were terminating others.
logger.debug("failed to request termination of RID %d",
rid, exc_info=True)
def terminate_pipeline_clicked(self):
idx = self.table.selectedIndexes()
if idx:
row = idx[0].row()
selected_rid = self.table_model.row_to_key[row]
pipeline = self.table_model.backing_store[selected_rid]["pipeline"]
self.status_bar.showMessage("Requesting termination of all "
"experiments in pipeline '{}'".format(pipeline))
rids = set()
for rid, info in self.table_model.backing_store.items():
if info["pipeline"] == pipeline:
rids.add(rid)
asyncio.ensure_future(self.request_term_multiple(rids))
def save_state(self):
return bytes(self.table.horizontalHeader().saveState())