-
Notifications
You must be signed in to change notification settings - Fork 6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Job output transform #548
Open
OlivGruwe
wants to merge
16
commits into
master
Choose a base branch
from
job_output_transform
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Job output transform #548
Changes from all commits
Commits
Show all changes
16 commits
Select commit
Hold shift + click to select a range
07a27e7
Transformer Implementation
OlivGruwe 3c1ef15
Transformer Implementation
OlivGruwe 6d23b4c
Transformer Implementation +
OlivGruwe d85aa30
Transformer Implementation
OlivGruwe b02bb01
Transformer Implementation
OlivGruwe d7c727f
Transformer Implementation
OlivGruwe b3b4f52
Transformer Implementation
OlivGruwe dcde84e
Correction Txt -> Pdf
OlivGruwe d6b8c6c
Merge branch 'master' of github.com:crim-ca/weaver into job_output_tr…
Nazim-crim b3048bb
Fixing naming typos
Nazim-crim a23519e
Adding libpangocairo to dockerfile
Nazim-crim ee9c208
Fixing import and linting
Nazim-crim a8d4473
Fixing docker call and removing unused code
Nazim-crim 574314c
Removing transformer route and test in job, fixing makefile
Nazim-crim 0304b3a
Adding swagger and endpoint definition to support outputId and resultId
Nazim-crim 4cf0e80
Adding in config output and result service
Nazim-crim File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
import mimetypes | ||
import os | ||
import shutil | ||
import tempfile | ||
|
||
from pyramid.response import FileResponse | ||
|
||
from weaver.transform.transform import FAMILIES, Transform | ||
|
||
|
||
def using_mimes(func): | ||
def wrapper(*args, **kwargs): | ||
cmt = mimetypes.guess_type(args[0])[0] | ||
for family in FAMILIES: | ||
if cmt in family: | ||
for wmt in [f for f in family if f != cmt]: | ||
func(args[0], cmt, wmt) | ||
|
||
return wrapper | ||
|
||
|
||
@using_mimes | ||
def transform(f, cmt="", wmt=""): | ||
try: | ||
with tempfile.TemporaryDirectory() as tmp_path: | ||
shutil.copy(f, os.path.join(tmp_path, os.path.basename(f))) | ||
f = os.path.join(tmp_path, os.path.basename(f)) | ||
|
||
t = Transform(file_path=f, current_media_type=cmt, wanted_media_type=wmt) | ||
|
||
assert isinstance(t.get(), FileResponse), f"{cmt} -> {wmt} {str(t['error'])}" | ||
print(f"{cmt} -> {wmt} passed") | ||
return t.output_path | ||
except Exception as e: | ||
print(f"{cmt} -> {wmt} failed") | ||
assert False, f"{os.path.splitext(f)[1]} -> {f} {str(e)}" | ||
pass | ||
|
||
|
||
def test_transformations(): | ||
for fn in os.listdir("./res/transform"): | ||
transform(os.path.join("./res/transform", fn)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -160,22 +160,22 @@ def setUp(self): | |
user_id=self.user_editor1_id, status=Status.STARTED, progress=99, access=Visibility.PUBLIC) | ||
|
||
def make_job(self, | ||
task_id, # type: str | ||
process, # type: str | ||
service, # type: Optional[str] | ||
user_id, # type: Optional[int] | ||
status, # type: AnyStatusType | ||
progress, # type: int | ||
access, # type: AnyVisibility | ||
created=None, # type: Optional[Union[datetime.datetime, str]] | ||
offset=None, # type: Optional[int] | ||
duration=None, # type: Optional[int] | ||
exceptions=None, # type: Optional[List[JSON]] | ||
logs=None, # type: Optional[List[Union[str, Tuple[str, AnyLogLevel, AnyStatusType, Number]]]] | ||
statistics=None, # type: Optional[Statistics] | ||
tags=None, # type: Optional[List[str]] | ||
add_info=True, # type: bool | ||
): # type: (...) -> Job | ||
task_id, # type: str | ||
process, # type: str | ||
service, # type: Optional[str] | ||
user_id, # type: Optional[int] | ||
status, # type: AnyStatusType | ||
progress, # type: int | ||
access, # type: AnyVisibility | ||
created=None, # type: Optional[Union[datetime.datetime, str]] | ||
offset=None, # type: Optional[int] | ||
duration=None, # type: Optional[int] | ||
exceptions=None, # type: Optional[List[JSON]] | ||
logs=None, # type: Optional[List[Union[str, Tuple[str, AnyLogLevel, AnyStatusType, Number]]]] | ||
statistics=None, # type: Optional[Statistics] | ||
tags=None, # type: Optional[List[str]] | ||
add_info=True, # type: bool | ||
): # type: (...) -> Job | ||
if isinstance(created, str): | ||
created = date_parser.parse(created) | ||
job = self.job_store.save_job(task_id=task_id, process=process, service=service, is_workflow=False, | ||
|
@@ -439,7 +439,7 @@ def test_get_jobs_links_navigation(self): | |
base_url = self.settings["weaver.url"] | ||
jobs_url = base_url + sd.jobs_service.path | ||
limit = 2 # expect 11 jobs to be visible, making 6 pages of 2 each (except last that is 1) | ||
last = 5 # zero-based index of last page | ||
last = 5 # zero-based index of last page | ||
last_page = f"page={last}" | ||
prev_last_page = f"page={last - 1}" | ||
limit_kvp = f"limit={limit}" | ||
|
@@ -882,7 +882,7 @@ def test_get_jobs_public_service_no_processes(self): | |
service=self.service_public.name, | ||
process=self.process_private.identifier) | ||
with contextlib.ExitStack() as stack: | ||
for patch in mocked_remote_wps([]): # process invisible (not returned by remote) | ||
for patch in mocked_remote_wps([]): # process invisible (not returned by remote) | ||
stack.enter_context(patch) | ||
resp = self.app.get(path, headers=self.json_headers, expect_errors=True) | ||
assert resp.status_code == 404 | ||
|
@@ -915,37 +915,43 @@ def filter_service(jobs): # type: (Iterable[Job]) -> List[Job] | |
path_jobs_user_req_tests = [ | ||
# pylint: disable=C0301,line-too-long | ||
# URI ACCESS USER EXPECTED JOBS | ||
(uri_direct_jobs, None, None, public_jobs), # noqa: E241,E501 | ||
(uri_direct_jobs, None, self.user_editor1_id, editor1_all_jobs), # noqa: E241,E501 | ||
(uri_direct_jobs, None, self.user_admin_id, self.job_info), # noqa: E241,E501 | ||
(uri_direct_jobs, Visibility.PRIVATE, None, public_jobs), # noqa: E241,E501 | ||
(uri_direct_jobs, Visibility.PRIVATE, self.user_editor1_id, editor1_private_jobs), # noqa: E241,E501 | ||
(uri_direct_jobs, Visibility.PRIVATE, self.user_admin_id, admin_private_jobs), # noqa: E241,E501 | ||
(uri_direct_jobs, Visibility.PUBLIC, None, public_jobs), # noqa: E241,E501 | ||
(uri_direct_jobs, Visibility.PUBLIC, self.user_editor1_id, editor1_public_jobs), # noqa: E241,E501 | ||
(uri_direct_jobs, Visibility.PUBLIC, self.user_admin_id, admin_public_jobs), # noqa: E241,E501 | ||
(uri_direct_jobs, None, None, public_jobs), # noqa: E241,E501 | ||
(uri_direct_jobs, None, self.user_editor1_id, editor1_all_jobs), # noqa: E241,E501 | ||
(uri_direct_jobs, None, self.user_admin_id, self.job_info), # noqa: E241,E501 | ||
(uri_direct_jobs, Visibility.PRIVATE, None, public_jobs), # noqa: E241,E501 | ||
(uri_direct_jobs, Visibility.PRIVATE, self.user_editor1_id, editor1_private_jobs), # noqa: E241,E501 | ||
(uri_direct_jobs, Visibility.PRIVATE, self.user_admin_id, admin_private_jobs), # noqa: E241,E501 | ||
(uri_direct_jobs, Visibility.PUBLIC, None, public_jobs), # noqa: E241,E501 | ||
(uri_direct_jobs, Visibility.PUBLIC, self.user_editor1_id, editor1_public_jobs), # noqa: E241,E501 | ||
(uri_direct_jobs, Visibility.PUBLIC, self.user_admin_id, admin_public_jobs), # noqa: E241,E501 | ||
# --- | ||
(uri_process_jobs, None, None, filter_process(public_jobs)), # noqa: E241,E501 | ||
(uri_process_jobs, None, self.user_editor1_id, filter_process(editor1_all_jobs)), # noqa: E241,E501 | ||
(uri_process_jobs, None, self.user_admin_id, filter_process(self.job_info)), # noqa: E241,E501 | ||
(uri_process_jobs, Visibility.PRIVATE, None, filter_process(public_jobs)), # noqa: E241,E501 | ||
(uri_process_jobs, Visibility.PRIVATE, self.user_editor1_id, filter_process(editor1_private_jobs)), # noqa: E241,E501 | ||
(uri_process_jobs, Visibility.PRIVATE, self.user_admin_id, filter_process(admin_private_jobs)), # noqa: E241,E501 | ||
(uri_process_jobs, Visibility.PUBLIC, None, filter_process(public_jobs)), # noqa: E241,E501 | ||
(uri_process_jobs, Visibility.PUBLIC, self.user_editor1_id, filter_process(editor1_public_jobs)), # noqa: E241,E501 | ||
(uri_process_jobs, Visibility.PUBLIC, self.user_admin_id, filter_process(public_jobs)), # noqa: E241,E501 | ||
(uri_process_jobs, None, None, filter_process(public_jobs)), # noqa: E241,E501 | ||
(uri_process_jobs, None, self.user_editor1_id, filter_process(editor1_all_jobs)), # noqa: E241,E501 | ||
(uri_process_jobs, None, self.user_admin_id, filter_process(self.job_info)), # noqa: E241,E501 | ||
(uri_process_jobs, Visibility.PRIVATE, None, filter_process(public_jobs)), # noqa: E241,E501 | ||
(uri_process_jobs, Visibility.PRIVATE, self.user_editor1_id, filter_process(editor1_private_jobs)), | ||
# noqa: E241,E501 | ||
(uri_process_jobs, Visibility.PRIVATE, self.user_admin_id, filter_process(admin_private_jobs)), | ||
# noqa: E241,E501 | ||
(uri_process_jobs, Visibility.PUBLIC, None, filter_process(public_jobs)), # noqa: E241,E501 | ||
(uri_process_jobs, Visibility.PUBLIC, self.user_editor1_id, filter_process(editor1_public_jobs)), | ||
# noqa: E241,E501 | ||
(uri_process_jobs, Visibility.PUBLIC, self.user_admin_id, filter_process(public_jobs)), # noqa: E241,E501 | ||
# --- | ||
(uri_provider_jobs, None, None, filter_service(public_jobs)), # noqa: E241,E501 | ||
(uri_provider_jobs, None, self.user_editor1_id, filter_service(editor1_all_jobs)), # noqa: E241,E501 | ||
(uri_provider_jobs, None, self.user_admin_id, filter_service(self.job_info)), # noqa: E241,E501 | ||
(uri_provider_jobs, Visibility.PRIVATE, None, filter_service(public_jobs)), # noqa: E241,E501 | ||
(uri_provider_jobs, Visibility.PRIVATE, self.user_editor1_id, filter_service(editor1_private_jobs)), # noqa: E241,E501 | ||
(uri_provider_jobs, Visibility.PRIVATE, self.user_admin_id, filter_service(admin_private_jobs)), # noqa: E241,E501 | ||
(uri_provider_jobs, Visibility.PUBLIC, None, filter_service(public_jobs)), # noqa: E241,E501 | ||
(uri_provider_jobs, Visibility.PUBLIC, self.user_editor1_id, filter_service(editor1_public_jobs)), # noqa: E241,E501 | ||
(uri_provider_jobs, Visibility.PUBLIC, self.user_admin_id, filter_service(public_jobs)), # noqa: E241,E501 | ||
|
||
] # type: List[Tuple[str, str, Union[None, int], List[Job]]] | ||
(uri_provider_jobs, None, None, filter_service(public_jobs)), # noqa: E241,E501 | ||
(uri_provider_jobs, None, self.user_editor1_id, filter_service(editor1_all_jobs)), # noqa: E241,E501 | ||
(uri_provider_jobs, None, self.user_admin_id, filter_service(self.job_info)), # noqa: E241,E501 | ||
(uri_provider_jobs, Visibility.PRIVATE, None, filter_service(public_jobs)), # noqa: E241,E501 | ||
(uri_provider_jobs, Visibility.PRIVATE, self.user_editor1_id, filter_service(editor1_private_jobs)), | ||
# noqa: E241,E501 | ||
(uri_provider_jobs, Visibility.PRIVATE, self.user_admin_id, filter_service(admin_private_jobs)), | ||
# noqa: E241,E501 | ||
(uri_provider_jobs, Visibility.PUBLIC, None, filter_service(public_jobs)), # noqa: E241,E501 | ||
(uri_provider_jobs, Visibility.PUBLIC, self.user_editor1_id, filter_service(editor1_public_jobs)), | ||
# noqa: E241,E501 | ||
(uri_provider_jobs, Visibility.PUBLIC, self.user_admin_id, filter_service(public_jobs)), # noqa: E241,E501 | ||
|
||
] # type: List[Tuple[str, str, Union[None, int], List[Job]]] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Revert auto-formating by your IDE here and above. |
||
|
||
for i, (path, access, user_id, expected_jobs) in enumerate(path_jobs_user_req_tests): | ||
with contextlib.ExitStack() as stack: | ||
|
@@ -1339,7 +1345,7 @@ def test_get_job_invalid_uuid(self): | |
""" | ||
# to make sure UUID is applied, use the "same format" (8-4-4-4-12), but with invalid definitions | ||
base_path = sd.job_service.path.format(job_id="thisisnt-some-real-uuid-allerrordata") | ||
for sub_path in ["", "/inputs", "/outputs", "/results", "/logs", "exceptions"]: | ||
for sub_path in ["", "/inputs", "/outputs", "/results", "/logs", "/exceptions"]: | ||
path = f"{base_path}{sub_path}" | ||
resp = self.app.get(path, headers=self.json_headers, expect_errors=True) | ||
assert resp.status_code == 400 | ||
|
@@ -1524,7 +1530,7 @@ def test_job_results_errors(self): | |
assert resp.status_code == code, case | ||
assert resp.json["title"] == title, case | ||
assert resp.json["cause"] == cause, case | ||
assert resp.json["type"].endswith(error_type), case # ignore http full reference, not always there | ||
assert resp.json["type"].endswith(error_type), case # ignore http full reference, not always there | ||
assert "links" in resp.json | ||
|
||
def test_jobs_inputs_outputs_validations(self): | ||
|
@@ -1628,6 +1634,14 @@ def test_jobs_inputs_outputs_validations(self): | |
with self.assertRaises(colander.Invalid): | ||
sd.Execute().deserialize({"outputs": {"random": {"transmissionMode": "bad"}}}) | ||
|
||
path = f"/jobs/{self.job_info[0].id}/outputs" | ||
resp = self.app.get(path, headers=self.json_headers) | ||
for link in resp.json["links"]: | ||
header = {"Accept": link["type"]} | ||
resp = self.app.get(link, headers=header) | ||
assert resp.status_code == 200 | ||
assert link["type"] in resp.content_type or "application/gzip" in resp.content_type | ||
|
||
def test_job_logs_formats(self): | ||
path = f"/jobs/{self.job_info[0].id}/logs" | ||
resp = self.app.get(path, headers=self.json_headers) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The Makefile refers to a
requirements-trfm.txt
file. Those should be moved into that file. It can then be embedded in this file using-r requirements-trfm.txt
(as done in the top).