digitalhub 0.8.0__py3-none-any.whl → 0.8.0b1__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 +4 -5
- digitalhub/client/builder.py +58 -3
- digitalhub/client/{dhcore/client.py → objects/dhcore.py} +60 -48
- digitalhub/client/{local/client.py → objects/local.py} +2 -2
- digitalhub/context/builder.py +85 -1
- digitalhub/context/context.py +1 -1
- digitalhub/datastores/builder.py +37 -13
- digitalhub/datastores/{_base/datastore.py → objects/base.py} +3 -3
- digitalhub/datastores/{local/datastore.py → objects/local.py} +2 -10
- digitalhub/datastores/{remote/datastore.py → objects/remote.py} +1 -9
- digitalhub/datastores/{s3/datastore.py → objects/s3.py} +2 -10
- digitalhub/datastores/{sql/datastore.py → objects/sql.py} +2 -10
- digitalhub/entities/_base/{_base/entity.py → base.py} +1 -1
- digitalhub/entities/_base/crud.py +389 -247
- digitalhub/entities/_base/entity/{entity.py → base.py} +34 -8
- digitalhub/entities/_base/{context/entity.py → entity/context.py} +6 -6
- digitalhub/entities/_base/{executable/entity.py → entity/executable.py} +36 -61
- digitalhub/entities/_base/{material/entity.py → entity/material.py} +6 -6
- digitalhub/entities/_base/entity/unversioned.py +87 -0
- digitalhub/entities/_base/entity/versioned.py +94 -0
- digitalhub/entities/_base/{entity/metadata.py → metadata.py} +2 -2
- digitalhub/entities/_base/{entity/spec.py → spec/base.py} +11 -11
- digitalhub/entities/_base/{material/spec.py → spec/material.py} +3 -3
- digitalhub/entities/_base/{entity/status.py → status/base.py} +3 -14
- digitalhub/entities/_base/{material/status.py → status/material.py} +1 -1
- digitalhub/entities/_builders/metadata.py +60 -0
- digitalhub/entities/_builders/spec.py +43 -0
- digitalhub/entities/_builders/status.py +62 -0
- digitalhub/entities/{_base/entity/_constructors → _builders}/uuid.py +11 -4
- digitalhub/entities/artifact/builder.py +133 -0
- digitalhub/entities/artifact/crud.py +48 -22
- digitalhub/entities/artifact/{_base/entity.py → entity/_base.py} +5 -5
- digitalhub/entities/artifact/entity/artifact.py +9 -0
- digitalhub/entities/artifact/{artifact/spec.py → spec.py} +16 -4
- digitalhub/entities/artifact/{artifact/status.py → status.py} +1 -1
- digitalhub/entities/dataitem/builder.py +144 -0
- digitalhub/entities/dataitem/crud.py +52 -29
- digitalhub/entities/dataitem/{_base/entity.py → entity/_base.py} +5 -5
- digitalhub/entities/dataitem/entity/dataitem.py +9 -0
- digitalhub/entities/dataitem/entity/iceberg.py +7 -0
- digitalhub/entities/dataitem/{table/entity.py → entity/table.py} +4 -25
- digitalhub/entities/dataitem/spec.py +61 -0
- digitalhub/entities/dataitem/status.py +38 -0
- digitalhub/entities/function/builder.py +86 -0
- digitalhub/entities/function/crud.py +43 -17
- digitalhub/entities/function/{_base/entity.py → entity.py} +12 -9
- digitalhub/entities/function/{_base/models.py → models.py} +1 -1
- digitalhub/entities/function/spec.py +81 -0
- digitalhub/entities/function/status.py +9 -0
- digitalhub/entities/model/builder.py +152 -0
- digitalhub/entities/model/crud.py +48 -21
- digitalhub/entities/model/{_base/entity.py → entity/_base.py} +5 -5
- digitalhub/entities/model/entity/huggingface.py +9 -0
- digitalhub/entities/model/{mlflow/utils.py → entity/mlflow.py} +10 -1
- digitalhub/entities/model/entity/model.py +9 -0
- digitalhub/entities/model/entity/sklearn.py +9 -0
- digitalhub/entities/model/spec.py +146 -0
- digitalhub/entities/model/status.py +33 -0
- digitalhub/entities/project/builder.py +82 -0
- digitalhub/entities/project/crud.py +12 -19
- digitalhub/entities/project/{_base/entity.py → entity.py} +102 -120
- digitalhub/entities/project/{_base/spec.py → spec.py} +4 -4
- digitalhub/entities/project/status.py +9 -0
- digitalhub/entities/registries.py +48 -0
- digitalhub/entities/run/builder.py +77 -0
- digitalhub/entities/run/crud.py +33 -20
- digitalhub/entities/run/{_base/entity.py → entity.py} +189 -35
- digitalhub/entities/run/spec.py +153 -0
- digitalhub/entities/run/status.py +114 -0
- digitalhub/entities/secret/builder.py +93 -0
- digitalhub/entities/secret/crud.py +31 -27
- digitalhub/entities/secret/{_base/entity.py → entity.py} +7 -8
- digitalhub/entities/secret/{_base/spec.py → spec.py} +4 -4
- digitalhub/entities/secret/status.py +9 -0
- digitalhub/entities/task/builder.py +74 -0
- digitalhub/entities/task/crud.py +33 -20
- digitalhub/entities/task/{_base/entity.py → entity.py} +8 -9
- digitalhub/entities/task/{_base/models.py → models.py} +0 -9
- digitalhub/entities/task/{_base/spec.py → spec.py} +7 -9
- digitalhub/entities/task/status.py +9 -0
- digitalhub/entities/{utils/utils.py → utils.py} +2 -20
- digitalhub/entities/workflow/builder.py +91 -0
- digitalhub/entities/workflow/crud.py +43 -17
- digitalhub/entities/workflow/{_base/entity.py → entity.py} +12 -9
- digitalhub/entities/workflow/spec.py +15 -0
- digitalhub/entities/workflow/status.py +9 -0
- digitalhub/readers/builder.py +54 -0
- digitalhub/readers/{pandas/reader.py → objects/pandas.py} +1 -1
- digitalhub/readers/registry.py +15 -0
- digitalhub/registry/models.py +87 -0
- digitalhub/registry/registry.py +74 -0
- digitalhub/registry/utils.py +150 -0
- digitalhub/runtimes/{_base.py → base.py} +65 -3
- digitalhub/runtimes/builder.py +40 -19
- digitalhub/runtimes/kind_registry.py +170 -0
- digitalhub/stores/builder.py +52 -6
- digitalhub/stores/{local/store.py → objects/local.py} +1 -1
- digitalhub/stores/{remote/store.py → objects/remote.py} +1 -1
- digitalhub/stores/{s3/store.py → objects/s3.py} +1 -1
- digitalhub/stores/{sql/store.py → objects/sql.py} +1 -1
- digitalhub/{client/dhcore/utils.py → utils/env_utils.py} +14 -2
- digitalhub/utils/exceptions.py +0 -12
- digitalhub/utils/generic_utils.py +42 -18
- digitalhub/utils/io_utils.py +2 -39
- {digitalhub-0.8.0.dist-info → digitalhub-0.8.0b1.dist-info}/METADATA +2 -3
- digitalhub-0.8.0b1.dist-info/RECORD +161 -0
- {digitalhub-0.8.0.dist-info → digitalhub-0.8.0b1.dist-info}/WHEEL +1 -1
- test/test_crud_artifacts.py +96 -0
- test/test_crud_dataitems.py +96 -0
- test/test_crud_functions.py +1 -1
- test/test_crud_runs.py +1 -1
- test/test_crud_tasks.py +1 -1
- digitalhub/client/api.py +0 -63
- digitalhub/client/dhcore/env.py +0 -21
- digitalhub/client/dhcore/models.py +0 -46
- digitalhub/context/api.py +0 -93
- digitalhub/datastores/api.py +0 -37
- digitalhub/entities/_base/api_utils.py +0 -620
- digitalhub/entities/_base/entity/_constructors/metadata.py +0 -44
- digitalhub/entities/_base/entity/_constructors/spec.py +0 -33
- digitalhub/entities/_base/entity/_constructors/status.py +0 -52
- digitalhub/entities/_base/entity/builder.py +0 -175
- digitalhub/entities/_base/executable/__init__.py +0 -0
- digitalhub/entities/_base/material/__init__.py +0 -0
- digitalhub/entities/_base/runtime_entity/__init__.py +0 -0
- digitalhub/entities/_base/runtime_entity/builder.py +0 -106
- digitalhub/entities/_base/unversioned/__init__.py +0 -0
- digitalhub/entities/_base/unversioned/builder.py +0 -66
- digitalhub/entities/_base/unversioned/entity.py +0 -49
- digitalhub/entities/_base/versioned/__init__.py +0 -0
- digitalhub/entities/_base/versioned/builder.py +0 -68
- digitalhub/entities/_base/versioned/entity.py +0 -53
- digitalhub/entities/artifact/_base/__init__.py +0 -0
- digitalhub/entities/artifact/_base/builder.py +0 -86
- digitalhub/entities/artifact/_base/spec.py +0 -15
- digitalhub/entities/artifact/_base/status.py +0 -9
- digitalhub/entities/artifact/artifact/__init__.py +0 -0
- digitalhub/entities/artifact/artifact/builder.py +0 -18
- digitalhub/entities/artifact/artifact/entity.py +0 -32
- digitalhub/entities/builders.py +0 -63
- digitalhub/entities/dataitem/_base/__init__.py +0 -0
- digitalhub/entities/dataitem/_base/builder.py +0 -86
- digitalhub/entities/dataitem/_base/spec.py +0 -15
- digitalhub/entities/dataitem/_base/status.py +0 -20
- digitalhub/entities/dataitem/dataitem/__init__.py +0 -0
- digitalhub/entities/dataitem/dataitem/builder.py +0 -18
- digitalhub/entities/dataitem/dataitem/entity.py +0 -32
- digitalhub/entities/dataitem/dataitem/spec.py +0 -15
- digitalhub/entities/dataitem/dataitem/status.py +0 -9
- digitalhub/entities/dataitem/iceberg/__init__.py +0 -0
- digitalhub/entities/dataitem/iceberg/builder.py +0 -18
- digitalhub/entities/dataitem/iceberg/entity.py +0 -32
- digitalhub/entities/dataitem/iceberg/spec.py +0 -15
- digitalhub/entities/dataitem/iceberg/status.py +0 -9
- digitalhub/entities/dataitem/table/__init__.py +0 -0
- digitalhub/entities/dataitem/table/builder.py +0 -18
- digitalhub/entities/dataitem/table/spec.py +0 -25
- digitalhub/entities/dataitem/table/status.py +0 -9
- digitalhub/entities/function/_base/__init__.py +0 -0
- digitalhub/entities/function/_base/builder.py +0 -79
- digitalhub/entities/function/_base/spec.py +0 -15
- digitalhub/entities/function/_base/status.py +0 -9
- digitalhub/entities/model/_base/__init__.py +0 -0
- digitalhub/entities/model/_base/builder.py +0 -86
- digitalhub/entities/model/_base/spec.py +0 -49
- digitalhub/entities/model/_base/status.py +0 -9
- digitalhub/entities/model/huggingface/__init__.py +0 -0
- digitalhub/entities/model/huggingface/builder.py +0 -18
- digitalhub/entities/model/huggingface/entity.py +0 -32
- digitalhub/entities/model/huggingface/spec.py +0 -36
- digitalhub/entities/model/huggingface/status.py +0 -9
- digitalhub/entities/model/mlflow/__init__.py +0 -0
- digitalhub/entities/model/mlflow/builder.py +0 -18
- digitalhub/entities/model/mlflow/entity.py +0 -32
- digitalhub/entities/model/mlflow/spec.py +0 -44
- digitalhub/entities/model/mlflow/status.py +0 -9
- digitalhub/entities/model/model/__init__.py +0 -0
- digitalhub/entities/model/model/builder.py +0 -18
- digitalhub/entities/model/model/entity.py +0 -32
- digitalhub/entities/model/model/spec.py +0 -15
- digitalhub/entities/model/model/status.py +0 -9
- digitalhub/entities/model/sklearn/__init__.py +0 -0
- digitalhub/entities/model/sklearn/builder.py +0 -18
- digitalhub/entities/model/sklearn/entity.py +0 -32
- digitalhub/entities/model/sklearn/spec.py +0 -15
- digitalhub/entities/model/sklearn/status.py +0 -9
- digitalhub/entities/project/_base/__init__.py +0 -0
- digitalhub/entities/project/_base/builder.py +0 -128
- digitalhub/entities/project/_base/status.py +0 -9
- digitalhub/entities/run/_base/__init__.py +0 -0
- digitalhub/entities/run/_base/builder.py +0 -94
- digitalhub/entities/run/_base/spec.py +0 -50
- digitalhub/entities/run/_base/status.py +0 -9
- digitalhub/entities/secret/_base/__init__.py +0 -0
- digitalhub/entities/secret/_base/builder.py +0 -81
- digitalhub/entities/secret/_base/status.py +0 -9
- digitalhub/entities/task/_base/__init__.py +0 -0
- digitalhub/entities/task/_base/builder.py +0 -91
- digitalhub/entities/task/_base/status.py +0 -9
- digitalhub/entities/utils/__init__.py +0 -0
- digitalhub/entities/workflow/_base/__init__.py +0 -0
- digitalhub/entities/workflow/_base/builder.py +0 -79
- digitalhub/entities/workflow/_base/spec.py +0 -15
- digitalhub/entities/workflow/_base/status.py +0 -9
- digitalhub/factory/__init__.py +0 -0
- digitalhub/factory/api.py +0 -277
- digitalhub/factory/factory.py +0 -268
- digitalhub/factory/utils.py +0 -90
- digitalhub/readers/_base/__init__.py +0 -0
- digitalhub/readers/_base/builder.py +0 -26
- digitalhub/readers/api.py +0 -80
- digitalhub/readers/factory.py +0 -133
- digitalhub/readers/pandas/__init__.py +0 -0
- digitalhub/readers/pandas/builder.py +0 -29
- digitalhub/stores/_base/__init__.py +0 -0
- digitalhub/stores/api.py +0 -54
- digitalhub/stores/local/__init__.py +0 -0
- digitalhub/stores/remote/__init__.py +0 -0
- digitalhub/stores/s3/__init__.py +0 -0
- digitalhub/stores/sql/__init__.py +0 -0
- digitalhub/utils/s3_utils.py +0 -58
- digitalhub-0.8.0.dist-info/RECORD +0 -231
- test/local/CRUD/test_artifacts.py +0 -96
- test/local/CRUD/test_dataitems.py +0 -96
- test/local/CRUD/test_models.py +0 -95
- /digitalhub/client/{_base → objects}/__init__.py +0 -0
- /digitalhub/client/{_base/client.py → objects/base.py} +0 -0
- /digitalhub/{client/dhcore → datastores/objects}/__init__.py +0 -0
- /digitalhub/entities/{utils → _base}/api.py +0 -0
- /digitalhub/{client/local → entities/_base/spec}/__init__.py +0 -0
- /digitalhub/entities/{utils → _base}/state.py +0 -0
- /digitalhub/{datastores/_base → entities/_base/status}/__init__.py +0 -0
- /digitalhub/{datastores/local → entities/_builders}/__init__.py +0 -0
- /digitalhub/entities/{_base/entity/_constructors → _builders}/name.py +0 -0
- /digitalhub/{datastores/remote → entities/artifact/entity}/__init__.py +0 -0
- /digitalhub/{datastores/s3 → entities/dataitem/entity}/__init__.py +0 -0
- /digitalhub/entities/dataitem/{table/models.py → models.py} +0 -0
- /digitalhub/entities/{utils/entity_types.py → entity_types.py} +0 -0
- /digitalhub/{datastores/sql → entities/model/entity}/__init__.py +0 -0
- /digitalhub/entities/model/{mlflow/models.py → models.py} +0 -0
- /digitalhub/{entities/_base/_base → readers/objects}/__init__.py +0 -0
- /digitalhub/readers/{_base/reader.py → objects/base.py} +0 -0
- /digitalhub/{entities/_base/context → registry}/__init__.py +0 -0
- /digitalhub/{entities/_base/entity/_constructors → stores/objects}/__init__.py +0 -0
- /digitalhub/stores/{_base/store.py → objects/base.py} +0 -0
- {digitalhub-0.8.0.dist-info → digitalhub-0.8.0b1.dist-info}/LICENSE.txt +0 -0
- {digitalhub-0.8.0.dist-info → digitalhub-0.8.0b1.dist-info}/top_level.txt +0 -0
- /test/{local/imports/test_imports.py → test_imports.py} +0 -0
|
@@ -3,20 +3,19 @@ from __future__ import annotations
|
|
|
3
3
|
import typing
|
|
4
4
|
from abc import ABCMeta, abstractmethod
|
|
5
5
|
|
|
6
|
-
from digitalhub.entities._base.
|
|
7
|
-
from digitalhub.factory.api import build_entity_from_dict
|
|
6
|
+
from digitalhub.entities._base.base import ModelObj
|
|
8
7
|
|
|
9
8
|
if typing.TYPE_CHECKING:
|
|
10
|
-
from digitalhub.entities._base.
|
|
11
|
-
from digitalhub.entities._base.
|
|
12
|
-
from digitalhub.entities._base.
|
|
9
|
+
from digitalhub.entities._base.metadata import Metadata
|
|
10
|
+
from digitalhub.entities._base.spec.base import Spec
|
|
11
|
+
from digitalhub.entities._base.status.base import Status
|
|
13
12
|
|
|
14
13
|
|
|
15
|
-
class Entity(
|
|
14
|
+
class Entity(ModelObj, metaclass=ABCMeta):
|
|
16
15
|
"""
|
|
17
16
|
Abstract class for entities.
|
|
18
17
|
|
|
19
|
-
An entity is a collection of metadata,
|
|
18
|
+
An entity is a collection of metadata, specification and status
|
|
20
19
|
representing a variety of objects handled by Digitalhub.
|
|
21
20
|
"""
|
|
22
21
|
|
|
@@ -69,7 +68,7 @@ class Entity(Base, metaclass=ABCMeta):
|
|
|
69
68
|
-------
|
|
70
69
|
None
|
|
71
70
|
"""
|
|
72
|
-
new_obj =
|
|
71
|
+
new_obj = self.from_dict(obj)
|
|
73
72
|
self.metadata = new_obj.metadata
|
|
74
73
|
self.spec = new_obj.spec
|
|
75
74
|
self.status = new_obj.status
|
|
@@ -94,6 +93,33 @@ class Entity(Base, metaclass=ABCMeta):
|
|
|
94
93
|
"""
|
|
95
94
|
return {k: v for k, v in super().to_dict().items() if k in self._obj_attr}
|
|
96
95
|
|
|
96
|
+
@classmethod
|
|
97
|
+
def from_dict(cls, obj: dict, validate: bool = True) -> Entity:
|
|
98
|
+
"""
|
|
99
|
+
Create a new object from dictionary.
|
|
100
|
+
|
|
101
|
+
Parameters
|
|
102
|
+
----------
|
|
103
|
+
obj : dict
|
|
104
|
+
Dictionary to create object from.
|
|
105
|
+
validate : bool
|
|
106
|
+
Flag to indicate if arguments validation against a pydantic schema must be ignored.
|
|
107
|
+
|
|
108
|
+
Returns
|
|
109
|
+
-------
|
|
110
|
+
Self
|
|
111
|
+
Self instance.
|
|
112
|
+
"""
|
|
113
|
+
parsed_dict = cls._parse_dict(obj, validate=validate)
|
|
114
|
+
return cls(**parsed_dict)
|
|
115
|
+
|
|
116
|
+
@staticmethod
|
|
117
|
+
@abstractmethod
|
|
118
|
+
def _parse_dict(obj: dict, validate: bool = True) -> dict:
|
|
119
|
+
"""
|
|
120
|
+
Abstract method to parse dictionary.
|
|
121
|
+
"""
|
|
122
|
+
|
|
97
123
|
def __repr__(self) -> str:
|
|
98
124
|
"""
|
|
99
125
|
Return string representation of the entity object.
|
|
@@ -2,16 +2,16 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import typing
|
|
4
4
|
|
|
5
|
-
from digitalhub.context.
|
|
6
|
-
from digitalhub.entities._base.
|
|
7
|
-
from digitalhub.entities._base.entity.
|
|
5
|
+
from digitalhub.context.builder import get_context
|
|
6
|
+
from digitalhub.entities._base.crud import create_entity_api_ctx, read_entity_api_ctx, update_entity_api_ctx
|
|
7
|
+
from digitalhub.entities._base.entity.base import Entity
|
|
8
8
|
from digitalhub.utils.generic_utils import get_timestamp
|
|
9
9
|
|
|
10
10
|
if typing.TYPE_CHECKING:
|
|
11
11
|
from digitalhub.context.context import Context
|
|
12
|
-
from digitalhub.entities._base.
|
|
13
|
-
from digitalhub.entities._base.
|
|
14
|
-
from digitalhub.entities._base.
|
|
12
|
+
from digitalhub.entities._base.metadata import Metadata
|
|
13
|
+
from digitalhub.entities._base.spec.base import Spec
|
|
14
|
+
from digitalhub.entities._base.status.base import Status
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class ContextEntity(Entity):
|
|
@@ -2,20 +2,19 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import typing
|
|
4
4
|
|
|
5
|
-
from digitalhub.entities._base.
|
|
6
|
-
from digitalhub.entities._base.versioned
|
|
5
|
+
from digitalhub.entities._base.crud import list_entity_api_ctx
|
|
6
|
+
from digitalhub.entities._base.entity.versioned import VersionedEntity
|
|
7
|
+
from digitalhub.entities.entity_types import EntityTypes
|
|
7
8
|
from digitalhub.entities.run.crud import delete_run, get_run, list_runs
|
|
8
|
-
from digitalhub.entities.task.crud import delete_task
|
|
9
|
-
from digitalhub.entities.utils.entity_types import EntityTypes
|
|
10
|
-
from digitalhub.factory.api import build_entity_from_dict, build_entity_from_params
|
|
9
|
+
from digitalhub.entities.task.crud import delete_task, task_from_dict, task_from_parameters
|
|
11
10
|
from digitalhub.utils.exceptions import EntityAlreadyExistsError, EntityError
|
|
12
11
|
|
|
13
12
|
if typing.TYPE_CHECKING:
|
|
14
|
-
from digitalhub.entities._base.
|
|
15
|
-
from digitalhub.entities._base.
|
|
16
|
-
from digitalhub.entities._base.
|
|
17
|
-
from digitalhub.entities.run.
|
|
18
|
-
from digitalhub.entities.task.
|
|
13
|
+
from digitalhub.entities._base.metadata import Metadata
|
|
14
|
+
from digitalhub.entities._base.spec.base import Spec
|
|
15
|
+
from digitalhub.entities._base.status.base import Status
|
|
16
|
+
from digitalhub.entities.run.entity import Run
|
|
17
|
+
from digitalhub.entities.task.entity import Task
|
|
19
18
|
|
|
20
19
|
|
|
21
20
|
class ExecutableEntity(VersionedEntity):
|
|
@@ -58,7 +57,7 @@ class ExecutableEntity(VersionedEntity):
|
|
|
58
57
|
# Tasks
|
|
59
58
|
##############################
|
|
60
59
|
|
|
61
|
-
def _get_or_create_task(self, kind: str) -> Task:
|
|
60
|
+
def _get_or_create_task(self, kind: str, **kwargs) -> Task:
|
|
62
61
|
"""
|
|
63
62
|
Get or create task.
|
|
64
63
|
|
|
@@ -73,10 +72,7 @@ class ExecutableEntity(VersionedEntity):
|
|
|
73
72
|
Task.
|
|
74
73
|
"""
|
|
75
74
|
if self._tasks.get(kind) is None:
|
|
76
|
-
|
|
77
|
-
self._tasks[kind] = self.get_task(kind)
|
|
78
|
-
except EntityError:
|
|
79
|
-
self._tasks[kind] = self.new_task(kind)
|
|
75
|
+
return self.new_task(kind)
|
|
80
76
|
return self._tasks[kind]
|
|
81
77
|
|
|
82
78
|
def import_tasks(self, tasks: list[dict]) -> None:
|
|
@@ -102,7 +98,7 @@ class ExecutableEntity(VersionedEntity):
|
|
|
102
98
|
# Create a new object from dictionary.
|
|
103
99
|
# the form in which tasks are stored in function
|
|
104
100
|
# status
|
|
105
|
-
task_obj =
|
|
101
|
+
task_obj = task_from_dict(task)
|
|
106
102
|
|
|
107
103
|
# Try to save it in backend to been able to use
|
|
108
104
|
# it for launching runs. In fact, tasks must be
|
|
@@ -145,40 +141,12 @@ class ExecutableEntity(VersionedEntity):
|
|
|
145
141
|
kwargs["kind"] = task_kind
|
|
146
142
|
|
|
147
143
|
# Create object instance
|
|
148
|
-
task =
|
|
144
|
+
task = task_from_parameters(**kwargs)
|
|
149
145
|
task.save()
|
|
150
146
|
|
|
151
147
|
self._tasks[task_kind] = task
|
|
152
148
|
return task
|
|
153
149
|
|
|
154
|
-
def get_task(self, kind: str) -> Task:
|
|
155
|
-
"""
|
|
156
|
-
Get task.
|
|
157
|
-
|
|
158
|
-
Parameters
|
|
159
|
-
----------
|
|
160
|
-
kind : str
|
|
161
|
-
Kind the object.
|
|
162
|
-
|
|
163
|
-
Returns
|
|
164
|
-
-------
|
|
165
|
-
Task
|
|
166
|
-
Task.
|
|
167
|
-
|
|
168
|
-
Raises
|
|
169
|
-
------
|
|
170
|
-
EntityError
|
|
171
|
-
If task is not created.
|
|
172
|
-
"""
|
|
173
|
-
try:
|
|
174
|
-
return self._tasks[kind]
|
|
175
|
-
except KeyError:
|
|
176
|
-
resp = self._get_task_from_backend(kind)
|
|
177
|
-
if not resp:
|
|
178
|
-
raise EntityError(f"Task {kind} is not created")
|
|
179
|
-
self._tasks[kind] = build_entity_from_dict(resp[0])
|
|
180
|
-
return self._tasks[kind]
|
|
181
|
-
|
|
182
150
|
def update_task(self, kind: str, **kwargs) -> Task:
|
|
183
151
|
"""
|
|
184
152
|
Update task.
|
|
@@ -207,47 +175,52 @@ class ExecutableEntity(VersionedEntity):
|
|
|
207
175
|
kwargs["uuid"] = self._tasks[kind].id
|
|
208
176
|
|
|
209
177
|
# Update task
|
|
210
|
-
task =
|
|
178
|
+
task = task_from_parameters(**kwargs)
|
|
211
179
|
task.save(update=True)
|
|
212
180
|
self._tasks[kind] = task
|
|
213
181
|
return task
|
|
214
182
|
|
|
215
|
-
def
|
|
183
|
+
def get_task(self, kind: str) -> Task:
|
|
216
184
|
"""
|
|
217
|
-
|
|
185
|
+
Get task.
|
|
218
186
|
|
|
219
187
|
Parameters
|
|
220
188
|
----------
|
|
221
189
|
kind : str
|
|
222
190
|
Kind the object.
|
|
223
|
-
cascade : bool
|
|
224
|
-
Flag to determine if cascade deletion must be performed.
|
|
225
191
|
|
|
226
192
|
Returns
|
|
227
193
|
-------
|
|
228
|
-
|
|
229
|
-
|
|
194
|
+
Task
|
|
195
|
+
Task.
|
|
196
|
+
|
|
197
|
+
Raises
|
|
198
|
+
------
|
|
199
|
+
EntityError
|
|
200
|
+
If task is not created.
|
|
230
201
|
"""
|
|
231
|
-
|
|
232
|
-
self._tasks
|
|
233
|
-
return resp
|
|
202
|
+
self._raise_if_not_exists(kind)
|
|
203
|
+
return self._tasks[kind]
|
|
234
204
|
|
|
235
|
-
def
|
|
205
|
+
def delete_task(self, kind: str, cascade: bool = True) -> dict:
|
|
236
206
|
"""
|
|
237
|
-
|
|
207
|
+
Delete task.
|
|
238
208
|
|
|
239
209
|
Parameters
|
|
240
210
|
----------
|
|
241
211
|
kind : str
|
|
242
212
|
Kind the object.
|
|
213
|
+
cascade : bool
|
|
214
|
+
Flag to determine if cascade deletion must be performed.
|
|
243
215
|
|
|
244
216
|
Returns
|
|
245
217
|
-------
|
|
246
|
-
|
|
218
|
+
dict
|
|
247
219
|
Response from backend.
|
|
248
220
|
"""
|
|
249
|
-
|
|
250
|
-
|
|
221
|
+
resp = delete_task(self._tasks[kind].key, cascade=cascade)
|
|
222
|
+
self._tasks.pop(kind, None)
|
|
223
|
+
return resp
|
|
251
224
|
|
|
252
225
|
def _check_task_in_backend(self, kind: str) -> bool:
|
|
253
226
|
"""
|
|
@@ -263,7 +236,9 @@ class ExecutableEntity(VersionedEntity):
|
|
|
263
236
|
bool
|
|
264
237
|
Flag to determine if task exists in backend.
|
|
265
238
|
"""
|
|
266
|
-
|
|
239
|
+
# List tasks from backend filtered by function and kind
|
|
240
|
+
params = {"function": self._get_executable_string(), "kind": kind}
|
|
241
|
+
resp = list_entity_api_ctx(self.project, EntityTypes.TASK.value, params=params)
|
|
267
242
|
if not resp:
|
|
268
243
|
return False
|
|
269
244
|
return True
|
|
@@ -3,14 +3,14 @@ from __future__ import annotations
|
|
|
3
3
|
import typing
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
|
|
6
|
-
from digitalhub.entities._base.
|
|
7
|
-
from digitalhub.entities._base.versioned
|
|
8
|
-
from digitalhub.stores.
|
|
6
|
+
from digitalhub.entities._base.crud import files_info_get_api, files_info_put_api
|
|
7
|
+
from digitalhub.entities._base.entity.versioned import VersionedEntity
|
|
8
|
+
from digitalhub.stores.builder import get_store
|
|
9
9
|
|
|
10
10
|
if typing.TYPE_CHECKING:
|
|
11
|
-
from digitalhub.entities._base.
|
|
12
|
-
from digitalhub.entities._base.material
|
|
13
|
-
from digitalhub.entities._base.material
|
|
11
|
+
from digitalhub.entities._base.metadata import Metadata
|
|
12
|
+
from digitalhub.entities._base.spec.material import MaterialSpec
|
|
13
|
+
from digitalhub.entities._base.status.material import MaterialStatus
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class MaterialEntity(VersionedEntity):
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities._base.entity.context import ContextEntity
|
|
6
|
+
from digitalhub.entities._builders.metadata import build_metadata
|
|
7
|
+
from digitalhub.entities._builders.spec import build_spec
|
|
8
|
+
from digitalhub.entities._builders.status import build_status
|
|
9
|
+
from digitalhub.entities._builders.uuid import build_uuid
|
|
10
|
+
from digitalhub.utils.io_utils import write_yaml
|
|
11
|
+
|
|
12
|
+
if typing.TYPE_CHECKING:
|
|
13
|
+
from digitalhub.entities._base.metadata import Metadata
|
|
14
|
+
from digitalhub.entities._base.spec.base import Spec
|
|
15
|
+
from digitalhub.entities._base.status.base import Status
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class UnversionedEntity(ContextEntity):
|
|
19
|
+
def __init__(
|
|
20
|
+
self,
|
|
21
|
+
project: str,
|
|
22
|
+
uuid: str,
|
|
23
|
+
kind: str,
|
|
24
|
+
metadata: Metadata,
|
|
25
|
+
spec: Spec,
|
|
26
|
+
status: Status,
|
|
27
|
+
user: str | None = None,
|
|
28
|
+
) -> None:
|
|
29
|
+
super().__init__(project, kind, metadata, spec, status, user)
|
|
30
|
+
self.id = uuid
|
|
31
|
+
self.key = f"store://{project}/{self.ENTITY_TYPE}/{kind}/{uuid}"
|
|
32
|
+
self._obj_attr.extend(["id"])
|
|
33
|
+
|
|
34
|
+
def export(self, filename: str | None = None) -> str:
|
|
35
|
+
"""
|
|
36
|
+
Export object as a YAML file.
|
|
37
|
+
|
|
38
|
+
Parameters
|
|
39
|
+
----------
|
|
40
|
+
filename : str
|
|
41
|
+
Name of the export YAML file. If not specified, the default value is used.
|
|
42
|
+
|
|
43
|
+
Returns
|
|
44
|
+
-------
|
|
45
|
+
str
|
|
46
|
+
Exported file.
|
|
47
|
+
"""
|
|
48
|
+
obj = self.to_dict()
|
|
49
|
+
if filename is None:
|
|
50
|
+
filename = f"{self.ENTITY_TYPE}-{self.id}.yml"
|
|
51
|
+
pth = self._context().root / filename
|
|
52
|
+
write_yaml(pth, obj)
|
|
53
|
+
return str(pth)
|
|
54
|
+
|
|
55
|
+
@staticmethod
|
|
56
|
+
def _parse_dict(obj: dict, validate: bool = True) -> dict:
|
|
57
|
+
"""
|
|
58
|
+
Get dictionary and parse it to a valid entity dictionary.
|
|
59
|
+
|
|
60
|
+
Parameters
|
|
61
|
+
----------
|
|
62
|
+
entity : str
|
|
63
|
+
Entity type.
|
|
64
|
+
obj : dict
|
|
65
|
+
Dictionary to parse.
|
|
66
|
+
|
|
67
|
+
Returns
|
|
68
|
+
-------
|
|
69
|
+
dict
|
|
70
|
+
A dictionary containing the attributes of the entity instance.
|
|
71
|
+
"""
|
|
72
|
+
project = obj.get("project")
|
|
73
|
+
kind = obj.get("kind")
|
|
74
|
+
uuid = build_uuid(obj.get("id"))
|
|
75
|
+
metadata = build_metadata(kind, **obj.get("metadata", {}))
|
|
76
|
+
spec = build_spec(kind, validate=validate, **obj.get("spec", {}))
|
|
77
|
+
status = build_status(kind, **obj.get("status", {}))
|
|
78
|
+
user = obj.get("user")
|
|
79
|
+
return {
|
|
80
|
+
"project": project,
|
|
81
|
+
"uuid": uuid,
|
|
82
|
+
"kind": kind,
|
|
83
|
+
"metadata": metadata,
|
|
84
|
+
"spec": spec,
|
|
85
|
+
"status": status,
|
|
86
|
+
"user": user,
|
|
87
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities._base.entity.context import ContextEntity
|
|
6
|
+
from digitalhub.entities._builders.metadata import build_metadata
|
|
7
|
+
from digitalhub.entities._builders.name import build_name
|
|
8
|
+
from digitalhub.entities._builders.spec import build_spec
|
|
9
|
+
from digitalhub.entities._builders.status import build_status
|
|
10
|
+
from digitalhub.entities._builders.uuid import build_uuid
|
|
11
|
+
from digitalhub.utils.io_utils import write_yaml
|
|
12
|
+
|
|
13
|
+
if typing.TYPE_CHECKING:
|
|
14
|
+
from digitalhub.entities._base.metadata import Metadata
|
|
15
|
+
from digitalhub.entities._base.spec.base import Spec
|
|
16
|
+
from digitalhub.entities._base.status.base import Status
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class VersionedEntity(ContextEntity):
|
|
20
|
+
def __init__(
|
|
21
|
+
self,
|
|
22
|
+
project: str,
|
|
23
|
+
name: str,
|
|
24
|
+
uuid: str,
|
|
25
|
+
kind: str,
|
|
26
|
+
metadata: Metadata,
|
|
27
|
+
spec: Spec,
|
|
28
|
+
status: Status,
|
|
29
|
+
user: str | None = None,
|
|
30
|
+
) -> None:
|
|
31
|
+
super().__init__(project, kind, metadata, spec, status, user)
|
|
32
|
+
self.name = name
|
|
33
|
+
self.id = uuid
|
|
34
|
+
self.key = f"store://{project}/{self.ENTITY_TYPE}/{kind}/{name}:{uuid}"
|
|
35
|
+
|
|
36
|
+
# Add attributes to be used in the to_dict method
|
|
37
|
+
self._obj_attr.extend(["name", "id"])
|
|
38
|
+
|
|
39
|
+
def export(self, filename: str | None = None) -> str:
|
|
40
|
+
"""
|
|
41
|
+
Export object as a YAML file.
|
|
42
|
+
|
|
43
|
+
Parameters
|
|
44
|
+
----------
|
|
45
|
+
filename : str
|
|
46
|
+
Name of the export YAML file. If not specified, the default value is used.
|
|
47
|
+
|
|
48
|
+
Returns
|
|
49
|
+
-------
|
|
50
|
+
str
|
|
51
|
+
Exported file.
|
|
52
|
+
"""
|
|
53
|
+
obj = self.to_dict()
|
|
54
|
+
if filename is None:
|
|
55
|
+
filename = f"{self.ENTITY_TYPE}-{self.name}-{self.id}.yml"
|
|
56
|
+
pth = self._context().root / filename
|
|
57
|
+
write_yaml(pth, obj)
|
|
58
|
+
return str(pth)
|
|
59
|
+
|
|
60
|
+
@staticmethod
|
|
61
|
+
def _parse_dict(obj: dict, validate: bool = True) -> dict:
|
|
62
|
+
"""
|
|
63
|
+
Get dictionary and parse it to a valid entity dictionary.
|
|
64
|
+
|
|
65
|
+
Parameters
|
|
66
|
+
----------
|
|
67
|
+
entity : str
|
|
68
|
+
Entity type.
|
|
69
|
+
obj : dict
|
|
70
|
+
Dictionary to parse.
|
|
71
|
+
|
|
72
|
+
Returns
|
|
73
|
+
-------
|
|
74
|
+
dict
|
|
75
|
+
A dictionary containing the attributes of the entity instance.
|
|
76
|
+
"""
|
|
77
|
+
project = obj.get("project")
|
|
78
|
+
kind = obj.get("kind")
|
|
79
|
+
name = build_name(obj.get("name"))
|
|
80
|
+
uuid = build_uuid(obj.get("id"))
|
|
81
|
+
metadata = build_metadata(kind, **obj.get("metadata", {}))
|
|
82
|
+
spec = build_spec(kind, validate=validate, **obj.get("spec", {}))
|
|
83
|
+
status = build_status(kind, **obj.get("status", {}))
|
|
84
|
+
user = obj.get("user")
|
|
85
|
+
return {
|
|
86
|
+
"project": project,
|
|
87
|
+
"name": name,
|
|
88
|
+
"uuid": uuid,
|
|
89
|
+
"kind": kind,
|
|
90
|
+
"metadata": metadata,
|
|
91
|
+
"spec": spec,
|
|
92
|
+
"status": status,
|
|
93
|
+
"user": user,
|
|
94
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from digitalhub.entities._base.
|
|
3
|
+
from digitalhub.entities._base.base import ModelObj
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
class Metadata(
|
|
6
|
+
class Metadata(ModelObj):
|
|
7
7
|
"""
|
|
8
8
|
A class representing the metadata of an entity.
|
|
9
9
|
Metadata is a collection of information about an entity thought
|
|
@@ -2,46 +2,46 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from pydantic import BaseModel
|
|
4
4
|
|
|
5
|
-
from digitalhub.entities._base.
|
|
5
|
+
from digitalhub.entities._base.base import ModelObj
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
class Spec(
|
|
8
|
+
class Spec(ModelObj):
|
|
9
9
|
"""
|
|
10
|
-
A class representing the
|
|
11
|
-
|
|
10
|
+
A class representing the specification of an entity.
|
|
11
|
+
Specification is a collection of information about an entity
|
|
12
12
|
thought to be immutable by the user.
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
15
|
@classmethod
|
|
16
16
|
def from_dict(cls, obj: dict) -> Spec:
|
|
17
17
|
"""
|
|
18
|
-
Return entity
|
|
18
|
+
Return entity specification object from dictionary.
|
|
19
19
|
|
|
20
20
|
Parameters
|
|
21
21
|
----------
|
|
22
22
|
obj : dict
|
|
23
|
-
A dictionary containing the attributes of the entity
|
|
23
|
+
A dictionary containing the attributes of the entity specification.
|
|
24
24
|
|
|
25
25
|
Returns
|
|
26
26
|
-------
|
|
27
27
|
EntitySpec
|
|
28
|
-
An entity
|
|
28
|
+
An entity specification object.
|
|
29
29
|
"""
|
|
30
30
|
return cls(**obj)
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
class
|
|
33
|
+
class SpecParams(BaseModel, extra="ignore"):
|
|
34
34
|
"""
|
|
35
35
|
A class representing the parameters of an entity.
|
|
36
36
|
This base class is used to define the parameters of an entity
|
|
37
|
-
|
|
37
|
+
specification and is used to validate the parameters passed
|
|
38
38
|
to the constructor.
|
|
39
39
|
"""
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
class MaterialSpec(Spec):
|
|
43
43
|
"""
|
|
44
|
-
Material
|
|
44
|
+
Material specification class.
|
|
45
45
|
"""
|
|
46
46
|
|
|
47
47
|
def __init__(self, path: str, **kwargs) -> None:
|
|
@@ -49,7 +49,7 @@ class MaterialSpec(Spec):
|
|
|
49
49
|
self.path = path
|
|
50
50
|
|
|
51
51
|
|
|
52
|
-
class
|
|
52
|
+
class MaterialParams(SpecParams):
|
|
53
53
|
"""
|
|
54
54
|
Material parameters class.
|
|
55
55
|
"""
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from digitalhub.entities._base.
|
|
3
|
+
from digitalhub.entities._base.spec.base import Spec, SpecParams
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
class MaterialSpec(Spec):
|
|
7
7
|
"""
|
|
8
|
-
Material
|
|
8
|
+
Material specification class.
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
11
|
def __init__(self, path: str, **kwargs) -> None:
|
|
@@ -13,7 +13,7 @@ class MaterialSpec(Spec):
|
|
|
13
13
|
self.path = path
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
class
|
|
16
|
+
class MaterialParams(SpecParams):
|
|
17
17
|
"""
|
|
18
18
|
Material parameters class.
|
|
19
19
|
"""
|
|
@@ -1,29 +1,18 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from digitalhub.entities._base.
|
|
3
|
+
from digitalhub.entities._base.base import ModelObj
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
class Status(
|
|
6
|
+
class Status(ModelObj):
|
|
7
7
|
"""
|
|
8
8
|
Base Status class.
|
|
9
9
|
The status class contains information about the state of an entity,
|
|
10
10
|
for example, the state of a RUNNING run, and eventual error message.
|
|
11
11
|
"""
|
|
12
12
|
|
|
13
|
-
def __init__(
|
|
14
|
-
self,
|
|
15
|
-
state: str,
|
|
16
|
-
message: str | None = None,
|
|
17
|
-
transitions: list[dict] | None = None,
|
|
18
|
-
k8s: dict | None = None,
|
|
19
|
-
**kwargs,
|
|
20
|
-
) -> None:
|
|
13
|
+
def __init__(self, state: str, message: str | None = None) -> None:
|
|
21
14
|
self.state = state
|
|
22
15
|
self.message = message
|
|
23
|
-
self.transitions = transitions
|
|
24
|
-
self.k8s = k8s
|
|
25
|
-
|
|
26
|
-
self._any_setter(**kwargs)
|
|
27
16
|
|
|
28
17
|
@classmethod
|
|
29
18
|
def from_dict(cls, obj: dict) -> Status:
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.registry.registry import registry
|
|
6
|
+
from digitalhub.registry.utils import import_class
|
|
7
|
+
from digitalhub.utils.generic_utils import get_timestamp
|
|
8
|
+
|
|
9
|
+
if typing.TYPE_CHECKING:
|
|
10
|
+
from digitalhub.entities._base.metadata import Metadata
|
|
11
|
+
from digitalhub.registry.models import RegistryEntry
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def build_metadata(kind: str, **kwargs) -> Metadata:
|
|
15
|
+
"""
|
|
16
|
+
Build entity metadata object. The builder takes as input
|
|
17
|
+
the kind of metadata's object to build and the keyword
|
|
18
|
+
arguments to pass to the metadata's constructor.
|
|
19
|
+
The specific Metadata class is searched in the global
|
|
20
|
+
registry, where lies info about where to find the class.
|
|
21
|
+
The arguments are parsed, eventually adding default values,
|
|
22
|
+
and then passed to the constructor.
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
kind : str
|
|
27
|
+
Registry entry kind.
|
|
28
|
+
**kwargs : dict
|
|
29
|
+
Keyword arguments for the constructor.
|
|
30
|
+
|
|
31
|
+
Returns
|
|
32
|
+
-------
|
|
33
|
+
Metadata
|
|
34
|
+
Metadata object.
|
|
35
|
+
"""
|
|
36
|
+
infos: RegistryEntry = getattr(registry, kind)
|
|
37
|
+
metadata = import_class(infos.metadata.module, infos.metadata.class_name)
|
|
38
|
+
kwargs = parse_arguments(**kwargs)
|
|
39
|
+
return metadata(**kwargs)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def parse_arguments(**kwargs) -> dict:
|
|
43
|
+
"""
|
|
44
|
+
Parse keyword arguments and add default values if necessary.
|
|
45
|
+
|
|
46
|
+
Parameters
|
|
47
|
+
----------
|
|
48
|
+
**kwargs : dict
|
|
49
|
+
Keyword arguments.
|
|
50
|
+
|
|
51
|
+
Returns
|
|
52
|
+
-------
|
|
53
|
+
dict
|
|
54
|
+
A dictionary containing the entity metadata attributes.
|
|
55
|
+
"""
|
|
56
|
+
if "created" not in kwargs or kwargs["created"] is None:
|
|
57
|
+
kwargs["created"] = get_timestamp()
|
|
58
|
+
if "updated" not in kwargs or kwargs["updated"] is None:
|
|
59
|
+
kwargs["updated"] = kwargs["created"]
|
|
60
|
+
return kwargs
|