summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <lwirzenius@wikimedia.org>2019-07-08 18:21:00 +0300
committerLars Wirzenius <lwirzenius@wikimedia.org>2019-07-08 18:21:00 +0300
commit9b52055d3a2fbac4b2287cc51b2bda1f8ac0e4b9 (patch)
treed28de3b9f1aab6f8fb8f1bc99b05ad1a3a1db1f0
parent8f6910254b3a90f426b478f0838d3897d7899eaa (diff)
downloadwmf-ci-arch-9b52055d3a2fbac4b2287cc51b2bda1f8ac0e4b9.tar.gz
Add: deployment worker to api.py
-rwxr-xr-xapi.py62
1 files changed, 62 insertions, 0 deletions
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)