From 8625124549dd4ae1a5b347a51c95c3f1887fb9ea Mon Sep 17 00:00:00 2001 From: Lauren Perry Date: Mon, 11 May 2015 16:22:53 +0000 Subject: distbuild: Condense Initiator class to remove unnecessary duplication Create an InitiatorCommand class that accepts message_type and status_text parameters to be used by the distbuild-list-jobs, distbuild-status and distbuild-cancel commands to send request messages to the distbuild network Change-Id: Ib686dcd7c370d802b612e9aaa1e3df76f0275fae --- distbuild/__init__.py | 3 +- distbuild/initiator.py | 134 ++--------------------------------- morphlib/plugins/distbuild_plugin.py | 20 ++++-- 3 files changed, 24 insertions(+), 133 deletions(-) diff --git a/distbuild/__init__.py b/distbuild/__init__.py index dc5ff153..145dc40a 100644 --- a/distbuild/__init__.py +++ b/distbuild/__init__.py @@ -59,8 +59,7 @@ from build_controller import (BuildController, BuildFailed, BuildProgress, BuildFinished, BuildCancel, BuildStarted, GraphingStarted, GraphingFinished, CacheState, build_step_name, map_build_graph) -from initiator import (Initiator, InitiatorStart, InitiatorCancel, - InitiatorListJobs, InitiatorStatus) +from initiator import (Initiator, InitiatorStart, InitiatorCommand) from protocol import message from crashpoint import (crash_point, add_crash_condition, add_crash_conditions, diff --git a/distbuild/initiator.py b/distbuild/initiator.py index f1facdfe..84a1f27f 100644 --- a/distbuild/initiator.py +++ b/distbuild/initiator.py @@ -334,14 +334,17 @@ class InitiatorStart(Initiator): handler = handlers[msg_type] handler(event.msg) -class InitiatorCancel(distbuild.StateMachine): - def __init__(self, cm, conn, app, job_id): +class InitiatorCommand(distbuild.StateMachine): + + def __init__(self, cm, conn, app, job_id, message_type, status_text): distbuild.StateMachine.__init__(self, 'waiting') self._cm = cm self._conn = conn self._app = app self._job_id = job_id + self._message_type = message_type + self._status_text = status_text def setup(self): distbuild.crash_point() @@ -358,76 +361,14 @@ class InitiatorCancel(distbuild.StateMachine): ] self.add_transitions(spec) - self._app.status(msg='Sending cancel request for distbuild job.') - msg = distbuild.message('build-cancel', + self._app.status(msg=self._status_text) + msg = distbuild.message(self._message_type, id=self._job_id, protocol_version=distbuild.protocol.VERSION, ) self._jm.send(msg) logging.debug('Initiator: sent to controller: %s', repr(msg)) - def _handle_json_message(self, event_source, event): - distbuild.crash_point() - - logging.debug('Initiator: from controller: %s', str(event.msg)) - - handlers = { - 'request-output': self._handle_request_output, - 'build-failed': self._handle_build_failed_message, - } - - handler = handlers[event.msg['type']] - handler(event.msg) - - def _handle_request_output(self, msg): - self._app.status(msg=str(msg['message'])) - self.mainloop.queue_event(self._cm, distbuild.StopConnecting()) - self._jm.close() - - def _handle_build_failed_message(self, msg): - self._app.status(msg=str(msg['reason'])) - self.mainloop.queue_event(self, _Failed(msg)) - self.mainloop.queue_event(self._cm, distbuild.StopConnecting()) - self._jm.close() - - def _terminate(self, event_source, event): - self.mainloop.queue_event(self._cm, distbuild.StopConnecting()) - self._jm.close() - - -class InitiatorListJobs(distbuild.StateMachine): - - def __init__(self, cm, conn, app): - distbuild.StateMachine.__init__(self, 'waiting') - self._cm = cm - self._conn = conn - self._app = app - - def setup(self): - distbuild.crash_point() - - self._jm = distbuild.JsonMachine(self._conn) - self.mainloop.add_state_machine(self._jm) - logging.debug('initiator: _jm=%s' % repr(self._jm)) - - spec = [ - # state, source, event_class, new_state, callback - ('waiting', self._jm, distbuild.JsonEof, None, self._terminate), - ('waiting', self._jm, distbuild.JsonNewMessage, None, - self._handle_json_message), - ] - self.add_transitions(spec) - - msg_uuid = uuid.uuid4().hex - - self._app.status(msg='Requesting currently running distbuilds.') - msg = distbuild.message('list-requests', - id=msg_uuid, - protocol_version=distbuild.protocol.VERSION, - ) - self._jm.send(msg) - logging.debug('Initiator: sent to controller: %s', repr(msg)) - def _handle_json_message(self, event_source, event): distbuild.crash_point() @@ -457,64 +398,3 @@ class InitiatorListJobs(distbuild.StateMachine): def _terminate(self, event_source, event): self.mainloop.queue_event(self._cm, distbuild.StopConnecting()) self._jm.close() - - -class InitiatorStatus(distbuild.StateMachine): - - def __init__(self, cm, conn, app, job_id): - distbuild.StateMachine.__init__(self, 'waiting') - self._cm = cm - self._conn = conn - self._app = app - self._job_id = job_id - - def setup(self): - distbuild.crash_point() - - self._jm = distbuild.JsonMachine(self._conn) - self.mainloop.add_state_machine(self._jm) - logging.debug('initiator: _jm=%s' % repr(self._jm)) - - spec = [ - # state, source, event_class, new_state, callback - ('waiting', self._jm, distbuild.JsonEof, None, self._terminate), - ('waiting', self._jm, distbuild.JsonNewMessage, None, - self._handle_json_message), - ] - self.add_transitions(spec) - - self._app.status(msg='Requesting status of recent build requests.') - msg = distbuild.message('build-status', - id=self._job_id, - protocol_version=distbuild.protocol.VERSION, - ) - self._jm.send(msg) - logging.debug('Initiator: sent to controller: %s', repr(msg)) - - def _handle_json_message(self, event_source, event): - distbuild.crash_point() - - logging.debug('Initiator: from controller: %s', str(event.msg)) - - handlers = { - 'request-output': self._handle_request_output, - 'build-failed': self._handle_build_failed_message, - } - - handler = handlers[event.msg['type']] - handler(event.msg) - - def _handle_request_output(self, msg): - self._app.status(msg=str(msg['message'])) - self.mainloop.queue_event(self._cm, distbuild.StopConnecting()) - self._jm.close() - - def _handle_build_failed_message(self, msg): - self._app.status(msg=str(msg['reason'])) - self.mainloop.queue_event(self, _Failed(msg)) - self.mainloop.queue_event(self._cm, distbuild.StopConnecting()) - self._jm.close() - - def _terminate(self, event_source, event): - self.mainloop.queue_event(self._cm, distbuild.StopConnecting()) - self._jm.close() diff --git a/morphlib/plugins/distbuild_plugin.py b/morphlib/plugins/distbuild_plugin.py index 2d6d932e..2da089f3 100644 --- a/morphlib/plugins/distbuild_plugin.py +++ b/morphlib/plugins/distbuild_plugin.py @@ -19,6 +19,7 @@ import cliapp import logging import re import sys +import uuid import morphlib import distbuild @@ -70,10 +71,12 @@ class DistbuildCancel(cliapp.Plugin): raise cliapp.AppException( 'usage: morph distbuild-cancel ') + args.append('build-cancel') + args.append('Sending cancel request for distbuild job.') addr = self.app.settings['controller-initiator-address'] port = self.app.settings['controller-initiator-port'] icm = distbuild.InitiatorConnectionMachine(self.app, addr, port, - distbuild.InitiatorCancel, + distbuild.InitiatorCommand, [self.app] + args, self.RECONNECT_INTERVAL, self.MAX_RETRIES) @@ -117,10 +120,12 @@ class DistbuildStatusPlugin(cliapp.Plugin): raise cliapp.AppException( 'usage: morph distbuild-status ') + args.append('build-status') + args.append('Requesting status of recent build requests.') addr = self.app.settings['controller-initiator-address'] port = self.app.settings['controller-initiator-port'] icm = distbuild.InitiatorConnectionMachine(self.app, addr, port, - distbuild.InitiatorStatus, + distbuild.InitiatorCommand, [self.app] + args, self.RECONNECT_INTERVAL, self.MAX_RETRIES) @@ -159,11 +164,18 @@ class DistbuildListJobsPlugin(cliapp.Plugin): ''' + if len(args) != 0: + raise cliapp.AppException( + 'distbuild-list-jobs takes zero arguments') + + args.append(uuid.uuid4().hex) + args.append('list-requests') + args.append('Requesting currently running distbuilds.') addr = self.app.settings['controller-initiator-address'] port = self.app.settings['controller-initiator-port'] icm = distbuild.InitiatorConnectionMachine(self.app, addr, port, - distbuild.InitiatorListJobs, - [self.app], + distbuild.InitiatorCommand, + [self.app] + args, self.RECONNECT_INTERVAL, self.MAX_RETRIES) loop = distbuild.MainLoop() -- cgit v1.2.1