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
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities._builders.metadata import build_metadata
|
|
4
|
+
from digitalhub.entities._builders.name import build_name
|
|
5
|
+
from digitalhub.entities._builders.spec import build_spec
|
|
6
|
+
from digitalhub.entities._builders.status import build_status
|
|
7
|
+
from digitalhub.entities.project.entity import Project
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def project_from_parameters(
|
|
11
|
+
name: str,
|
|
12
|
+
kind: str,
|
|
13
|
+
description: str | None = None,
|
|
14
|
+
labels: list[str] | None = None,
|
|
15
|
+
local: bool = False,
|
|
16
|
+
context: str | None = None,
|
|
17
|
+
**kwargs,
|
|
18
|
+
) -> Project:
|
|
19
|
+
"""
|
|
20
|
+
Create a new object.
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
name : str
|
|
25
|
+
Object name.
|
|
26
|
+
kind : str
|
|
27
|
+
Kind the object.
|
|
28
|
+
description : str
|
|
29
|
+
Description of the object (human readable).
|
|
30
|
+
labels : list[str]
|
|
31
|
+
List of labels.
|
|
32
|
+
local : bool
|
|
33
|
+
If True, use local backend, if False use DHCore backend. Default to False.
|
|
34
|
+
context : str
|
|
35
|
+
The context local folder of the project.
|
|
36
|
+
**kwargs : dict
|
|
37
|
+
Spec keyword arguments.
|
|
38
|
+
|
|
39
|
+
Returns
|
|
40
|
+
-------
|
|
41
|
+
Project
|
|
42
|
+
Object instance.
|
|
43
|
+
"""
|
|
44
|
+
name = build_name(name)
|
|
45
|
+
spec = build_spec(
|
|
46
|
+
kind,
|
|
47
|
+
context=context,
|
|
48
|
+
**kwargs,
|
|
49
|
+
)
|
|
50
|
+
metadata = build_metadata(
|
|
51
|
+
kind,
|
|
52
|
+
project=name,
|
|
53
|
+
name=name,
|
|
54
|
+
description=description,
|
|
55
|
+
labels=labels,
|
|
56
|
+
)
|
|
57
|
+
status = build_status(kind)
|
|
58
|
+
return Project(
|
|
59
|
+
name=name,
|
|
60
|
+
kind=kind,
|
|
61
|
+
metadata=metadata,
|
|
62
|
+
spec=spec,
|
|
63
|
+
status=status,
|
|
64
|
+
local=local,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def project_from_dict(obj: dict) -> Project:
|
|
69
|
+
"""
|
|
70
|
+
Create a new object from dictionary.
|
|
71
|
+
|
|
72
|
+
Parameters
|
|
73
|
+
----------
|
|
74
|
+
obj : dict
|
|
75
|
+
Dictionary to create object from.
|
|
76
|
+
|
|
77
|
+
Returns
|
|
78
|
+
-------
|
|
79
|
+
Project
|
|
80
|
+
Object instance.
|
|
81
|
+
"""
|
|
82
|
+
return Project.from_dict(obj)
|
|
@@ -4,16 +4,16 @@ import importlib.util as imputil
|
|
|
4
4
|
import typing
|
|
5
5
|
from pathlib import Path
|
|
6
6
|
|
|
7
|
-
from digitalhub.client.
|
|
8
|
-
from digitalhub.context.
|
|
9
|
-
from digitalhub.entities._base.
|
|
10
|
-
from digitalhub.entities.
|
|
11
|
-
from digitalhub.
|
|
12
|
-
from digitalhub.utils.exceptions import BackendError,
|
|
7
|
+
from digitalhub.client.builder import build_client, get_client
|
|
8
|
+
from digitalhub.context.builder import delete_context
|
|
9
|
+
from digitalhub.entities._base.crud import delete_entity_api_base, read_entity_api_base, update_entity_api_base
|
|
10
|
+
from digitalhub.entities.entity_types import EntityTypes
|
|
11
|
+
from digitalhub.entities.project.builder import project_from_dict, project_from_parameters
|
|
12
|
+
from digitalhub.utils.exceptions import BackendError, EntityError
|
|
13
13
|
from digitalhub.utils.io_utils import read_yaml
|
|
14
14
|
|
|
15
15
|
if typing.TYPE_CHECKING:
|
|
16
|
-
from digitalhub.entities.project.
|
|
16
|
+
from digitalhub.entities.project.entity import Project
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
ENTITY_TYPE = EntityTypes.PROJECT.value
|
|
@@ -63,7 +63,7 @@ def new_project(
|
|
|
63
63
|
build_client(local, config)
|
|
64
64
|
if context is None:
|
|
65
65
|
context = name
|
|
66
|
-
obj =
|
|
66
|
+
obj = project_from_parameters(
|
|
67
67
|
name=name,
|
|
68
68
|
kind="project",
|
|
69
69
|
description=description,
|
|
@@ -112,7 +112,7 @@ def get_project(
|
|
|
112
112
|
client = get_client(local)
|
|
113
113
|
obj = read_entity_api_base(client, ENTITY_TYPE, name, **kwargs)
|
|
114
114
|
obj["local"] = local
|
|
115
|
-
project =
|
|
115
|
+
project = project_from_dict(obj)
|
|
116
116
|
return _setup_project(project, setup_kwargs)
|
|
117
117
|
|
|
118
118
|
|
|
@@ -148,18 +148,11 @@ def import_project(
|
|
|
148
148
|
build_client(local, config)
|
|
149
149
|
dict_obj: dict = read_yaml(file)
|
|
150
150
|
dict_obj["local"] = local
|
|
151
|
-
obj =
|
|
151
|
+
obj = project_from_dict(dict_obj)
|
|
152
152
|
obj = _setup_project(obj, setup_kwargs)
|
|
153
153
|
|
|
154
|
-
try:
|
|
155
|
-
obj.save()
|
|
156
|
-
except EntityAlreadyExistsError:
|
|
157
|
-
pass
|
|
158
|
-
|
|
159
154
|
# Import related entities
|
|
160
|
-
obj._import_entities(
|
|
161
|
-
|
|
162
|
-
obj.refresh()
|
|
155
|
+
obj._import_entities()
|
|
163
156
|
|
|
164
157
|
return obj
|
|
165
158
|
|
|
@@ -285,7 +278,7 @@ def update_project(entity: Project, local: bool = False, **kwargs) -> Project:
|
|
|
285
278
|
"""
|
|
286
279
|
client = get_client(local)
|
|
287
280
|
obj = update_entity_api_base(client, ENTITY_TYPE, entity.name, entity.to_dict(), **kwargs)
|
|
288
|
-
return
|
|
281
|
+
return project_from_dict(obj)
|
|
289
282
|
|
|
290
283
|
|
|
291
284
|
def delete_project(
|
|
@@ -4,17 +4,21 @@ import typing
|
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
from typing import Any
|
|
6
6
|
|
|
7
|
-
from digitalhub.client.
|
|
8
|
-
from digitalhub.context.
|
|
9
|
-
from digitalhub.entities._base.
|
|
7
|
+
from digitalhub.client.builder import get_client
|
|
8
|
+
from digitalhub.context.builder import set_context
|
|
9
|
+
from digitalhub.entities._base.crud import (
|
|
10
10
|
create_entity_api_base,
|
|
11
11
|
read_entity_api_base,
|
|
12
12
|
read_entity_api_ctx,
|
|
13
13
|
update_entity_api_base,
|
|
14
14
|
)
|
|
15
|
-
from digitalhub.entities._base.
|
|
16
|
-
from digitalhub.entities.
|
|
15
|
+
from digitalhub.entities._base.entity.base import Entity
|
|
16
|
+
from digitalhub.entities._builders.metadata import build_metadata
|
|
17
|
+
from digitalhub.entities._builders.name import build_name
|
|
18
|
+
from digitalhub.entities._builders.spec import build_spec
|
|
19
|
+
from digitalhub.entities._builders.status import build_status
|
|
17
20
|
from digitalhub.entities.artifact.crud import (
|
|
21
|
+
artifact_from_dict,
|
|
18
22
|
delete_artifact,
|
|
19
23
|
get_artifact,
|
|
20
24
|
get_artifact_versions,
|
|
@@ -25,6 +29,7 @@ from digitalhub.entities.artifact.crud import (
|
|
|
25
29
|
update_artifact,
|
|
26
30
|
)
|
|
27
31
|
from digitalhub.entities.dataitem.crud import (
|
|
32
|
+
dataitem_from_dict,
|
|
28
33
|
delete_dataitem,
|
|
29
34
|
get_dataitem,
|
|
30
35
|
get_dataitem_versions,
|
|
@@ -34,8 +39,10 @@ from digitalhub.entities.dataitem.crud import (
|
|
|
34
39
|
new_dataitem,
|
|
35
40
|
update_dataitem,
|
|
36
41
|
)
|
|
42
|
+
from digitalhub.entities.entity_types import EntityTypes
|
|
37
43
|
from digitalhub.entities.function.crud import (
|
|
38
44
|
delete_function,
|
|
45
|
+
function_from_dict,
|
|
39
46
|
get_function,
|
|
40
47
|
get_function_versions,
|
|
41
48
|
import_function,
|
|
@@ -50,6 +57,7 @@ from digitalhub.entities.model.crud import (
|
|
|
50
57
|
import_model,
|
|
51
58
|
list_models,
|
|
52
59
|
log_model,
|
|
60
|
+
model_from_dict,
|
|
53
61
|
new_model,
|
|
54
62
|
update_model,
|
|
55
63
|
)
|
|
@@ -63,7 +71,6 @@ from digitalhub.entities.secret.crud import (
|
|
|
63
71
|
new_secret,
|
|
64
72
|
update_secret,
|
|
65
73
|
)
|
|
66
|
-
from digitalhub.entities.utils.entity_types import EntityTypes
|
|
67
74
|
from digitalhub.entities.workflow.crud import (
|
|
68
75
|
delete_workflow,
|
|
69
76
|
get_workflow,
|
|
@@ -72,24 +79,49 @@ from digitalhub.entities.workflow.crud import (
|
|
|
72
79
|
list_workflows,
|
|
73
80
|
new_workflow,
|
|
74
81
|
update_workflow,
|
|
82
|
+
workflow_from_dict,
|
|
75
83
|
)
|
|
76
|
-
from digitalhub.factory.api import build_entity_from_dict
|
|
77
84
|
from digitalhub.utils.exceptions import BackendError, EntityAlreadyExistsError, EntityError
|
|
78
85
|
from digitalhub.utils.generic_utils import get_timestamp
|
|
79
86
|
from digitalhub.utils.io_utils import write_yaml
|
|
80
87
|
from digitalhub.utils.uri_utils import map_uri_scheme
|
|
81
88
|
|
|
82
89
|
if typing.TYPE_CHECKING:
|
|
83
|
-
from digitalhub.entities._base.
|
|
84
|
-
from digitalhub.entities.artifact._base
|
|
85
|
-
from digitalhub.entities.dataitem._base
|
|
86
|
-
from digitalhub.entities.function.
|
|
87
|
-
from digitalhub.entities.model._base
|
|
88
|
-
from digitalhub.entities.project.
|
|
89
|
-
from digitalhub.entities.project.
|
|
90
|
-
from digitalhub.entities.run.
|
|
91
|
-
from digitalhub.entities.secret.
|
|
92
|
-
from digitalhub.entities.workflow.
|
|
90
|
+
from digitalhub.entities._base.metadata import Metadata
|
|
91
|
+
from digitalhub.entities.artifact.entity._base import Artifact
|
|
92
|
+
from digitalhub.entities.dataitem.entity._base import Dataitem
|
|
93
|
+
from digitalhub.entities.function.entity import Function
|
|
94
|
+
from digitalhub.entities.model.entity._base import Model
|
|
95
|
+
from digitalhub.entities.project.spec import ProjectSpec
|
|
96
|
+
from digitalhub.entities.project.status import ProjectStatus
|
|
97
|
+
from digitalhub.entities.run.entity import Run
|
|
98
|
+
from digitalhub.entities.secret.entity import Secret
|
|
99
|
+
from digitalhub.entities.workflow.entity import Workflow
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
ARTIFACTS = EntityTypes.ARTIFACT.value + "s"
|
|
103
|
+
FUNCTIONS = EntityTypes.FUNCTION.value + "s"
|
|
104
|
+
WORKFLOWS = EntityTypes.WORKFLOW.value + "s"
|
|
105
|
+
DATAITEMS = EntityTypes.DATAITEM.value + "s"
|
|
106
|
+
MODELS = EntityTypes.MODEL.value + "s"
|
|
107
|
+
|
|
108
|
+
CTX_ENTITIES = [ARTIFACTS, FUNCTIONS, WORKFLOWS, DATAITEMS, MODELS]
|
|
109
|
+
|
|
110
|
+
FROM_DICT_MAP = {
|
|
111
|
+
ARTIFACTS: artifact_from_dict,
|
|
112
|
+
FUNCTIONS: function_from_dict,
|
|
113
|
+
WORKFLOWS: workflow_from_dict,
|
|
114
|
+
DATAITEMS: dataitem_from_dict,
|
|
115
|
+
MODELS: model_from_dict,
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
IMPORT_MAP = {
|
|
119
|
+
ARTIFACTS: import_artifact,
|
|
120
|
+
FUNCTIONS: import_function,
|
|
121
|
+
WORKFLOWS: import_workflow,
|
|
122
|
+
DATAITEMS: import_dataitem,
|
|
123
|
+
MODELS: import_model,
|
|
124
|
+
}
|
|
93
125
|
|
|
94
126
|
|
|
95
127
|
class Project(Entity):
|
|
@@ -192,7 +224,6 @@ class Project(Entity):
|
|
|
192
224
|
filename = f"{self.kind}_{self.name}.yml"
|
|
193
225
|
pth = Path(self.spec.context) / filename
|
|
194
226
|
pth.parent.mkdir(parents=True, exist_ok=True)
|
|
195
|
-
|
|
196
227
|
obj = self._export_not_embedded(obj)
|
|
197
228
|
write_yaml(pth, obj)
|
|
198
229
|
return str(pth)
|
|
@@ -226,16 +257,16 @@ class Project(Entity):
|
|
|
226
257
|
Updatated project object in dictionary format with referenced entities.
|
|
227
258
|
"""
|
|
228
259
|
# Cycle over entity types
|
|
229
|
-
for entity_type in
|
|
260
|
+
for entity_type in CTX_ENTITIES:
|
|
230
261
|
# Entity types are stored as a list of entities
|
|
231
262
|
for idx, entity in enumerate(obj.get("spec", {}).get(entity_type, [])):
|
|
232
263
|
# Export entity if not embedded is in metadata, else do nothing
|
|
233
|
-
if not
|
|
264
|
+
if not entity["metadata"]["embedded"]:
|
|
234
265
|
# Get entity object from backend
|
|
235
266
|
obj_dict: dict = read_entity_api_ctx(entity["key"])
|
|
236
267
|
|
|
237
268
|
# Create from dict (not need to new method, we do not save to backend)
|
|
238
|
-
ent =
|
|
269
|
+
ent = FROM_DICT_MAP[entity_type](obj_dict)
|
|
239
270
|
|
|
240
271
|
# Export and stor ref in object metadata inside project
|
|
241
272
|
pth = ent.export()
|
|
@@ -244,121 +275,76 @@ class Project(Entity):
|
|
|
244
275
|
# Return updated object
|
|
245
276
|
return obj
|
|
246
277
|
|
|
247
|
-
def _import_entities(self
|
|
278
|
+
def _import_entities(self) -> None:
|
|
248
279
|
"""
|
|
249
280
|
Import project entities.
|
|
250
281
|
|
|
251
|
-
Parameters
|
|
252
|
-
----------
|
|
253
|
-
obj : dict
|
|
254
|
-
Project object in dictionary format.
|
|
255
|
-
|
|
256
282
|
Returns
|
|
257
283
|
-------
|
|
258
284
|
None
|
|
259
285
|
"""
|
|
260
|
-
entity_types = self._get_entity_types()
|
|
261
|
-
|
|
262
286
|
# Cycle over entity types
|
|
263
|
-
for entity_type in
|
|
287
|
+
for entity_type in CTX_ENTITIES:
|
|
264
288
|
# Entity types are stored as a list of entities
|
|
265
|
-
for entity in
|
|
266
|
-
|
|
267
|
-
|
|
289
|
+
for entity in getattr(self.spec, entity_type, []):
|
|
290
|
+
entity_metadata = entity["metadata"]
|
|
291
|
+
embedded = entity_metadata.get("embedded", False)
|
|
292
|
+
ref = entity_metadata.get("ref", None)
|
|
268
293
|
|
|
269
|
-
# Import entity if not embedded
|
|
294
|
+
# Import entity if not embedded
|
|
270
295
|
if not embedded and ref is not None:
|
|
271
296
|
# Import entity from local ref
|
|
272
297
|
if map_uri_scheme(ref) == "local":
|
|
273
298
|
try:
|
|
274
|
-
|
|
275
|
-
if entity_type in entity_types[:3]:
|
|
276
|
-
import_context_entity(ref)
|
|
277
|
-
|
|
278
|
-
# Functions and Workflows
|
|
279
|
-
elif entity_type in entity_types[3:]:
|
|
280
|
-
import_executable_entity(ref)
|
|
281
|
-
|
|
299
|
+
IMPORT_MAP[entity_type](ref)
|
|
282
300
|
except FileNotFoundError:
|
|
283
301
|
msg = f"File not found: {ref}."
|
|
284
302
|
raise EntityError(msg)
|
|
285
303
|
|
|
286
304
|
# If entity is embedded, create it and try to save
|
|
287
305
|
elif embedded:
|
|
288
|
-
# It's possible that embedded field in metadata is not shown
|
|
289
|
-
if entity["metadata"].get("embedded") is None:
|
|
290
|
-
entity["metadata"]["embedded"] = True
|
|
291
|
-
|
|
292
306
|
try:
|
|
293
|
-
|
|
307
|
+
FROM_DICT_MAP[entity_type](entity).save()
|
|
294
308
|
except EntityAlreadyExistsError:
|
|
295
309
|
pass
|
|
296
310
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
Parameters
|
|
302
|
-
----------
|
|
303
|
-
entity : dict
|
|
304
|
-
Entity in dictionary format.
|
|
305
|
-
|
|
306
|
-
Returns
|
|
307
|
-
-------
|
|
308
|
-
bool
|
|
309
|
-
True if entity is embedded.
|
|
310
|
-
"""
|
|
311
|
-
metadata_embedded = entity["metadata"].get("embedded", False)
|
|
312
|
-
no_status = entity.get("status", None) is None
|
|
313
|
-
no_spec = entity.get("spec", None) is None
|
|
314
|
-
return metadata_embedded or not (no_status and no_spec)
|
|
315
|
-
|
|
316
|
-
def _get_entity_types(self) -> list[str]:
|
|
317
|
-
"""
|
|
318
|
-
Get entity types.
|
|
319
|
-
|
|
320
|
-
Returns
|
|
321
|
-
-------
|
|
322
|
-
list
|
|
323
|
-
Entity types.
|
|
324
|
-
"""
|
|
325
|
-
return [
|
|
326
|
-
f"{EntityTypes.ARTIFACT.value}s",
|
|
327
|
-
f"{EntityTypes.DATAITEM.value}s",
|
|
328
|
-
f"{EntityTypes.MODEL.value}s",
|
|
329
|
-
f"{EntityTypes.FUNCTION.value}s",
|
|
330
|
-
f"{EntityTypes.WORKFLOW.value}s",
|
|
331
|
-
]
|
|
311
|
+
##############################
|
|
312
|
+
# Static interface methods
|
|
313
|
+
##############################
|
|
332
314
|
|
|
333
|
-
|
|
315
|
+
@staticmethod
|
|
316
|
+
def _parse_dict(obj: dict, validate: bool = True) -> dict:
|
|
334
317
|
"""
|
|
335
|
-
|
|
318
|
+
Get dictionary and parse it to a valid entity dictionary.
|
|
336
319
|
|
|
337
320
|
Parameters
|
|
338
321
|
----------
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
322
|
+
entity : str
|
|
323
|
+
Entity type.
|
|
324
|
+
obj : dict
|
|
325
|
+
Dictionary to parse.
|
|
343
326
|
|
|
344
327
|
Returns
|
|
345
328
|
-------
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
"""
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
329
|
+
dict
|
|
330
|
+
A dictionary containing the attributes of the entity instance.
|
|
331
|
+
"""
|
|
332
|
+
name = build_name(obj.get("name"))
|
|
333
|
+
kind = obj.get("kind")
|
|
334
|
+
metadata = build_metadata(kind, **obj.get("metadata", {}))
|
|
335
|
+
spec = build_spec(kind, validate=validate, **obj.get("spec", {}))
|
|
336
|
+
status = build_status(kind, **obj.get("status", {}))
|
|
337
|
+
user = obj.get("user")
|
|
338
|
+
local = obj.get("local", False)
|
|
339
|
+
return {
|
|
340
|
+
"name": name,
|
|
341
|
+
"kind": kind,
|
|
342
|
+
"metadata": metadata,
|
|
343
|
+
"spec": spec,
|
|
344
|
+
"status": status,
|
|
345
|
+
"user": user,
|
|
346
|
+
"local": local,
|
|
347
|
+
}
|
|
362
348
|
|
|
363
349
|
##############################
|
|
364
350
|
# Artifacts
|
|
@@ -371,7 +357,7 @@ class Project(Entity):
|
|
|
371
357
|
uuid: str | None = None,
|
|
372
358
|
description: str | None = None,
|
|
373
359
|
labels: list[str] | None = None,
|
|
374
|
-
embedded: bool =
|
|
360
|
+
embedded: bool = True,
|
|
375
361
|
path: str | None = None,
|
|
376
362
|
**kwargs,
|
|
377
363
|
) -> Artifact:
|
|
@@ -385,7 +371,7 @@ class Project(Entity):
|
|
|
385
371
|
kind : str
|
|
386
372
|
Kind the object.
|
|
387
373
|
uuid : str
|
|
388
|
-
ID of the object.
|
|
374
|
+
ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
|
|
389
375
|
description : str
|
|
390
376
|
Description of the object (human readable).
|
|
391
377
|
labels : list[str]
|
|
@@ -662,7 +648,7 @@ class Project(Entity):
|
|
|
662
648
|
uuid: str | None = None,
|
|
663
649
|
description: str | None = None,
|
|
664
650
|
labels: list[str] | None = None,
|
|
665
|
-
embedded: bool =
|
|
651
|
+
embedded: bool = True,
|
|
666
652
|
path: str | None = None,
|
|
667
653
|
**kwargs,
|
|
668
654
|
) -> Dataitem:
|
|
@@ -676,7 +662,7 @@ class Project(Entity):
|
|
|
676
662
|
kind : str
|
|
677
663
|
Kind the object.
|
|
678
664
|
uuid : str
|
|
679
|
-
ID of the object.
|
|
665
|
+
ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
|
|
680
666
|
description : str
|
|
681
667
|
Description of the object (human readable).
|
|
682
668
|
labels : list[str]
|
|
@@ -966,7 +952,7 @@ class Project(Entity):
|
|
|
966
952
|
uuid: str | None = None,
|
|
967
953
|
description: str | None = None,
|
|
968
954
|
labels: list[str] | None = None,
|
|
969
|
-
embedded: bool =
|
|
955
|
+
embedded: bool = True,
|
|
970
956
|
path: str | None = None,
|
|
971
957
|
**kwargs,
|
|
972
958
|
) -> Model:
|
|
@@ -980,7 +966,7 @@ class Project(Entity):
|
|
|
980
966
|
kind : str
|
|
981
967
|
Kind the object.
|
|
982
968
|
uuid : str
|
|
983
|
-
ID of the object.
|
|
969
|
+
ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
|
|
984
970
|
description : str
|
|
985
971
|
Description of the object (human readable).
|
|
986
972
|
labels : list[str]
|
|
@@ -1258,7 +1244,7 @@ class Project(Entity):
|
|
|
1258
1244
|
uuid: str | None = None,
|
|
1259
1245
|
description: str | None = None,
|
|
1260
1246
|
labels: list[str] | None = None,
|
|
1261
|
-
embedded: bool =
|
|
1247
|
+
embedded: bool = True,
|
|
1262
1248
|
**kwargs,
|
|
1263
1249
|
) -> Function:
|
|
1264
1250
|
"""
|
|
@@ -1271,7 +1257,7 @@ class Project(Entity):
|
|
|
1271
1257
|
kind : str
|
|
1272
1258
|
Kind the object.
|
|
1273
1259
|
uuid : str
|
|
1274
|
-
ID of the object.
|
|
1260
|
+
ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
|
|
1275
1261
|
description : str
|
|
1276
1262
|
Description of the object (human readable).
|
|
1277
1263
|
labels : list[str]
|
|
@@ -1504,7 +1490,7 @@ class Project(Entity):
|
|
|
1504
1490
|
uuid: str | None = None,
|
|
1505
1491
|
description: str | None = None,
|
|
1506
1492
|
labels: list[str] | None = None,
|
|
1507
|
-
embedded: bool =
|
|
1493
|
+
embedded: bool = True,
|
|
1508
1494
|
**kwargs,
|
|
1509
1495
|
) -> Workflow:
|
|
1510
1496
|
"""
|
|
@@ -1517,7 +1503,7 @@ class Project(Entity):
|
|
|
1517
1503
|
kind : str
|
|
1518
1504
|
Kind the object.
|
|
1519
1505
|
uuid : str
|
|
1520
|
-
ID of the object.
|
|
1506
|
+
ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
|
|
1521
1507
|
description : str
|
|
1522
1508
|
Description of the object (human readable).
|
|
1523
1509
|
labels : list[str]
|
|
@@ -1749,7 +1735,7 @@ class Project(Entity):
|
|
|
1749
1735
|
uuid: str | None = None,
|
|
1750
1736
|
description: str | None = None,
|
|
1751
1737
|
labels: list[str] | None = None,
|
|
1752
|
-
embedded: bool =
|
|
1738
|
+
embedded: bool = True,
|
|
1753
1739
|
secret_value: str | None = None,
|
|
1754
1740
|
**kwargs,
|
|
1755
1741
|
) -> Secret:
|
|
@@ -1761,7 +1747,7 @@ class Project(Entity):
|
|
|
1761
1747
|
name : str
|
|
1762
1748
|
Object name.
|
|
1763
1749
|
uuid : str
|
|
1764
|
-
ID of the object.
|
|
1750
|
+
ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
|
|
1765
1751
|
description : str
|
|
1766
1752
|
Description of the object (human readable).
|
|
1767
1753
|
labels : list[str]
|
|
@@ -2072,7 +2058,3 @@ class Project(Entity):
|
|
|
2072
2058
|
**kwargs,
|
|
2073
2059
|
)
|
|
2074
2060
|
self.refresh()
|
|
2075
|
-
|
|
2076
|
-
##############################
|
|
2077
|
-
# Project methods
|
|
2078
|
-
##############################
|
|
@@ -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 ProjectSpec(Spec):
|
|
7
7
|
"""
|
|
8
|
-
|
|
8
|
+
Project specification.
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
11
|
def __init__(
|
|
@@ -26,9 +26,9 @@ class ProjectSpec(Spec):
|
|
|
26
26
|
self.models = models if models is not None else []
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
class
|
|
29
|
+
class ProjectParams(SpecParams):
|
|
30
30
|
"""
|
|
31
|
-
|
|
31
|
+
Parameters model for project.
|
|
32
32
|
"""
|
|
33
33
|
|
|
34
34
|
context: str = None
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities.entity_types import EntityTypes
|
|
4
|
+
from digitalhub.registry.registry import registry
|
|
5
|
+
from digitalhub.registry.utils import create_info
|
|
6
|
+
|
|
7
|
+
# Root module
|
|
8
|
+
root = "digitalhub.entities"
|
|
9
|
+
|
|
10
|
+
# Projects
|
|
11
|
+
entity_type = EntityTypes.PROJECT.value
|
|
12
|
+
prefix = entity_type.capitalize()
|
|
13
|
+
project_info = create_info(root, entity_type, prefix)
|
|
14
|
+
registry.register("project", project_info)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# Secrets
|
|
18
|
+
entity_type = EntityTypes.SECRET.value
|
|
19
|
+
prefix = entity_type.capitalize()
|
|
20
|
+
secret_info = create_info(root, entity_type, prefix)
|
|
21
|
+
registry.register("secret", secret_info)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# Artifacts
|
|
25
|
+
entity_type = EntityTypes.ARTIFACT.value
|
|
26
|
+
for i in ["artifact"]:
|
|
27
|
+
prefix = entity_type.capitalize()
|
|
28
|
+
suffix = i.capitalize()
|
|
29
|
+
artifact_info = create_info(root, entity_type, prefix, suffix)
|
|
30
|
+
registry.register(i, artifact_info)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# Dataitems
|
|
34
|
+
entity_type = EntityTypes.DATAITEM.value
|
|
35
|
+
for i in ["dataitem", "table"]:
|
|
36
|
+
prefix = entity_type.capitalize()
|
|
37
|
+
suffix = i.capitalize()
|
|
38
|
+
dataitem_info = create_info(root, entity_type, prefix, suffix)
|
|
39
|
+
registry.register(i, dataitem_info)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# Models
|
|
43
|
+
entity_type = EntityTypes.MODEL.value
|
|
44
|
+
for i in ["model", "mlflow", "sklearn", "huggingface"]:
|
|
45
|
+
prefix = entity_type.capitalize()
|
|
46
|
+
suffix = i.capitalize()
|
|
47
|
+
model_info = create_info(root, entity_type, prefix, suffix)
|
|
48
|
+
registry.register(i, model_info)
|