summaryrefslogtreecommitdiff
path: root/mason/tests/build.py
diff options
context:
space:
mode:
Diffstat (limited to 'mason/tests/build.py')
-rw-r--r--mason/tests/build.py115
1 files changed, 115 insertions, 0 deletions
diff --git a/mason/tests/build.py b/mason/tests/build.py
new file mode 100644
index 0000000..d347eb9
--- /dev/null
+++ b/mason/tests/build.py
@@ -0,0 +1,115 @@
+# Copyright 2014 Codethink Ltd
+
+import cliapp
+import json
+import logging
+import morphlib
+import os
+import urlparse
+
+import mason
+
+
+class Build(object):
+
+ """A single build instance."""
+
+ def __init__(self, name, controller):
+ self.system_name = name
+ self.controller = controller
+ self.command = [
+ 'morph', 'build', self.system_name]
+
+ def start(self):
+ self.process = subprocess.Popen(self.command)
+
+ def completed(self):
+ return (self.process.poll() is not None)
+
+
+class Runner(mason.util.JobRunner):
+
+ """This thread handles running the build-deploy-build test,
+ which is used to ensure that Baserock can build Baserock."""
+
+ log = logging.getLogger("mason.tests.build.Runner")
+
+ def __init__(self, worker_server, plugin_config, job_name):
+ super(Runner, self).__init__(worker_server, plugin_config, job_name)
+
+ self.total_steps = 3
+
+ def do_job_steps(self):
+ self.log.info('Step 1: Creating a workspace')
+ self._create_workspace()
+
+ self.log.info('Step 2: Building the systems')
+ self._build_systems()
+
+ #TODO: provide logs
+ self.log.info('Step 3: Clean up')
+ self._clean_up()
+
+ def _do_git_config(self):
+ cliapp.runcmd(['git', 'config', 'user.name', 'Mason Test Runner'])
+ cliapp.runcmd(['git', 'config', 'user.email', 'mason@test.runner'])
+
+ def _parse_controllers(self, conf):
+ controllers = {}
+ for arch, addr in (item.split(':') for item in conf['controllers']):
+ controllers[arch] = addr
+ return controllers
+
+ def _prepare_builds(self, conf):
+ cluster = self.morph_helper.load_morphology(conf['cluster-morphology'])
+ systems = set(self.morph_helper.iterate_systems(cluster['systems']))
+ controllers = self._parse_controllers(conf)
+ builds = []
+ for system_name in systems:
+ system = self.morph_helper.load_morphology(system_name)
+ if system['arch'] in controllers:
+ builds.append(Build(system_name, controllers['arch']))
+ return builds
+
+ def _create_workspace(self):
+ self.commit = self.job_arguments['ZUUL_COMMIT']
+ self.project = self.job_arguments['ZUUL_PROJECT']
+ self.ref = self.job_arguments['ZUUL_REF']
+ self.workspace = '/root/mason-workspace'
+ self.zuul_url = self.job_arguments['ZUUL_URL']
+
+ url = urlparse.urlparse(self.zuul_url)
+ self.defs_checkout = os.path.join(self.workspace,
+ self.commit,
+ url.hostname,
+ '8080',
+ self.project)
+ self.morph_helper = mason.util.MorphologyHelper(self.defs_checkout)
+
+ self._do_git_config()
+ cliapp.runcmd(['morph', 'init', self.workspace])
+
+ repo = 'http://%s:8080/%s' % (url.hostname, self.project)
+ cliapp.runcmd(['morph', 'checkout', repo, self.commit],
+ cwd=self.workspace)
+
+ def _build_systems(self):
+ builds = self._prepare_builds(self.plugin_config['config'])
+ os.chdir(self.defs_checkout)
+ for build in builds:
+ build.start()
+
+ while not all(build.completed() for build in builds):
+ time.sleep(1)
+
+ fail = False
+ for build in builds:
+ if build.process.returncode != 0:
+ fail = True
+ sys.stderr.write(
+ 'Building failed for %s\n' % build.system_name)
+ if fail:
+ raise cliapp.AppException('Building of systems failed.')
+
+ def _clean_up(self):
+ cliapp.runcmd(['rm', '-rf', self.workspace])