digitalhub 0.7.0b2__py3-none-any.whl → 0.8.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of digitalhub might be problematic. Click here for more details.
- digitalhub/__init__.py +63 -93
- digitalhub/client/__init__.py +0 -0
- digitalhub/client/_base/__init__.py +0 -0
- digitalhub/client/_base/client.py +56 -0
- digitalhub/client/api.py +63 -0
- digitalhub/client/builder.py +50 -0
- digitalhub/client/dhcore/__init__.py +0 -0
- digitalhub/client/dhcore/client.py +669 -0
- digitalhub/client/dhcore/env.py +21 -0
- digitalhub/client/dhcore/models.py +46 -0
- digitalhub/client/dhcore/utils.py +111 -0
- digitalhub/client/local/__init__.py +0 -0
- digitalhub/client/local/client.py +533 -0
- digitalhub/context/__init__.py +0 -0
- digitalhub/context/api.py +93 -0
- digitalhub/context/builder.py +94 -0
- digitalhub/context/context.py +136 -0
- digitalhub/datastores/__init__.py +0 -0
- digitalhub/datastores/_base/__init__.py +0 -0
- digitalhub/datastores/_base/datastore.py +85 -0
- digitalhub/datastores/api.py +37 -0
- digitalhub/datastores/builder.py +110 -0
- digitalhub/datastores/local/__init__.py +0 -0
- digitalhub/datastores/local/datastore.py +50 -0
- digitalhub/datastores/remote/__init__.py +0 -0
- digitalhub/datastores/remote/datastore.py +31 -0
- digitalhub/datastores/s3/__init__.py +0 -0
- digitalhub/datastores/s3/datastore.py +46 -0
- digitalhub/datastores/sql/__init__.py +0 -0
- digitalhub/datastores/sql/datastore.py +68 -0
- digitalhub/entities/__init__.py +0 -0
- digitalhub/entities/_base/__init__.py +0 -0
- digitalhub/entities/_base/_base/__init__.py +0 -0
- digitalhub/entities/_base/_base/entity.py +82 -0
- digitalhub/entities/_base/api_utils.py +620 -0
- digitalhub/entities/_base/context/__init__.py +0 -0
- digitalhub/entities/_base/context/entity.py +118 -0
- digitalhub/entities/_base/crud.py +468 -0
- digitalhub/entities/_base/entity/__init__.py +0 -0
- digitalhub/entities/_base/entity/_constructors/__init__.py +0 -0
- digitalhub/entities/_base/entity/_constructors/metadata.py +44 -0
- digitalhub/entities/_base/entity/_constructors/name.py +31 -0
- digitalhub/entities/_base/entity/_constructors/spec.py +33 -0
- digitalhub/entities/_base/entity/_constructors/status.py +52 -0
- digitalhub/entities/_base/entity/_constructors/uuid.py +26 -0
- digitalhub/entities/_base/entity/builder.py +175 -0
- digitalhub/entities/_base/entity/entity.py +106 -0
- digitalhub/entities/_base/entity/metadata.py +59 -0
- digitalhub/entities/_base/entity/spec.py +58 -0
- digitalhub/entities/_base/entity/status.py +43 -0
- digitalhub/entities/_base/executable/__init__.py +0 -0
- digitalhub/entities/_base/executable/entity.py +405 -0
- digitalhub/entities/_base/material/__init__.py +0 -0
- digitalhub/entities/_base/material/entity.py +214 -0
- digitalhub/entities/_base/material/spec.py +22 -0
- digitalhub/entities/_base/material/status.py +49 -0
- digitalhub/entities/_base/runtime_entity/__init__.py +0 -0
- digitalhub/entities/_base/runtime_entity/builder.py +106 -0
- digitalhub/entities/_base/unversioned/__init__.py +0 -0
- digitalhub/entities/_base/unversioned/builder.py +66 -0
- digitalhub/entities/_base/unversioned/entity.py +49 -0
- digitalhub/entities/_base/versioned/__init__.py +0 -0
- digitalhub/entities/_base/versioned/builder.py +68 -0
- digitalhub/entities/_base/versioned/entity.py +53 -0
- digitalhub/entities/artifact/__init__.py +0 -0
- digitalhub/entities/artifact/_base/__init__.py +0 -0
- digitalhub/entities/artifact/_base/builder.py +86 -0
- digitalhub/entities/artifact/_base/entity.py +39 -0
- digitalhub/entities/artifact/_base/spec.py +15 -0
- digitalhub/entities/artifact/_base/status.py +9 -0
- digitalhub/entities/artifact/artifact/__init__.py +0 -0
- digitalhub/entities/artifact/artifact/builder.py +18 -0
- digitalhub/entities/artifact/artifact/entity.py +32 -0
- digitalhub/entities/artifact/artifact/spec.py +27 -0
- digitalhub/entities/artifact/artifact/status.py +15 -0
- digitalhub/entities/artifact/crud.py +332 -0
- digitalhub/entities/builders.py +63 -0
- digitalhub/entities/dataitem/__init__.py +0 -0
- digitalhub/entities/dataitem/_base/__init__.py +0 -0
- digitalhub/entities/dataitem/_base/builder.py +86 -0
- digitalhub/entities/dataitem/_base/entity.py +75 -0
- digitalhub/entities/dataitem/_base/spec.py +15 -0
- digitalhub/entities/dataitem/_base/status.py +20 -0
- digitalhub/entities/dataitem/crud.py +372 -0
- digitalhub/entities/dataitem/dataitem/__init__.py +0 -0
- digitalhub/entities/dataitem/dataitem/builder.py +18 -0
- digitalhub/entities/dataitem/dataitem/entity.py +32 -0
- digitalhub/entities/dataitem/dataitem/spec.py +15 -0
- digitalhub/entities/dataitem/dataitem/status.py +9 -0
- digitalhub/entities/dataitem/iceberg/__init__.py +0 -0
- digitalhub/entities/dataitem/iceberg/builder.py +18 -0
- digitalhub/entities/dataitem/iceberg/entity.py +32 -0
- digitalhub/entities/dataitem/iceberg/spec.py +15 -0
- digitalhub/entities/dataitem/iceberg/status.py +9 -0
- digitalhub/entities/dataitem/table/__init__.py +0 -0
- digitalhub/entities/dataitem/table/builder.py +18 -0
- digitalhub/entities/dataitem/table/entity.py +146 -0
- digitalhub/entities/dataitem/table/models.py +62 -0
- digitalhub/entities/dataitem/table/spec.py +25 -0
- digitalhub/entities/dataitem/table/status.py +9 -0
- digitalhub/entities/function/__init__.py +0 -0
- digitalhub/entities/function/_base/__init__.py +0 -0
- digitalhub/entities/function/_base/builder.py +79 -0
- digitalhub/entities/function/_base/entity.py +98 -0
- digitalhub/entities/function/_base/models.py +118 -0
- digitalhub/entities/function/_base/spec.py +15 -0
- digitalhub/entities/function/_base/status.py +9 -0
- digitalhub/entities/function/crud.py +279 -0
- digitalhub/entities/model/__init__.py +0 -0
- digitalhub/entities/model/_base/__init__.py +0 -0
- digitalhub/entities/model/_base/builder.py +86 -0
- digitalhub/entities/model/_base/entity.py +34 -0
- digitalhub/entities/model/_base/spec.py +49 -0
- digitalhub/entities/model/_base/status.py +9 -0
- digitalhub/entities/model/crud.py +331 -0
- digitalhub/entities/model/huggingface/__init__.py +0 -0
- digitalhub/entities/model/huggingface/builder.py +18 -0
- digitalhub/entities/model/huggingface/entity.py +32 -0
- digitalhub/entities/model/huggingface/spec.py +36 -0
- digitalhub/entities/model/huggingface/status.py +9 -0
- digitalhub/entities/model/mlflow/__init__.py +0 -0
- digitalhub/entities/model/mlflow/builder.py +18 -0
- digitalhub/entities/model/mlflow/entity.py +32 -0
- digitalhub/entities/model/mlflow/models.py +26 -0
- digitalhub/entities/model/mlflow/spec.py +44 -0
- digitalhub/entities/model/mlflow/status.py +9 -0
- digitalhub/entities/model/mlflow/utils.py +81 -0
- digitalhub/entities/model/model/__init__.py +0 -0
- digitalhub/entities/model/model/builder.py +18 -0
- digitalhub/entities/model/model/entity.py +32 -0
- digitalhub/entities/model/model/spec.py +15 -0
- digitalhub/entities/model/model/status.py +9 -0
- digitalhub/entities/model/sklearn/__init__.py +0 -0
- digitalhub/entities/model/sklearn/builder.py +18 -0
- digitalhub/entities/model/sklearn/entity.py +32 -0
- digitalhub/entities/model/sklearn/spec.py +15 -0
- digitalhub/entities/model/sklearn/status.py +9 -0
- digitalhub/entities/project/__init__.py +0 -0
- digitalhub/entities/project/_base/__init__.py +0 -0
- digitalhub/entities/project/_base/builder.py +128 -0
- digitalhub/entities/project/_base/entity.py +2078 -0
- digitalhub/entities/project/_base/spec.py +50 -0
- digitalhub/entities/project/_base/status.py +9 -0
- digitalhub/entities/project/crud.py +357 -0
- digitalhub/entities/run/__init__.py +0 -0
- digitalhub/entities/run/_base/__init__.py +0 -0
- digitalhub/entities/run/_base/builder.py +94 -0
- digitalhub/entities/run/_base/entity.py +307 -0
- digitalhub/entities/run/_base/spec.py +50 -0
- digitalhub/entities/run/_base/status.py +9 -0
- digitalhub/entities/run/crud.py +219 -0
- digitalhub/entities/secret/__init__.py +0 -0
- digitalhub/entities/secret/_base/__init__.py +0 -0
- digitalhub/entities/secret/_base/builder.py +81 -0
- digitalhub/entities/secret/_base/entity.py +74 -0
- digitalhub/entities/secret/_base/spec.py +35 -0
- digitalhub/entities/secret/_base/status.py +9 -0
- digitalhub/entities/secret/crud.py +290 -0
- digitalhub/entities/task/__init__.py +0 -0
- digitalhub/entities/task/_base/__init__.py +0 -0
- digitalhub/entities/task/_base/builder.py +91 -0
- digitalhub/entities/task/_base/entity.py +136 -0
- digitalhub/entities/task/_base/models.py +208 -0
- digitalhub/entities/task/_base/spec.py +53 -0
- digitalhub/entities/task/_base/status.py +9 -0
- digitalhub/entities/task/crud.py +228 -0
- digitalhub/entities/utils/__init__.py +0 -0
- digitalhub/entities/utils/api.py +346 -0
- digitalhub/entities/utils/entity_types.py +19 -0
- digitalhub/entities/utils/state.py +31 -0
- digitalhub/entities/utils/utils.py +202 -0
- digitalhub/entities/workflow/__init__.py +0 -0
- digitalhub/entities/workflow/_base/__init__.py +0 -0
- digitalhub/entities/workflow/_base/builder.py +79 -0
- digitalhub/entities/workflow/_base/entity.py +74 -0
- digitalhub/entities/workflow/_base/spec.py +15 -0
- digitalhub/entities/workflow/_base/status.py +9 -0
- digitalhub/entities/workflow/crud.py +278 -0
- digitalhub/factory/__init__.py +0 -0
- digitalhub/factory/api.py +277 -0
- digitalhub/factory/factory.py +268 -0
- digitalhub/factory/utils.py +90 -0
- digitalhub/readers/__init__.py +0 -0
- digitalhub/readers/_base/__init__.py +0 -0
- digitalhub/readers/_base/builder.py +26 -0
- digitalhub/readers/_base/reader.py +70 -0
- digitalhub/readers/api.py +80 -0
- digitalhub/readers/factory.py +133 -0
- digitalhub/readers/pandas/__init__.py +0 -0
- digitalhub/readers/pandas/builder.py +29 -0
- digitalhub/readers/pandas/reader.py +207 -0
- digitalhub/runtimes/__init__.py +0 -0
- digitalhub/runtimes/_base.py +102 -0
- digitalhub/runtimes/builder.py +32 -0
- digitalhub/stores/__init__.py +0 -0
- digitalhub/stores/_base/__init__.py +0 -0
- digitalhub/stores/_base/store.py +189 -0
- digitalhub/stores/api.py +54 -0
- digitalhub/stores/builder.py +211 -0
- digitalhub/stores/local/__init__.py +0 -0
- digitalhub/stores/local/store.py +230 -0
- digitalhub/stores/remote/__init__.py +0 -0
- digitalhub/stores/remote/store.py +143 -0
- digitalhub/stores/s3/__init__.py +0 -0
- digitalhub/stores/s3/store.py +563 -0
- digitalhub/stores/sql/__init__.py +0 -0
- digitalhub/stores/sql/store.py +328 -0
- digitalhub/utils/__init__.py +0 -0
- digitalhub/utils/data_utils.py +127 -0
- digitalhub/utils/exceptions.py +67 -0
- digitalhub/utils/file_utils.py +204 -0
- digitalhub/utils/generic_utils.py +183 -0
- digitalhub/utils/git_utils.py +148 -0
- digitalhub/utils/io_utils.py +116 -0
- digitalhub/utils/logger.py +17 -0
- digitalhub/utils/s3_utils.py +58 -0
- digitalhub/utils/uri_utils.py +56 -0
- {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/METADATA +30 -13
- digitalhub-0.8.0.dist-info/RECORD +231 -0
- {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/WHEEL +1 -1
- test/local/CRUD/test_artifacts.py +96 -0
- test/local/CRUD/test_dataitems.py +96 -0
- test/local/CRUD/test_models.py +95 -0
- test/test_crud_functions.py +1 -1
- test/test_crud_runs.py +1 -1
- test/test_crud_tasks.py +1 -1
- digitalhub-0.7.0b2.dist-info/RECORD +0 -14
- test/test_crud_artifacts.py +0 -96
- test/test_crud_dataitems.py +0 -96
- {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/LICENSE.txt +0 -0
- {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/top_level.txt +0 -0
- /test/{test_imports.py → local/imports/test_imports.py} +0 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
from typing_extensions import Literal
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Volume(BaseModel):
|
|
8
|
+
"""
|
|
9
|
+
Volume model.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
volume_type: Literal["persistent_volume_claim", "empty_dir"]
|
|
13
|
+
"""Volume type."""
|
|
14
|
+
|
|
15
|
+
name: str
|
|
16
|
+
"""Volume name."""
|
|
17
|
+
|
|
18
|
+
mount_path: str
|
|
19
|
+
"""Volume mount path inside the container."""
|
|
20
|
+
|
|
21
|
+
spec: dict[str, str]
|
|
22
|
+
"""Volume spec."""
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class NodeSelector(BaseModel):
|
|
26
|
+
"""
|
|
27
|
+
NodeSelector model.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
key: str
|
|
31
|
+
"""Node selector key."""
|
|
32
|
+
|
|
33
|
+
value: str
|
|
34
|
+
"""Node selector value."""
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class ResourceItem(BaseModel):
|
|
38
|
+
"""
|
|
39
|
+
Resource item model.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
requests: str = Field(default=None, regex=r"[\d]+|^([0-9])+([a-zA-Z])+$")
|
|
43
|
+
"""Resource requests."""
|
|
44
|
+
|
|
45
|
+
limits: str = Field(default=None, regex=r"[\d]+|^([0-9])+([a-zA-Z])+$")
|
|
46
|
+
"""Resource limits."""
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class Resource(BaseModel):
|
|
50
|
+
"""
|
|
51
|
+
Resource model.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
cpu: ResourceItem = None
|
|
55
|
+
"""CPU resource model."""
|
|
56
|
+
|
|
57
|
+
mem: ResourceItem = None
|
|
58
|
+
"""Memory resource model."""
|
|
59
|
+
|
|
60
|
+
gpu: ResourceItem = None
|
|
61
|
+
"""GPU resource model."""
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class Env(BaseModel):
|
|
65
|
+
"""
|
|
66
|
+
Env variable model.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
name: str
|
|
70
|
+
"""Env variable name."""
|
|
71
|
+
|
|
72
|
+
value: str
|
|
73
|
+
"""Env variable value."""
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class Toleration(BaseModel):
|
|
77
|
+
"""
|
|
78
|
+
Toleration model.
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
key: str = None
|
|
82
|
+
"""Toleration key."""
|
|
83
|
+
|
|
84
|
+
operator: str = None
|
|
85
|
+
"""Toleration operator."""
|
|
86
|
+
|
|
87
|
+
value: str = None
|
|
88
|
+
"""Toleration value."""
|
|
89
|
+
|
|
90
|
+
effect: str = None
|
|
91
|
+
"""Toleration effect."""
|
|
92
|
+
|
|
93
|
+
toleration_seconds: int = None
|
|
94
|
+
"""Toleration seconds."""
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class V1NodeSelectorRequirement(BaseModel):
|
|
98
|
+
key: str
|
|
99
|
+
operator: str
|
|
100
|
+
values: list[str] = None
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class V1NodeSelectorTerm(BaseModel):
|
|
104
|
+
match_expressions: list[V1NodeSelectorRequirement] = None
|
|
105
|
+
match_fields: list[V1NodeSelectorRequirement] = None
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class V1NodeSelector(BaseModel):
|
|
109
|
+
node_selector_terms: list[V1NodeSelectorTerm]
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class V1PreferredSchedulingTerm(BaseModel):
|
|
113
|
+
preference: V1NodeSelector
|
|
114
|
+
weight: int
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class V1LabelSelectorRequirement(BaseModel):
|
|
118
|
+
key: str
|
|
119
|
+
operator: str
|
|
120
|
+
values: list[str] = None
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class V1LabelSelector(BaseModel):
|
|
124
|
+
match_expressions: list[V1LabelSelectorRequirement] = None
|
|
125
|
+
match_labels: dict[str, str] = None
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class V1PodAffinityTerm(BaseModel):
|
|
129
|
+
label_selector: V1LabelSelector = None
|
|
130
|
+
match_label_keys: list[str] = None
|
|
131
|
+
mismatch_label_keys: list[str] = None
|
|
132
|
+
namespace_selector: V1LabelSelector = None
|
|
133
|
+
namespaces: list[str] = None
|
|
134
|
+
topology_key: str
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class V1WeightedPodAffinityTerm(BaseModel):
|
|
138
|
+
pod_affinity_term: V1PodAffinityTerm
|
|
139
|
+
weight: int
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class V1NodeAffinity(BaseModel):
|
|
143
|
+
preferred_during_scheduling_ignored_during_execution: list[V1PreferredSchedulingTerm] = None
|
|
144
|
+
required_during_scheduling_ignored_during_execution: V1NodeSelector = None
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class V1PodAffinity(BaseModel):
|
|
148
|
+
preferred_during_scheduling_ignored_during_execution: list[V1WeightedPodAffinityTerm] = None
|
|
149
|
+
required_during_scheduling_ignored_during_execution: list[V1PodAffinityTerm] = None
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class V1PodAntiAffinity(BaseModel):
|
|
153
|
+
preferred_during_scheduling_ignored_during_execution: list[V1WeightedPodAffinityTerm] = None
|
|
154
|
+
required_during_scheduling_ignored_during_execution: list[V1PodAffinityTerm] = None
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
class Affinity(BaseModel):
|
|
158
|
+
"""
|
|
159
|
+
Affinity model.
|
|
160
|
+
"""
|
|
161
|
+
|
|
162
|
+
node_affinity: V1NodeAffinity = None
|
|
163
|
+
"""Node affinity."""
|
|
164
|
+
|
|
165
|
+
pod_affinity: V1PodAffinity = None
|
|
166
|
+
"""Pod affinity."""
|
|
167
|
+
|
|
168
|
+
pod_anti_affinity: V1PodAntiAffinity = None
|
|
169
|
+
"""Pod anti affinity."""
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
class K8s(BaseModel):
|
|
173
|
+
"""
|
|
174
|
+
Kubernetes resource model.
|
|
175
|
+
"""
|
|
176
|
+
|
|
177
|
+
node_selector: list[NodeSelector] = None
|
|
178
|
+
"""Node selector."""
|
|
179
|
+
|
|
180
|
+
volumes: list[Volume] = None
|
|
181
|
+
"""List of volumes."""
|
|
182
|
+
|
|
183
|
+
resources: Resource = None
|
|
184
|
+
"""Resources restrictions."""
|
|
185
|
+
|
|
186
|
+
affinity: Affinity = None
|
|
187
|
+
"""Affinity."""
|
|
188
|
+
|
|
189
|
+
tolerations: list[Toleration] = None
|
|
190
|
+
"""Tolerations."""
|
|
191
|
+
|
|
192
|
+
envs: list[Env] = None
|
|
193
|
+
"""Env variables."""
|
|
194
|
+
|
|
195
|
+
secrets: list[str] = None
|
|
196
|
+
"""List of secret names."""
|
|
197
|
+
|
|
198
|
+
profile: str = None
|
|
199
|
+
"""Profile template."""
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
class CorePort(BaseModel):
|
|
203
|
+
"""
|
|
204
|
+
Port mapper model.
|
|
205
|
+
"""
|
|
206
|
+
|
|
207
|
+
port: int
|
|
208
|
+
target_port: int
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities._base.entity.spec import Spec, SpecValidator
|
|
4
|
+
from digitalhub.entities.task._base.models import K8s
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class TaskSpec(Spec):
|
|
8
|
+
"""TaskSpec specifications."""
|
|
9
|
+
|
|
10
|
+
def __init__(self, function: str) -> None:
|
|
11
|
+
self.function = function
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TaskSpecK8s(TaskSpec):
|
|
15
|
+
"""TaskSpecK8s specifications."""
|
|
16
|
+
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
function: str,
|
|
20
|
+
node_selector: dict | None = None,
|
|
21
|
+
volumes: list | None = None,
|
|
22
|
+
resources: dict | None = None,
|
|
23
|
+
affinity: dict | None = None,
|
|
24
|
+
tolerations: list | None = None,
|
|
25
|
+
envs: list | None = None,
|
|
26
|
+
secrets: list | None = None,
|
|
27
|
+
profile: str | None = None,
|
|
28
|
+
**kwargs,
|
|
29
|
+
) -> None:
|
|
30
|
+
super().__init__(function)
|
|
31
|
+
self.node_selector = node_selector
|
|
32
|
+
self.volumes = volumes
|
|
33
|
+
self.resources = resources
|
|
34
|
+
self.affinity = affinity
|
|
35
|
+
self.tolerations = tolerations
|
|
36
|
+
self.envs = envs
|
|
37
|
+
self.secrets = secrets
|
|
38
|
+
self.profile = profile
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class TaskValidator(SpecValidator):
|
|
42
|
+
"""
|
|
43
|
+
TaskValidator validator.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
function: str
|
|
47
|
+
"""Function string."""
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class TaskValidatorK8s(TaskValidator, K8s):
|
|
51
|
+
"""
|
|
52
|
+
TaskValidatorK8s validator.
|
|
53
|
+
"""
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities._base.crud import (
|
|
6
|
+
delete_entity,
|
|
7
|
+
get_unversioned_entity,
|
|
8
|
+
import_context_entity,
|
|
9
|
+
list_context_entities,
|
|
10
|
+
new_context_entity,
|
|
11
|
+
)
|
|
12
|
+
from digitalhub.entities.utils.entity_types import EntityTypes
|
|
13
|
+
from digitalhub.utils.exceptions import EntityError
|
|
14
|
+
|
|
15
|
+
if typing.TYPE_CHECKING:
|
|
16
|
+
from digitalhub.entities.task._base.entity import Task
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
ENTITY_TYPE = EntityTypes.TASK.value
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def new_task(
|
|
23
|
+
project: str,
|
|
24
|
+
kind: str,
|
|
25
|
+
uuid: str | None = None,
|
|
26
|
+
labels: list[str] | None = None,
|
|
27
|
+
function: str | None = None,
|
|
28
|
+
**kwargs,
|
|
29
|
+
) -> Task:
|
|
30
|
+
"""
|
|
31
|
+
Create a new object.
|
|
32
|
+
|
|
33
|
+
Parameters
|
|
34
|
+
----------
|
|
35
|
+
project : str
|
|
36
|
+
Project name.
|
|
37
|
+
kind : str
|
|
38
|
+
Kind the object.
|
|
39
|
+
uuid : str
|
|
40
|
+
ID of the object.
|
|
41
|
+
labels : list[str]
|
|
42
|
+
List of labels.
|
|
43
|
+
function : str
|
|
44
|
+
Name of the executable associated with the task.
|
|
45
|
+
**kwargs : dict
|
|
46
|
+
Spec keyword arguments.
|
|
47
|
+
|
|
48
|
+
Returns
|
|
49
|
+
-------
|
|
50
|
+
Task
|
|
51
|
+
Object instance.
|
|
52
|
+
|
|
53
|
+
Examples
|
|
54
|
+
--------
|
|
55
|
+
>>> obj = new_task(project="my-project",
|
|
56
|
+
>>> kind="python+job",
|
|
57
|
+
>>> function="function-string")
|
|
58
|
+
"""
|
|
59
|
+
return new_context_entity(
|
|
60
|
+
project=project,
|
|
61
|
+
kind=kind,
|
|
62
|
+
uuid=uuid,
|
|
63
|
+
labels=labels,
|
|
64
|
+
function=function,
|
|
65
|
+
**kwargs,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def get_task(
|
|
70
|
+
identifier: str,
|
|
71
|
+
project: str | None = None,
|
|
72
|
+
**kwargs,
|
|
73
|
+
) -> Task:
|
|
74
|
+
"""
|
|
75
|
+
Get object from backend.
|
|
76
|
+
|
|
77
|
+
Parameters
|
|
78
|
+
----------
|
|
79
|
+
identifier : str
|
|
80
|
+
Entity key (store://...) or entity ID.
|
|
81
|
+
project : str
|
|
82
|
+
Project name.
|
|
83
|
+
**kwargs : dict
|
|
84
|
+
Parameters to pass to the API call.
|
|
85
|
+
|
|
86
|
+
Returns
|
|
87
|
+
-------
|
|
88
|
+
Task
|
|
89
|
+
Object instance.
|
|
90
|
+
|
|
91
|
+
Examples
|
|
92
|
+
--------
|
|
93
|
+
Using entity key:
|
|
94
|
+
>>> obj = get_task("store://my-task-key")
|
|
95
|
+
|
|
96
|
+
Using entity ID:
|
|
97
|
+
>>> obj = get_task("my-task-id"
|
|
98
|
+
>>> project="my-project")
|
|
99
|
+
"""
|
|
100
|
+
return get_unversioned_entity(
|
|
101
|
+
identifier,
|
|
102
|
+
entity_type=ENTITY_TYPE,
|
|
103
|
+
project=project,
|
|
104
|
+
**kwargs,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def list_tasks(project: str, **kwargs) -> list[Task]:
|
|
109
|
+
"""
|
|
110
|
+
List all latest version objects from backend.
|
|
111
|
+
|
|
112
|
+
Parameters
|
|
113
|
+
----------
|
|
114
|
+
project : str
|
|
115
|
+
Project name.
|
|
116
|
+
**kwargs : dict
|
|
117
|
+
Parameters to pass to the API call.
|
|
118
|
+
|
|
119
|
+
Returns
|
|
120
|
+
-------
|
|
121
|
+
list[Task]
|
|
122
|
+
List of object instances.
|
|
123
|
+
|
|
124
|
+
Examples
|
|
125
|
+
--------
|
|
126
|
+
>>> objs = list_tasks(project="my-project")
|
|
127
|
+
"""
|
|
128
|
+
return list_context_entities(
|
|
129
|
+
project=project,
|
|
130
|
+
entity_type=ENTITY_TYPE,
|
|
131
|
+
**kwargs,
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def import_task(file: str) -> Task:
|
|
136
|
+
"""
|
|
137
|
+
Get object from file.
|
|
138
|
+
|
|
139
|
+
Parameters
|
|
140
|
+
----------
|
|
141
|
+
file : str
|
|
142
|
+
Path to YAML file.
|
|
143
|
+
|
|
144
|
+
Returns
|
|
145
|
+
-------
|
|
146
|
+
Task
|
|
147
|
+
Object instance.
|
|
148
|
+
|
|
149
|
+
Example
|
|
150
|
+
-------
|
|
151
|
+
>>> obj = import_task("my-task.yaml")
|
|
152
|
+
"""
|
|
153
|
+
return import_context_entity(file)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def update_task(entity: Task) -> Task:
|
|
157
|
+
"""
|
|
158
|
+
Update object. Note that object spec are immutable.
|
|
159
|
+
|
|
160
|
+
Parameters
|
|
161
|
+
----------
|
|
162
|
+
entity : Task
|
|
163
|
+
Object to update.
|
|
164
|
+
|
|
165
|
+
Returns
|
|
166
|
+
-------
|
|
167
|
+
Task
|
|
168
|
+
Entity updated.
|
|
169
|
+
|
|
170
|
+
Examples
|
|
171
|
+
--------
|
|
172
|
+
>>> obj = update_task(obj)
|
|
173
|
+
"""
|
|
174
|
+
return entity.save(update=True)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def delete_task(
|
|
178
|
+
identifier: str,
|
|
179
|
+
project: str | None = None,
|
|
180
|
+
entity_id: str | None = None,
|
|
181
|
+
delete_all_versions: bool = False,
|
|
182
|
+
cascade: bool = True,
|
|
183
|
+
**kwargs,
|
|
184
|
+
) -> dict:
|
|
185
|
+
"""
|
|
186
|
+
Delete object from backend.
|
|
187
|
+
|
|
188
|
+
Parameters
|
|
189
|
+
----------
|
|
190
|
+
identifier : str
|
|
191
|
+
Entity key (store://...) or entity name.
|
|
192
|
+
project : str
|
|
193
|
+
Project name.
|
|
194
|
+
entity_id : str
|
|
195
|
+
Entity ID.
|
|
196
|
+
delete_all_versions : bool
|
|
197
|
+
Delete all versions of the named entity. If True, use entity name instead of entity key as identifier.
|
|
198
|
+
cascade : bool
|
|
199
|
+
Cascade delete.
|
|
200
|
+
**kwargs : dict
|
|
201
|
+
Parameters to pass to the API call.
|
|
202
|
+
|
|
203
|
+
Returns
|
|
204
|
+
-------
|
|
205
|
+
dict
|
|
206
|
+
Response from backend.
|
|
207
|
+
|
|
208
|
+
Examples
|
|
209
|
+
--------
|
|
210
|
+
If delete_all_versions is False:
|
|
211
|
+
>>> obj = delete_task("store://my-task-key")
|
|
212
|
+
|
|
213
|
+
Otherwise:
|
|
214
|
+
>>> obj = delete_task("task-name",
|
|
215
|
+
>>> project="my-project",
|
|
216
|
+
>>> delete_all_versions=True)
|
|
217
|
+
"""
|
|
218
|
+
if not identifier.startswith("store://"):
|
|
219
|
+
raise EntityError("Task has no name. Use key instead.")
|
|
220
|
+
return delete_entity(
|
|
221
|
+
identifier=identifier,
|
|
222
|
+
entity_type=ENTITY_TYPE,
|
|
223
|
+
project=project,
|
|
224
|
+
entity_id=entity_id,
|
|
225
|
+
delete_all_versions=delete_all_versions,
|
|
226
|
+
cascade=cascade,
|
|
227
|
+
**kwargs,
|
|
228
|
+
)
|
|
File without changes
|