summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLauren Perry <lauren.perry@codethink.co.uk>2015-05-11 16:22:53 +0000
committerBaserock Gerrit <gerrit@baserock.org>2015-05-15 14:19:02 +0000
commit8625124549dd4ae1a5b347a51c95c3f1887fb9ea (patch)
tree1c933b04810f0092a34d259a712705e0547e10f9
parent2c2b11373d03d98787f5094a16fe41f05104e14a (diff)
downloadmorph-8625124549dd4ae1a5b347a51c95c3f1887fb9ea.tar.gz
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
-rw-r--r--distbuild/__init__.py3
-rw-r--r--distbuild/initiator.py134
-rw-r--r--morphlib/plugins/distbuild_plugin.py20
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,8 +361,8 @@ 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,
)
@@ -372,68 +375,6 @@ class InitiatorCancel(distbuild.StateMachine):
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()
-
- logging.debug('Initiator: from controller: %s', str(event.msg))
-
- handlers = {
# set build-failed rather than request-failed so old versions of
# morph recognise the message and don't ignore it
'build-failed': self._handle_request_failed,
@@ -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 <build-request id>')
+ 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 <build-request id>')
+ 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()