summaryrefslogtreecommitdiff
path: root/morphlib
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 /morphlib
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 'morphlib')
-rw-r--r--morphlib/buildcommand.py10
-rw-r--r--morphlib/plugins/build_plugin.py31
-rw-r--r--morphlib/plugins/distbuild_plugin.py42
3 files changed, 80 insertions, 3 deletions
diff --git a/morphlib/buildcommand.py b/morphlib/buildcommand.py
index 37dccf82..efd10f26 100644
--- a/morphlib/buildcommand.py
+++ b/morphlib/buildcommand.py
@@ -525,10 +525,11 @@ class InitiatorBuildCommand(BuildCommand):
RECONNECT_INTERVAL = 30 # seconds
MAX_RETRIES = 1
- def __init__(self, app, addr, port):
+ def __init__(self, app, addr, port, allow_detach):
self.app = app
self.addr = addr
self.port = port
+ self.allow_detach = allow_detach
self.app.settings['push-build-branches'] = True
super(InitiatorBuildCommand, self).__init__(app)
@@ -546,10 +547,15 @@ class InitiatorBuildCommand(BuildCommand):
loop = distbuild.MainLoop()
args = [repo_name, ref, filename, original_ref or ref,
component_names]
+ if self.allow_detach:
+ initiator_type = distbuild.InitiatorStart
+ else:
+ initiator_type = distbuild.Initiator
+
cm = distbuild.InitiatorConnectionMachine(self.app,
self.addr,
self.port,
- distbuild.Initiator,
+ initiator_type,
[self.app] + args,
self.RECONNECT_INTERVAL,
self.MAX_RETRIES)
diff --git a/morphlib/plugins/build_plugin.py b/morphlib/plugins/build_plugin.py
index 12d69545..8da66358 100644
--- a/morphlib/plugins/build_plugin.py
+++ b/morphlib/plugins/build_plugin.py
@@ -46,10 +46,14 @@ class BuildPlugin(cliapp.Plugin):
'[COMPONENT...]')
self.app.add_subcommand('distbuild', self.distbuild,
arg_synopsis='SYSTEM [COMPONENT...]')
+ self.app.add_subcommand('distbuild-start', self.distbuild_start,
+ arg_synopsis='SYSTEM [COMPONENT...]')
self.use_distbuild = False
+ self.allow_detach = False
def disable(self):
self.use_distbuild = False
+ self.allow_detach = False
def distbuild_morphology(self, args):
'''Distbuild a system, outside of a system branch.
@@ -97,6 +101,12 @@ class BuildPlugin(cliapp.Plugin):
your system, the system artifact will be copied from your trove
and cached locally.
+ Log information can be found in the current working directory, in
+ directories called build-xx.
+
+ If you do not have a persistent connection to the server on which
+ the distbuild runs, consider using `morph distbuild-start` instead.
+
Example:
morph distbuild devel-system-x86_64-generic.morph
@@ -106,6 +116,25 @@ class BuildPlugin(cliapp.Plugin):
self.use_distbuild = True
self.build(args)
+ def distbuild_start(self, args):
+ '''Distbuild a system image without a lasting client-server connection.
+
+ This command launches a distributed build, and disconnects from the
+ distbuild cluster once the build starts, leaving the build running
+ remotely.
+
+ The command will return a build-ID which can be used to cancel the
+ distbuild via `morph distbuild-cancel`. Builds started in this manner
+ can be found via `morph distbuild-list-jobs`
+
+ See `morph help distbuild` for more information and example usage.
+
+ '''
+
+ self.use_distbuild = True
+ self.allow_detach = True
+ self.build(args)
+
def build_morphology(self, args):
'''Build a system, outside of a system branch.
@@ -211,7 +240,7 @@ class BuildPlugin(cliapp.Plugin):
port = self.app.settings['controller-initiator-port']
build_command = morphlib.buildcommand.InitiatorBuildCommand(
- self.app, addr, port)
+ self.app, addr, port, self.allow_detach)
else:
build_command = morphlib.buildcommand.BuildCommand(self.app)
diff --git a/morphlib/plugins/distbuild_plugin.py b/morphlib/plugins/distbuild_plugin.py
index 09669988..68a80784 100644
--- a/morphlib/plugins/distbuild_plugin.py
+++ b/morphlib/plugins/distbuild_plugin.py
@@ -40,6 +40,48 @@ class DistbuildOptionsPlugin(cliapp.Plugin):
pass
+class DistbuildCancel(cliapp.Plugin):
+
+ RECONNECT_INTERVAL = 30 # seconds
+ MAX_RETRIES = 1
+
+ def enable(self):
+ self.app.add_subcommand('distbuild-cancel', self.distbuild_cancel,
+ arg_synopsis='ID')
+
+ def disable(self):
+ pass
+
+ def distbuild_cancel(self, args):
+ '''Cancels a currently-running distbuild
+
+ Command line arguments:
+
+ `ID` of the running process that you wish to cancel
+ (this can be found via distbuild-list-jobs)
+
+ Example:
+
+ * morph distbuild-cancel InitiatorConnection-1
+
+ '''
+
+ if len(args) != 1:
+ raise cliapp.AppException(
+ 'usage: morph distbuild-cancel <build-request id>')
+
+ addr = self.app.settings['controller-initiator-address']
+ port = self.app.settings['controller-initiator-port']
+ icm = distbuild.InitiatorConnectionMachine(self.app, addr, port,
+ distbuild.InitiatorCancel,
+ [self.app] + args,
+ self.RECONNECT_INTERVAL,
+ self.MAX_RETRIES)
+ loop = distbuild.MainLoop()
+ loop.add_state_machine(icm)
+ loop.run()
+
+
class DistbuildListJobsPlugin(cliapp.Plugin):
RECONNECT_INTERVAL = 30 # seconds