zenml-nightly 0.75.0.dev20250312__py3-none-any.whl → 0.75.0.dev20250314__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.
- zenml/VERSION +1 -1
- zenml/__init__.py +2 -0
- zenml/analytics/context.py +7 -0
- zenml/analytics/enums.py +2 -2
- zenml/artifacts/utils.py +2 -4
- zenml/cli/__init__.py +8 -9
- zenml/cli/base.py +2 -2
- zenml/cli/code_repository.py +1 -1
- zenml/cli/login.py +6 -0
- zenml/cli/model.py +7 -15
- zenml/cli/pipeline.py +3 -3
- zenml/cli/project.py +172 -0
- zenml/cli/secret.py +47 -44
- zenml/cli/service_accounts.py +0 -1
- zenml/cli/service_connectors.py +15 -17
- zenml/cli/stack.py +0 -3
- zenml/cli/stack_components.py +2 -2
- zenml/cli/tag.py +3 -5
- zenml/cli/utils.py +25 -23
- zenml/client.py +749 -475
- zenml/config/global_config.py +48 -37
- zenml/config/pipeline_configurations.py +3 -2
- zenml/config/pipeline_run_configuration.py +2 -1
- zenml/config/secret_reference_mixin.py +1 -1
- zenml/constants.py +6 -6
- zenml/enums.py +0 -7
- zenml/event_hub/event_hub.py +3 -1
- zenml/exceptions.py +0 -24
- zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +5 -3
- zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +1 -4
- zenml/integrations/gcp/service_connectors/gcp_service_connector.py +7 -6
- zenml/integrations/github/plugins/event_sources/github_webhook_event_source.py +1 -4
- zenml/integrations/mlflow/steps/mlflow_registry.py +3 -3
- zenml/integrations/seldon/model_deployers/seldon_model_deployer.py +1 -1
- zenml/integrations/wandb/__init__.py +1 -1
- zenml/integrations/wandb/experiment_trackers/wandb_experiment_tracker.py +29 -9
- zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +5 -3
- zenml/model/model.py +10 -10
- zenml/model_registries/base_model_registry.py +1 -1
- zenml/models/__init__.py +45 -28
- zenml/models/v2/base/base.py +0 -5
- zenml/models/v2/base/filter.py +2 -2
- zenml/models/v2/base/scoped.py +135 -156
- zenml/models/v2/core/action.py +12 -12
- zenml/models/v2/core/api_key.py +1 -1
- zenml/models/v2/core/artifact.py +31 -18
- zenml/models/v2/core/artifact_version.py +57 -40
- zenml/models/v2/core/code_repository.py +12 -12
- zenml/models/v2/core/component.py +22 -33
- zenml/models/v2/core/device.py +3 -2
- zenml/models/v2/core/event_source.py +14 -14
- zenml/models/v2/core/flavor.py +19 -47
- zenml/models/v2/core/logs.py +1 -2
- zenml/models/v2/core/model.py +23 -20
- zenml/models/v2/core/model_version.py +51 -42
- zenml/models/v2/core/pipeline.py +16 -16
- zenml/models/v2/core/pipeline_build.py +14 -14
- zenml/models/v2/core/pipeline_deployment.py +12 -14
- zenml/models/v2/core/pipeline_run.py +21 -29
- zenml/models/v2/core/project.py +203 -0
- zenml/models/v2/core/run_metadata.py +2 -2
- zenml/models/v2/core/run_template.py +16 -17
- zenml/models/v2/core/schedule.py +12 -21
- zenml/models/v2/core/secret.py +94 -128
- zenml/models/v2/core/server_settings.py +2 -2
- zenml/models/v2/core/service.py +57 -26
- zenml/models/v2/core/service_connector.py +14 -16
- zenml/models/v2/core/stack.py +24 -26
- zenml/models/v2/core/step_run.py +16 -28
- zenml/models/v2/core/tag.py +41 -15
- zenml/models/v2/core/trigger.py +13 -13
- zenml/models/v2/core/trigger_execution.py +2 -2
- zenml/models/v2/core/user.py +2 -2
- zenml/models/v2/misc/statistics.py +45 -0
- zenml/models/v2/misc/tag.py +27 -0
- zenml/orchestrators/cache_utils.py +7 -7
- zenml/orchestrators/input_utils.py +1 -0
- zenml/orchestrators/step_launcher.py +1 -2
- zenml/orchestrators/step_run_utils.py +2 -4
- zenml/orchestrators/step_runner.py +10 -1
- zenml/orchestrators/utils.py +4 -4
- zenml/pipelines/build_utils.py +2 -4
- zenml/pipelines/pipeline_decorator.py +3 -2
- zenml/pipelines/pipeline_definition.py +8 -9
- zenml/pipelines/run_utils.py +4 -4
- zenml/service_connectors/service_connector.py +0 -10
- zenml/service_connectors/service_connector_utils.py +0 -2
- zenml/stack/authentication_mixin.py +1 -1
- zenml/stack/flavor.py +3 -14
- zenml/stack/stack.py +0 -1
- zenml/stack/stack_component.py +1 -5
- zenml/steps/base_step.py +10 -2
- zenml/steps/step_context.py +19 -0
- zenml/utils/string_utils.py +1 -1
- zenml/utils/tag_utils.py +642 -0
- zenml/zen_server/cloud_utils.py +21 -0
- zenml/zen_server/exceptions.py +0 -6
- zenml/zen_server/rbac/endpoint_utils.py +134 -46
- zenml/zen_server/rbac/models.py +65 -3
- zenml/zen_server/rbac/rbac_interface.py +9 -0
- zenml/zen_server/rbac/rbac_sql_zen_store.py +15 -7
- zenml/zen_server/rbac/utils.py +155 -30
- zenml/zen_server/rbac/zenml_cloud_rbac.py +39 -11
- zenml/zen_server/routers/actions_endpoints.py +3 -5
- zenml/zen_server/routers/artifact_endpoint.py +0 -5
- zenml/zen_server/routers/artifact_version_endpoints.py +15 -9
- zenml/zen_server/routers/auth_endpoints.py +22 -7
- zenml/zen_server/routers/code_repositories_endpoints.py +54 -3
- zenml/zen_server/routers/devices_endpoints.py +0 -4
- zenml/zen_server/routers/event_source_endpoints.py +0 -5
- zenml/zen_server/routers/flavors_endpoints.py +0 -5
- zenml/zen_server/routers/logs_endpoints.py +0 -1
- zenml/zen_server/routers/model_versions_endpoints.py +100 -23
- zenml/zen_server/routers/models_endpoints.py +50 -69
- zenml/zen_server/routers/pipeline_builds_endpoints.py +55 -3
- zenml/zen_server/routers/pipeline_deployments_endpoints.py +56 -4
- zenml/zen_server/routers/pipelines_endpoints.py +70 -3
- zenml/zen_server/routers/plugin_endpoints.py +0 -1
- zenml/zen_server/routers/projects_endpoints.py +283 -0
- zenml/zen_server/routers/run_metadata_endpoints.py +97 -0
- zenml/zen_server/routers/run_templates_endpoints.py +64 -3
- zenml/zen_server/routers/runs_endpoints.py +58 -8
- zenml/zen_server/routers/schedule_endpoints.py +67 -6
- zenml/zen_server/routers/secrets_endpoints.py +38 -4
- zenml/zen_server/routers/server_endpoints.py +53 -1
- zenml/zen_server/routers/service_accounts_endpoints.py +14 -15
- zenml/zen_server/routers/service_connectors_endpoints.py +94 -14
- zenml/zen_server/routers/service_endpoints.py +18 -7
- zenml/zen_server/routers/stack_components_endpoints.py +66 -7
- zenml/zen_server/routers/stacks_endpoints.py +95 -6
- zenml/zen_server/routers/steps_endpoints.py +17 -11
- zenml/zen_server/routers/tag_resource_endpoints.py +115 -0
- zenml/zen_server/routers/tags_endpoints.py +6 -17
- zenml/zen_server/routers/triggers_endpoints.py +5 -8
- zenml/zen_server/routers/users_endpoints.py +9 -12
- zenml/zen_server/template_execution/utils.py +8 -7
- zenml/zen_server/utils.py +21 -0
- zenml/zen_server/zen_server_api.py +7 -2
- zenml/zen_stores/base_zen_store.py +50 -69
- zenml/zen_stores/migrations/versions/12eff0206201_rename_workspace_to_project.py +768 -0
- zenml/zen_stores/migrations/versions/1cb6477f72d6_move_artifact_save_type.py +20 -10
- zenml/zen_stores/migrations/versions/1f9d1cd00b90_add_unique_name_constraints.py +231 -0
- zenml/zen_stores/migrations/versions/288f4fb6e112_make_tags_user_scoped.py +74 -0
- zenml/zen_stores/migrations/versions/2e695a26fe7a_add_user_default_workspace.py +45 -0
- zenml/zen_stores/migrations/versions/3b1776345020_remove_workspace_from_globals.py +81 -0
- zenml/zen_stores/migrations/versions/41b28cae31ce_make_artifacts_workspace_scoped.py +136 -0
- zenml/zen_stores/migrations/versions/9e7bf0970266_adding_exclusive_attribute_to_tags.py +47 -0
- zenml/zen_stores/migrations/versions/b557b2871693_update_step_run_input_types.py +8 -4
- zenml/zen_stores/migrations/versions/cbc6acd71f92_add_workspace_display_name.py +58 -0
- zenml/zen_stores/migrations/versions/cc269488e5a9_separate_run_metadata.py +12 -6
- zenml/zen_stores/migrations/versions/f1d723fd723b_add_secret_private_attr.py +61 -0
- zenml/zen_stores/migrations/versions/f76a368a25a5_add_stack_description.py +35 -0
- zenml/zen_stores/rest_zen_store.py +223 -230
- zenml/zen_stores/schemas/__init__.py +2 -2
- zenml/zen_stores/schemas/action_schemas.py +15 -8
- zenml/zen_stores/schemas/api_key_schemas.py +8 -1
- zenml/zen_stores/schemas/artifact_schemas.py +35 -10
- zenml/zen_stores/schemas/code_repository_schemas.py +22 -17
- zenml/zen_stores/schemas/component_schemas.py +9 -14
- zenml/zen_stores/schemas/event_source_schemas.py +15 -8
- zenml/zen_stores/schemas/flavor_schemas.py +14 -20
- zenml/zen_stores/schemas/model_schemas.py +18 -17
- zenml/zen_stores/schemas/pipeline_build_schemas.py +7 -7
- zenml/zen_stores/schemas/pipeline_deployment_schemas.py +10 -8
- zenml/zen_stores/schemas/pipeline_run_schemas.py +9 -12
- zenml/zen_stores/schemas/pipeline_schemas.py +9 -9
- zenml/zen_stores/schemas/{workspace_schemas.py → project_schemas.py} +53 -65
- zenml/zen_stores/schemas/run_metadata_schemas.py +5 -5
- zenml/zen_stores/schemas/run_template_schemas.py +17 -13
- zenml/zen_stores/schemas/schedule_schema.py +16 -21
- zenml/zen_stores/schemas/secret_schemas.py +15 -25
- zenml/zen_stores/schemas/service_connector_schemas.py +8 -17
- zenml/zen_stores/schemas/service_schemas.py +7 -8
- zenml/zen_stores/schemas/stack_schemas.py +12 -15
- zenml/zen_stores/schemas/step_run_schemas.py +14 -15
- zenml/zen_stores/schemas/tag_schemas.py +30 -2
- zenml/zen_stores/schemas/trigger_schemas.py +15 -8
- zenml/zen_stores/schemas/user_schemas.py +12 -2
- zenml/zen_stores/schemas/utils.py +16 -0
- zenml/zen_stores/secrets_stores/service_connector_secrets_store.py +0 -3
- zenml/zen_stores/sql_zen_store.py +2984 -2369
- zenml/zen_stores/template_utils.py +1 -1
- zenml/zen_stores/zen_store_interface.py +136 -126
- {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/METADATA +1 -1
- {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/RECORD +188 -173
- zenml/cli/workspace.py +0 -86
- zenml/models/v2/core/workspace.py +0 -131
- zenml/zen_server/routers/workspaces_endpoints.py +0 -1469
- {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/entry_points.txt +0 -0
@@ -13,39 +13,35 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Endpoint definitions for models."""
|
15
15
|
|
16
|
-
from typing import Union
|
16
|
+
from typing import Optional, Union
|
17
17
|
from uuid import UUID
|
18
18
|
|
19
19
|
from fastapi import APIRouter, Depends, Security
|
20
20
|
|
21
21
|
from zenml.constants import (
|
22
22
|
API,
|
23
|
-
MODEL_VERSIONS,
|
24
23
|
MODELS,
|
25
24
|
VERSION_1,
|
26
25
|
)
|
27
26
|
from zenml.models import (
|
28
27
|
ModelFilter,
|
28
|
+
ModelRequest,
|
29
29
|
ModelResponse,
|
30
30
|
ModelUpdate,
|
31
|
-
ModelVersionFilter,
|
32
|
-
ModelVersionResponse,
|
33
31
|
Page,
|
34
32
|
)
|
35
33
|
from zenml.zen_server.auth import AuthContext, authorize
|
36
34
|
from zenml.zen_server.exceptions import error_response
|
37
35
|
from zenml.zen_server.feature_gate.endpoint_utils import report_decrement
|
38
36
|
from zenml.zen_server.rbac.endpoint_utils import (
|
37
|
+
verify_permissions_and_create_entity,
|
39
38
|
verify_permissions_and_delete_entity,
|
40
39
|
verify_permissions_and_get_entity,
|
41
40
|
verify_permissions_and_list_entities,
|
42
41
|
verify_permissions_and_update_entity,
|
43
42
|
)
|
44
43
|
from zenml.zen_server.rbac.models import ResourceType
|
45
|
-
from zenml.zen_server.
|
46
|
-
dehydrate_page,
|
47
|
-
get_allowed_resource_ids,
|
48
|
-
)
|
44
|
+
from zenml.zen_server.routers.projects_endpoints import workspace_router
|
49
45
|
from zenml.zen_server.utils import (
|
50
46
|
handle_exceptions,
|
51
47
|
make_dependable,
|
@@ -64,9 +60,45 @@ router = APIRouter(
|
|
64
60
|
)
|
65
61
|
|
66
62
|
|
63
|
+
@router.post(
|
64
|
+
"",
|
65
|
+
responses={401: error_response, 409: error_response, 422: error_response},
|
66
|
+
)
|
67
|
+
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
68
|
+
# and can be removed after the migration
|
69
|
+
@workspace_router.post(
|
70
|
+
"/{project_name_or_id}" + MODELS,
|
71
|
+
responses={401: error_response, 409: error_response, 422: error_response},
|
72
|
+
deprecated=True,
|
73
|
+
tags=["models"],
|
74
|
+
)
|
75
|
+
@handle_exceptions
|
76
|
+
def create_model(
|
77
|
+
model: ModelRequest,
|
78
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
79
|
+
_: AuthContext = Security(authorize),
|
80
|
+
) -> ModelResponse:
|
81
|
+
"""Creates a model.
|
82
|
+
|
83
|
+
Args:
|
84
|
+
model: Model to create.
|
85
|
+
project_name_or_id: Optional name or ID of the project.
|
86
|
+
|
87
|
+
Returns:
|
88
|
+
The created model.
|
89
|
+
"""
|
90
|
+
if project_name_or_id:
|
91
|
+
project = zen_store().get_project(project_name_or_id)
|
92
|
+
model.project = project.id
|
93
|
+
|
94
|
+
return verify_permissions_and_create_entity(
|
95
|
+
request_model=model,
|
96
|
+
create_method=zen_store().create_model,
|
97
|
+
)
|
98
|
+
|
99
|
+
|
67
100
|
@router.get(
|
68
101
|
"",
|
69
|
-
response_model=Page[ModelResponse],
|
70
102
|
responses={401: error_response, 404: error_response, 422: error_response},
|
71
103
|
)
|
72
104
|
@handle_exceptions
|
@@ -95,20 +127,19 @@ def list_models(
|
|
95
127
|
|
96
128
|
|
97
129
|
@router.get(
|
98
|
-
"/{
|
99
|
-
response_model=ModelResponse,
|
130
|
+
"/{model_id}",
|
100
131
|
responses={401: error_response, 404: error_response, 422: error_response},
|
101
132
|
)
|
102
133
|
@handle_exceptions
|
103
134
|
def get_model(
|
104
|
-
|
135
|
+
model_id: UUID,
|
105
136
|
hydrate: bool = True,
|
106
137
|
_: AuthContext = Security(authorize),
|
107
138
|
) -> ModelResponse:
|
108
139
|
"""Get a model by name or ID.
|
109
140
|
|
110
141
|
Args:
|
111
|
-
|
142
|
+
model_id: The ID of the model to get.
|
112
143
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
113
144
|
by including metadata fields in the response.
|
114
145
|
|
@@ -116,13 +147,12 @@ def get_model(
|
|
116
147
|
The model with the given name or ID.
|
117
148
|
"""
|
118
149
|
return verify_permissions_and_get_entity(
|
119
|
-
id=
|
150
|
+
id=model_id, get_method=zen_store().get_model, hydrate=hydrate
|
120
151
|
)
|
121
152
|
|
122
153
|
|
123
154
|
@router.put(
|
124
155
|
"/{model_id}",
|
125
|
-
response_model=ModelResponse,
|
126
156
|
responses={401: error_response, 404: error_response, 422: error_response},
|
127
157
|
)
|
128
158
|
@handle_exceptions
|
@@ -149,21 +179,21 @@ def update_model(
|
|
149
179
|
|
150
180
|
|
151
181
|
@router.delete(
|
152
|
-
"/{
|
182
|
+
"/{model_id}",
|
153
183
|
responses={401: error_response, 404: error_response, 422: error_response},
|
154
184
|
)
|
155
185
|
@handle_exceptions
|
156
186
|
def delete_model(
|
157
|
-
|
187
|
+
model_id: UUID,
|
158
188
|
_: AuthContext = Security(authorize),
|
159
189
|
) -> None:
|
160
|
-
"""Delete a model by
|
190
|
+
"""Delete a model by ID.
|
161
191
|
|
162
192
|
Args:
|
163
|
-
|
193
|
+
model_id: The ID of the model to delete.
|
164
194
|
"""
|
165
195
|
model = verify_permissions_and_delete_entity(
|
166
|
-
id=
|
196
|
+
id=model_id,
|
167
197
|
get_method=zen_store().get_model,
|
168
198
|
delete_method=zen_store().delete_model,
|
169
199
|
)
|
@@ -171,52 +201,3 @@ def delete_model(
|
|
171
201
|
if server_config().feature_gate_enabled:
|
172
202
|
if ResourceType.MODEL in server_config().reportable_resources:
|
173
203
|
report_decrement(ResourceType.MODEL, resource_id=model.id)
|
174
|
-
|
175
|
-
|
176
|
-
#################
|
177
|
-
# Model Versions
|
178
|
-
#################
|
179
|
-
|
180
|
-
|
181
|
-
@router.get(
|
182
|
-
"/{model_name_or_id}" + MODEL_VERSIONS,
|
183
|
-
response_model=Page[ModelVersionResponse],
|
184
|
-
responses={401: error_response, 404: error_response, 422: error_response},
|
185
|
-
)
|
186
|
-
@handle_exceptions
|
187
|
-
def list_model_versions(
|
188
|
-
model_name_or_id: Union[str, UUID],
|
189
|
-
model_version_filter_model: ModelVersionFilter = Depends(
|
190
|
-
make_dependable(ModelVersionFilter)
|
191
|
-
),
|
192
|
-
hydrate: bool = False,
|
193
|
-
auth_context: AuthContext = Security(authorize),
|
194
|
-
) -> Page[ModelVersionResponse]:
|
195
|
-
"""Get model versions according to query filters.
|
196
|
-
|
197
|
-
This endpoint serves the purpose of allowing scoped filtering by model_id.
|
198
|
-
|
199
|
-
Args:
|
200
|
-
model_name_or_id: The name or ID of the model to list in.
|
201
|
-
model_version_filter_model: Filter model used for pagination, sorting,
|
202
|
-
filtering.
|
203
|
-
hydrate: Flag deciding whether to hydrate the output model(s)
|
204
|
-
by including metadata fields in the response.
|
205
|
-
auth_context: The authentication context.
|
206
|
-
|
207
|
-
Returns:
|
208
|
-
The model versions according to query filters.
|
209
|
-
"""
|
210
|
-
allowed_model_ids = get_allowed_resource_ids(
|
211
|
-
resource_type=ResourceType.MODEL
|
212
|
-
)
|
213
|
-
model_version_filter_model.configure_rbac(
|
214
|
-
authenticated_user_id=auth_context.user.id, model_id=allowed_model_ids
|
215
|
-
)
|
216
|
-
|
217
|
-
model_versions = zen_store().list_model_versions(
|
218
|
-
model_name_or_id=model_name_or_id,
|
219
|
-
model_version_filter_model=model_version_filter_model,
|
220
|
-
hydrate=hydrate,
|
221
|
-
)
|
222
|
-
return dehydrate_page(model_versions)
|
@@ -13,6 +13,7 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Endpoint definitions for builds."""
|
15
15
|
|
16
|
+
from typing import Optional, Union
|
16
17
|
from uuid import UUID
|
17
18
|
|
18
19
|
from fastapi import APIRouter, Depends, Security
|
@@ -21,16 +22,19 @@ from zenml.constants import API, PIPELINE_BUILDS, VERSION_1
|
|
21
22
|
from zenml.models import (
|
22
23
|
Page,
|
23
24
|
PipelineBuildFilter,
|
25
|
+
PipelineBuildRequest,
|
24
26
|
PipelineBuildResponse,
|
25
27
|
)
|
26
28
|
from zenml.zen_server.auth import AuthContext, authorize
|
27
29
|
from zenml.zen_server.exceptions import error_response
|
28
30
|
from zenml.zen_server.rbac.endpoint_utils import (
|
31
|
+
verify_permissions_and_create_entity,
|
29
32
|
verify_permissions_and_delete_entity,
|
30
33
|
verify_permissions_and_get_entity,
|
31
34
|
verify_permissions_and_list_entities,
|
32
35
|
)
|
33
36
|
from zenml.zen_server.rbac.models import ResourceType
|
37
|
+
from zenml.zen_server.routers.projects_endpoints import workspace_router
|
34
38
|
from zenml.zen_server.utils import (
|
35
39
|
handle_exceptions,
|
36
40
|
make_dependable,
|
@@ -44,16 +48,61 @@ router = APIRouter(
|
|
44
48
|
)
|
45
49
|
|
46
50
|
|
51
|
+
@router.post(
|
52
|
+
"",
|
53
|
+
responses={401: error_response, 409: error_response, 422: error_response},
|
54
|
+
)
|
55
|
+
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
56
|
+
# and can be removed after the migration
|
57
|
+
@workspace_router.post(
|
58
|
+
"/{project_name_or_id}" + PIPELINE_BUILDS,
|
59
|
+
responses={401: error_response, 409: error_response, 422: error_response},
|
60
|
+
deprecated=True,
|
61
|
+
tags=["builds"],
|
62
|
+
)
|
63
|
+
@handle_exceptions
|
64
|
+
def create_build(
|
65
|
+
build: PipelineBuildRequest,
|
66
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
67
|
+
_: AuthContext = Security(authorize),
|
68
|
+
) -> PipelineBuildResponse:
|
69
|
+
"""Creates a build, optionally in a specific project.
|
70
|
+
|
71
|
+
Args:
|
72
|
+
build: Build to create.
|
73
|
+
project_name_or_id: Optional name or ID of the project.
|
74
|
+
|
75
|
+
Returns:
|
76
|
+
The created build.
|
77
|
+
"""
|
78
|
+
if project_name_or_id:
|
79
|
+
project = zen_store().get_project(project_name_or_id)
|
80
|
+
build.project = project.id
|
81
|
+
|
82
|
+
return verify_permissions_and_create_entity(
|
83
|
+
request_model=build,
|
84
|
+
create_method=zen_store().create_build,
|
85
|
+
)
|
86
|
+
|
87
|
+
|
47
88
|
@router.get(
|
48
89
|
"",
|
49
|
-
response_model=Page[PipelineBuildResponse],
|
50
90
|
responses={401: error_response, 404: error_response, 422: error_response},
|
51
91
|
)
|
92
|
+
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
93
|
+
# and can be removed after the migration
|
94
|
+
@workspace_router.get(
|
95
|
+
"/{project_name_or_id}" + PIPELINE_BUILDS,
|
96
|
+
responses={401: error_response, 404: error_response, 422: error_response},
|
97
|
+
deprecated=True,
|
98
|
+
tags=["builds"],
|
99
|
+
)
|
52
100
|
@handle_exceptions
|
53
101
|
def list_builds(
|
54
102
|
build_filter_model: PipelineBuildFilter = Depends(
|
55
103
|
make_dependable(PipelineBuildFilter)
|
56
104
|
),
|
105
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
57
106
|
hydrate: bool = False,
|
58
107
|
_: AuthContext = Security(authorize),
|
59
108
|
) -> Page[PipelineBuildResponse]:
|
@@ -62,12 +111,16 @@ def list_builds(
|
|
62
111
|
Args:
|
63
112
|
build_filter_model: Filter model used for pagination, sorting,
|
64
113
|
filtering.
|
114
|
+
project_name_or_id: Optional name or ID of the project to filter by.
|
65
115
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
66
116
|
by including metadata fields in the response.
|
67
117
|
|
68
118
|
Returns:
|
69
|
-
List of build objects.
|
119
|
+
List of build objects matching the filter criteria.
|
70
120
|
"""
|
121
|
+
if project_name_or_id:
|
122
|
+
build_filter_model.project = project_name_or_id
|
123
|
+
|
71
124
|
return verify_permissions_and_list_entities(
|
72
125
|
filter_model=build_filter_model,
|
73
126
|
resource_type=ResourceType.PIPELINE_BUILD,
|
@@ -78,7 +131,6 @@ def list_builds(
|
|
78
131
|
|
79
132
|
@router.get(
|
80
133
|
"/{build_id}",
|
81
|
-
response_model=PipelineBuildResponse,
|
82
134
|
responses={401: error_response, 404: error_response, 422: error_response},
|
83
135
|
)
|
84
136
|
@handle_exceptions
|
@@ -13,6 +13,7 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Endpoint definitions for deployments."""
|
15
15
|
|
16
|
+
from typing import Optional, Union
|
16
17
|
from uuid import UUID
|
17
18
|
|
18
19
|
from fastapi import APIRouter, Depends, Security
|
@@ -21,16 +22,19 @@ from zenml.constants import API, PIPELINE_DEPLOYMENTS, VERSION_1
|
|
21
22
|
from zenml.models import (
|
22
23
|
Page,
|
23
24
|
PipelineDeploymentFilter,
|
25
|
+
PipelineDeploymentRequest,
|
24
26
|
PipelineDeploymentResponse,
|
25
27
|
)
|
26
28
|
from zenml.zen_server.auth import AuthContext, authorize
|
27
29
|
from zenml.zen_server.exceptions import error_response
|
28
30
|
from zenml.zen_server.rbac.endpoint_utils import (
|
31
|
+
verify_permissions_and_create_entity,
|
29
32
|
verify_permissions_and_delete_entity,
|
30
33
|
verify_permissions_and_get_entity,
|
31
34
|
verify_permissions_and_list_entities,
|
32
35
|
)
|
33
36
|
from zenml.zen_server.rbac.models import ResourceType
|
37
|
+
from zenml.zen_server.routers.projects_endpoints import workspace_router
|
34
38
|
from zenml.zen_server.utils import (
|
35
39
|
handle_exceptions,
|
36
40
|
make_dependable,
|
@@ -46,30 +50,79 @@ router = APIRouter(
|
|
46
50
|
)
|
47
51
|
|
48
52
|
|
53
|
+
@router.post(
|
54
|
+
"",
|
55
|
+
responses={401: error_response, 409: error_response, 422: error_response},
|
56
|
+
)
|
57
|
+
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
58
|
+
# and can be removed after the migration
|
59
|
+
@workspace_router.post(
|
60
|
+
"/{project_name_or_id}" + PIPELINE_DEPLOYMENTS,
|
61
|
+
responses={401: error_response, 409: error_response, 422: error_response},
|
62
|
+
deprecated=True,
|
63
|
+
tags=["deployments"],
|
64
|
+
)
|
65
|
+
@handle_exceptions
|
66
|
+
def create_deployment(
|
67
|
+
deployment: PipelineDeploymentRequest,
|
68
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
69
|
+
_: AuthContext = Security(authorize),
|
70
|
+
) -> PipelineDeploymentResponse:
|
71
|
+
"""Creates a deployment.
|
72
|
+
|
73
|
+
Args:
|
74
|
+
deployment: Deployment to create.
|
75
|
+
project_name_or_id: Optional name or ID of the project.
|
76
|
+
|
77
|
+
Returns:
|
78
|
+
The created deployment.
|
79
|
+
"""
|
80
|
+
if project_name_or_id:
|
81
|
+
project = zen_store().get_project(project_name_or_id)
|
82
|
+
deployment.project = project.id
|
83
|
+
|
84
|
+
return verify_permissions_and_create_entity(
|
85
|
+
request_model=deployment,
|
86
|
+
create_method=zen_store().create_deployment,
|
87
|
+
)
|
88
|
+
|
89
|
+
|
49
90
|
@router.get(
|
50
91
|
"",
|
51
|
-
response_model=Page[PipelineDeploymentResponse],
|
52
92
|
responses={401: error_response, 404: error_response, 422: error_response},
|
53
93
|
)
|
94
|
+
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
95
|
+
# and can be removed after the migration
|
96
|
+
@workspace_router.get(
|
97
|
+
"/{project_name_or_id}" + PIPELINE_DEPLOYMENTS,
|
98
|
+
responses={401: error_response, 404: error_response, 422: error_response},
|
99
|
+
deprecated=True,
|
100
|
+
tags=["deployments"],
|
101
|
+
)
|
54
102
|
@handle_exceptions
|
55
103
|
def list_deployments(
|
56
104
|
deployment_filter_model: PipelineDeploymentFilter = Depends(
|
57
105
|
make_dependable(PipelineDeploymentFilter)
|
58
106
|
),
|
107
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
59
108
|
hydrate: bool = False,
|
60
109
|
_: AuthContext = Security(authorize),
|
61
110
|
) -> Page[PipelineDeploymentResponse]:
|
62
|
-
"""Gets a list of
|
111
|
+
"""Gets a list of deployments.
|
63
112
|
|
64
113
|
Args:
|
65
114
|
deployment_filter_model: Filter model used for pagination, sorting,
|
66
115
|
filtering.
|
116
|
+
project_name_or_id: Optional name or ID of the project to filter by.
|
67
117
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
68
118
|
by including metadata fields in the response.
|
69
119
|
|
70
120
|
Returns:
|
71
|
-
List of deployment objects.
|
121
|
+
List of deployment objects matching the filter criteria.
|
72
122
|
"""
|
123
|
+
if project_name_or_id:
|
124
|
+
deployment_filter_model.project = project_name_or_id
|
125
|
+
|
73
126
|
return verify_permissions_and_list_entities(
|
74
127
|
filter_model=deployment_filter_model,
|
75
128
|
resource_type=ResourceType.PIPELINE_DEPLOYMENT,
|
@@ -80,7 +133,6 @@ def list_deployments(
|
|
80
133
|
|
81
134
|
@router.get(
|
82
135
|
"/{deployment_id}",
|
83
|
-
response_model=PipelineDeploymentResponse,
|
84
136
|
responses={401: error_response, 404: error_response, 422: error_response},
|
85
137
|
)
|
86
138
|
@handle_exceptions
|
@@ -13,6 +13,7 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Endpoint definitions for pipelines."""
|
15
15
|
|
16
|
+
from typing import Optional, Union
|
16
17
|
from uuid import UUID
|
17
18
|
|
18
19
|
from fastapi import APIRouter, Depends, Security
|
@@ -26,6 +27,7 @@ from zenml.constants import (
|
|
26
27
|
from zenml.models import (
|
27
28
|
Page,
|
28
29
|
PipelineFilter,
|
30
|
+
PipelineRequest,
|
29
31
|
PipelineResponse,
|
30
32
|
PipelineRunFilter,
|
31
33
|
PipelineRunResponse,
|
@@ -33,14 +35,18 @@ from zenml.models import (
|
|
33
35
|
)
|
34
36
|
from zenml.zen_server.auth import AuthContext, authorize
|
35
37
|
from zenml.zen_server.exceptions import error_response
|
36
|
-
from zenml.zen_server.feature_gate.endpoint_utils import
|
38
|
+
from zenml.zen_server.feature_gate.endpoint_utils import (
|
39
|
+
report_decrement,
|
40
|
+
)
|
37
41
|
from zenml.zen_server.rbac.endpoint_utils import (
|
42
|
+
verify_permissions_and_create_entity,
|
38
43
|
verify_permissions_and_delete_entity,
|
39
44
|
verify_permissions_and_get_entity,
|
40
45
|
verify_permissions_and_list_entities,
|
41
46
|
verify_permissions_and_update_entity,
|
42
47
|
)
|
43
48
|
from zenml.zen_server.rbac.models import ResourceType
|
49
|
+
from zenml.zen_server.routers.projects_endpoints import workspace_router
|
44
50
|
from zenml.zen_server.utils import (
|
45
51
|
handle_exceptions,
|
46
52
|
make_dependable,
|
@@ -55,15 +61,70 @@ router = APIRouter(
|
|
55
61
|
)
|
56
62
|
|
57
63
|
|
64
|
+
@router.post(
|
65
|
+
"",
|
66
|
+
responses={401: error_response, 409: error_response, 422: error_response},
|
67
|
+
)
|
68
|
+
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
69
|
+
# and can be removed after the migration
|
70
|
+
@workspace_router.post(
|
71
|
+
"/{project_name_or_id}" + PIPELINES,
|
72
|
+
responses={401: error_response, 409: error_response, 422: error_response},
|
73
|
+
deprecated=True,
|
74
|
+
tags=["pipelines"],
|
75
|
+
)
|
76
|
+
@handle_exceptions
|
77
|
+
def create_pipeline(
|
78
|
+
pipeline: PipelineRequest,
|
79
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
80
|
+
_: AuthContext = Security(authorize),
|
81
|
+
) -> PipelineResponse:
|
82
|
+
"""Creates a pipeline.
|
83
|
+
|
84
|
+
Args:
|
85
|
+
pipeline: Pipeline to create.
|
86
|
+
project_name_or_id: Optional name or ID of the project.
|
87
|
+
|
88
|
+
Returns:
|
89
|
+
The created pipeline.
|
90
|
+
"""
|
91
|
+
if project_name_or_id:
|
92
|
+
project = zen_store().get_project(project_name_or_id)
|
93
|
+
pipeline.project = project.id
|
94
|
+
|
95
|
+
# We limit pipeline namespaces, not pipeline versions
|
96
|
+
skip_entitlements = (
|
97
|
+
zen_store().count_pipelines(
|
98
|
+
PipelineFilter(name=pipeline.name, project=pipeline.project)
|
99
|
+
)
|
100
|
+
> 0
|
101
|
+
)
|
102
|
+
|
103
|
+
return verify_permissions_and_create_entity(
|
104
|
+
request_model=pipeline,
|
105
|
+
create_method=zen_store().create_pipeline,
|
106
|
+
skip_entitlements=skip_entitlements,
|
107
|
+
)
|
108
|
+
|
109
|
+
|
58
110
|
@router.get(
|
59
111
|
"",
|
60
112
|
responses={401: error_response, 404: error_response, 422: error_response},
|
61
113
|
)
|
114
|
+
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
115
|
+
# and can be removed after the migration
|
116
|
+
@workspace_router.get(
|
117
|
+
"/{project_name_or_id}" + PIPELINES,
|
118
|
+
responses={401: error_response, 404: error_response, 422: error_response},
|
119
|
+
deprecated=True,
|
120
|
+
tags=["pipelines"],
|
121
|
+
)
|
62
122
|
@handle_exceptions
|
63
123
|
def list_pipelines(
|
64
124
|
pipeline_filter_model: PipelineFilter = Depends(
|
65
125
|
make_dependable(PipelineFilter)
|
66
126
|
),
|
127
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
67
128
|
hydrate: bool = False,
|
68
129
|
_: AuthContext = Security(authorize),
|
69
130
|
) -> Page[PipelineResponse]:
|
@@ -72,12 +133,16 @@ def list_pipelines(
|
|
72
133
|
Args:
|
73
134
|
pipeline_filter_model: Filter model used for pagination, sorting,
|
74
135
|
filtering.
|
136
|
+
project_name_or_id: Optional name or ID of the project to filter by.
|
75
137
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
76
138
|
by including metadata fields in the response.
|
77
139
|
|
78
140
|
Returns:
|
79
|
-
List of pipeline objects.
|
141
|
+
List of pipeline objects matching the filter criteria.
|
80
142
|
"""
|
143
|
+
if project_name_or_id:
|
144
|
+
pipeline_filter_model.project = project_name_or_id
|
145
|
+
|
81
146
|
return verify_permissions_and_list_entities(
|
82
147
|
filter_model=pipeline_filter_model,
|
83
148
|
resource_type=ResourceType.PIPELINE,
|
@@ -160,7 +225,9 @@ def delete_pipeline(
|
|
160
225
|
|
161
226
|
should_decrement = (
|
162
227
|
ResourceType.PIPELINE in server_config().reportable_resources
|
163
|
-
and zen_store().count_pipelines(
|
228
|
+
and zen_store().count_pipelines(
|
229
|
+
PipelineFilter(name=pipeline.name, project=pipeline.project.id)
|
230
|
+
)
|
164
231
|
== 0
|
165
232
|
)
|
166
233
|
if should_decrement:
|