Skip to content

Commit

Permalink
Add http upload capability for the data files
Browse files Browse the repository at this point in the history
  • Loading branch information
tcezard committed Oct 5, 2023
1 parent 889888a commit e85a48c
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 12 deletions.
3 changes: 2 additions & 1 deletion cli/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,9 @@ def token(self):
'scope': 'openid'
}
response = requests.post(self.device_authorization_url, data=payload)
response_json = response.json()
response.raise_for_status()

response_json = response.json()
device_code = response_json['device_code']
user_code = response_json['user_code']
verification_uri = response_json['verification_uri']
Expand Down
26 changes: 19 additions & 7 deletions cli/submit.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
#!/usr/bin/env python
import os
from urllib.parse import urljoin

import requests
import yaml
from ebi_eva_common_pyutils.logger import logging_config

from ebi_eva_common_pyutils.logger import logging_config, AppLogger
from retry import retry

from cli.auth import get_auth

Expand All @@ -15,9 +18,11 @@


class StudySubmitter:
def __init__(self, submission_initiate_url=SUBMISSION_INITIATE_URL):
def __init__(self, vcf_files, metadata_file, submission_initiate_url=SUBMISSION_INITIATE_URL):
self.auth = get_auth()
self.submission_initiate_url = submission_initiate_url
self.vcf_files = vcf_files
self.metadata_file = metadata_file

def create_submission_config_file(self, submission_dir, submission_id, submission_upload_url):
submission_config_file = os.path.join(submission_dir, SUB_CLI_CONFIG_FILE)
Expand All @@ -38,19 +43,26 @@ def get_submission_id_and_upload_url(self, submission_dir):
else:
raise FileNotFoundError(f'Could not upload. No config file found for the submission in {submission_dir}')

# TODO
def upload_submission(self, submission_dir, submission_id=None, submission_upload_url=None):
if not submission_id or not submission_upload_url:
def upload_submission(self, submission_upload_url, submission_dir):
if not submission_upload_url:
submission_id, submission_upload_url = self.get_submission_id_and_upload_url(submission_dir)
pass

for f in self.vcf_files:
self.upload_file(submission_upload_url, f)
self.upload_file(submission_upload_url, self.metadata_file)

@retry(tries=5, delay=10, backoff=5, logger=logger)
def upload_file(self, submission_upload_url, input_file):
base_name = os.path.basename(input_file)
r = requests.put(urljoin(submission_upload_url, base_name), data=open(input_file, 'rb'))
r.raise_for_status()

def verify_submission_dir(self, submission_dir):
if not os.path.exists(submission_dir):
os.makedirs(submission_dir)
if not os.access(submission_dir, os.W_OK):
raise Exception(f"The directory '{submission_dir}' does not have write permissions.")


def submit(self, submission_dir):
self.verify_submission_dir(submission_dir)
response = requests.post(self.submission_initiate_url,
Expand Down
17 changes: 13 additions & 4 deletions tests/test_submit.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
import json
import os
import unittest
from unittest.mock import MagicMock, patch, Mock, PropertyMock
from unittest.mock import MagicMock, patch, Mock

from cli import LSRI_CLIENT_ID
from cli.auth import WebinAuth, LSRIAuth
from cli.submit import StudySubmitter


class TestSubmit(unittest.TestCase):
resource_dir = os.path.join(os.path.dirname(__file__), 'resources')

def setUp(self) -> None:
self.token = 'a token'
with patch('cli.submit.get_auth', return_value=Mock(token=self.token)):
self.submitter = StudySubmitter()
vcf_files = [os.path.join(self.resource_dir, 'vcf_files', 'example2.vcf.gz')]
metadata_file = [os.path.join(self.resource_dir, 'EVA_Submission_template.V1.1.4.xlsx')]
self.submitter = StudySubmitter(vcf_files=vcf_files, metadata_file=metadata_file)

def test_submit(self):
# Mock the response for post-authentication response from eva-submission-ws
Expand All @@ -30,3 +32,10 @@ def test_submit(self):
headers={'Accept': 'application/hal+json', 'Authorization': 'Bearer a token'})

# TODO: Check that upload_submission was called with submission id

def test_upload_file(self):
resource_dir = os.path.join(os.path.dirname(__file__), 'resources')

file_to_upload = os.path.join(resource_dir, 'EVA_Submission_template.V1.1.4.xlsx')
self.submitter.upload_file(submission_upload_url='',
input_file=file_to_upload)

0 comments on commit e85a48c

Please sign in to comment.