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
@@ -32,6 +32,7 @@ from zenml.enums import AuthScheme
|
|
32
32
|
from zenml.exceptions import IllegalOperationError
|
33
33
|
from zenml.models import (
|
34
34
|
ComponentFilter,
|
35
|
+
ProjectFilter,
|
35
36
|
ServerActivationRequest,
|
36
37
|
ServerLoadInfo,
|
37
38
|
ServerModel,
|
@@ -40,7 +41,6 @@ from zenml.models import (
|
|
40
41
|
ServerStatistics,
|
41
42
|
StackFilter,
|
42
43
|
UserResponse,
|
43
|
-
WorkspaceFilter,
|
44
44
|
)
|
45
45
|
from zenml.zen_server.auth import AuthContext, authorize
|
46
46
|
from zenml.zen_server.exceptions import error_response
|
@@ -267,10 +267,10 @@ def get_server_statistics(
|
|
267
267
|
),
|
268
268
|
)
|
269
269
|
|
270
|
-
|
271
|
-
|
270
|
+
project_filter = ProjectFilter()
|
271
|
+
project_filter.configure_rbac(
|
272
272
|
authenticated_user_id=user_id,
|
273
|
-
id=get_allowed_resource_ids(resource_type=ResourceType.
|
273
|
+
id=get_allowed_resource_ids(resource_type=ResourceType.PROJECT),
|
274
274
|
)
|
275
275
|
|
276
276
|
stack_filter = StackFilter()
|
@@ -284,5 +284,5 @@ def get_server_statistics(
|
|
284
284
|
components=zen_store().count_stack_components(
|
285
285
|
filter_model=component_filter
|
286
286
|
),
|
287
|
-
|
287
|
+
projects=zen_store().count_projects(filter_model=project_filter),
|
288
288
|
)
|
@@ -59,9 +59,7 @@ from zenml.zen_server.rbac.utils import (
|
|
59
59
|
verify_permission,
|
60
60
|
verify_permission_for_model,
|
61
61
|
)
|
62
|
-
from zenml.zen_server.routers.
|
63
|
-
router as workspace_router,
|
64
|
-
)
|
62
|
+
from zenml.zen_server.routers.projects_endpoints import workspace_router
|
65
63
|
from zenml.zen_server.utils import (
|
66
64
|
handle_exceptions,
|
67
65
|
make_dependable,
|
@@ -88,7 +86,7 @@ types_router = APIRouter(
|
|
88
86
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
89
87
|
# and can be removed after the migration
|
90
88
|
@workspace_router.post(
|
91
|
-
"/{
|
89
|
+
"/{project_name_or_id}" + SERVICE_CONNECTORS,
|
92
90
|
responses={401: error_response, 409: error_response, 422: error_response},
|
93
91
|
deprecated=True,
|
94
92
|
tags=["service_connectors"],
|
@@ -96,14 +94,14 @@ types_router = APIRouter(
|
|
96
94
|
@handle_exceptions
|
97
95
|
def create_service_connector(
|
98
96
|
connector: ServiceConnectorRequest,
|
99
|
-
|
97
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
100
98
|
_: AuthContext = Security(authorize),
|
101
99
|
) -> ServiceConnectorResponse:
|
102
100
|
"""Creates a service connector.
|
103
101
|
|
104
102
|
Args:
|
105
103
|
connector: Service connector to register.
|
106
|
-
|
104
|
+
project_name_or_id: Optional name or ID of the project.
|
107
105
|
|
108
106
|
Returns:
|
109
107
|
The created service connector.
|
@@ -121,7 +119,7 @@ def create_service_connector(
|
|
121
119
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
122
120
|
# and can be removed after the migration
|
123
121
|
@workspace_router.get(
|
124
|
-
"/{
|
122
|
+
"/{project_name_or_id}" + SERVICE_CONNECTORS,
|
125
123
|
responses={401: error_response, 404: error_response, 422: error_response},
|
126
124
|
deprecated=True,
|
127
125
|
tags=["service_connectors"],
|
@@ -131,17 +129,17 @@ def list_service_connectors(
|
|
131
129
|
connector_filter_model: ServiceConnectorFilter = Depends(
|
132
130
|
make_dependable(ServiceConnectorFilter)
|
133
131
|
),
|
134
|
-
|
132
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
135
133
|
expand_secrets: bool = True,
|
136
134
|
hydrate: bool = False,
|
137
135
|
_: AuthContext = Security(authorize),
|
138
136
|
) -> Page[ServiceConnectorResponse]:
|
139
|
-
"""Get a list of all service connectors
|
137
|
+
"""Get a list of all service connectors.
|
140
138
|
|
141
139
|
Args:
|
142
140
|
connector_filter_model: Filter model used for pagination, sorting,
|
143
141
|
filtering
|
144
|
-
|
142
|
+
project_name_or_id: Optional name or ID of the project to filter by.
|
145
143
|
expand_secrets: Whether to expand secrets or not.
|
146
144
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
147
145
|
by including metadata fields in the response.
|
@@ -318,7 +316,7 @@ def validate_and_verify_service_connector_config(
|
|
318
316
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
319
317
|
# and can be removed after the migration
|
320
318
|
@workspace_router.get(
|
321
|
-
"/{
|
319
|
+
"/{project_name_or_id}" + SERVICE_CONNECTOR_RESOURCES,
|
322
320
|
responses={401: error_response, 404: error_response, 422: error_response},
|
323
321
|
deprecated=True,
|
324
322
|
tags=["service_connectors"],
|
@@ -328,7 +326,7 @@ def list_service_connector_resources(
|
|
328
326
|
filter_model: ServiceConnectorFilter = Depends(
|
329
327
|
make_dependable(ServiceConnectorFilter)
|
330
328
|
),
|
331
|
-
|
329
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
332
330
|
auth_context: AuthContext = Security(authorize),
|
333
331
|
) -> List[ServiceConnectorResourcesModel]:
|
334
332
|
"""List resources that can be accessed by service connectors.
|
@@ -336,7 +334,7 @@ def list_service_connector_resources(
|
|
336
334
|
Args:
|
337
335
|
filter_model: The filter model to use when fetching service
|
338
336
|
connectors.
|
339
|
-
|
337
|
+
project_name_or_id: Optional name or ID of the project.
|
340
338
|
auth_context: Authentication context.
|
341
339
|
|
342
340
|
Returns:
|
@@ -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}" + SERVICES,
|
63
61
|
responses={401: error_response, 409: error_response, 422: error_response},
|
64
62
|
deprecated=True,
|
65
63
|
tags=["services"],
|
@@ -67,21 +65,21 @@ router = APIRouter(
|
|
67
65
|
@handle_exceptions
|
68
66
|
def create_service(
|
69
67
|
service: ServiceRequest,
|
70
|
-
|
68
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
71
69
|
_: AuthContext = Security(authorize),
|
72
70
|
) -> ServiceResponse:
|
73
71
|
"""Creates a new service.
|
74
72
|
|
75
73
|
Args:
|
76
74
|
service: The service to create.
|
77
|
-
|
75
|
+
project_name_or_id: Optional name or ID of the project.
|
78
76
|
|
79
77
|
Returns:
|
80
78
|
The created service.
|
81
79
|
"""
|
82
|
-
if
|
83
|
-
|
84
|
-
service.
|
80
|
+
if project_name_or_id:
|
81
|
+
project = zen_store().get_project(project_name_or_id)
|
82
|
+
service.project = project.id
|
85
83
|
|
86
84
|
return verify_permissions_and_create_entity(
|
87
85
|
request_model=service,
|
@@ -38,9 +38,7 @@ from zenml.zen_server.rbac.endpoint_utils import (
|
|
38
38
|
)
|
39
39
|
from zenml.zen_server.rbac.models import Action, ResourceType
|
40
40
|
from zenml.zen_server.rbac.utils import verify_permission_for_model
|
41
|
-
from zenml.zen_server.routers.
|
42
|
-
router as workspace_router,
|
43
|
-
)
|
41
|
+
from zenml.zen_server.routers.projects_endpoints import workspace_router
|
44
42
|
from zenml.zen_server.utils import (
|
45
43
|
handle_exceptions,
|
46
44
|
make_dependable,
|
@@ -67,7 +65,7 @@ types_router = APIRouter(
|
|
67
65
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
68
66
|
# and can be removed after the migration
|
69
67
|
@workspace_router.post(
|
70
|
-
"/{
|
68
|
+
"/{project_name_or_id}" + STACK_COMPONENTS,
|
71
69
|
responses={401: error_response, 409: error_response, 422: error_response},
|
72
70
|
deprecated=True,
|
73
71
|
tags=["stack_components"],
|
@@ -75,14 +73,14 @@ types_router = APIRouter(
|
|
75
73
|
@handle_exceptions
|
76
74
|
def create_stack_component(
|
77
75
|
component: ComponentRequest,
|
78
|
-
|
76
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
79
77
|
_: AuthContext = Security(authorize),
|
80
78
|
) -> ComponentResponse:
|
81
|
-
"""Creates a stack component
|
79
|
+
"""Creates a stack component.
|
82
80
|
|
83
81
|
Args:
|
84
82
|
component: Stack component to register.
|
85
|
-
|
83
|
+
project_name_or_id: Optional name or ID of the project.
|
86
84
|
|
87
85
|
Returns:
|
88
86
|
The created stack component.
|
@@ -117,7 +115,7 @@ def create_stack_component(
|
|
117
115
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
118
116
|
# and can be removed after the migration
|
119
117
|
@workspace_router.get(
|
120
|
-
"/{
|
118
|
+
"/{project_name_or_id}" + STACK_COMPONENTS,
|
121
119
|
responses={401: error_response, 404: error_response, 422: error_response},
|
122
120
|
deprecated=True,
|
123
121
|
tags=["stack_components"],
|
@@ -127,16 +125,16 @@ def list_stack_components(
|
|
127
125
|
component_filter_model: ComponentFilter = Depends(
|
128
126
|
make_dependable(ComponentFilter)
|
129
127
|
),
|
130
|
-
|
128
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
131
129
|
hydrate: bool = False,
|
132
130
|
_: AuthContext = Security(authorize),
|
133
131
|
) -> Page[ComponentResponse]:
|
134
|
-
"""Get a list of all stack components
|
132
|
+
"""Get a list of all stack components.
|
135
133
|
|
136
134
|
Args:
|
137
135
|
component_filter_model: Filter model used for pagination, sorting,
|
138
136
|
filtering.
|
139
|
-
|
137
|
+
project_name_or_id: Optional name or ID of the project to filter by.
|
140
138
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
141
139
|
by including metadata fields in the response.
|
142
140
|
|
@@ -40,9 +40,7 @@ from zenml.zen_server.rbac.utils import (
|
|
40
40
|
verify_permission,
|
41
41
|
verify_permission_for_model,
|
42
42
|
)
|
43
|
-
from zenml.zen_server.routers.
|
44
|
-
router as workspace_router,
|
45
|
-
)
|
43
|
+
from zenml.zen_server.routers.projects_endpoints import workspace_router
|
46
44
|
from zenml.zen_server.utils import (
|
47
45
|
handle_exceptions,
|
48
46
|
make_dependable,
|
@@ -63,7 +61,7 @@ router = APIRouter(
|
|
63
61
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
64
62
|
# and can be removed after the migration
|
65
63
|
@workspace_router.post(
|
66
|
-
"/{
|
64
|
+
"/{project_name_or_id}" + STACKS,
|
67
65
|
responses={401: error_response, 409: error_response, 422: error_response},
|
68
66
|
deprecated=True,
|
69
67
|
tags=["stacks"],
|
@@ -71,14 +69,14 @@ router = APIRouter(
|
|
71
69
|
@handle_exceptions
|
72
70
|
def create_stack(
|
73
71
|
stack: StackRequest,
|
74
|
-
|
72
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
75
73
|
auth_context: AuthContext = Security(authorize),
|
76
74
|
) -> StackResponse:
|
77
|
-
"""Creates a stack
|
75
|
+
"""Creates a stack.
|
78
76
|
|
79
77
|
Args:
|
80
78
|
stack: Stack to register.
|
81
|
-
|
79
|
+
project_name_or_id: Optional name or ID of the project.
|
82
80
|
auth_context: Authentication context.
|
83
81
|
|
84
82
|
Returns:
|
@@ -133,22 +131,22 @@ def create_stack(
|
|
133
131
|
# TODO: the workspace scoped endpoint is only kept for dashboard compatibility
|
134
132
|
# and can be removed after the migration
|
135
133
|
@workspace_router.get(
|
136
|
-
"/{
|
134
|
+
"/{project_name_or_id}" + STACKS,
|
137
135
|
responses={401: error_response, 404: error_response, 422: error_response},
|
138
136
|
deprecated=True,
|
139
137
|
tags=["stacks"],
|
140
138
|
)
|
141
139
|
@handle_exceptions
|
142
140
|
def list_stacks(
|
143
|
-
|
141
|
+
project_name_or_id: Optional[Union[str, UUID]] = None,
|
144
142
|
stack_filter_model: StackFilter = Depends(make_dependable(StackFilter)),
|
145
143
|
hydrate: bool = False,
|
146
144
|
_: AuthContext = Security(authorize),
|
147
145
|
) -> Page[StackResponse]:
|
148
|
-
"""Returns all stacks
|
146
|
+
"""Returns all stacks.
|
149
147
|
|
150
148
|
Args:
|
151
|
-
|
149
|
+
project_name_or_id: Optional name or ID of the project to filter by.
|
152
150
|
stack_filter_model: Filter model used for pagination, sorting,
|
153
151
|
filtering.
|
154
152
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
@@ -50,7 +50,7 @@ from zenml.zen_server.rbac.utils import (
|
|
50
50
|
from zenml.zen_server.utils import (
|
51
51
|
handle_exceptions,
|
52
52
|
make_dependable,
|
53
|
-
|
53
|
+
set_filter_project_scope,
|
54
54
|
zen_store,
|
55
55
|
)
|
56
56
|
|
@@ -85,14 +85,14 @@ def list_run_steps(
|
|
85
85
|
Returns:
|
86
86
|
The run steps according to query filters.
|
87
87
|
"""
|
88
|
-
# A
|
89
|
-
#
|
90
|
-
|
91
|
-
assert isinstance(step_run_filter_model.
|
88
|
+
# A project scoped request must always be scoped to a specific
|
89
|
+
# project. This is required for the RBAC check to work.
|
90
|
+
set_filter_project_scope(step_run_filter_model)
|
91
|
+
assert isinstance(step_run_filter_model.project, UUID)
|
92
92
|
|
93
93
|
allowed_pipeline_run_ids = get_allowed_resource_ids(
|
94
94
|
resource_type=ResourceType.PIPELINE_RUN,
|
95
|
-
|
95
|
+
project_id=step_run_filter_model.project,
|
96
96
|
)
|
97
97
|
step_run_filter_model.configure_rbac(
|
98
98
|
authenticated_user_id=auth_context.user.id,
|
@@ -33,12 +33,12 @@ from zenml.exceptions import AuthorizationException, IllegalOperationError
|
|
33
33
|
from zenml.logger import get_logger
|
34
34
|
from zenml.models import (
|
35
35
|
Page,
|
36
|
+
ProjectScopedResponse,
|
36
37
|
UserAuthModel,
|
37
38
|
UserFilter,
|
38
39
|
UserRequest,
|
39
40
|
UserResponse,
|
40
41
|
UserUpdate,
|
41
|
-
WorkspaceScopedResponse,
|
42
42
|
)
|
43
43
|
from zenml.zen_server.auth import (
|
44
44
|
AuthContext,
|
@@ -47,9 +47,6 @@ from zenml.zen_server.auth import (
|
|
47
47
|
)
|
48
48
|
from zenml.zen_server.exceptions import error_response
|
49
49
|
from zenml.zen_server.rate_limit import RequestLimiter
|
50
|
-
from zenml.zen_server.rbac.endpoint_utils import (
|
51
|
-
verify_permissions_and_get_entity,
|
52
|
-
)
|
53
50
|
from zenml.zen_server.rbac.models import Action, Resource, ResourceType
|
54
51
|
from zenml.zen_server.rbac.utils import (
|
55
52
|
dehydrate_page,
|
@@ -757,12 +754,12 @@ if server_config().rbac_enabled:
|
|
757
754
|
"not exist."
|
758
755
|
)
|
759
756
|
|
760
|
-
|
761
|
-
if isinstance(model,
|
762
|
-
|
757
|
+
project_id = None
|
758
|
+
if isinstance(model, ProjectScopedResponse):
|
759
|
+
project_id = model.project.id
|
763
760
|
|
764
761
|
resource = Resource(
|
765
|
-
type=resource_type, id=resource_id,
|
762
|
+
type=resource_type, id=resource_id, project_id=project_id
|
766
763
|
)
|
767
764
|
|
768
765
|
verify_permission_for_model(model=model, action=Action.SHARE)
|
@@ -776,38 +773,3 @@ if server_config().rbac_enabled:
|
|
776
773
|
resource=resource,
|
777
774
|
actions=[Action(action) for action in actions],
|
778
775
|
)
|
779
|
-
|
780
|
-
|
781
|
-
@current_user_router.put(
|
782
|
-
"/default-workspace",
|
783
|
-
responses={
|
784
|
-
401: error_response,
|
785
|
-
404: error_response,
|
786
|
-
422: error_response,
|
787
|
-
},
|
788
|
-
)
|
789
|
-
@handle_exceptions
|
790
|
-
def update_user_default_workspace(
|
791
|
-
workspace_name_or_id: Union[str, UUID],
|
792
|
-
auth_context: AuthContext = Security(authorize),
|
793
|
-
) -> UserResponse:
|
794
|
-
"""Updates the default workspace of the current user.
|
795
|
-
|
796
|
-
Args:
|
797
|
-
workspace_name_or_id: Name or ID of the workspace.
|
798
|
-
auth_context: Authentication context.
|
799
|
-
|
800
|
-
Returns:
|
801
|
-
The updated user.
|
802
|
-
"""
|
803
|
-
workspace = verify_permissions_and_get_entity(
|
804
|
-
id=workspace_name_or_id,
|
805
|
-
get_method=zen_store().get_workspace,
|
806
|
-
)
|
807
|
-
|
808
|
-
user = zen_store().update_user(
|
809
|
-
user_id=auth_context.user.id,
|
810
|
-
user_update=UserUpdate(default_workspace_id=workspace.id),
|
811
|
-
)
|
812
|
-
|
813
|
-
return dehydrate_response_model(user)
|
@@ -18,8 +18,8 @@ from zenml.config.pipeline_run_configuration import (
|
|
18
18
|
)
|
19
19
|
from zenml.config.step_configurations import Step, StepConfiguration
|
20
20
|
from zenml.constants import (
|
21
|
+
ENV_ZENML_ACTIVE_PROJECT_ID,
|
21
22
|
ENV_ZENML_ACTIVE_STACK_ID,
|
22
|
-
ENV_ZENML_ACTIVE_WORKSPACE_ID,
|
23
23
|
)
|
24
24
|
from zenml.enums import ExecutionStatus, StackComponentType, StoreType
|
25
25
|
from zenml.logger import get_logger
|
@@ -134,7 +134,7 @@ def run_template(
|
|
134
134
|
).access_token
|
135
135
|
|
136
136
|
environment = {
|
137
|
-
|
137
|
+
ENV_ZENML_ACTIVE_PROJECT_ID: str(new_deployment.project.id),
|
138
138
|
ENV_ZENML_ACTIVE_STACK_ID: str(stack.id),
|
139
139
|
"ZENML_VERSION": zenml_version,
|
140
140
|
"ZENML_STORE_URL": server_url,
|
@@ -407,7 +407,7 @@ def deployment_request_from_template(
|
|
407
407
|
assert deployment.stack
|
408
408
|
assert deployment.build
|
409
409
|
deployment_request = PipelineDeploymentRequest(
|
410
|
-
|
410
|
+
project=deployment.project.id,
|
411
411
|
run_name_template=config.run_name
|
412
412
|
or get_default_run_name(pipeline_name=pipeline_configuration.name),
|
413
413
|
pipeline_configuration=pipeline_configuration,
|
@@ -463,7 +463,7 @@ def get_pipeline_run_analytics_metadata(
|
|
463
463
|
}
|
464
464
|
|
465
465
|
return {
|
466
|
-
"
|
466
|
+
"project_id": deployment.project.id,
|
467
467
|
"store_type": "rest", # This method is called from within a REST endpoint
|
468
468
|
**stack_metadata,
|
469
469
|
"total_steps": len(deployment.step_configurations),
|
zenml/zen_server/utils.py
CHANGED
@@ -46,7 +46,7 @@ from zenml.constants import (
|
|
46
46
|
from zenml.enums import StoreType
|
47
47
|
from zenml.exceptions import IllegalOperationError, OAuthError
|
48
48
|
from zenml.logger import get_logger
|
49
|
-
from zenml.models.v2.base.scoped import
|
49
|
+
from zenml.models.v2.base.scoped import ProjectScopedFilter
|
50
50
|
from zenml.plugins.plugin_flavor_registry import PluginFlavorRegistry
|
51
51
|
from zenml.zen_server.cache import MemoryCache
|
52
52
|
from zenml.zen_server.deploy.deployment import (
|
@@ -640,19 +640,19 @@ def get_zenml_headers() -> Dict[str, str]:
|
|
640
640
|
return headers
|
641
641
|
|
642
642
|
|
643
|
-
def
|
644
|
-
filter_model:
|
645
|
-
|
643
|
+
def set_filter_project_scope(
|
644
|
+
filter_model: ProjectScopedFilter,
|
645
|
+
project_name_or_id: Optional[Union[UUID, str]] = None,
|
646
646
|
) -> None:
|
647
|
-
"""Set the
|
647
|
+
"""Set the project scope of the filter model.
|
648
648
|
|
649
649
|
Args:
|
650
650
|
filter_model: The filter model to set the scope for.
|
651
|
-
|
652
|
-
provided, the
|
653
|
-
|
651
|
+
project_name_or_id: The project to set the scope for. If not
|
652
|
+
provided, the project scope is determined from the request
|
653
|
+
project filter or the default project, in that order.
|
654
654
|
"""
|
655
|
-
zen_store().
|
655
|
+
zen_store().set_filter_project_id(
|
656
656
|
filter_model=filter_model,
|
657
|
-
|
657
|
+
project_name_or_id=project_name_or_id,
|
658
658
|
)
|
@@ -73,6 +73,7 @@ from zenml.zen_server.routers import (
|
|
73
73
|
pipeline_deployments_endpoints,
|
74
74
|
pipelines_endpoints,
|
75
75
|
plugin_endpoints,
|
76
|
+
projects_endpoints,
|
76
77
|
run_metadata_endpoints,
|
77
78
|
run_templates_endpoints,
|
78
79
|
runs_endpoints,
|
@@ -91,7 +92,6 @@ from zenml.zen_server.routers import (
|
|
91
92
|
triggers_endpoints,
|
92
93
|
users_endpoints,
|
93
94
|
webhook_endpoints,
|
94
|
-
workspaces_endpoints,
|
95
95
|
)
|
96
96
|
from zenml.zen_server.secure_headers import (
|
97
97
|
initialize_secure_headers,
|
@@ -495,7 +495,8 @@ app.include_router(triggers_endpoints.router)
|
|
495
495
|
app.include_router(users_endpoints.router)
|
496
496
|
app.include_router(users_endpoints.current_user_router)
|
497
497
|
app.include_router(webhook_endpoints.router)
|
498
|
-
app.include_router(
|
498
|
+
app.include_router(projects_endpoints.workspace_router)
|
499
|
+
app.include_router(projects_endpoints.router)
|
499
500
|
|
500
501
|
# When the auth scheme is set to EXTERNAL, users cannot be managed via the
|
501
502
|
# API.
|