From 9b52055d3a2fbac4b2287cc51b2bda1f8ac0e4b9 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Mon, 8 Jul 2019 18:21:00 +0300 Subject: Add: deployment worker to api.py --- api.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/api.py b/api.py index 90afbdf..434b0cf 100755 --- a/api.py +++ b/api.py @@ -327,6 +327,64 @@ class VCSWorker(API): return runcmd(dirname, argv, self.MAX_PUSH_TIME) +class Deployer(API): + + '''A deployment worker API''' + + MAX_DOWNLOAD_TIME = 10 + MAX_UPLOAD_TIME = 60 + ARTIFACT_STORE = 'wmf2-artifacts.vm.liw.fi' + + def __init__(self, artifact_token, ssh_target): + self._artifact_token = artifact_token + self._ssh_target = ssh_target + + def get_routes(self): + return [ + { + 'method': 'POST', + 'path': '/publish', + 'func': self._publish, + 'scopes': ['publish'], + }, + ] + + def _publish(self): + spec = bottle.request.json + logging.info('Publishing: %r', spec) + + artifact_id = spec['artifact_id'] + published_name = spec['published_name'] + fd, filename = tempfile.mkstemp() + os.close(fd) + + try: + self._get_artifact(self._artifact_token, artifact_id, filename) + ssh_target = '{}/{}'.format(self._ssh_target, published_name) + self._publish_via_ssh(filename, ssh_target) + except Exception as e: + logging.error('Deployment failed: %s', str(e)) + os.remove(filename) + return bottle.HTTPError(418) + + os.remove(filename) + return 'Deployment OK\n' + + def _get_artifact(self, token, artifact_id, filename): + logging.info('Getting artifact %s', artifact_id) + url = 'https://%s/blobs/%s' % (self.ARTIFACT_STORE, artifact_id) + argv = ['curl', url, '-o', filename, '-HAuthorization: Bearer %s' % token] + return runcmd('.', argv, self.MAX_DOWNLOAD_TIME) + + def _publish_via_ssh(self, filename, ssh_target): + logging.info('Copying %s to %s', filename, ssh_target) + argv = [ + 'scp', '-oUserKnownHostsFile=/dev/null', '-oStrictHostKeyChecking=no', + filename, ssh_target, + ] + return runcmd('.', argv, self.MAX_UPLOAD_TIME) + + def runcmd(cwd, argv, timeout): logging.info('Running command: %r', argv) try: @@ -381,6 +439,10 @@ def main(): gitlab_token = get_token_from_file(args.pop(0)) artifact_token = get_token_from_file(args.pop(0)) api = VCSWorker(gitlab_token, artifact_token) + elif cmd == 'deployer': + artifact_token = get_token_from_file(args.pop(0)) + ssh_target = args.pop(0) + api = Deployer(artifact_token, ssh_target) else: sys.exit('Unknown command %s' % cmd) -- cgit v1.2.1