summaryrefslogtreecommitdiff
path: root/distbuild/initiator_connection.py
diff options
context:
space:
mode:
authorLauren Perry <lauren.perry@codethink.co.uk>2015-04-02 17:23:07 +0100
committerRichard Ipsum <richardipsum@fastmail.co.uk>2015-04-29 16:10:58 +0000
commit84096556ea54d4af236f1fe5f7ccf61c1343016f (patch)
tree76b5aa72bf9c691fd8e154feade051c2ceba16ac /distbuild/initiator_connection.py
parent4a1c2d118511da067fcadf2253fdc2a49d04e4fa (diff)
downloadmorph-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.py48
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' %