Skip to content

Commit 955c541

Browse files
committed
fix archive download with multi-cluster setup
# Conflicts: # src/api/handlers/projects/jobs.py
1 parent 3cc099a commit 955c541

1 file changed

Lines changed: 39 additions & 6 deletions

File tree

src/api/handlers/projects/jobs.py

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
import json
22
import os
33

4+
import requests
5+
46
from flask import g, abort, Response, send_file, request
57
from flask_restplus import Resource
68

79
from pyinfraboxutils import get_logger
810
from pyinfraboxutils.ibflask import auth_required, OK
911
from pyinfraboxutils.storage import storage
1012
from api.namespaces import project as ns
13+
from pyinfraboxutils.token import encode_user_token
1114

1215
logger = get_logger('api')
1316

@@ -299,20 +302,50 @@ class ArchiveDownload(Resource):
299302

300303
@auth_required(['user'], allow_if_public=True)
301304
def get(self, project_id, job_id):
302-
f = request.args.get('filename', None)
305+
filename = request.args.get('filename', None)
303306

304-
if not f:
307+
if not filename:
305308
abort(404)
306309

307-
key = '%s/%s' % (job_id, f)
308-
f = storage.download_archive(key)
310+
result = g.db.execute_one_dict('''
311+
SELECT cluster_name
312+
FROM job
313+
WHERE id = %s
314+
AND project_id = %s
315+
''', [job_id, project_id])
316+
317+
if not result or not result['cluster_name']:
318+
abort(404)
319+
320+
job_cluster = result['cluster_name']
321+
key = '%s/%s' % (job_id, filename)
322+
323+
if os.environ['INFRABOX_CLUSTER_NAME'] == job_cluster:
324+
f = storage.download_archive(key)
325+
else:
326+
c = g.db.execute_one_dict('''
327+
SELECT *
328+
FROM cluster
329+
WHERE name=%s
330+
''', [job_cluster])
331+
url = '%s/api/v1/projects/%s/jobs/%s/archive/download?filename=%s' % (c['root_url'], project_id, job_id, filename)
332+
try:
333+
token = encode_user_token(g.token['user']['id'])
334+
except AttributeError:
335+
#public project has no token here.
336+
token = ""
337+
headers = {'Authorization': 'bearer ' + token}
338+
logger.info('get archive %s from %s', [filename, url])
339+
340+
# TODO(ib-steffen): allow custom ca bundles
341+
r = requests.get(url,headers=headers, timeout=120, verify=False, stream=True)
342+
f = r.raw
309343

310344
if not f:
311345
logger.error(key)
312346
abort(404)
313347

314-
return send_file(f, as_attachment=True, attachment_filename=os.path.basename(f))
315-
348+
return send_file(f, as_attachment=True, attachment_filename=os.path.basename(filename))
316349

317350
@ns.route('/<project_id>/jobs/<job_id>/archive')
318351
class Archive(Resource):

0 commit comments

Comments
 (0)