zenml-nightly 0.75.0.dev20250313__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/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/pipeline.py +3 -3
- zenml/cli/project.py +172 -0
- 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 +347 -340
- zenml/config/global_config.py +41 -43
- zenml/constants.py +5 -3
- zenml/event_hub/event_hub.py +1 -1
- zenml/integrations/gcp/service_connectors/gcp_service_connector.py +7 -6
- 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/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 +17 -17
- 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/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/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 +2 -2
- 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/zen_server/rbac/endpoint_utils.py +17 -17
- zenml/zen_server/rbac/models.py +20 -20
- 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 +12 -16
- 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 +5 -5
- 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 +3 -2
- zenml/zen_stores/base_zen_store.py +35 -39
- 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 +54 -62
- 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 +258 -268
- zenml/zen_stores/zen_store_interface.py +56 -70
- {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/METADATA +1 -1
- {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/RECORD +121 -119
- 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.dev20250314.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.75.0.dev20250313.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/entry_points.txt +0 -0
@@ -58,22 +58,20 @@ def _convert_from_cloud_resource(cloud_resource: str) -> Resource:
|
|
58
58
|
Returns:
|
59
59
|
The converted resource.
|
60
60
|
"""
|
61
|
-
scope,
|
62
|
-
":", maxsplit=1
|
63
|
-
)
|
61
|
+
scope, project_resource_type_and_id = cloud_resource.split(":", maxsplit=1)
|
64
62
|
|
65
63
|
if scope != f"{SERVER_ID}@{SERVER_SCOPE_IDENTIFIER}":
|
66
64
|
raise ValueError("Invalid scope for server resource.")
|
67
65
|
|
68
|
-
|
69
|
-
if ":" in
|
66
|
+
project_id: Optional[str] = None
|
67
|
+
if ":" in project_resource_type_and_id:
|
70
68
|
(
|
71
|
-
|
69
|
+
project_id,
|
72
70
|
resource_type_and_id,
|
73
|
-
) =
|
71
|
+
) = project_resource_type_and_id.split(":", maxsplit=1)
|
74
72
|
else:
|
75
|
-
|
76
|
-
resource_type_and_id =
|
73
|
+
project_id = None
|
74
|
+
resource_type_and_id = project_resource_type_and_id
|
77
75
|
|
78
76
|
resource_id: Optional[str] = None
|
79
77
|
if "/" in resource_type_and_id:
|
@@ -81,15 +79,13 @@ def _convert_from_cloud_resource(cloud_resource: str) -> Resource:
|
|
81
79
|
else:
|
82
80
|
resource_type = resource_type_and_id
|
83
81
|
|
84
|
-
if resource_type == ResourceType.
|
85
|
-
# TODO: For now, we duplicate the
|
86
|
-
# representation when describing a
|
82
|
+
if resource_type == ResourceType.PROJECT and project_id is not None:
|
83
|
+
# TODO: For now, we duplicate the project ID in the string
|
84
|
+
# representation when describing a project instance, because
|
87
85
|
# this is what is expected by the RBAC implementation.
|
88
|
-
|
86
|
+
project_id = None
|
89
87
|
|
90
|
-
return Resource(
|
91
|
-
type=resource_type, id=resource_id, workspace_id=workspace_id
|
92
|
-
)
|
88
|
+
return Resource(type=resource_type, id=resource_id, project_id=project_id)
|
93
89
|
|
94
90
|
|
95
91
|
class ZenMLCloudRBAC(RBACInterface):
|
@@ -46,7 +46,7 @@ from zenml.zen_server.rbac.utils import (
|
|
46
46
|
from zenml.zen_server.utils import (
|
47
47
|
handle_exceptions,
|
48
48
|
make_dependable,
|
49
|
-
|
49
|
+
set_filter_project_scope,
|
50
50
|
zen_store,
|
51
51
|
)
|
52
52
|
|
@@ -81,14 +81,14 @@ def list_artifact_versions(
|
|
81
81
|
Returns:
|
82
82
|
The artifact versions according to query filters.
|
83
83
|
"""
|
84
|
-
# A
|
85
|
-
#
|
86
|
-
|
87
|
-
assert isinstance(artifact_version_filter_model.
|
84
|
+
# A project scoped request must always be scoped to a specific
|
85
|
+
# project. This is required for the RBAC check to work.
|
86
|
+
set_filter_project_scope(artifact_version_filter_model)
|
87
|
+
assert isinstance(artifact_version_filter_model.project, UUID)
|
88
88
|
|
89
89
|
allowed_artifact_ids = get_allowed_resource_ids(
|
90
90
|
resource_type=ResourceType.ARTIFACT,
|
91
|
-
|
91
|
+
project_id=artifact_version_filter_model.project,
|
92
92
|
)
|
93
93
|
artifact_version_filter_model.configure_rbac(
|
94
94
|
authenticated_user_id=auth_context.user.id,
|
@@ -228,24 +228,24 @@ def delete_artifact_version(
|
|
228
228
|
)
|
229
229
|
@handle_exceptions
|
230
230
|
def prune_artifact_versions(
|
231
|
-
|
231
|
+
project_name_or_id: Union[str, UUID],
|
232
232
|
only_versions: bool = True,
|
233
233
|
_: AuthContext = Security(authorize),
|
234
234
|
) -> None:
|
235
235
|
"""Prunes unused artifact versions and their artifacts.
|
236
236
|
|
237
237
|
Args:
|
238
|
-
|
238
|
+
project_name_or_id: The project name or ID to prune artifact
|
239
239
|
versions for.
|
240
240
|
only_versions: Only delete artifact versions, keeping artifacts
|
241
241
|
"""
|
242
|
-
|
242
|
+
project_id = zen_store().get_project(project_name_or_id).id
|
243
243
|
|
244
244
|
verify_permissions_and_prune_entities(
|
245
245
|
resource_type=ResourceType.ARTIFACT_VERSION,
|
246
246
|
prune_method=zen_store().prune_artifact_versions,
|
247
247
|
only_versions=only_versions,
|
248
|
-
|
248
|
+
project_id=project_id,
|
249
249
|
)
|
250
250
|
|
251
251
|
|
@@ -582,7 +582,7 @@ def api_token(
|
|
582
582
|
f"step run {token.step_run_id}."
|
583
583
|
)
|
584
584
|
|
585
|
-
|
585
|
+
project_id: Optional[UUID] = None
|
586
586
|
|
587
587
|
if schedule_id:
|
588
588
|
# The schedule must exist
|
@@ -593,7 +593,7 @@ def api_token(
|
|
593
593
|
f"Schedule {schedule_id} does not exist and API tokens cannot "
|
594
594
|
"be generated for non-existent schedules for security reasons."
|
595
595
|
)
|
596
|
-
|
596
|
+
project_id = schedule.project.id
|
597
597
|
|
598
598
|
if not schedule.active:
|
599
599
|
raise ValueError(
|
@@ -614,7 +614,7 @@ def api_token(
|
|
614
614
|
|
615
615
|
verify_permission_for_model(model=pipeline_run, action=Action.READ)
|
616
616
|
|
617
|
-
|
617
|
+
project_id = pipeline_run.project.id
|
618
618
|
|
619
619
|
if pipeline_run.status.is_finished:
|
620
620
|
raise ValueError(
|
@@ -633,7 +633,7 @@ def api_token(
|
|
633
633
|
"be generated for non-existent step runs for security reasons."
|
634
634
|
)
|
635
635
|
|
636
|
-
|
636
|
+
project_id = step_run.project.id
|
637
637
|
|
638
638
|
if step_run.status.is_finished:
|
639
639
|
raise ValueError(
|
@@ -642,11 +642,11 @@ def api_token(
|
|
642
642
|
"for security reasons."
|
643
643
|
)
|
644
644
|
|
645
|
-
assert
|
645
|
+
assert project_id is not None
|
646
646
|
verify_permission(
|
647
647
|
resource_type=ResourceType.PIPELINE_RUN,
|
648
648
|
action=Action.CREATE,
|
649
|
-
|
649
|
+
project_id=project_id,
|
650
650
|
)
|
651
651
|
|
652
652
|
return generate_access_token(
|
@@ -36,9 +36,7 @@ from zenml.zen_server.rbac.endpoint_utils import (
|
|
36
36
|
verify_permissions_and_update_entity,
|
37
37
|
)
|
38
38
|
from zenml.zen_server.rbac.models import ResourceType
|
39
|
-
from zenml.zen_server.routers.
|
40
|
-
router as workspace_router,
|
41
|
-
)
|
39
|
+
from zenml.zen_server.routers.projects_endpoints import workspace_router
|
42
40
|
from zenml.zen_server.utils import (
|
43
41
|
handle_exceptions,
|
44
42
|
make_dependable,
|
@@ -59,7 +57,7 @@ router = APIRouter(
|
|
59
57
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
60
58
|
# and can be removed after the migration
|
61
59
|
@workspace_router.post(
|
62
|
-
"/{
|
60
|
+
"/{project_name_or_id}" + CODE_REPOSITORIES,
|
63
61
|
responses={401: error_response, 409: error_response, 422: error_response},
|
64
62
|
deprecated=True,
|
65
63
|
tags=["code_repositories"],
|
@@ -67,21 +65,21 @@ router = APIRouter(
|
|
67
65
|
@handle_exceptions
|
68
66
|
def create_code_repository(
|
69
67
|
code_repository: CodeRepositoryRequest,
|
70
|
-
|
68
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
71
69
|
_: AuthContext = Security(authorize),
|
72
70
|
) -> CodeRepositoryResponse:
|
73
71
|
"""Creates a code repository.
|
74
72
|
|
75
73
|
Args:
|
76
74
|
code_repository: Code repository to create.
|
77
|
-
|
75
|
+
project_name_or_id: Optional name or ID of the project.
|
78
76
|
|
79
77
|
Returns:
|
80
78
|
The created code repository.
|
81
79
|
"""
|
82
|
-
if
|
83
|
-
|
84
|
-
code_repository.
|
80
|
+
if project_name_or_id:
|
81
|
+
project = zen_store().get_project(project_name_or_id)
|
82
|
+
code_repository.project = project.id
|
85
83
|
|
86
84
|
return verify_permissions_and_create_entity(
|
87
85
|
request_model=code_repository,
|
@@ -96,7 +94,7 @@ def create_code_repository(
|
|
96
94
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
97
95
|
# and can be removed after the migration
|
98
96
|
@workspace_router.get(
|
99
|
-
"/{
|
97
|
+
"/{project_name_or_id}" + CODE_REPOSITORIES,
|
100
98
|
responses={401: error_response, 404: error_response, 422: error_response},
|
101
99
|
deprecated=True,
|
102
100
|
tags=["code_repositories"],
|
@@ -106,7 +104,7 @@ def list_code_repositories(
|
|
106
104
|
filter_model: CodeRepositoryFilter = Depends(
|
107
105
|
make_dependable(CodeRepositoryFilter)
|
108
106
|
),
|
109
|
-
|
107
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
110
108
|
hydrate: bool = False,
|
111
109
|
_: AuthContext = Security(authorize),
|
112
110
|
) -> Page[CodeRepositoryResponse]:
|
@@ -115,15 +113,15 @@ def list_code_repositories(
|
|
115
113
|
Args:
|
116
114
|
filter_model: Filter model used for pagination, sorting,
|
117
115
|
filtering.
|
118
|
-
|
116
|
+
project_name_or_id: Optional name or ID of the project.
|
119
117
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
120
118
|
by including metadata fields in the response.
|
121
119
|
|
122
120
|
Returns:
|
123
121
|
Page of code repository objects.
|
124
122
|
"""
|
125
|
-
if
|
126
|
-
filter_model.
|
123
|
+
if project_name_or_id:
|
124
|
+
filter_model.project = project_name_or_id
|
127
125
|
|
128
126
|
return verify_permissions_and_list_entities(
|
129
127
|
filter_model=filter_model,
|
@@ -56,13 +56,11 @@ from zenml.zen_server.rbac.utils import (
|
|
56
56
|
from zenml.zen_server.routers.models_endpoints import (
|
57
57
|
router as model_router,
|
58
58
|
)
|
59
|
-
from zenml.zen_server.routers.
|
60
|
-
router as workspace_router,
|
61
|
-
)
|
59
|
+
from zenml.zen_server.routers.projects_endpoints import workspace_router
|
62
60
|
from zenml.zen_server.utils import (
|
63
61
|
handle_exceptions,
|
64
62
|
make_dependable,
|
65
|
-
|
63
|
+
set_filter_project_scope,
|
66
64
|
zen_store,
|
67
65
|
)
|
68
66
|
|
@@ -85,7 +83,7 @@ router = APIRouter(
|
|
85
83
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
86
84
|
# and can be removed after the migration
|
87
85
|
@workspace_router.post(
|
88
|
-
"/{
|
86
|
+
"/{project_name_or_id}" + MODELS + "/{model_id}" + MODEL_VERSIONS,
|
89
87
|
responses={401: error_response, 409: error_response, 422: error_response},
|
90
88
|
deprecated=True,
|
91
89
|
tags=["model_versions"],
|
@@ -94,7 +92,7 @@ router = APIRouter(
|
|
94
92
|
def create_model_version(
|
95
93
|
model_version: ModelVersionRequest,
|
96
94
|
model_id: Optional[UUID] = None,
|
97
|
-
|
95
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
98
96
|
_: AuthContext = Security(authorize),
|
99
97
|
) -> ModelVersionResponse:
|
100
98
|
"""Creates a model version.
|
@@ -102,14 +100,14 @@ def create_model_version(
|
|
102
100
|
Args:
|
103
101
|
model_version: Model version to create.
|
104
102
|
model_id: Optional ID of the model.
|
105
|
-
|
103
|
+
project_name_or_id: Optional name or ID of the project.
|
106
104
|
|
107
105
|
Returns:
|
108
106
|
The created model version.
|
109
107
|
"""
|
110
|
-
if
|
111
|
-
|
112
|
-
model_version.
|
108
|
+
if project_name_or_id:
|
109
|
+
project = zen_store().get_project(project_name_or_id)
|
110
|
+
model_version.project = project.id
|
113
111
|
|
114
112
|
if model_id:
|
115
113
|
model_version.model = model_id
|
@@ -159,14 +157,14 @@ def list_model_versions(
|
|
159
157
|
if not model_version_filter_model.model:
|
160
158
|
raise ValueError("Model missing from the filter")
|
161
159
|
|
162
|
-
# A
|
163
|
-
#
|
164
|
-
|
165
|
-
assert isinstance(model_version_filter_model.
|
160
|
+
# A project scoped request must always be scoped to a specific
|
161
|
+
# project. This is required for the RBAC check to work.
|
162
|
+
set_filter_project_scope(model_version_filter_model)
|
163
|
+
assert isinstance(model_version_filter_model.project, UUID)
|
166
164
|
|
167
165
|
model = zen_store().get_model_by_name_or_id(
|
168
166
|
model_version_filter_model.model,
|
169
|
-
|
167
|
+
project=model_version_filter_model.project,
|
170
168
|
)
|
171
169
|
|
172
170
|
# Check read permissions on the model
|
@@ -41,9 +41,7 @@ from zenml.zen_server.rbac.endpoint_utils import (
|
|
41
41
|
verify_permissions_and_update_entity,
|
42
42
|
)
|
43
43
|
from zenml.zen_server.rbac.models import ResourceType
|
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,
|
@@ -69,7 +67,7 @@ router = APIRouter(
|
|
69
67
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
70
68
|
# and can be removed after the migration
|
71
69
|
@workspace_router.post(
|
72
|
-
"/{
|
70
|
+
"/{project_name_or_id}" + MODELS,
|
73
71
|
responses={401: error_response, 409: error_response, 422: error_response},
|
74
72
|
deprecated=True,
|
75
73
|
tags=["models"],
|
@@ -77,21 +75,21 @@ router = APIRouter(
|
|
77
75
|
@handle_exceptions
|
78
76
|
def create_model(
|
79
77
|
model: ModelRequest,
|
80
|
-
|
78
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
81
79
|
_: AuthContext = Security(authorize),
|
82
80
|
) -> ModelResponse:
|
83
81
|
"""Creates a model.
|
84
82
|
|
85
83
|
Args:
|
86
84
|
model: Model to create.
|
87
|
-
|
85
|
+
project_name_or_id: Optional name or ID of the project.
|
88
86
|
|
89
87
|
Returns:
|
90
88
|
The created model.
|
91
89
|
"""
|
92
|
-
if
|
93
|
-
|
94
|
-
model.
|
90
|
+
if project_name_or_id:
|
91
|
+
project = zen_store().get_project(project_name_or_id)
|
92
|
+
model.project = project.id
|
95
93
|
|
96
94
|
return verify_permissions_and_create_entity(
|
97
95
|
request_model=model,
|
@@ -34,9 +34,7 @@ from zenml.zen_server.rbac.endpoint_utils import (
|
|
34
34
|
verify_permissions_and_list_entities,
|
35
35
|
)
|
36
36
|
from zenml.zen_server.rbac.models import ResourceType
|
37
|
-
from zenml.zen_server.routers.
|
38
|
-
router as workspace_router,
|
39
|
-
)
|
37
|
+
from zenml.zen_server.routers.projects_endpoints import workspace_router
|
40
38
|
from zenml.zen_server.utils import (
|
41
39
|
handle_exceptions,
|
42
40
|
make_dependable,
|
@@ -57,7 +55,7 @@ router = APIRouter(
|
|
57
55
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
58
56
|
# and can be removed after the migration
|
59
57
|
@workspace_router.post(
|
60
|
-
"/{
|
58
|
+
"/{project_name_or_id}" + PIPELINE_BUILDS,
|
61
59
|
responses={401: error_response, 409: error_response, 422: error_response},
|
62
60
|
deprecated=True,
|
63
61
|
tags=["builds"],
|
@@ -65,21 +63,21 @@ router = APIRouter(
|
|
65
63
|
@handle_exceptions
|
66
64
|
def create_build(
|
67
65
|
build: PipelineBuildRequest,
|
68
|
-
|
66
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
69
67
|
_: AuthContext = Security(authorize),
|
70
68
|
) -> PipelineBuildResponse:
|
71
|
-
"""Creates a build, optionally in a specific
|
69
|
+
"""Creates a build, optionally in a specific project.
|
72
70
|
|
73
71
|
Args:
|
74
72
|
build: Build to create.
|
75
|
-
|
73
|
+
project_name_or_id: Optional name or ID of the project.
|
76
74
|
|
77
75
|
Returns:
|
78
76
|
The created build.
|
79
77
|
"""
|
80
|
-
if
|
81
|
-
|
82
|
-
build.
|
78
|
+
if project_name_or_id:
|
79
|
+
project = zen_store().get_project(project_name_or_id)
|
80
|
+
build.project = project.id
|
83
81
|
|
84
82
|
return verify_permissions_and_create_entity(
|
85
83
|
request_model=build,
|
@@ -94,7 +92,7 @@ def create_build(
|
|
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}" + PIPELINE_BUILDS,
|
98
96
|
responses={401: error_response, 404: error_response, 422: error_response},
|
99
97
|
deprecated=True,
|
100
98
|
tags=["builds"],
|
@@ -104,24 +102,24 @@ def list_builds(
|
|
104
102
|
build_filter_model: PipelineBuildFilter = Depends(
|
105
103
|
make_dependable(PipelineBuildFilter)
|
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[PipelineBuildResponse]:
|
111
|
-
"""Gets a list of builds
|
109
|
+
"""Gets a list of builds.
|
112
110
|
|
113
111
|
Args:
|
114
112
|
build_filter_model: Filter model used for pagination, sorting,
|
115
113
|
filtering.
|
116
|
-
|
114
|
+
project_name_or_id: Optional name or ID of the project to filter by.
|
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 build objects matching the filter criteria.
|
122
120
|
"""
|
123
|
-
if
|
124
|
-
build_filter_model.
|
121
|
+
if project_name_or_id:
|
122
|
+
build_filter_model.project = project_name_or_id
|
125
123
|
|
126
124
|
return verify_permissions_and_list_entities(
|
127
125
|
filter_model=build_filter_model,
|
@@ -34,9 +34,7 @@ from zenml.zen_server.rbac.endpoint_utils import (
|
|
34
34
|
verify_permissions_and_list_entities,
|
35
35
|
)
|
36
36
|
from zenml.zen_server.rbac.models import ResourceType
|
37
|
-
from zenml.zen_server.routers.
|
38
|
-
router as workspace_router,
|
39
|
-
)
|
37
|
+
from zenml.zen_server.routers.projects_endpoints import workspace_router
|
40
38
|
from zenml.zen_server.utils import (
|
41
39
|
handle_exceptions,
|
42
40
|
make_dependable,
|
@@ -59,7 +57,7 @@ router = APIRouter(
|
|
59
57
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
60
58
|
# and can be removed after the migration
|
61
59
|
@workspace_router.post(
|
62
|
-
"/{
|
60
|
+
"/{project_name_or_id}" + PIPELINE_DEPLOYMENTS,
|
63
61
|
responses={401: error_response, 409: error_response, 422: error_response},
|
64
62
|
deprecated=True,
|
65
63
|
tags=["deployments"],
|
@@ -67,21 +65,21 @@ router = APIRouter(
|
|
67
65
|
@handle_exceptions
|
68
66
|
def create_deployment(
|
69
67
|
deployment: PipelineDeploymentRequest,
|
70
|
-
|
68
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
71
69
|
_: AuthContext = Security(authorize),
|
72
70
|
) -> PipelineDeploymentResponse:
|
73
71
|
"""Creates a deployment.
|
74
72
|
|
75
73
|
Args:
|
76
74
|
deployment: Deployment to create.
|
77
|
-
|
75
|
+
project_name_or_id: Optional name or ID of the project.
|
78
76
|
|
79
77
|
Returns:
|
80
78
|
The created deployment.
|
81
79
|
"""
|
82
|
-
if
|
83
|
-
|
84
|
-
deployment.
|
80
|
+
if project_name_or_id:
|
81
|
+
project = zen_store().get_project(project_name_or_id)
|
82
|
+
deployment.project = project.id
|
85
83
|
|
86
84
|
return verify_permissions_and_create_entity(
|
87
85
|
request_model=deployment,
|
@@ -96,7 +94,7 @@ def create_deployment(
|
|
96
94
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
97
95
|
# and can be removed after the migration
|
98
96
|
@workspace_router.get(
|
99
|
-
"/{
|
97
|
+
"/{project_name_or_id}" + PIPELINE_DEPLOYMENTS,
|
100
98
|
responses={401: error_response, 404: error_response, 422: error_response},
|
101
99
|
deprecated=True,
|
102
100
|
tags=["deployments"],
|
@@ -106,24 +104,24 @@ def list_deployments(
|
|
106
104
|
deployment_filter_model: PipelineDeploymentFilter = Depends(
|
107
105
|
make_dependable(PipelineDeploymentFilter)
|
108
106
|
),
|
109
|
-
|
107
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
110
108
|
hydrate: bool = False,
|
111
109
|
_: AuthContext = Security(authorize),
|
112
110
|
) -> Page[PipelineDeploymentResponse]:
|
113
|
-
"""Gets a list of deployments
|
111
|
+
"""Gets a list of deployments.
|
114
112
|
|
115
113
|
Args:
|
116
114
|
deployment_filter_model: Filter model used for pagination, sorting,
|
117
115
|
filtering.
|
118
|
-
|
116
|
+
project_name_or_id: Optional name or ID of the project to filter by.
|
119
117
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
120
118
|
by including metadata fields in the response.
|
121
119
|
|
122
120
|
Returns:
|
123
121
|
List of deployment objects matching the filter criteria.
|
124
122
|
"""
|
125
|
-
if
|
126
|
-
deployment_filter_model.
|
123
|
+
if project_name_or_id:
|
124
|
+
deployment_filter_model.project = project_name_or_id
|
127
125
|
|
128
126
|
return verify_permissions_and_list_entities(
|
129
127
|
filter_model=deployment_filter_model,
|
@@ -46,9 +46,7 @@ from zenml.zen_server.rbac.endpoint_utils import (
|
|
46
46
|
verify_permissions_and_update_entity,
|
47
47
|
)
|
48
48
|
from zenml.zen_server.rbac.models import ResourceType
|
49
|
-
from zenml.zen_server.routers.
|
50
|
-
router as workspace_router,
|
51
|
-
)
|
49
|
+
from zenml.zen_server.routers.projects_endpoints import workspace_router
|
52
50
|
from zenml.zen_server.utils import (
|
53
51
|
handle_exceptions,
|
54
52
|
make_dependable,
|
@@ -70,7 +68,7 @@ router = APIRouter(
|
|
70
68
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
71
69
|
# and can be removed after the migration
|
72
70
|
@workspace_router.post(
|
73
|
-
"/{
|
71
|
+
"/{project_name_or_id}" + PIPELINES,
|
74
72
|
responses={401: error_response, 409: error_response, 422: error_response},
|
75
73
|
deprecated=True,
|
76
74
|
tags=["pipelines"],
|
@@ -78,26 +76,26 @@ router = APIRouter(
|
|
78
76
|
@handle_exceptions
|
79
77
|
def create_pipeline(
|
80
78
|
pipeline: PipelineRequest,
|
81
|
-
|
79
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
82
80
|
_: AuthContext = Security(authorize),
|
83
81
|
) -> PipelineResponse:
|
84
|
-
"""Creates a pipeline
|
82
|
+
"""Creates a pipeline.
|
85
83
|
|
86
84
|
Args:
|
87
85
|
pipeline: Pipeline to create.
|
88
|
-
|
86
|
+
project_name_or_id: Optional name or ID of the project.
|
89
87
|
|
90
88
|
Returns:
|
91
89
|
The created pipeline.
|
92
90
|
"""
|
93
|
-
if
|
94
|
-
|
95
|
-
pipeline.
|
91
|
+
if project_name_or_id:
|
92
|
+
project = zen_store().get_project(project_name_or_id)
|
93
|
+
pipeline.project = project.id
|
96
94
|
|
97
95
|
# We limit pipeline namespaces, not pipeline versions
|
98
96
|
skip_entitlements = (
|
99
97
|
zen_store().count_pipelines(
|
100
|
-
PipelineFilter(name=pipeline.name,
|
98
|
+
PipelineFilter(name=pipeline.name, project=pipeline.project)
|
101
99
|
)
|
102
100
|
> 0
|
103
101
|
)
|
@@ -116,7 +114,7 @@ def create_pipeline(
|
|
116
114
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
117
115
|
# and can be removed after the migration
|
118
116
|
@workspace_router.get(
|
119
|
-
"/{
|
117
|
+
"/{project_name_or_id}" + PIPELINES,
|
120
118
|
responses={401: error_response, 404: error_response, 422: error_response},
|
121
119
|
deprecated=True,
|
122
120
|
tags=["pipelines"],
|
@@ -126,24 +124,24 @@ def list_pipelines(
|
|
126
124
|
pipeline_filter_model: PipelineFilter = Depends(
|
127
125
|
make_dependable(PipelineFilter)
|
128
126
|
),
|
129
|
-
|
127
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
130
128
|
hydrate: bool = False,
|
131
129
|
_: AuthContext = Security(authorize),
|
132
130
|
) -> Page[PipelineResponse]:
|
133
|
-
"""Gets a list of pipelines
|
131
|
+
"""Gets a list of pipelines.
|
134
132
|
|
135
133
|
Args:
|
136
134
|
pipeline_filter_model: Filter model used for pagination, sorting,
|
137
135
|
filtering.
|
138
|
-
|
136
|
+
project_name_or_id: Optional name or ID of the project to filter by.
|
139
137
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
140
138
|
by including metadata fields in the response.
|
141
139
|
|
142
140
|
Returns:
|
143
141
|
List of pipeline objects matching the filter criteria.
|
144
142
|
"""
|
145
|
-
if
|
146
|
-
pipeline_filter_model.
|
143
|
+
if project_name_or_id:
|
144
|
+
pipeline_filter_model.project = project_name_or_id
|
147
145
|
|
148
146
|
return verify_permissions_and_list_entities(
|
149
147
|
filter_model=pipeline_filter_model,
|
@@ -228,7 +226,7 @@ def delete_pipeline(
|
|
228
226
|
should_decrement = (
|
229
227
|
ResourceType.PIPELINE in server_config().reportable_resources
|
230
228
|
and zen_store().count_pipelines(
|
231
|
-
PipelineFilter(name=pipeline.name,
|
229
|
+
PipelineFilter(name=pipeline.name, project=pipeline.project.id)
|
232
230
|
)
|
233
231
|
== 0
|
234
232
|
)
|