digitalhub 0.11.0b7__py3-none-any.whl → 0.13.0b0__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 -1
- digitalhub/context/api.py +4 -0
- digitalhub/context/builder.py +4 -0
- digitalhub/context/context.py +4 -0
- digitalhub/entities/__init__.py +3 -0
- digitalhub/entities/_base/__init__.py +3 -0
- digitalhub/entities/_base/_base/__init__.py +3 -0
- digitalhub/entities/_base/_base/entity.py +4 -0
- digitalhub/entities/_base/context/__init__.py +3 -0
- digitalhub/entities/_base/context/entity.py +4 -0
- digitalhub/entities/_base/entity/__init__.py +3 -0
- digitalhub/entities/_base/entity/_constructors/__init__.py +3 -0
- digitalhub/entities/_base/entity/_constructors/metadata.py +4 -0
- digitalhub/entities/_base/entity/_constructors/name.py +4 -0
- digitalhub/entities/_base/entity/_constructors/spec.py +4 -0
- digitalhub/entities/_base/entity/_constructors/status.py +4 -0
- digitalhub/entities/_base/entity/_constructors/uuid.py +4 -0
- digitalhub/entities/_base/entity/builder.py +4 -0
- digitalhub/entities/_base/entity/entity.py +4 -0
- digitalhub/entities/_base/entity/metadata.py +4 -0
- digitalhub/entities/_base/entity/spec.py +4 -0
- digitalhub/entities/_base/entity/status.py +4 -0
- digitalhub/entities/_base/executable/__init__.py +3 -0
- digitalhub/entities/_base/executable/entity.py +11 -0
- digitalhub/entities/_base/material/__init__.py +3 -0
- digitalhub/entities/_base/material/entity.py +12 -15
- digitalhub/entities/_base/material/spec.py +4 -0
- digitalhub/entities/_base/material/status.py +4 -0
- digitalhub/entities/_base/material/utils.py +5 -1
- digitalhub/entities/_base/runtime_entity/__init__.py +3 -0
- digitalhub/entities/_base/runtime_entity/builder.py +4 -0
- digitalhub/entities/_base/unversioned/__init__.py +3 -0
- digitalhub/entities/_base/unversioned/builder.py +4 -0
- digitalhub/entities/_base/unversioned/entity.py +4 -0
- digitalhub/entities/_base/versioned/__init__.py +3 -0
- digitalhub/entities/_base/versioned/builder.py +4 -0
- digitalhub/entities/_base/versioned/entity.py +4 -0
- digitalhub/entities/_commons/__init__.py +3 -0
- digitalhub/entities/_commons/enums.py +4 -0
- digitalhub/entities/_commons/metrics.py +4 -0
- digitalhub/entities/_commons/types.py +4 -0
- digitalhub/entities/_commons/utils.py +4 -0
- digitalhub/entities/_processors/__init__.py +3 -0
- digitalhub/entities/_processors/base.py +4 -0
- digitalhub/entities/_processors/context.py +5 -1
- digitalhub/entities/_processors/utils.py +4 -0
- digitalhub/entities/artifact/__init__.py +3 -0
- digitalhub/entities/artifact/_base/__init__.py +3 -0
- digitalhub/entities/artifact/_base/builder.py +4 -0
- digitalhub/entities/artifact/_base/entity.py +4 -0
- digitalhub/entities/artifact/_base/spec.py +4 -0
- digitalhub/entities/artifact/_base/status.py +4 -0
- digitalhub/entities/artifact/artifact/__init__.py +3 -0
- digitalhub/entities/artifact/artifact/builder.py +4 -0
- digitalhub/entities/artifact/artifact/entity.py +4 -0
- digitalhub/entities/artifact/artifact/spec.py +4 -0
- digitalhub/entities/artifact/artifact/status.py +4 -0
- digitalhub/entities/artifact/crud.py +4 -0
- digitalhub/entities/artifact/utils.py +4 -0
- digitalhub/entities/builders.py +4 -0
- digitalhub/entities/dataitem/__init__.py +3 -0
- digitalhub/entities/dataitem/_base/__init__.py +3 -0
- digitalhub/entities/dataitem/_base/builder.py +4 -0
- digitalhub/entities/dataitem/_base/entity.py +4 -0
- digitalhub/entities/dataitem/_base/spec.py +4 -0
- digitalhub/entities/dataitem/_base/status.py +4 -0
- digitalhub/entities/dataitem/crud.py +4 -0
- digitalhub/entities/dataitem/dataitem/__init__.py +3 -0
- digitalhub/entities/dataitem/dataitem/builder.py +4 -0
- digitalhub/entities/dataitem/dataitem/entity.py +4 -0
- digitalhub/entities/dataitem/dataitem/spec.py +4 -0
- digitalhub/entities/dataitem/dataitem/status.py +4 -0
- digitalhub/entities/dataitem/iceberg/__init__.py +3 -0
- digitalhub/entities/dataitem/iceberg/builder.py +4 -0
- digitalhub/entities/dataitem/iceberg/entity.py +4 -0
- digitalhub/entities/dataitem/iceberg/spec.py +4 -0
- digitalhub/entities/dataitem/iceberg/status.py +4 -0
- digitalhub/entities/dataitem/table/__init__.py +3 -0
- digitalhub/entities/dataitem/table/builder.py +4 -0
- digitalhub/entities/dataitem/table/entity.py +4 -0
- digitalhub/entities/dataitem/table/models.py +4 -0
- digitalhub/entities/dataitem/table/spec.py +4 -0
- digitalhub/entities/dataitem/table/status.py +4 -0
- digitalhub/entities/dataitem/table/utils.py +4 -0
- digitalhub/entities/dataitem/utils.py +4 -0
- digitalhub/entities/function/__init__.py +3 -0
- digitalhub/entities/function/_base/__init__.py +3 -0
- digitalhub/entities/function/_base/builder.py +4 -0
- digitalhub/entities/function/_base/entity.py +4 -0
- digitalhub/entities/function/_base/spec.py +4 -0
- digitalhub/entities/function/_base/status.py +4 -0
- digitalhub/entities/function/crud.py +4 -0
- digitalhub/entities/model/__init__.py +3 -0
- digitalhub/entities/model/_base/__init__.py +3 -0
- digitalhub/entities/model/_base/builder.py +4 -0
- digitalhub/entities/model/_base/entity.py +4 -0
- digitalhub/entities/model/_base/spec.py +4 -0
- digitalhub/entities/model/_base/status.py +4 -0
- digitalhub/entities/model/crud.py +4 -0
- digitalhub/entities/model/huggingface/__init__.py +3 -0
- digitalhub/entities/model/huggingface/builder.py +4 -0
- digitalhub/entities/model/huggingface/entity.py +4 -0
- digitalhub/entities/model/huggingface/spec.py +4 -0
- digitalhub/entities/model/huggingface/status.py +4 -0
- digitalhub/entities/model/mlflow/__init__.py +3 -0
- digitalhub/entities/model/mlflow/builder.py +4 -0
- digitalhub/entities/model/mlflow/entity.py +4 -0
- digitalhub/entities/model/mlflow/models.py +4 -0
- digitalhub/entities/model/mlflow/spec.py +4 -0
- digitalhub/entities/model/mlflow/status.py +4 -0
- digitalhub/entities/model/mlflow/utils.py +4 -0
- digitalhub/entities/model/model/__init__.py +3 -0
- digitalhub/entities/model/model/builder.py +4 -0
- digitalhub/entities/model/model/entity.py +4 -0
- digitalhub/entities/model/model/spec.py +4 -0
- digitalhub/entities/model/model/status.py +4 -0
- digitalhub/entities/model/sklearn/__init__.py +3 -0
- digitalhub/entities/model/sklearn/builder.py +4 -0
- digitalhub/entities/model/sklearn/entity.py +4 -0
- digitalhub/entities/model/sklearn/spec.py +4 -0
- digitalhub/entities/model/sklearn/status.py +4 -0
- digitalhub/entities/model/utils.py +4 -0
- digitalhub/entities/project/__init__.py +3 -0
- digitalhub/entities/project/_base/__init__.py +3 -0
- digitalhub/entities/project/_base/builder.py +4 -0
- digitalhub/entities/project/_base/entity.py +4 -0
- digitalhub/entities/project/_base/models.py +4 -0
- digitalhub/entities/project/_base/spec.py +4 -0
- digitalhub/entities/project/_base/status.py +4 -0
- digitalhub/entities/project/crud.py +4 -0
- digitalhub/entities/project/utils.py +4 -0
- digitalhub/entities/run/__init__.py +3 -0
- digitalhub/entities/run/_base/__init__.py +3 -0
- digitalhub/entities/run/_base/builder.py +4 -0
- digitalhub/entities/run/_base/entity.py +4 -0
- digitalhub/entities/run/_base/spec.py +4 -0
- digitalhub/entities/run/_base/status.py +4 -0
- digitalhub/entities/run/crud.py +4 -0
- digitalhub/entities/secret/__init__.py +3 -0
- digitalhub/entities/secret/_base/__init__.py +3 -0
- digitalhub/entities/secret/_base/builder.py +4 -0
- digitalhub/entities/secret/_base/entity.py +4 -0
- digitalhub/entities/secret/_base/spec.py +4 -0
- digitalhub/entities/secret/_base/status.py +4 -0
- digitalhub/entities/secret/crud.py +4 -0
- digitalhub/entities/task/__init__.py +3 -0
- digitalhub/entities/task/_base/__init__.py +3 -0
- digitalhub/entities/task/_base/builder.py +4 -0
- digitalhub/entities/task/_base/entity.py +4 -0
- digitalhub/entities/task/_base/models.py +4 -0
- digitalhub/entities/task/_base/spec.py +4 -0
- digitalhub/entities/task/_base/status.py +4 -0
- digitalhub/entities/task/_base/utils.py +4 -0
- digitalhub/entities/task/crud.py +4 -0
- digitalhub/entities/trigger/__init__.py +3 -0
- digitalhub/entities/trigger/_base/__init__.py +3 -0
- digitalhub/entities/trigger/_base/builder.py +4 -0
- digitalhub/entities/trigger/_base/entity.py +4 -0
- digitalhub/entities/trigger/_base/spec.py +4 -0
- digitalhub/entities/trigger/_base/status.py +4 -0
- digitalhub/entities/trigger/crud.py +4 -0
- digitalhub/entities/trigger/lifecycle/__init__.py +3 -0
- digitalhub/entities/trigger/lifecycle/builder.py +4 -0
- digitalhub/entities/trigger/lifecycle/entity.py +4 -0
- digitalhub/entities/trigger/lifecycle/spec.py +4 -0
- digitalhub/entities/trigger/lifecycle/status.py +4 -0
- digitalhub/entities/trigger/scheduler/__init__.py +3 -0
- digitalhub/entities/trigger/scheduler/builder.py +4 -0
- digitalhub/entities/trigger/scheduler/entity.py +4 -0
- digitalhub/entities/trigger/scheduler/spec.py +4 -0
- digitalhub/entities/trigger/scheduler/status.py +4 -0
- digitalhub/entities/workflow/__init__.py +3 -0
- digitalhub/entities/workflow/_base/__init__.py +3 -0
- digitalhub/entities/workflow/_base/builder.py +4 -0
- digitalhub/entities/workflow/_base/entity.py +4 -0
- digitalhub/entities/workflow/_base/spec.py +4 -0
- digitalhub/entities/workflow/_base/status.py +4 -0
- digitalhub/entities/workflow/crud.py +4 -0
- digitalhub/factory/__init__.py +3 -0
- digitalhub/factory/factory.py +4 -0
- digitalhub/factory/utils.py +4 -0
- digitalhub/runtimes/__init__.py +3 -0
- digitalhub/runtimes/_base.py +4 -0
- digitalhub/runtimes/builder.py +4 -0
- digitalhub/runtimes/enums.py +4 -0
- digitalhub/stores/__init__.py +3 -0
- digitalhub/stores/client/__init__.py +3 -0
- digitalhub/stores/client/_base/__init__.py +3 -0
- digitalhub/stores/client/_base/api_builder.py +4 -0
- digitalhub/stores/client/_base/client.py +4 -0
- digitalhub/stores/client/_base/key_builder.py +4 -0
- digitalhub/stores/client/_base/params_builder.py +4 -0
- digitalhub/stores/client/api.py +4 -0
- digitalhub/stores/client/builder.py +4 -0
- digitalhub/stores/client/dhcore/__init__.py +3 -0
- digitalhub/stores/client/dhcore/api_builder.py +4 -0
- digitalhub/stores/client/dhcore/client.py +60 -19
- digitalhub/stores/client/dhcore/configurator.py +282 -183
- digitalhub/stores/client/dhcore/enums.py +6 -0
- digitalhub/stores/client/dhcore/error_parser.py +4 -0
- digitalhub/stores/client/dhcore/key_builder.py +4 -0
- digitalhub/stores/client/dhcore/models.py +4 -0
- digitalhub/stores/client/dhcore/params_builder.py +4 -0
- digitalhub/stores/client/dhcore/utils.py +12 -8
- digitalhub/stores/client/local/__init__.py +3 -0
- digitalhub/stores/client/local/api_builder.py +4 -0
- digitalhub/stores/client/local/client.py +4 -0
- digitalhub/stores/client/local/enums.py +4 -0
- digitalhub/stores/client/local/key_builder.py +4 -0
- digitalhub/stores/client/local/params_builder.py +4 -0
- digitalhub/stores/credentials/__init__.py +3 -0
- digitalhub/stores/{configurator → credentials}/api.py +7 -3
- digitalhub/stores/credentials/configurator.py +37 -0
- digitalhub/stores/credentials/enums.py +54 -0
- digitalhub/stores/credentials/handler.py +148 -0
- digitalhub/stores/{configurator → credentials}/ini_module.py +5 -1
- digitalhub/stores/credentials/store.py +49 -0
- digitalhub/stores/data/__init__.py +3 -0
- digitalhub/stores/data/_base/__init__.py +3 -0
- digitalhub/stores/data/_base/store.py +23 -6
- digitalhub/stores/data/api.py +41 -1
- digitalhub/stores/data/builder.py +50 -53
- digitalhub/stores/data/enums.py +4 -0
- digitalhub/stores/data/local/__init__.py +3 -0
- digitalhub/stores/data/local/store.py +8 -7
- digitalhub/stores/data/remote/__init__.py +3 -0
- digitalhub/stores/data/remote/store.py +8 -7
- digitalhub/stores/data/s3/__init__.py +3 -0
- digitalhub/stores/data/s3/configurator.py +40 -92
- digitalhub/stores/data/s3/store.py +46 -57
- digitalhub/stores/data/s3/utils.py +5 -1
- digitalhub/stores/data/sql/__init__.py +3 -0
- digitalhub/stores/data/sql/configurator.py +39 -83
- digitalhub/stores/data/sql/store.py +19 -15
- digitalhub/stores/readers/__init__.py +3 -0
- digitalhub/stores/readers/data/__init__.py +3 -0
- digitalhub/stores/readers/data/_base/__init__.py +3 -0
- digitalhub/stores/readers/data/_base/builder.py +4 -0
- digitalhub/stores/readers/data/_base/reader.py +4 -0
- digitalhub/stores/readers/data/api.py +4 -0
- digitalhub/stores/readers/data/factory.py +4 -0
- digitalhub/stores/readers/data/pandas/__init__.py +3 -0
- digitalhub/stores/readers/data/pandas/builder.py +4 -0
- digitalhub/stores/readers/data/pandas/reader.py +4 -0
- digitalhub/stores/readers/query/__init__.py +3 -0
- digitalhub/utils/__init__.py +3 -0
- digitalhub/utils/enums.py +4 -0
- digitalhub/utils/exceptions.py +4 -0
- digitalhub/utils/file_utils.py +4 -0
- digitalhub/utils/generic_utils.py +4 -0
- digitalhub/utils/git_utils.py +4 -0
- digitalhub/utils/io_utils.py +4 -0
- digitalhub/utils/logger.py +4 -0
- digitalhub/utils/types.py +4 -0
- digitalhub/utils/uri_utils.py +4 -0
- digitalhub-0.13.0b0.dist-info/METADATA +301 -0
- digitalhub-0.13.0b0.dist-info/RECORD +260 -0
- digitalhub-0.13.0b0.dist-info/licenses/AUTHORS +5 -0
- digitalhub-0.13.0b0.dist-info/licenses/LICENSE +201 -0
- digitalhub/stores/configurator/__init__.py +0 -0
- digitalhub/stores/configurator/configurator.py +0 -198
- digitalhub/stores/configurator/credentials_store.py +0 -65
- digitalhub/stores/configurator/enums.py +0 -21
- digitalhub/stores/data/s3/enums.py +0 -16
- digitalhub/stores/data/sql/enums.py +0 -16
- digitalhub/stores/data/utils.py +0 -34
- digitalhub-0.11.0b7.dist-info/METADATA +0 -259
- digitalhub-0.11.0b7.dist-info/RECORD +0 -261
- digitalhub-0.11.0b7.dist-info/licenses/LICENSE.txt +0 -216
- {digitalhub-0.11.0b7.dist-info → digitalhub-0.13.0b0.dist-info}/WHEEL +0 -0
|
@@ -1,10 +1,14 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
1
5
|
from __future__ import annotations
|
|
2
6
|
|
|
3
7
|
import os
|
|
4
8
|
import typing
|
|
5
9
|
|
|
6
10
|
from digitalhub.stores.client.api import get_client
|
|
7
|
-
from digitalhub.stores.
|
|
11
|
+
from digitalhub.stores.credentials.enums import CredsEnvVar
|
|
8
12
|
|
|
9
13
|
if typing.TYPE_CHECKING:
|
|
10
14
|
from digitalhub.stores.client.dhcore.client import ClientDHCore
|
|
@@ -43,20 +47,20 @@ def set_dhcore_env(
|
|
|
43
47
|
None
|
|
44
48
|
"""
|
|
45
49
|
if endpoint is not None:
|
|
46
|
-
os.environ[
|
|
50
|
+
os.environ[CredsEnvVar.DHCORE_ENDPOINT.value] = endpoint
|
|
47
51
|
if user is not None:
|
|
48
|
-
os.environ[
|
|
52
|
+
os.environ[CredsEnvVar.DHCORE_USER.value] = user
|
|
49
53
|
if password is not None:
|
|
50
|
-
os.environ[
|
|
54
|
+
os.environ[CredsEnvVar.DHCORE_PASSWORD.value] = password
|
|
51
55
|
if access_token is not None:
|
|
52
|
-
os.environ[
|
|
56
|
+
os.environ[CredsEnvVar.DHCORE_ACCESS_TOKEN.value] = access_token
|
|
53
57
|
if refresh_token is not None:
|
|
54
|
-
os.environ[
|
|
58
|
+
os.environ[CredsEnvVar.DHCORE_REFRESH_TOKEN.value] = refresh_token
|
|
55
59
|
if client_id is not None:
|
|
56
|
-
os.environ[
|
|
60
|
+
os.environ[CredsEnvVar.DHCORE_CLIENT_ID.value] = client_id
|
|
57
61
|
|
|
58
62
|
client: ClientDHCore = get_client(local=False)
|
|
59
|
-
client._configurator.
|
|
63
|
+
client._configurator.load_env_vars()
|
|
60
64
|
|
|
61
65
|
|
|
62
66
|
def refresh_token() -> None:
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
1
5
|
from __future__ import annotations
|
|
2
6
|
|
|
3
|
-
from digitalhub.stores.
|
|
7
|
+
from digitalhub.stores.credentials.handler import creds_handler
|
|
4
8
|
|
|
5
9
|
|
|
6
10
|
def set_current_env(environment: str) -> None:
|
|
@@ -16,7 +20,7 @@ def set_current_env(environment: str) -> None:
|
|
|
16
20
|
-------
|
|
17
21
|
None
|
|
18
22
|
"""
|
|
19
|
-
|
|
23
|
+
creds_handler.set_current_env(environment)
|
|
20
24
|
|
|
21
25
|
|
|
22
26
|
def get_current_env() -> str:
|
|
@@ -28,4 +32,4 @@ def get_current_env() -> str:
|
|
|
28
32
|
str
|
|
29
33
|
Credentials set name.
|
|
30
34
|
"""
|
|
31
|
-
return
|
|
35
|
+
return creds_handler.get_current_env()
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from abc import abstractmethod
|
|
8
|
+
|
|
9
|
+
from digitalhub.stores.credentials.enums import CredsOrigin
|
|
10
|
+
from digitalhub.stores.credentials.handler import creds_handler
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Configurator:
|
|
14
|
+
# Must be set in implementing class
|
|
15
|
+
keys: list[str] = []
|
|
16
|
+
required_keys: list[str] = []
|
|
17
|
+
|
|
18
|
+
# Origin of the credentials
|
|
19
|
+
_env = CredsOrigin.ENV.value
|
|
20
|
+
_file = CredsOrigin.FILE.value
|
|
21
|
+
|
|
22
|
+
# Credentials handler
|
|
23
|
+
_creds_handler = creds_handler
|
|
24
|
+
|
|
25
|
+
def get_credentials(self, origin: str) -> dict:
|
|
26
|
+
return creds_handler.get_credentials(origin)
|
|
27
|
+
|
|
28
|
+
@abstractmethod
|
|
29
|
+
def load_configs(self) -> None:
|
|
30
|
+
...
|
|
31
|
+
|
|
32
|
+
def _check_credentials(self, creds: dict) -> list[str]:
|
|
33
|
+
missing_keys = []
|
|
34
|
+
for k, v in creds.items():
|
|
35
|
+
if v is None and k in self.required_keys:
|
|
36
|
+
missing_keys.append(k)
|
|
37
|
+
return missing_keys
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from enum import Enum
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class CredsOrigin(Enum):
|
|
11
|
+
"""
|
|
12
|
+
List credential origins.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
ENV = "env"
|
|
16
|
+
FILE = "file"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class SetCreds(Enum):
|
|
20
|
+
"""
|
|
21
|
+
List supported environments.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
DEFAULT = "__default"
|
|
25
|
+
DH_ENV = "DH_NAME"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class CredsEnvVar(Enum):
|
|
29
|
+
# S3
|
|
30
|
+
S3_ENDPOINT_URL = "AWS_ENDPOINT_URL"
|
|
31
|
+
S3_ACCESS_KEY_ID = "AWS_ACCESS_KEY_ID"
|
|
32
|
+
S3_SECRET_ACCESS_KEY = "AWS_SECRET_ACCESS_KEY"
|
|
33
|
+
S3_SESSION_TOKEN = "AWS_SESSION_TOKEN"
|
|
34
|
+
S3_REGION = "AWS_REGION"
|
|
35
|
+
S3_SIGNATURE_VERSION = "S3_SIGNATURE_VERSION"
|
|
36
|
+
|
|
37
|
+
# SQL
|
|
38
|
+
DB_HOST = "DB_HOST"
|
|
39
|
+
DB_PORT = "DB_PORT"
|
|
40
|
+
DB_USERNAME = "DB_USERNAME"
|
|
41
|
+
DB_PASSWORD = "DB_PASSWORD"
|
|
42
|
+
DB_DATABASE = "DB_DATABASE"
|
|
43
|
+
DB_PG_SCHEMA = "DB_SCHEMA"
|
|
44
|
+
|
|
45
|
+
# DHCORE
|
|
46
|
+
DHCORE_ENDPOINT = "DHCORE_ENDPOINT"
|
|
47
|
+
DHCORE_ISSUER = "DHCORE_ISSUER"
|
|
48
|
+
DHCORE_USER = "DHCORE_USER"
|
|
49
|
+
DHCORE_PASSWORD = "DHCORE_PASSWORD"
|
|
50
|
+
DHCORE_CLIENT_ID = "DHCORE_CLIENT_ID"
|
|
51
|
+
DHCORE_ACCESS_TOKEN = "DHCORE_ACCESS_TOKEN"
|
|
52
|
+
DHCORE_REFRESH_TOKEN = "DHCORE_REFRESH_TOKEN"
|
|
53
|
+
DHCORE_PERSONAL_ACCESS_TOKEN = "DHCORE_PERSONAL_ACCESS_TOKEN"
|
|
54
|
+
DHCORE_WORKFLOW_IMAGE = "DHCORE_WORKFLOW_IMAGE"
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
|
|
9
|
+
from digitalhub.stores.credentials.enums import SetCreds
|
|
10
|
+
from digitalhub.stores.credentials.ini_module import load_from_file, read_env_from_file, set_current_env, write_config
|
|
11
|
+
from digitalhub.stores.credentials.store import CredentialsStore
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class CredentialHandler:
|
|
15
|
+
"""
|
|
16
|
+
Configurator object used to configure clients and store credentials.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
def __init__(self) -> None:
|
|
20
|
+
# Store
|
|
21
|
+
self._creds_store = CredentialsStore()
|
|
22
|
+
|
|
23
|
+
# Current credentials set (__default by default)
|
|
24
|
+
self._environment = os.getenv(SetCreds.DH_ENV.value, SetCreds.DEFAULT.value)
|
|
25
|
+
|
|
26
|
+
##############################
|
|
27
|
+
# Public methods
|
|
28
|
+
##############################
|
|
29
|
+
|
|
30
|
+
def set_current_env(self, creds_set: str) -> None:
|
|
31
|
+
"""
|
|
32
|
+
Set the current credentials set.
|
|
33
|
+
|
|
34
|
+
Parameters
|
|
35
|
+
----------
|
|
36
|
+
creds_set : str
|
|
37
|
+
Credentials set name.
|
|
38
|
+
|
|
39
|
+
Returns
|
|
40
|
+
-------
|
|
41
|
+
None
|
|
42
|
+
"""
|
|
43
|
+
self._environment = creds_set
|
|
44
|
+
set_current_env(creds_set)
|
|
45
|
+
|
|
46
|
+
def get_current_env(self) -> str:
|
|
47
|
+
"""
|
|
48
|
+
Get the current credentials set.
|
|
49
|
+
|
|
50
|
+
Returns
|
|
51
|
+
-------
|
|
52
|
+
str
|
|
53
|
+
Credentials set name.
|
|
54
|
+
"""
|
|
55
|
+
return self._environment
|
|
56
|
+
|
|
57
|
+
def load_from_env(self, var: str) -> str | None:
|
|
58
|
+
"""
|
|
59
|
+
Load variable from env.
|
|
60
|
+
|
|
61
|
+
Parameters
|
|
62
|
+
----------
|
|
63
|
+
var : str
|
|
64
|
+
Environment variable name.
|
|
65
|
+
|
|
66
|
+
Returns
|
|
67
|
+
-------
|
|
68
|
+
str | None
|
|
69
|
+
Environment variable value.
|
|
70
|
+
"""
|
|
71
|
+
env_var = os.getenv(var)
|
|
72
|
+
if env_var != "":
|
|
73
|
+
return env_var
|
|
74
|
+
|
|
75
|
+
def load_from_file(self, var: str) -> str | None:
|
|
76
|
+
"""
|
|
77
|
+
Load variable from config file.
|
|
78
|
+
|
|
79
|
+
Parameters
|
|
80
|
+
----------
|
|
81
|
+
var : str
|
|
82
|
+
Environment variable name.
|
|
83
|
+
|
|
84
|
+
Returns
|
|
85
|
+
-------
|
|
86
|
+
str | None
|
|
87
|
+
Environment variable value.
|
|
88
|
+
"""
|
|
89
|
+
env_from_file = read_env_from_file()
|
|
90
|
+
if env_from_file is not None:
|
|
91
|
+
self._environment = env_from_file
|
|
92
|
+
return load_from_file(var)
|
|
93
|
+
|
|
94
|
+
def write_env(self, creds: dict) -> None:
|
|
95
|
+
"""
|
|
96
|
+
Write the env variables to the .dhcore file.
|
|
97
|
+
|
|
98
|
+
Parameters
|
|
99
|
+
----------
|
|
100
|
+
creds : dict
|
|
101
|
+
Credentials.
|
|
102
|
+
|
|
103
|
+
Returns
|
|
104
|
+
-------
|
|
105
|
+
None
|
|
106
|
+
"""
|
|
107
|
+
write_config(creds, self._environment)
|
|
108
|
+
|
|
109
|
+
##############################
|
|
110
|
+
# Credentials store methods
|
|
111
|
+
##############################
|
|
112
|
+
|
|
113
|
+
def set_credentials(self, origin: str, creds: dict) -> None:
|
|
114
|
+
"""
|
|
115
|
+
Set credentials.
|
|
116
|
+
|
|
117
|
+
Parameters
|
|
118
|
+
----------
|
|
119
|
+
origin : str
|
|
120
|
+
The origin of the credentials.
|
|
121
|
+
creds : dict
|
|
122
|
+
The credentials.
|
|
123
|
+
|
|
124
|
+
Returns
|
|
125
|
+
-------
|
|
126
|
+
None
|
|
127
|
+
"""
|
|
128
|
+
self._creds_store.set_credentials(self._environment, origin, creds)
|
|
129
|
+
|
|
130
|
+
def get_credentials(self, origin: str) -> dict:
|
|
131
|
+
"""
|
|
132
|
+
Get credentials from origin.
|
|
133
|
+
|
|
134
|
+
Parameters
|
|
135
|
+
----------
|
|
136
|
+
origin : str
|
|
137
|
+
The origin of the credentials.
|
|
138
|
+
|
|
139
|
+
Returns
|
|
140
|
+
-------
|
|
141
|
+
dict
|
|
142
|
+
The credentials.
|
|
143
|
+
"""
|
|
144
|
+
return self._creds_store.get_credentials(self._environment, origin)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
# Define global configurator
|
|
148
|
+
creds_handler = CredentialHandler()
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
1
5
|
from __future__ import annotations
|
|
2
6
|
|
|
3
7
|
from configparser import ConfigParser
|
|
@@ -79,7 +83,7 @@ def write_config(creds: dict, environment: str) -> None:
|
|
|
79
83
|
|
|
80
84
|
cfg["DEFAULT"]["current_environment"] = environment
|
|
81
85
|
for k, v in creds.items():
|
|
82
|
-
cfg[environment][k] = v
|
|
86
|
+
cfg[environment][k] = str(v)
|
|
83
87
|
|
|
84
88
|
ENV_FILE.touch(exist_ok=True)
|
|
85
89
|
with open(ENV_FILE, "w") as inifile:
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from digitalhub.stores.credentials.enums import CredsOrigin
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class CredentialsStore:
|
|
13
|
+
"""
|
|
14
|
+
Credentials store to store and retrieve credentials.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def __init__(self) -> None:
|
|
18
|
+
self._file_creds: dict[str, dict[str, Any]] = {}
|
|
19
|
+
self._env_creds: dict[str, Any] = {}
|
|
20
|
+
|
|
21
|
+
def set_credentials(
|
|
22
|
+
self,
|
|
23
|
+
profile: str,
|
|
24
|
+
origin: str,
|
|
25
|
+
credentials: dict[str, Any],
|
|
26
|
+
) -> None:
|
|
27
|
+
"""
|
|
28
|
+
Set all credentials for a given profile and origin.
|
|
29
|
+
"""
|
|
30
|
+
if origin == CredsOrigin.ENV.value:
|
|
31
|
+
for key, value in credentials.items():
|
|
32
|
+
self._env_creds[key] = value
|
|
33
|
+
return
|
|
34
|
+
if profile not in self._file_creds:
|
|
35
|
+
self._file_creds[profile] = {}
|
|
36
|
+
for key, value in credentials.items():
|
|
37
|
+
self._file_creds[profile][key] = value
|
|
38
|
+
|
|
39
|
+
def get_credentials(
|
|
40
|
+
self,
|
|
41
|
+
profile: str,
|
|
42
|
+
origin: str,
|
|
43
|
+
) -> dict[str, Any]:
|
|
44
|
+
"""
|
|
45
|
+
Get all credentials for a given profile and origin.
|
|
46
|
+
"""
|
|
47
|
+
if origin == CredsOrigin.ENV.value:
|
|
48
|
+
return self._env_creds
|
|
49
|
+
return self._file_creds[profile]
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
1
5
|
from __future__ import annotations
|
|
2
6
|
|
|
3
7
|
import typing
|
|
@@ -12,6 +16,7 @@ from digitalhub.utils.types import SourcesOrListOfSources
|
|
|
12
16
|
from digitalhub.utils.uri_utils import has_local_scheme
|
|
13
17
|
|
|
14
18
|
if typing.TYPE_CHECKING:
|
|
19
|
+
from digitalhub.stores.credentials.configurator import Configurator
|
|
15
20
|
from digitalhub.stores.readers.data._base.reader import DataframeReader
|
|
16
21
|
|
|
17
22
|
|
|
@@ -20,6 +25,9 @@ class Store:
|
|
|
20
25
|
Store abstract class.
|
|
21
26
|
"""
|
|
22
27
|
|
|
28
|
+
def __init__(self, configurator: Configurator | None = None) -> None:
|
|
29
|
+
self._configurator = configurator
|
|
30
|
+
|
|
23
31
|
##############################
|
|
24
32
|
# I/O methods
|
|
25
33
|
##############################
|
|
@@ -27,19 +35,22 @@ class Store:
|
|
|
27
35
|
@abstractmethod
|
|
28
36
|
def download(
|
|
29
37
|
self,
|
|
30
|
-
|
|
38
|
+
src: str,
|
|
31
39
|
dst: Path,
|
|
32
|
-
src: list[str],
|
|
33
40
|
overwrite: bool = False,
|
|
34
41
|
) -> str:
|
|
35
42
|
"""
|
|
36
|
-
Method to download
|
|
43
|
+
Method to download material entity from storage.
|
|
37
44
|
"""
|
|
38
45
|
|
|
39
46
|
@abstractmethod
|
|
40
|
-
def upload(
|
|
47
|
+
def upload(
|
|
48
|
+
self,
|
|
49
|
+
src: SourcesOrListOfSources,
|
|
50
|
+
dst: str,
|
|
51
|
+
) -> list[tuple[str, str]]:
|
|
41
52
|
"""
|
|
42
|
-
Method to upload
|
|
53
|
+
Method to upload material entity to storage.
|
|
43
54
|
"""
|
|
44
55
|
|
|
45
56
|
@abstractmethod
|
|
@@ -79,7 +90,13 @@ class Store:
|
|
|
79
90
|
"""
|
|
80
91
|
|
|
81
92
|
@abstractmethod
|
|
82
|
-
def write_df(
|
|
93
|
+
def write_df(
|
|
94
|
+
self,
|
|
95
|
+
df: Any,
|
|
96
|
+
dst: str,
|
|
97
|
+
extension: str | None = None,
|
|
98
|
+
**kwargs,
|
|
99
|
+
) -> str:
|
|
83
100
|
"""
|
|
84
101
|
Write DataFrame as parquet or csv.
|
|
85
102
|
"""
|
digitalhub/stores/data/api.py
CHANGED
|
@@ -1,13 +1,53 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
1
5
|
from __future__ import annotations
|
|
2
6
|
|
|
3
7
|
import typing
|
|
4
8
|
|
|
9
|
+
from digitalhub.context.api import get_context
|
|
10
|
+
from digitalhub.stores.credentials.handler import creds_handler
|
|
5
11
|
from digitalhub.stores.data.builder import store_builder
|
|
12
|
+
from digitalhub.stores.data.enums import StoreEnv
|
|
6
13
|
|
|
7
14
|
if typing.TYPE_CHECKING:
|
|
8
15
|
from digitalhub.stores.data._base.store import Store
|
|
9
16
|
|
|
10
17
|
|
|
18
|
+
def get_default_store(project: str) -> str:
|
|
19
|
+
"""
|
|
20
|
+
Get default store URI.
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
project : str
|
|
25
|
+
Project name.
|
|
26
|
+
|
|
27
|
+
Returns
|
|
28
|
+
-------
|
|
29
|
+
str
|
|
30
|
+
Default store URI.
|
|
31
|
+
"""
|
|
32
|
+
context = get_context(project)
|
|
33
|
+
store = context.config.get(StoreEnv.DEFAULT_FILES_STORE.value.lower())
|
|
34
|
+
if store is not None:
|
|
35
|
+
return store
|
|
36
|
+
|
|
37
|
+
store = creds_handler.load_from_env(StoreEnv.DEFAULT_FILES_STORE.value)
|
|
38
|
+
if store is None:
|
|
39
|
+
store = creds_handler.load_from_file(StoreEnv.DEFAULT_FILES_STORE.value)
|
|
40
|
+
|
|
41
|
+
if store is None or store == "":
|
|
42
|
+
raise ValueError(
|
|
43
|
+
"No default store found. "
|
|
44
|
+
"Please set a default store "
|
|
45
|
+
f"in your environment (e.g. export {StoreEnv.DEFAULT_FILES_STORE.value}=) "
|
|
46
|
+
"or set it in project config."
|
|
47
|
+
)
|
|
48
|
+
return store
|
|
49
|
+
|
|
50
|
+
|
|
11
51
|
def get_store(project: str, uri: str) -> Store:
|
|
12
52
|
"""
|
|
13
53
|
Get store instance by URI.
|
|
@@ -26,4 +66,4 @@ def get_store(project: str, uri: str) -> Store:
|
|
|
26
66
|
Store
|
|
27
67
|
Store instance.
|
|
28
68
|
"""
|
|
29
|
-
return store_builder.get(
|
|
69
|
+
return store_builder.get(uri)
|