Source code for pydantictes.api
from typing import (
Union,
)
import requests
from .models import (
TesCancelTaskResponse,
TesCreateTaskResponse,
TesListTasksResponse,
TesServiceInfo,
TesTask,
)
HasTaskId = Union[TesCreateTaskResponse, TesTask, str]
[docs]
class TesClient:
def __init__(self, url: str):
self._url = url
[docs]
def create_task(self, task: TesTask) -> TesCreateTaskResponse:
url = self._build_url("tasks")
response = requests.post(url, data=task.json())
response.raise_for_status()
return TesCreateTaskResponse(**response.json())
[docs]
def get_task(self, has_task_id: HasTaskId, view) -> TesTask:
task_id = self._get_task_id(has_task_id)
url = self._build_url(f"tasks/{task_id}")
response = requests.get(
url,
params={"view": view},
)
response.raise_for_status()
response_dict = response.json()
self._hack_task_response_around_funnel(response_dict)
return TesTask(**response_dict)
[docs]
def cancel_task(self, has_task_id: HasTaskId) -> TesCancelTaskResponse:
task_id = self._get_task_id(has_task_id)
url = self._build_url(f"tasks/{task_id}:cancel")
response = requests.post(url)
response.raise_for_status()
return TesCancelTaskResponse(**response.json())
[docs]
def service_info(self) -> TesServiceInfo:
url = self._build_url("/tasks/service-info")
response = requests.get(url)
response.raise_for_status()
response_dict = response.json()
self._hack_service_info_around_funnel(response_dict)
return TesServiceInfo(**response_dict)
[docs]
def list_tasks(self) -> TesListTasksResponse:
url = self._build_url("tasks")
response = requests.get(url)
response.raise_for_status()
response_dict = response.json()
self._hack_list_response_around_funnel(response_dict)
return TesListTasksResponse(**response_dict)
def _get_task_id(self, has_task_id: HasTaskId) -> str:
if not isinstance(has_task_id, str):
task_id = has_task_id.id
else:
task_id = has_task_id
assert task_id
return task_id
def _hack_list_response_around_funnel(self, response_dict):
for task in response_dict["tasks"]:
if "executors" not in task:
task["executors"] = []
def _hack_service_info_around_funnel(self, response_dict):
if "id" not in response_dict:
response_dict["id"] = "unknown id"
if "organization" not in response_dict:
response_dict["organization"] = {
"name": "unknown organization",
"url": "http://unkonwnservice.com/",
}
if "version" not in response_dict:
response_dict["version"] = "0.0.1"
if "type" not in response_dict:
response_dict["type"] = {
"artifact": "tes",
"group": "org.ga4gh",
"version": "1.0.0",
}
def _hack_task_response_around_funnel(self, response_dict):
if "logs" in response_dict:
logs = response_dict["logs"]
if len(logs) == 1 and logs[0] == {}:
response_dict["logs"] = []
for log in logs:
if "outputs" not in log:
log["outputs"] = []
if "logs" not in log:
log["logs"] = []
if "logs" in log:
for inner_log in log["logs"]:
if "exit_code" not in inner_log:
inner_log["exit_code"] = -255
def _build_url(self, path: str) -> str:
return f"{self._url}/v1/{path}"