diff --git a/nomad/api/upload.py b/nomad/api/upload.py index 23b817ec178a69424fcd3ba8112505a23c8bf782..f2ba368ab73ba08d3f0f0d0e0857cc19ff51539c 100644 --- a/nomad/api/upload.py +++ b/nomad/api/upload.py @@ -21,6 +21,7 @@ from flask import g, request from flask_restplus import Resource, fields, abort from datetime import datetime +from nomad import config from nomad.processing import Upload from nomad.processing import NotAllowedDuringProcessing from nomad.utils import get_logger @@ -60,8 +61,6 @@ upload_model = api.inherit('UploadProcessing', proc_model, { 'used within nomad to identify uploads.' ), 'additional_metadata': fields.Arbitrary, - 'upload_url': fields.String, - 'upload_command': fields.String, 'local_path': fields.String, 'upload_time': fields.DateTime(dt_format='iso8601'), }) @@ -298,3 +297,26 @@ class UploadResource(Resource): return upload, 200 abort(400, message='Unsuported operation %s.' % operation) + + +upload_command_model = api.model('UploadCommand', { + 'upload_url': fields.Url, + 'upload_command': fields.String +}) + + +@ns.route('/command') +class UploadCommandResource(Resource): + @api.marshal_with(upload_command_model, code=200, description='Upload command send') + @login_really_required + def get(self): + """ Get url and example command for shell based uploads. """ + upload_url = 'http://%s:%s%s/uploads/' % ( + config.services.api_host, + config.services.api_port, + config.services.api_base_path) + + upload_command = 'curl -H "X-Token: "%s" "%s" --upload-file <local_file>' % ( + g.user.get_auth_token().decode('utf-8'), upload_url) + + return dict(upload_url=upload_url, upload_command=upload_command), 200 diff --git a/nomad/processing/data.py b/nomad/processing/data.py index 048b44cdc869bfd5aba14b6ad589e471919abeb0..26c8f76de80aeda12fd9805f3482f1a4b03b7ce4 100644 --- a/nomad/processing/data.py +++ b/nomad/processing/data.py @@ -28,12 +28,11 @@ from typing import List, Any, ContextManager, Tuple, Generator from elasticsearch.exceptions import NotFoundError from mongoengine import StringField, BooleanField, DateTimeField, DictField, IntField import logging -import base64 import time from structlog import wrap_logger from contextlib import contextmanager -from nomad import config, utils, coe_repo +from nomad import utils, coe_repo from nomad.files import UploadFile, ArchiveFile, ArchiveLogFile, File from nomad.repo import RepoCalc from nomad.processing.base import Proc, Chord, process, task, PENDING, SUCCESS, FAILURE, RUNNING @@ -325,8 +324,6 @@ class Upload(Chord): upload_hash = StringField(default=None) user_id = StringField(required=True) - upload_url = StringField(default=None) - upload_command = StringField(default=None) coe_repo_upload_id = IntField(default=None) @@ -386,13 +383,6 @@ class Upload(Chord): with lnr(logger, 'deleting upload'): super().delete() - @classmethod - def _external_objects_url(cls, url): - """ Replaces the given internal object storage url with an URL that allows - external access. - """ - return 'http://%s:%s%s%s' % (config.services.api_host, config.services.api_port, config.services.api_base_path, url) - @classmethod def create(cls, **kwargs) -> 'Upload': """ @@ -410,12 +400,6 @@ class Upload(Chord): kwargs.update(user_id=str(user.user_id)) self = super().create(**kwargs) - basic_auth_token = base64.b64encode(b'%s:' % user.get_auth_token()).decode('utf-8') - - self.upload_url = cls._external_objects_url('/uploads/%s/file' % self.upload_id) - self.upload_command = 'curl -H "Authorization: Basic %s" "%s" --upload-file local_file' % ( - basic_auth_token, self.upload_url) - self._continue_with('uploading') return self diff --git a/tests/test_api.py b/tests/test_api.py index a4e9acef91e1aa5e1b8109f246ff962828ac714c..9df6e643d816a42e988344d662b7e7fd27873605 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -115,8 +115,6 @@ class TestUploads: if id is not None: assert id == data['upload_id'] assert 'create_time' in data - assert 'upload_url' in data - assert 'upload_command' in data for key, value in kwargs.items(): assert data.get(key, None) == value @@ -170,6 +168,13 @@ class TestUploads: self.assert_uploads(rv.data, count=0) assert_coe_upload(upload['upload_hash'], proc_infra['repository_db'], empty=empty_upload) + def test_get_command(self, client, test_user_auth, no_warn): + rv = client.get('/uploads/command', headers=test_user_auth) + assert rv.status_code == 200 + data = json.loads(rv.data) + assert 'upload_command' in data + assert 'upload_url' in data + def test_get_empty(self, client, test_user_auth, no_warn): rv = client.get('/uploads/', headers=test_user_auth)