summaryrefslogtreecommitdiff
path: root/distbuild/build_controller.py
diff options
context:
space:
mode:
Diffstat (limited to 'distbuild/build_controller.py')
-rw-r--r--distbuild/build_controller.py42
1 files changed, 41 insertions, 1 deletions
diff --git a/distbuild/build_controller.py b/distbuild/build_controller.py
index 35b231f9..d879ffea 100644
--- a/distbuild/build_controller.py
+++ b/distbuild/build_controller.py
@@ -43,6 +43,12 @@ class _GotGraph(object):
self.artifact = artifact
+class BuildStarted(object):
+
+ def __init__(self, id):
+ self.id = id
+
+
class BuildCancel(object):
def __init__(self, id):
@@ -77,12 +83,14 @@ class BuildStepStarted(object):
self.step_name = step_name
self.worker_name = worker_name
+
class BuildStepAlreadyStarted(BuildStepStarted):
def __init__(self, request_id, step_name, worker_name):
super(BuildStepAlreadyStarted, self).__init__(
request_id, step_name, worker_name)
+
class BuildOutput(object):
def __init__(self, request_id, step_name, stdout, stderr):
@@ -174,6 +182,7 @@ class BuildController(distbuild.StateMachine):
self._helper_id = None
self.debug_transitions = False
self.debug_graph_state = False
+ self.allow_detach = build_request_message['allow_detach']
def __repr__(self):
return '<BuildController at 0x%x, request-id %s>' % (id(self),
@@ -194,6 +203,9 @@ class BuildController(distbuild.StateMachine):
('init', distbuild.InitiatorConnection,
distbuild.InitiatorDisconnect, 'init',
self._maybe_notify_initiator_disconnected),
+ ('init', distbuild.InitiatorConnection,
+ distbuild.CancelRequest, 'init',
+ self._maybe_notify_build_cancelled),
('init', self, _Abort, None, None),
('graphing', distbuild.HelperRouter, distbuild.HelperOutput,
@@ -204,6 +216,9 @@ class BuildController(distbuild.StateMachine):
'annotating', self._start_annotating),
('graphing', self, BuildFailed, None, None),
('graphing', distbuild.InitiatorConnection,
+ distbuild.CancelRequest, 'graphing',
+ self._maybe_notify_build_cancelled),
+ ('graphing', distbuild.InitiatorConnection,
distbuild.InitiatorDisconnect, 'graphing',
self._maybe_notify_initiator_disconnected),
('graphing', self, _Abort, None, None),
@@ -214,6 +229,9 @@ class BuildController(distbuild.StateMachine):
('annotating', self, _Annotated, 'building',
self._queue_worker_builds),
('annotating', distbuild.InitiatorConnection,
+ distbuild.CancelRequest, 'annotating',
+ self._maybe_notify_build_cancelled),
+ ('annotating', distbuild.InitiatorConnection,
distbuild.InitiatorDisconnect, 'annotating',
self._maybe_notify_initiator_disconnected),
('annotating', self, _Abort, None, None),
@@ -250,6 +268,9 @@ class BuildController(distbuild.StateMachine):
('building', self, _Abort, None, None),
('building', self, _Built, None, self._notify_build_done),
('building', distbuild.InitiatorConnection,
+ distbuild.CancelRequest, 'building',
+ self._maybe_notify_build_cancelled),
+ ('building', distbuild.InitiatorConnection,
distbuild.InitiatorDisconnect, 'building',
self._maybe_notify_initiator_disconnected),
]
@@ -448,6 +469,9 @@ class BuildController(distbuild.StateMachine):
self.mainloop.queue_event(self, _Built())
return
+ self.mainloop.queue_event(BuildController,
+ BuildStarted(self._request['id']))
+
logging.debug('Queuing more worker-builds to run')
if self.debug_graph_state:
logging.debug('Current state of build graph nodes:')
@@ -496,8 +520,24 @@ class BuildController(distbuild.StateMachine):
logging.debug("BuildController %r: initiator id %s disconnected",
self, event.id)
+ if self.allow_detach:
+ logging.debug('Detaching from client; build continuing remotely.')
+ else:
+ self.mainloop.queue_event(BuildController, distbuild.CancelRequest)
+
+ def _maybe_notify_build_cancelled(self, event_source, event):
+ if event.id != self._request['id']:
+ logging.debug('Heard initiator cancel request with event id %s '
+ 'but our request id is %s',
+ event.id, self._request['id'])
+ return # not for us
+
+ logging.debug("BuildController %r: initiator id %s cancelled",
+ self, event.id)
+
cancel_pending = distbuild.WorkerCancelPending(event.id)
- self.mainloop.queue_event(distbuild.WorkerBuildQueuer, cancel_pending)
+ self.mainloop.queue_event(distbuild.WorkerBuildQueuer,
+ cancel_pending)
cancel = BuildCancel(event.id)
self.mainloop.queue_event(BuildController, cancel)