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/initiator_connection.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/initiator_connection.py')
-rw-r--r-- | distbuild/initiator_connection.py | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/distbuild/initiator_connection.py b/distbuild/initiator_connection.py index fdb1dab5..718686dc 100644 --- a/distbuild/initiator_connection.py +++ b/distbuild/initiator_connection.py @@ -26,6 +26,12 @@ class InitiatorDisconnect(object): self.id = id +class CancelRequest(object): + + def __init__(self, id): + self.id = id + + class _Close(object): def __init__(self, event_source): @@ -76,8 +82,12 @@ class InitiatorConnection(distbuild.StateMachine): 'idle', self._send_build_failed_message), ('idle', distbuild.BuildController, distbuild.BuildProgress, 'idle', self._send_build_progress_message), + ('idle', distbuild.BuildController, distbuild.BuildCancel, + 'idle', self._send_build_cancelled_message), ('idle', distbuild.BuildController, distbuild.BuildStepStarted, 'idle', self._send_build_step_started_message), + ('idle', distbuild.BuildController, distbuild.BuildStarted, + 'idle', self._send_build_started_message), ('idle', distbuild.BuildController, distbuild.BuildStepAlreadyStarted, 'idle', self._send_build_step_already_started_message), @@ -117,6 +127,8 @@ class InitiatorConnection(distbuild.StateMachine): self._handle_build_request(event) elif event.msg['type'] == 'list-requests': self._handle_list_requests(event) + elif event.msg['type'] == 'build-cancel': + self._handle_build_cancel(event) else: logging.error('Invalid message type: %s', event.msg) except (KeyError, ValueError) as ex: @@ -151,6 +163,24 @@ class InitiatorConnection(distbuild.StateMachine): message=('\n\n'.join(output_msg))) self.jm.send(msg) + def _handle_build_cancel(self, event): + requests = self.mainloop.state_machines_of_type( + distbuild.BuildController) + for build in requests: + if build.get_request()['id'] == event.msg['id']: + self.mainloop.queue_event(InitiatorConnection, + CancelRequest(event.msg['id'])) + msg = distbuild.message('request-output', message=( + 'Cancelling build request with ID %s' % + event.msg['id'])) + self.jm.send(msg) + break + else: + msg = distbuild.message('request-output', message=('Given ' + 'build-request ID does not match any ' + 'running build IDs.')) + self.jm.send(msg) + def _disconnect(self, event_source, event): for id in self.our_ids: logging.debug('InitiatorConnection: %s: InitiatorDisconnect(%s)', @@ -187,6 +217,16 @@ class InitiatorConnection(distbuild.StateMachine): self.jm.send(msg) self._log_send(msg) + def _send_build_cancelled_message(self, event_source, event): + if event.id in self.our_ids: + msg = distbuild.message('build-cancelled', + id=self._route_map.get_incoming_id(event.id)) + + self._route_map.remove(event.id) + self.our_ids.remove(event.id) + self.jm.send(msg) + self._log_send(msg) + def _send_build_failed_message(self, event_source, event): if event.id in self.our_ids: msg = distbuild.message('build-failed', @@ -205,6 +245,14 @@ class InitiatorConnection(distbuild.StateMachine): self.jm.send(msg) self._log_send(msg) + def _send_build_started_message(self, event_source, event): + logging.debug('InitiatorConnection: build_started: id=%s' % event.id) + + if event.id in self.our_ids: + msg = distbuild.message('build-started', id=event.id) + self.jm.send(msg) + self._log_send(msg) + def _send_build_step_started_message(self, event_source, event): logging.debug('InitiatorConnection: build_step_started: ' 'id=%s step_name=%s worker_name=%s' % |