diff options
author | Lauren Perry <lauren.perry@codethink.co.uk> | 2015-04-02 17:23:07 +0100 |
---|---|---|
committer | Richard Ipsum <richardipsum@fastmail.co.uk> | 2015-04-29 16:10:58 +0000 |
commit | 84096556ea54d4af236f1fe5f7ccf61c1343016f (patch) | |
tree | 76b5aa72bf9c691fd8e154feade051c2ceba16ac /distbuild/build_controller.py | |
parent | 4a1c2d118511da067fcadf2253fdc2a49d04e4fa (diff) | |
download | morph-84096556ea54d4af236f1fe5f7ccf61c1343016f.tar.gz |
distbuild: Add distbuild start and cancel functionality
Add command for distbuild-start to build_plugin in morphlib,
and create a boolean parameter to inform the initiator whether
to disconnect the controller and leave the build running remotely.
Add distbuild-cancel command to parse currently-running distbuild
build-request IDs and cancel the one matching the given argument
Change-Id: I458a5767bb768ceb2b4d8876adf1c86075d452bd
Diffstat (limited to 'distbuild/build_controller.py')
-rw-r--r-- | distbuild/build_controller.py | 42 |
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) |