summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)