zenml-nightly 0.75.0.dev20250313__py3-none-any.whl → 0.75.0.dev20250315__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/analytics/context.py +4 -4
- zenml/analytics/enums.py +2 -2
- zenml/artifacts/utils.py +2 -2
- zenml/cli/__init__.py +8 -9
- zenml/cli/base.py +2 -2
- zenml/cli/code_repository.py +1 -1
- zenml/cli/login.py +21 -18
- zenml/cli/pipeline.py +3 -3
- zenml/cli/project.py +172 -0
- zenml/cli/server.py +5 -5
- zenml/cli/service_accounts.py +0 -1
- zenml/cli/service_connectors.py +15 -16
- zenml/cli/stack.py +0 -2
- zenml/cli/stack_components.py +2 -2
- zenml/cli/utils.py +3 -3
- zenml/client.py +352 -341
- zenml/config/global_config.py +41 -43
- zenml/config/server_config.py +9 -9
- zenml/constants.py +5 -3
- zenml/event_hub/event_hub.py +1 -1
- zenml/integrations/gcp/__init__.py +1 -0
- zenml/integrations/gcp/flavors/vertex_orchestrator_flavor.py +5 -0
- zenml/integrations/gcp/flavors/vertex_step_operator_flavor.py +5 -28
- zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +125 -78
- zenml/integrations/gcp/service_connectors/gcp_service_connector.py +7 -6
- zenml/integrations/gcp/vertex_custom_job_parameters.py +50 -0
- zenml/integrations/mlflow/steps/mlflow_registry.py +3 -3
- 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 +2 -0
- zenml/login/credentials.py +26 -27
- zenml/login/credentials_store.py +5 -5
- zenml/login/pro/client.py +9 -9
- zenml/login/pro/utils.py +8 -8
- zenml/login/pro/{tenant → workspace}/__init__.py +1 -1
- zenml/login/pro/{tenant → workspace}/client.py +25 -25
- zenml/login/pro/{tenant → workspace}/models.py +27 -28
- zenml/model/model.py +2 -2
- zenml/model_registries/base_model_registry.py +1 -1
- zenml/models/__init__.py +29 -29
- zenml/models/v2/base/filter.py +1 -1
- zenml/models/v2/base/scoped.py +49 -53
- zenml/models/v2/core/action.py +12 -12
- zenml/models/v2/core/artifact.py +15 -15
- zenml/models/v2/core/artifact_version.py +15 -15
- zenml/models/v2/core/code_repository.py +12 -12
- zenml/models/v2/core/event_source.py +12 -12
- zenml/models/v2/core/model.py +26 -18
- zenml/models/v2/core/model_version.py +15 -15
- zenml/models/v2/core/pipeline.py +15 -15
- 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 +16 -16
- zenml/models/v2/core/project.py +203 -0
- zenml/models/v2/core/run_metadata.py +2 -2
- zenml/models/v2/core/run_template.py +15 -15
- zenml/models/v2/core/schedule.py +12 -12
- zenml/models/v2/core/secret.py +1 -1
- zenml/models/v2/core/service.py +14 -14
- zenml/models/v2/core/step_run.py +13 -13
- zenml/models/v2/core/tag.py +96 -3
- zenml/models/v2/core/trigger.py +13 -13
- zenml/models/v2/core/trigger_execution.py +2 -2
- zenml/models/v2/core/user.py +0 -17
- zenml/models/v2/misc/server_models.py +6 -6
- zenml/models/v2/misc/statistics.py +4 -4
- zenml/orchestrators/cache_utils.py +7 -7
- zenml/orchestrators/input_utils.py +1 -1
- zenml/orchestrators/step_launcher.py +1 -1
- zenml/orchestrators/step_run_utils.py +3 -3
- zenml/orchestrators/utils.py +4 -4
- zenml/pipelines/build_utils.py +2 -2
- zenml/pipelines/pipeline_definition.py +5 -5
- zenml/pipelines/run_utils.py +1 -1
- zenml/service_connectors/service_connector.py +0 -3
- zenml/service_connectors/service_connector_utils.py +0 -1
- zenml/stack/stack.py +0 -1
- zenml/steps/base_step.py +10 -2
- zenml/utils/dashboard_utils.py +1 -1
- zenml/utils/tag_utils.py +0 -12
- zenml/zen_server/cloud_utils.py +3 -3
- zenml/zen_server/feature_gate/endpoint_utils.py +1 -1
- zenml/zen_server/feature_gate/zenml_cloud_feature_gate.py +1 -1
- zenml/zen_server/rbac/endpoint_utils.py +17 -17
- zenml/zen_server/rbac/models.py +47 -22
- zenml/zen_server/rbac/rbac_sql_zen_store.py +3 -3
- zenml/zen_server/rbac/utils.py +23 -25
- zenml/zen_server/rbac/zenml_cloud_rbac.py +7 -74
- zenml/zen_server/routers/artifact_version_endpoints.py +10 -10
- zenml/zen_server/routers/auth_endpoints.py +6 -6
- zenml/zen_server/routers/code_repositories_endpoints.py +12 -14
- zenml/zen_server/routers/model_versions_endpoints.py +13 -15
- zenml/zen_server/routers/models_endpoints.py +7 -9
- zenml/zen_server/routers/pipeline_builds_endpoints.py +14 -16
- zenml/zen_server/routers/pipeline_deployments_endpoints.py +13 -15
- zenml/zen_server/routers/pipelines_endpoints.py +16 -18
- zenml/zen_server/routers/{workspaces_endpoints.py → projects_endpoints.py} +111 -68
- zenml/zen_server/routers/run_metadata_endpoints.py +7 -9
- zenml/zen_server/routers/run_templates_endpoints.py +15 -17
- zenml/zen_server/routers/runs_endpoints.py +12 -14
- zenml/zen_server/routers/schedule_endpoints.py +12 -14
- zenml/zen_server/routers/secrets_endpoints.py +1 -3
- zenml/zen_server/routers/server_endpoints.py +7 -7
- zenml/zen_server/routers/service_connectors_endpoints.py +11 -13
- zenml/zen_server/routers/service_endpoints.py +7 -9
- zenml/zen_server/routers/stack_components_endpoints.py +9 -11
- zenml/zen_server/routers/stacks_endpoints.py +9 -11
- zenml/zen_server/routers/steps_endpoints.py +6 -6
- zenml/zen_server/routers/users_endpoints.py +5 -43
- zenml/zen_server/template_execution/utils.py +4 -4
- zenml/zen_server/utils.py +10 -10
- zenml/zen_server/zen_server_api.py +6 -5
- zenml/zen_stores/base_zen_store.py +38 -42
- zenml/zen_stores/migrations/versions/12eff0206201_rename_workspace_to_project.py +768 -0
- zenml/zen_stores/migrations/versions/41b28cae31ce_make_artifacts_workspace_scoped.py +3 -3
- zenml/zen_stores/migrations/versions/cbc6acd71f92_add_workspace_display_name.py +58 -0
- zenml/zen_stores/rest_zen_store.py +55 -63
- zenml/zen_stores/schemas/__init__.py +2 -2
- zenml/zen_stores/schemas/action_schemas.py +9 -9
- zenml/zen_stores/schemas/artifact_schemas.py +15 -17
- zenml/zen_stores/schemas/code_repository_schemas.py +16 -18
- zenml/zen_stores/schemas/event_source_schemas.py +9 -9
- zenml/zen_stores/schemas/model_schemas.py +15 -17
- zenml/zen_stores/schemas/pipeline_build_schemas.py +7 -7
- zenml/zen_stores/schemas/pipeline_deployment_schemas.py +7 -7
- zenml/zen_stores/schemas/pipeline_run_schemas.py +9 -9
- zenml/zen_stores/schemas/pipeline_schemas.py +9 -9
- zenml/zen_stores/schemas/{workspace_schemas.py → project_schemas.py} +47 -41
- zenml/zen_stores/schemas/run_metadata_schemas.py +5 -5
- zenml/zen_stores/schemas/run_template_schemas.py +9 -9
- zenml/zen_stores/schemas/schedule_schema.py +9 -9
- zenml/zen_stores/schemas/service_schemas.py +7 -7
- zenml/zen_stores/schemas/step_run_schemas.py +7 -7
- zenml/zen_stores/schemas/trigger_schemas.py +9 -9
- zenml/zen_stores/schemas/user_schemas.py +0 -12
- zenml/zen_stores/sql_zen_store.py +318 -275
- zenml/zen_stores/zen_store_interface.py +56 -70
- {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250315.dist-info}/METADATA +1 -1
- {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250315.dist-info}/RECORD +143 -140
- zenml/cli/workspace.py +0 -160
- zenml/models/v2/core/workspace.py +0 -131
- {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250315.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250315.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250315.dist-info}/entry_points.txt +0 -0
@@ -11,7 +11,7 @@
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
12
12
|
# or implied. See the License for the specific language governing
|
13
13
|
# permissions and limitations under the License.
|
14
|
-
"""Endpoint definitions for
|
14
|
+
"""Endpoint definitions for projects."""
|
15
15
|
|
16
16
|
from typing import Union
|
17
17
|
from uuid import UUID
|
@@ -20,6 +20,7 @@ from fastapi import APIRouter, Depends, Security
|
|
20
20
|
|
21
21
|
from zenml.constants import (
|
22
22
|
API,
|
23
|
+
PROJECTS,
|
23
24
|
STATISTICS,
|
24
25
|
VERSION_1,
|
25
26
|
WORKSPACES,
|
@@ -28,11 +29,11 @@ from zenml.models import (
|
|
28
29
|
Page,
|
29
30
|
PipelineFilter,
|
30
31
|
PipelineRunFilter,
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
ProjectFilter,
|
33
|
+
ProjectRequest,
|
34
|
+
ProjectResponse,
|
35
|
+
ProjectStatistics,
|
36
|
+
ProjectUpdate,
|
36
37
|
)
|
37
38
|
from zenml.zen_server.auth import AuthContext, authorize
|
38
39
|
from zenml.zen_server.exceptions import error_response
|
@@ -53,188 +54,230 @@ from zenml.zen_server.utils import (
|
|
53
54
|
zen_store,
|
54
55
|
)
|
55
56
|
|
56
|
-
|
57
|
+
workspace_router = APIRouter(
|
57
58
|
prefix=API + VERSION_1 + WORKSPACES,
|
58
59
|
tags=["workspaces"],
|
59
60
|
responses={401: error_response},
|
60
61
|
)
|
61
62
|
|
63
|
+
router = APIRouter(
|
64
|
+
prefix=API + VERSION_1 + PROJECTS,
|
65
|
+
tags=["projects"],
|
66
|
+
responses={401: error_response},
|
67
|
+
)
|
68
|
+
|
62
69
|
|
70
|
+
# TODO: kept for backwards compatibility only; to be removed after the migration
|
71
|
+
@workspace_router.get(
|
72
|
+
"",
|
73
|
+
responses={401: error_response, 404: error_response, 422: error_response},
|
74
|
+
deprecated=True,
|
75
|
+
)
|
63
76
|
@router.get(
|
64
77
|
"",
|
65
78
|
responses={401: error_response, 404: error_response, 422: error_response},
|
66
79
|
)
|
67
80
|
@handle_exceptions
|
68
|
-
def
|
69
|
-
|
70
|
-
make_dependable(
|
81
|
+
def list_projects(
|
82
|
+
project_filter_model: ProjectFilter = Depends(
|
83
|
+
make_dependable(ProjectFilter)
|
71
84
|
),
|
72
85
|
hydrate: bool = False,
|
73
86
|
_: AuthContext = Security(authorize),
|
74
|
-
) -> Page[
|
75
|
-
"""Lists all
|
87
|
+
) -> Page[ProjectResponse]:
|
88
|
+
"""Lists all projects in the organization.
|
76
89
|
|
77
90
|
Args:
|
78
|
-
|
91
|
+
project_filter_model: Filter model used for pagination, sorting,
|
79
92
|
filtering,
|
80
93
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
81
94
|
by including metadata fields in the response.
|
82
95
|
|
83
96
|
Returns:
|
84
|
-
A list of
|
97
|
+
A list of projects.
|
85
98
|
"""
|
86
99
|
return verify_permissions_and_list_entities(
|
87
|
-
filter_model=
|
88
|
-
resource_type=ResourceType.
|
89
|
-
list_method=zen_store().
|
100
|
+
filter_model=project_filter_model,
|
101
|
+
resource_type=ResourceType.PROJECT,
|
102
|
+
list_method=zen_store().list_projects,
|
90
103
|
hydrate=hydrate,
|
91
104
|
)
|
92
105
|
|
93
106
|
|
107
|
+
# TODO: kept for backwards compatibility only; to be removed after the migration
|
108
|
+
@workspace_router.post(
|
109
|
+
"",
|
110
|
+
responses={401: error_response, 409: error_response, 422: error_response},
|
111
|
+
deprecated=True,
|
112
|
+
)
|
94
113
|
@router.post(
|
95
114
|
"",
|
96
115
|
responses={401: error_response, 409: error_response, 422: error_response},
|
97
116
|
)
|
98
117
|
@handle_exceptions
|
99
|
-
def
|
100
|
-
|
118
|
+
def create_project(
|
119
|
+
project_request: ProjectRequest,
|
101
120
|
_: AuthContext = Security(authorize),
|
102
|
-
) ->
|
103
|
-
"""Creates a
|
121
|
+
) -> ProjectResponse:
|
122
|
+
"""Creates a project based on the requestBody.
|
104
123
|
|
105
124
|
# noqa: DAR401
|
106
125
|
|
107
126
|
Args:
|
108
|
-
|
127
|
+
project_request: Project to create.
|
109
128
|
|
110
129
|
Returns:
|
111
|
-
The created
|
130
|
+
The created project.
|
112
131
|
"""
|
113
132
|
return verify_permissions_and_create_entity(
|
114
|
-
request_model=
|
115
|
-
create_method=zen_store().
|
133
|
+
request_model=project_request,
|
134
|
+
create_method=zen_store().create_project,
|
116
135
|
)
|
117
136
|
|
118
137
|
|
138
|
+
# TODO: kept for backwards compatibility only; to be removed after the migration
|
139
|
+
@workspace_router.get(
|
140
|
+
"/{project_name_or_id}",
|
141
|
+
responses={401: error_response, 404: error_response, 422: error_response},
|
142
|
+
deprecated=True,
|
143
|
+
)
|
119
144
|
@router.get(
|
120
|
-
"/{
|
145
|
+
"/{project_name_or_id}",
|
121
146
|
responses={401: error_response, 404: error_response, 422: error_response},
|
122
147
|
)
|
123
148
|
@handle_exceptions
|
124
|
-
def
|
125
|
-
|
149
|
+
def get_project(
|
150
|
+
project_name_or_id: Union[str, UUID],
|
126
151
|
hydrate: bool = True,
|
127
152
|
_: AuthContext = Security(authorize),
|
128
|
-
) ->
|
129
|
-
"""Get a
|
153
|
+
) -> ProjectResponse:
|
154
|
+
"""Get a project for given name.
|
130
155
|
|
131
156
|
# noqa: DAR401
|
132
157
|
|
133
158
|
Args:
|
134
|
-
|
159
|
+
project_name_or_id: Name or ID of the project.
|
135
160
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
136
161
|
by including metadata fields in the response.
|
137
162
|
|
138
163
|
Returns:
|
139
|
-
The requested
|
164
|
+
The requested project.
|
140
165
|
"""
|
141
166
|
return verify_permissions_and_get_entity(
|
142
|
-
id=
|
143
|
-
get_method=zen_store().
|
167
|
+
id=project_name_or_id,
|
168
|
+
get_method=zen_store().get_project,
|
144
169
|
hydrate=hydrate,
|
145
170
|
)
|
146
171
|
|
147
172
|
|
173
|
+
# TODO: kept for backwards compatibility only; to be removed after the migration
|
174
|
+
@workspace_router.put(
|
175
|
+
"/{project_name_or_id}",
|
176
|
+
responses={401: error_response, 404: error_response, 422: error_response},
|
177
|
+
deprecated=True,
|
178
|
+
)
|
148
179
|
@router.put(
|
149
|
-
"/{
|
180
|
+
"/{project_name_or_id}",
|
150
181
|
responses={401: error_response, 404: error_response, 422: error_response},
|
151
182
|
)
|
152
183
|
@handle_exceptions
|
153
|
-
def
|
154
|
-
|
155
|
-
|
184
|
+
def update_project(
|
185
|
+
project_name_or_id: UUID,
|
186
|
+
project_update: ProjectUpdate,
|
156
187
|
_: AuthContext = Security(authorize),
|
157
|
-
) ->
|
158
|
-
"""Get a
|
188
|
+
) -> ProjectResponse:
|
189
|
+
"""Get a project for given name.
|
159
190
|
|
160
191
|
# noqa: DAR401
|
161
192
|
|
162
193
|
Args:
|
163
|
-
|
164
|
-
|
194
|
+
project_name_or_id: Name or ID of the project to update.
|
195
|
+
project_update: the project to use to update
|
165
196
|
|
166
197
|
Returns:
|
167
|
-
The updated
|
198
|
+
The updated project.
|
168
199
|
"""
|
169
200
|
return verify_permissions_and_update_entity(
|
170
|
-
id=
|
171
|
-
update_model=
|
172
|
-
get_method=zen_store().
|
173
|
-
update_method=zen_store().
|
201
|
+
id=project_name_or_id,
|
202
|
+
update_model=project_update,
|
203
|
+
get_method=zen_store().get_project,
|
204
|
+
update_method=zen_store().update_project,
|
174
205
|
)
|
175
206
|
|
176
207
|
|
208
|
+
# TODO: kept for backwards compatibility only; to be removed after the migration
|
209
|
+
@workspace_router.delete(
|
210
|
+
"/{project_name_or_id}",
|
211
|
+
responses={401: error_response, 404: error_response, 422: error_response},
|
212
|
+
deprecated=True,
|
213
|
+
)
|
177
214
|
@router.delete(
|
178
|
-
"/{
|
215
|
+
"/{project_name_or_id}",
|
179
216
|
responses={401: error_response, 404: error_response, 422: error_response},
|
180
217
|
)
|
181
218
|
@handle_exceptions
|
182
|
-
def
|
183
|
-
|
219
|
+
def delete_project(
|
220
|
+
project_name_or_id: Union[str, UUID],
|
184
221
|
_: AuthContext = Security(authorize),
|
185
222
|
) -> None:
|
186
|
-
"""Deletes a
|
223
|
+
"""Deletes a project.
|
187
224
|
|
188
225
|
Args:
|
189
|
-
|
226
|
+
project_name_or_id: Name or ID of the project.
|
190
227
|
"""
|
191
228
|
verify_permissions_and_delete_entity(
|
192
|
-
id=
|
193
|
-
get_method=zen_store().
|
194
|
-
delete_method=zen_store().
|
229
|
+
id=project_name_or_id,
|
230
|
+
get_method=zen_store().get_project,
|
231
|
+
delete_method=zen_store().delete_project,
|
195
232
|
)
|
196
233
|
|
197
234
|
|
235
|
+
# TODO: kept for backwards compatibility only; to be removed after the migration
|
236
|
+
@workspace_router.get(
|
237
|
+
"/{project_name_or_id}" + STATISTICS,
|
238
|
+
responses={401: error_response, 404: error_response, 422: error_response},
|
239
|
+
deprecated=True,
|
240
|
+
)
|
198
241
|
@router.get(
|
199
|
-
"/{
|
242
|
+
"/{project_name_or_id}" + STATISTICS,
|
200
243
|
responses={401: error_response, 404: error_response, 422: error_response},
|
201
244
|
)
|
202
245
|
@handle_exceptions
|
203
|
-
def
|
204
|
-
|
246
|
+
def get_project_statistics(
|
247
|
+
project_name_or_id: Union[str, UUID],
|
205
248
|
auth_context: AuthContext = Security(authorize),
|
206
|
-
) ->
|
207
|
-
"""Gets statistics of a
|
249
|
+
) -> ProjectStatistics:
|
250
|
+
"""Gets statistics of a project.
|
208
251
|
|
209
252
|
# noqa: DAR401
|
210
253
|
|
211
254
|
Args:
|
212
|
-
|
255
|
+
project_name_or_id: Name or ID of the project to get statistics for.
|
213
256
|
auth_context: Authentication context.
|
214
257
|
|
215
258
|
Returns:
|
216
|
-
|
259
|
+
Project statistics.
|
217
260
|
"""
|
218
|
-
|
219
|
-
id=
|
220
|
-
get_method=zen_store().
|
261
|
+
project = verify_permissions_and_get_entity(
|
262
|
+
id=project_name_or_id,
|
263
|
+
get_method=zen_store().get_project,
|
221
264
|
)
|
222
265
|
|
223
266
|
user_id = auth_context.user.id
|
224
267
|
|
225
|
-
run_filter = PipelineRunFilter(
|
268
|
+
run_filter = PipelineRunFilter(project=project.id)
|
226
269
|
run_filter.configure_rbac(
|
227
270
|
authenticated_user_id=user_id,
|
228
271
|
id=get_allowed_resource_ids(resource_type=ResourceType.PIPELINE_RUN),
|
229
272
|
)
|
230
273
|
|
231
|
-
pipeline_filter = PipelineFilter(
|
274
|
+
pipeline_filter = PipelineFilter(project=project.id)
|
232
275
|
pipeline_filter.configure_rbac(
|
233
276
|
authenticated_user_id=user_id,
|
234
277
|
id=get_allowed_resource_ids(resource_type=ResourceType.PIPELINE),
|
235
278
|
)
|
236
279
|
|
237
|
-
return
|
280
|
+
return ProjectStatistics(
|
238
281
|
pipelines=zen_store().count_pipelines(filter_model=pipeline_filter),
|
239
282
|
runs=zen_store().count_runs(filter_model=run_filter),
|
240
283
|
)
|
@@ -28,9 +28,7 @@ from zenml.zen_server.rbac.utils import (
|
|
28
28
|
batch_verify_permissions_for_models,
|
29
29
|
verify_permission_for_model,
|
30
30
|
)
|
31
|
-
from zenml.zen_server.routers.
|
32
|
-
router as workspace_router,
|
33
|
-
)
|
31
|
+
from zenml.zen_server.routers.projects_endpoints import workspace_router
|
34
32
|
from zenml.zen_server.utils import handle_exceptions, zen_store
|
35
33
|
|
36
34
|
router = APIRouter(
|
@@ -47,7 +45,7 @@ router = APIRouter(
|
|
47
45
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
48
46
|
# and can be removed after the migration
|
49
47
|
@workspace_router.post(
|
50
|
-
"/{
|
48
|
+
"/{project_name_or_id}" + RUN_METADATA,
|
51
49
|
responses={401: error_response, 409: error_response, 422: error_response},
|
52
50
|
deprecated=True,
|
53
51
|
tags=["run_metadata"],
|
@@ -55,22 +53,22 @@ router = APIRouter(
|
|
55
53
|
@handle_exceptions
|
56
54
|
def create_run_metadata(
|
57
55
|
run_metadata: RunMetadataRequest,
|
58
|
-
|
56
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
59
57
|
auth_context: AuthContext = Security(authorize),
|
60
58
|
) -> None:
|
61
59
|
"""Creates run metadata.
|
62
60
|
|
63
61
|
Args:
|
64
62
|
run_metadata: The run metadata to create.
|
65
|
-
|
63
|
+
project_name_or_id: Optional name or ID of the project.
|
66
64
|
auth_context: Authentication context.
|
67
65
|
|
68
66
|
Raises:
|
69
67
|
RuntimeError: If the resource type is not supported.
|
70
68
|
"""
|
71
|
-
if
|
72
|
-
|
73
|
-
run_metadata.
|
69
|
+
if project_name_or_id:
|
70
|
+
project = zen_store().get_project(project_name_or_id)
|
71
|
+
run_metadata.project = project.id
|
74
72
|
|
75
73
|
run_metadata.user = auth_context.user.id
|
76
74
|
|
@@ -41,9 +41,7 @@ from zenml.zen_server.rbac.endpoint_utils import (
|
|
41
41
|
)
|
42
42
|
from zenml.zen_server.rbac.models import Action, ResourceType
|
43
43
|
from zenml.zen_server.rbac.utils import verify_permission
|
44
|
-
from zenml.zen_server.routers.
|
45
|
-
router as workspace_router,
|
46
|
-
)
|
44
|
+
from zenml.zen_server.routers.projects_endpoints import workspace_router
|
47
45
|
from zenml.zen_server.utils import (
|
48
46
|
handle_exceptions,
|
49
47
|
make_dependable,
|
@@ -65,7 +63,7 @@ router = APIRouter(
|
|
65
63
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
66
64
|
# and can be removed after the migration
|
67
65
|
@workspace_router.post(
|
68
|
-
"/{
|
66
|
+
"/{project_name_or_id}" + RUN_TEMPLATES,
|
69
67
|
responses={401: error_response, 409: error_response, 422: error_response},
|
70
68
|
deprecated=True,
|
71
69
|
tags=["run_templates"],
|
@@ -73,21 +71,21 @@ router = APIRouter(
|
|
73
71
|
@handle_exceptions
|
74
72
|
def create_run_template(
|
75
73
|
run_template: RunTemplateRequest,
|
76
|
-
|
74
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
77
75
|
_: AuthContext = Security(authorize),
|
78
76
|
) -> RunTemplateResponse:
|
79
77
|
"""Create a run template.
|
80
78
|
|
81
79
|
Args:
|
82
80
|
run_template: Run template to create.
|
83
|
-
|
81
|
+
project_name_or_id: Optional name or ID of the project.
|
84
82
|
|
85
83
|
Returns:
|
86
84
|
The created run template.
|
87
85
|
"""
|
88
|
-
if
|
89
|
-
|
90
|
-
run_template.
|
86
|
+
if project_name_or_id:
|
87
|
+
project = zen_store().get_project(project_name_or_id)
|
88
|
+
run_template.project = project.id
|
91
89
|
|
92
90
|
return verify_permissions_and_create_entity(
|
93
91
|
request_model=run_template,
|
@@ -102,7 +100,7 @@ def create_run_template(
|
|
102
100
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
103
101
|
# and can be removed after the migration
|
104
102
|
@workspace_router.get(
|
105
|
-
"/{
|
103
|
+
"/{project_name_or_id}" + RUN_TEMPLATES,
|
106
104
|
responses={401: error_response, 404: error_response, 422: error_response},
|
107
105
|
deprecated=True,
|
108
106
|
tags=["run_templates"],
|
@@ -112,7 +110,7 @@ def list_run_templates(
|
|
112
110
|
filter_model: RunTemplateFilter = Depends(
|
113
111
|
make_dependable(RunTemplateFilter)
|
114
112
|
),
|
115
|
-
|
113
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
116
114
|
hydrate: bool = False,
|
117
115
|
_: AuthContext = Security(authorize),
|
118
116
|
) -> Page[RunTemplateResponse]:
|
@@ -121,15 +119,15 @@ def list_run_templates(
|
|
121
119
|
Args:
|
122
120
|
filter_model: Filter model used for pagination, sorting,
|
123
121
|
filtering.
|
124
|
-
|
122
|
+
project_name_or_id: Optional name or ID of the project.
|
125
123
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
126
124
|
by including metadata fields in the response.
|
127
125
|
|
128
126
|
Returns:
|
129
127
|
Page of run templates.
|
130
128
|
"""
|
131
|
-
if
|
132
|
-
filter_model.
|
129
|
+
if project_name_or_id:
|
130
|
+
filter_model.project = project_name_or_id
|
133
131
|
|
134
132
|
return verify_permissions_and_list_entities(
|
135
133
|
filter_model=filter_model,
|
@@ -253,18 +251,18 @@ if server_config().workload_manager_enabled:
|
|
253
251
|
hydrate=True,
|
254
252
|
)
|
255
253
|
analytics_handler.metadata = {
|
256
|
-
"
|
254
|
+
"project_id": template.project.id,
|
257
255
|
}
|
258
256
|
|
259
257
|
verify_permission(
|
260
258
|
resource_type=ResourceType.PIPELINE_DEPLOYMENT,
|
261
259
|
action=Action.CREATE,
|
262
|
-
|
260
|
+
project_id=template.project.id,
|
263
261
|
)
|
264
262
|
verify_permission(
|
265
263
|
resource_type=ResourceType.PIPELINE_RUN,
|
266
264
|
action=Action.CREATE,
|
267
|
-
|
265
|
+
project_id=template.project.id,
|
268
266
|
)
|
269
267
|
|
270
268
|
return run_template(
|
@@ -51,9 +51,7 @@ from zenml.zen_server.rbac.models import Action, ResourceType
|
|
51
51
|
from zenml.zen_server.rbac.utils import (
|
52
52
|
verify_permission_for_model,
|
53
53
|
)
|
54
|
-
from zenml.zen_server.routers.
|
55
|
-
router as workspace_router,
|
56
|
-
)
|
54
|
+
from zenml.zen_server.routers.projects_endpoints import workspace_router
|
57
55
|
from zenml.zen_server.utils import (
|
58
56
|
handle_exceptions,
|
59
57
|
make_dependable,
|
@@ -77,7 +75,7 @@ logger = get_logger(__name__)
|
|
77
75
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
78
76
|
# and can be removed after the migration
|
79
77
|
@workspace_router.post(
|
80
|
-
"/{
|
78
|
+
"/{project_name_or_id}" + RUNS,
|
81
79
|
responses={401: error_response, 409: error_response, 422: error_response},
|
82
80
|
deprecated=True,
|
83
81
|
tags=["runs"],
|
@@ -85,22 +83,22 @@ logger = get_logger(__name__)
|
|
85
83
|
@handle_exceptions
|
86
84
|
def get_or_create_pipeline_run(
|
87
85
|
pipeline_run: PipelineRunRequest,
|
88
|
-
|
86
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
89
87
|
_: AuthContext = Security(authorize),
|
90
88
|
) -> Tuple[PipelineRunResponse, bool]:
|
91
89
|
"""Get or create a pipeline run.
|
92
90
|
|
93
91
|
Args:
|
94
92
|
pipeline_run: Pipeline run to create.
|
95
|
-
|
93
|
+
project_name_or_id: Optional name or ID of the project.
|
96
94
|
|
97
95
|
Returns:
|
98
96
|
The pipeline run and a boolean indicating whether the run was created
|
99
97
|
or not.
|
100
98
|
"""
|
101
|
-
if
|
102
|
-
|
103
|
-
pipeline_run.
|
99
|
+
if project_name_or_id:
|
100
|
+
project = zen_store().get_project(project_name_or_id)
|
101
|
+
pipeline_run.project = project.id
|
104
102
|
|
105
103
|
return verify_permissions_and_get_or_create_entity(
|
106
104
|
request_model=pipeline_run,
|
@@ -115,7 +113,7 @@ def get_or_create_pipeline_run(
|
|
115
113
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
116
114
|
# and can be removed after the migration
|
117
115
|
@workspace_router.get(
|
118
|
-
"/{
|
116
|
+
"/{project_name_or_id}" + RUNS,
|
119
117
|
responses={401: error_response, 404: error_response, 422: error_response},
|
120
118
|
deprecated=True,
|
121
119
|
tags=["runs"],
|
@@ -125,7 +123,7 @@ def list_runs(
|
|
125
123
|
runs_filter_model: PipelineRunFilter = Depends(
|
126
124
|
make_dependable(PipelineRunFilter)
|
127
125
|
),
|
128
|
-
|
126
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
129
127
|
hydrate: bool = False,
|
130
128
|
_: AuthContext = Security(authorize),
|
131
129
|
) -> Page[PipelineRunResponse]:
|
@@ -133,15 +131,15 @@ def list_runs(
|
|
133
131
|
|
134
132
|
Args:
|
135
133
|
runs_filter_model: Filter model used for pagination, sorting, filtering.
|
136
|
-
|
134
|
+
project_name_or_id: Optional name or ID of the project.
|
137
135
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
138
136
|
by including metadata fields in the response.
|
139
137
|
|
140
138
|
Returns:
|
141
139
|
The pipeline runs according to query filters.
|
142
140
|
"""
|
143
|
-
if
|
144
|
-
runs_filter_model.
|
141
|
+
if project_name_or_id:
|
142
|
+
runs_filter_model.project = project_name_or_id
|
145
143
|
|
146
144
|
return verify_permissions_and_list_entities(
|
147
145
|
filter_model=runs_filter_model,
|
@@ -31,9 +31,7 @@ from zenml.zen_server.exceptions import error_response
|
|
31
31
|
from zenml.zen_server.rbac.endpoint_utils import (
|
32
32
|
verify_permissions_and_create_entity,
|
33
33
|
)
|
34
|
-
from zenml.zen_server.routers.
|
35
|
-
router as workspace_router,
|
36
|
-
)
|
34
|
+
from zenml.zen_server.routers.projects_endpoints import workspace_router
|
37
35
|
from zenml.zen_server.utils import (
|
38
36
|
handle_exceptions,
|
39
37
|
make_dependable,
|
@@ -54,7 +52,7 @@ router = APIRouter(
|
|
54
52
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
55
53
|
# and can be removed after the migration
|
56
54
|
@workspace_router.post(
|
57
|
-
"/{
|
55
|
+
"/{project_name_or_id}" + SCHEDULES,
|
58
56
|
responses={401: error_response, 409: error_response, 422: error_response},
|
59
57
|
deprecated=True,
|
60
58
|
tags=["schedules"],
|
@@ -62,22 +60,22 @@ router = APIRouter(
|
|
62
60
|
@handle_exceptions
|
63
61
|
def create_schedule(
|
64
62
|
schedule: ScheduleRequest,
|
65
|
-
|
63
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
66
64
|
auth_context: AuthContext = Security(authorize),
|
67
65
|
) -> ScheduleResponse:
|
68
66
|
"""Creates a schedule.
|
69
67
|
|
70
68
|
Args:
|
71
69
|
schedule: Schedule to create.
|
72
|
-
|
70
|
+
project_name_or_id: Optional name or ID of the project.
|
73
71
|
auth_context: Authentication context.
|
74
72
|
|
75
73
|
Returns:
|
76
74
|
The created schedule.
|
77
75
|
"""
|
78
|
-
if
|
79
|
-
|
80
|
-
schedule.
|
76
|
+
if project_name_or_id:
|
77
|
+
project = zen_store().get_project(project_name_or_id)
|
78
|
+
schedule.project = project.id
|
81
79
|
|
82
80
|
# NOTE: no RBAC is enforced currently for schedules, but we're
|
83
81
|
# keeping the RBAC checks here for consistency
|
@@ -94,7 +92,7 @@ def create_schedule(
|
|
94
92
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
95
93
|
# and can be removed after the migration
|
96
94
|
@workspace_router.get(
|
97
|
-
"/{
|
95
|
+
"/{project_name_or_id}" + SCHEDULES,
|
98
96
|
responses={401: error_response, 404: error_response, 422: error_response},
|
99
97
|
deprecated=True,
|
100
98
|
tags=["schedules"],
|
@@ -104,7 +102,7 @@ def list_schedules(
|
|
104
102
|
schedule_filter_model: ScheduleFilter = Depends(
|
105
103
|
make_dependable(ScheduleFilter)
|
106
104
|
),
|
107
|
-
|
105
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
108
106
|
hydrate: bool = False,
|
109
107
|
_: AuthContext = Security(authorize),
|
110
108
|
) -> Page[ScheduleResponse]:
|
@@ -113,15 +111,15 @@ def list_schedules(
|
|
113
111
|
Args:
|
114
112
|
schedule_filter_model: Filter model used for pagination, sorting,
|
115
113
|
filtering
|
116
|
-
|
114
|
+
project_name_or_id: Optional name or ID of the project.
|
117
115
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
118
116
|
by including metadata fields in the response.
|
119
117
|
|
120
118
|
Returns:
|
121
119
|
List of schedule objects.
|
122
120
|
"""
|
123
|
-
if
|
124
|
-
schedule_filter_model.
|
121
|
+
if project_name_or_id:
|
122
|
+
schedule_filter_model.project = project_name_or_id
|
125
123
|
|
126
124
|
return zen_store().list_schedules(
|
127
125
|
schedule_filter_model=schedule_filter_model,
|
@@ -49,9 +49,7 @@ from zenml.zen_server.rbac.utils import (
|
|
49
49
|
is_owned_by_authenticated_user,
|
50
50
|
verify_permission,
|
51
51
|
)
|
52
|
-
from zenml.zen_server.routers.
|
53
|
-
router as workspace_router,
|
54
|
-
)
|
52
|
+
from zenml.zen_server.routers.projects_endpoints import workspace_router
|
55
53
|
from zenml.zen_server.utils import (
|
56
54
|
handle_exceptions,
|
57
55
|
make_dependable,
|