Skip to content

Commit 6a578b0

Browse files
committed
feat: create task
1 parent e790298 commit 6a578b0

15 files changed

Lines changed: 1080 additions & 7 deletions

deployment/config.yaml

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,78 @@ api:
4848
swagger_ui: True
4949
serve_spec: True
5050

51+
custom:
52+
taskmaster_template:
53+
apiVersion: batch/v1
54+
kind: Job
55+
metadata:
56+
name: taskmaster
57+
labels:
58+
app: taskmaster
59+
spec:
60+
template:
61+
metadata:
62+
name: taskmaster
63+
spec:
64+
serviceAccountName: default
65+
containers:
66+
- name: taskmaster
67+
image: eu.gcr.io/tes-wes/taskmaster:v0.0.5.2
68+
args:
69+
- -f
70+
- /jsoninput/JSON_INPUT.gz
71+
env:
72+
- name: TESK_FTP_USERNAME
73+
valueFrom:
74+
secretKeyRef:
75+
name: ftp-secret
76+
key: username
77+
optional: true
78+
- name: TESK_FTP_PASSWORD
79+
valueFrom:
80+
secretKeyRef:
81+
name: ftp-secret
82+
key: password
83+
optional: true
84+
volumeMounts:
85+
- name: podinfo
86+
mountPath: /podinfo
87+
readOnly: true
88+
- name: jsoninput
89+
mountPath: /jsoninput
90+
readOnly: true
91+
volumes:
92+
- name: podinfo
93+
downwardAPI:
94+
items:
95+
- path: labels
96+
fieldRef:
97+
fieldPath: metadata.labels
98+
restartPolicy: Never
99+
taskmaster_env_properties:
100+
# Taskmaster image name
101+
imageName: eu.gcr.io/tes-wes/taskmaster
102+
# Taskmaster image version
103+
imageVersion: v0.10.0
104+
# Filer image name
105+
filerImageName: eu.gcr.io/tes-wes/filer
106+
# Filer image version
107+
filerImageVersion: v0.10.0
108+
# Test FTP account settings
109+
ftp:
110+
# Name of the secret with FTP account credentials
111+
secretName: account-secret
112+
# If FTP account enabled (based on non-emptiness of secretName)
113+
enabled: false
114+
# If verbose (debug) mode of taskmaster is on (passes additional flag to taskmaster and sets image pull policy to Always)
115+
debug: false
116+
# Environment variables, that will be passed to taskmaster
117+
environment:
118+
key: value
119+
# Service Account name for taskmaster
120+
serviceAccountName: default
121+
122+
51123
# Logging configuration
52124
# Cf. https://foca.readthedocs.io/en/latest/modules/foca.models.html#foca.models.config.LogConfig
53125
log:

poetry.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ version = "0.1.0"
3030
[tool.poetry.dependencies]
3131
boto3 = "1.34.104"
3232
foca = "^0.13.0"
33-
kubernetes = "^29.0.0"
33+
kubernetes = "^30.1.0"
3434
python = "^3.11"
3535
requests = ">=2.20.0"
3636
urllib3 = "^2.2.1"

tesk/api/ga4gh/tes/controllers.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,15 @@
22

33
import logging
44

5-
# from connexion import request # type: ignore
65
from foca.utils.logging import log_traffic # type: ignore
76

7+
from tesk.api.kubernetes.template import KubernetesTemplateSupplier
8+
from tesk.api.ga4gh.tes.models import TesTask
9+
from tesk.utils import get_custom_config
10+
from tesk.api.kubernetes.converter import TesKubernetesConverter
11+
12+
# from tesk.api.ga4gh.tes.task.create_task import CreateTask as TaskCreater
13+
814
# Get logger instance
915
logger = logging.getLogger(__name__)
1016

@@ -24,13 +30,22 @@ def CancelTask(id, *args, **kwargs) -> dict: # type: ignore
2430

2531
# POST /tasks
2632
@log_traffic
27-
def CreateTask(*args, **kwargs) -> dict: # type: ignore
33+
def CreateTask(**kwargs) -> dict: # type: ignore
2834
"""Create task.
2935
3036
Args:
3137
*args: Variable length argument list.
3238
**kwargs: Arbitrary keyword arguments.
3339
"""
40+
request_body = kwargs["body"]
41+
create_task_request = TesTask(**request_body)
42+
user = {
43+
"username": "test",
44+
"is_member": True,
45+
"any_group": "test_group",
46+
}
47+
tkc = TesKubernetesConverter().from_tes_task_to_k8s_job(create_task_request, user)
48+
print(tkc)
3449
pass
3550

3651

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"""Task API controller logic."""
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
"""TESK API module for creating a task."""
2+
3+
import logging
4+
5+
from tesk.api.ga4gh.tes.models import TesTask
6+
from tesk.api.kubernetes.client_wrapper import KubernetesClientWrapper
7+
from tesk.api.kubernetes.constants import Constants
8+
from tesk.api.kubernetes.converter import TesKubernetesConverter
9+
from tesk.exceptions import KubernetesError
10+
11+
logger = logging.getLogger(__name__)
12+
13+
14+
class CreateTesTask:
15+
"""Create TES task."""
16+
17+
def __init__(self, task: TesTask, user=None, namespace="default"):
18+
"""Initialize the CreateTask class.
19+
20+
Args:
21+
task: TES task to create.
22+
user: User who creates the task.
23+
namespace: Kubernetes namespace where the task is created.
24+
"""
25+
self.task = task
26+
self.user = user
27+
self.kubernetes_client_wrapper = KubernetesClientWrapper()
28+
self.namespace = namespace
29+
self.tes_kubernetes_converter = TesKubernetesConverter(self.namespace)
30+
self.constants = Constants()
31+
32+
def create_task(self):
33+
"""Create TES task."""
34+
attempts_no = 0
35+
while True:
36+
try:
37+
resources = self.task.resources
38+
39+
if resources and resources.ram_gb:
40+
minimum_ram_gb = self.kubernetes_client_wrapper.minimum_ram_gb()
41+
if resources.ram_gb < minimum_ram_gb:
42+
self.task.resources.ram_gb = minimum_ram_gb
43+
44+
task_master_job = (
45+
self.tes_kubernetes_converter.from_tes_task_to_k8s_job(
46+
self.task, self.user
47+
)
48+
)
49+
50+
# TODO: Create ConfigMap
51+
# TODO: Create Job
52+
# TODO Return created job
53+
# task_master_config_map = converter.from_tes_task_to_k8s_config_map(
54+
# task, user, task_master_job
55+
# )
56+
# created_config_map = kubernetes_client_wrapper.create_config_map(
57+
# task_master_config_map
58+
# )
59+
# created_job = kubernetes_client_wrapper.create_job(task_master_job)
60+
# return converter.from_k8s_job_to_tes_create_task_response(created_job)
61+
62+
except KubernetesError as e:
63+
# Handle Kubernetes specific exceptions
64+
if (
65+
not e.is_object_name_duplicated()
66+
or attempts_no >= self.constants.job_create_attempts_no
67+
):
68+
raise e
69+
attempts_no += 1
70+
71+
except Exception as exc:
72+
logging.error("ERROR: In createTask", exc_info=True)
73+
raise exc
74+
75+
def response(self) -> dict:
76+
"""Create response."""
77+
return self.create_task()

tesk/api/kubernetes/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"""Kubernetes API module."""

0 commit comments

Comments
 (0)