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
@@ -58,7 +58,6 @@ router = APIRouter(
|
|
58
58
|
|
59
59
|
@router.get(
|
60
60
|
"",
|
61
|
-
response_model=Page[TriggerResponse],
|
62
61
|
responses={401: error_response, 404: error_response, 422: error_response},
|
63
62
|
)
|
64
63
|
@handle_exceptions
|
@@ -90,7 +89,6 @@ def list_triggers(
|
|
90
89
|
|
91
90
|
@router.get(
|
92
91
|
"/{trigger_id}",
|
93
|
-
response_model=TriggerResponse,
|
94
92
|
responses={401: error_response, 404: error_response, 422: error_response},
|
95
93
|
)
|
96
94
|
@handle_exceptions
|
@@ -116,7 +114,6 @@ def get_trigger(
|
|
116
114
|
|
117
115
|
@router.post(
|
118
116
|
"",
|
119
|
-
response_model=TriggerResponse,
|
120
117
|
responses={401: error_response, 409: error_response, 422: error_response},
|
121
118
|
)
|
122
119
|
@handle_exceptions
|
@@ -162,14 +159,12 @@ def create_trigger(
|
|
162
159
|
|
163
160
|
return verify_permissions_and_create_entity(
|
164
161
|
request_model=trigger,
|
165
|
-
resource_type=ResourceType.TRIGGER,
|
166
162
|
create_method=zen_store().create_trigger,
|
167
163
|
)
|
168
164
|
|
169
165
|
|
170
166
|
@router.put(
|
171
167
|
"/{trigger_id}",
|
172
|
-
response_model=TriggerResponse,
|
173
168
|
responses={401: error_response, 404: error_response, 422: error_response},
|
174
169
|
)
|
175
170
|
@handle_exceptions
|
@@ -245,9 +240,11 @@ def delete_trigger(
|
|
245
240
|
Args:
|
246
241
|
trigger_id: Name of the trigger.
|
247
242
|
"""
|
248
|
-
|
249
|
-
|
250
|
-
|
243
|
+
verify_permissions_and_delete_entity(
|
244
|
+
id=trigger_id,
|
245
|
+
get_method=zen_store().get_trigger,
|
246
|
+
delete_method=zen_store().delete_trigger,
|
247
|
+
)
|
251
248
|
|
252
249
|
|
253
250
|
executions_router = APIRouter(
|
@@ -33,6 +33,7 @@ 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,
|
@@ -87,7 +88,6 @@ current_user_router = APIRouter(
|
|
87
88
|
|
88
89
|
@router.get(
|
89
90
|
"",
|
90
|
-
response_model=Page[UserResponse],
|
91
91
|
responses={401: error_response, 404: error_response, 422: error_response},
|
92
92
|
)
|
93
93
|
@handle_exceptions
|
@@ -133,7 +133,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
|
|
133
133
|
|
134
134
|
@router.post(
|
135
135
|
"",
|
136
|
-
response_model=UserResponse,
|
137
136
|
responses={
|
138
137
|
401: error_response,
|
139
138
|
409: error_response,
|
@@ -174,7 +173,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
|
|
174
173
|
|
175
174
|
# new_user = verify_permissions_and_create_entity(
|
176
175
|
# request_model=user,
|
177
|
-
# resource_type=ResourceType.USER,
|
178
176
|
# create_method=zen_store().create_user,
|
179
177
|
# )
|
180
178
|
new_user = zen_store().create_user(user)
|
@@ -188,7 +186,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
|
|
188
186
|
|
189
187
|
@router.get(
|
190
188
|
"/{user_name_or_id}",
|
191
|
-
response_model=UserResponse,
|
192
189
|
responses={401: error_response, 404: error_response, 422: error_response},
|
193
190
|
)
|
194
191
|
@handle_exceptions
|
@@ -233,7 +230,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
|
|
233
230
|
|
234
231
|
@router.put(
|
235
232
|
"/{user_name_or_id}",
|
236
|
-
response_model=UserResponse,
|
237
233
|
responses={
|
238
234
|
401: error_response,
|
239
235
|
404: error_response,
|
@@ -403,7 +399,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
|
|
403
399
|
|
404
400
|
@activation_router.put(
|
405
401
|
"/{user_name_or_id}" + ACTIVATE,
|
406
|
-
response_model=UserResponse,
|
407
402
|
responses={
|
408
403
|
401: error_response,
|
409
404
|
404: error_response,
|
@@ -464,7 +459,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
|
|
464
459
|
|
465
460
|
@router.put(
|
466
461
|
"/{user_name_or_id}" + DEACTIVATE,
|
467
|
-
response_model=UserResponse,
|
468
462
|
responses={
|
469
463
|
401: error_response,
|
470
464
|
404: error_response,
|
@@ -555,7 +549,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
|
|
555
549
|
|
556
550
|
@router.put(
|
557
551
|
"/{user_name_or_id}" + EMAIL_ANALYTICS,
|
558
|
-
response_model=UserResponse,
|
559
552
|
responses={
|
560
553
|
401: error_response,
|
561
554
|
404: error_response,
|
@@ -608,7 +601,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
|
|
608
601
|
|
609
602
|
@current_user_router.get(
|
610
603
|
"/current-user",
|
611
|
-
response_model=UserResponse,
|
612
604
|
responses={401: error_response, 404: error_response, 422: error_response},
|
613
605
|
)
|
614
606
|
@handle_exceptions
|
@@ -632,7 +624,6 @@ if server_config().auth_scheme != AuthScheme.EXTERNAL:
|
|
632
624
|
|
633
625
|
@current_user_router.put(
|
634
626
|
"/current-user",
|
635
|
-
response_model=UserResponse,
|
636
627
|
responses={
|
637
628
|
401: error_response,
|
638
629
|
404: error_response,
|
@@ -752,8 +743,6 @@ if server_config().rbac_enabled:
|
|
752
743
|
)
|
753
744
|
|
754
745
|
resource_type = ResourceType(resource_type)
|
755
|
-
resource = Resource(type=resource_type, id=resource_id)
|
756
|
-
|
757
746
|
schema_class = get_schema_for_resource_type(resource_type)
|
758
747
|
model = zen_store().get_entity_by_id(
|
759
748
|
entity_id=resource_id, schema_class=schema_class
|
@@ -765,6 +754,14 @@ if server_config().rbac_enabled:
|
|
765
754
|
"not exist."
|
766
755
|
)
|
767
756
|
|
757
|
+
project_id = None
|
758
|
+
if isinstance(model, ProjectScopedResponse):
|
759
|
+
project_id = model.project.id
|
760
|
+
|
761
|
+
resource = Resource(
|
762
|
+
type=resource_type, id=resource_id, project_id=project_id
|
763
|
+
)
|
764
|
+
|
768
765
|
verify_permission_for_model(model=model, action=Action.SHARE)
|
769
766
|
for action in actions:
|
770
767
|
# Make sure users aren't able to share permissions they don't have
|
@@ -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,
|
@@ -149,9 +149,10 @@ def run_template(
|
|
149
149
|
)
|
150
150
|
|
151
151
|
def _task() -> None:
|
152
|
-
|
153
|
-
|
154
|
-
|
152
|
+
(
|
153
|
+
pypi_requirements,
|
154
|
+
apt_packages,
|
155
|
+
) = requirements_utils.get_requirements_for_stack(stack=stack)
|
155
156
|
|
156
157
|
if build.python_version:
|
157
158
|
version_info = version.parse(build.python_version)
|
@@ -406,8 +407,7 @@ def deployment_request_from_template(
|
|
406
407
|
assert deployment.stack
|
407
408
|
assert deployment.build
|
408
409
|
deployment_request = PipelineDeploymentRequest(
|
409
|
-
|
410
|
-
workspace=deployment.workspace.id,
|
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,6 +463,7 @@ def get_pipeline_run_analytics_metadata(
|
|
463
463
|
}
|
464
464
|
|
465
465
|
return {
|
466
|
+
"project_id": deployment.project.id,
|
466
467
|
"store_type": "rest", # This method is called from within a REST endpoint
|
467
468
|
**stack_metadata,
|
468
469
|
"total_steps": len(deployment.step_configurations),
|
zenml/zen_server/utils.py
CHANGED
@@ -26,9 +26,11 @@ from typing import (
|
|
26
26
|
Tuple,
|
27
27
|
Type,
|
28
28
|
TypeVar,
|
29
|
+
Union,
|
29
30
|
cast,
|
30
31
|
)
|
31
32
|
from urllib.parse import urlparse
|
33
|
+
from uuid import UUID
|
32
34
|
|
33
35
|
from pydantic import BaseModel, ValidationError
|
34
36
|
|
@@ -44,6 +46,7 @@ from zenml.constants import (
|
|
44
46
|
from zenml.enums import StoreType
|
45
47
|
from zenml.exceptions import IllegalOperationError, OAuthError
|
46
48
|
from zenml.logger import get_logger
|
49
|
+
from zenml.models.v2.base.scoped import ProjectScopedFilter
|
47
50
|
from zenml.plugins.plugin_flavor_registry import PluginFlavorRegistry
|
48
51
|
from zenml.zen_server.cache import MemoryCache
|
49
52
|
from zenml.zen_server.deploy.deployment import (
|
@@ -635,3 +638,21 @@ def get_zenml_headers() -> Dict[str, str]:
|
|
635
638
|
headers["zenml-server-url"] = config.server_url
|
636
639
|
|
637
640
|
return headers
|
641
|
+
|
642
|
+
|
643
|
+
def set_filter_project_scope(
|
644
|
+
filter_model: ProjectScopedFilter,
|
645
|
+
project_name_or_id: Optional[Union[UUID, str]] = None,
|
646
|
+
) -> None:
|
647
|
+
"""Set the project scope of the filter model.
|
648
|
+
|
649
|
+
Args:
|
650
|
+
filter_model: The filter model to set the scope for.
|
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
|
+
"""
|
655
|
+
zen_store().set_filter_project_id(
|
656
|
+
filter_model=filter_model,
|
657
|
+
project_name_or_id=project_name_or_id,
|
658
|
+
)
|
@@ -73,6 +73,8 @@ from zenml.zen_server.routers import (
|
|
73
73
|
pipeline_deployments_endpoints,
|
74
74
|
pipelines_endpoints,
|
75
75
|
plugin_endpoints,
|
76
|
+
projects_endpoints,
|
77
|
+
run_metadata_endpoints,
|
76
78
|
run_templates_endpoints,
|
77
79
|
runs_endpoints,
|
78
80
|
schedule_endpoints,
|
@@ -85,11 +87,11 @@ from zenml.zen_server.routers import (
|
|
85
87
|
stack_deployment_endpoints,
|
86
88
|
stacks_endpoints,
|
87
89
|
steps_endpoints,
|
90
|
+
tag_resource_endpoints,
|
88
91
|
tags_endpoints,
|
89
92
|
triggers_endpoints,
|
90
93
|
users_endpoints,
|
91
94
|
webhook_endpoints,
|
92
|
-
workspaces_endpoints,
|
93
95
|
)
|
94
96
|
from zenml.zen_server.secure_headers import (
|
95
97
|
initialize_secure_headers,
|
@@ -472,6 +474,7 @@ app.include_router(pipelines_endpoints.router)
|
|
472
474
|
app.include_router(pipeline_builds_endpoints.router)
|
473
475
|
app.include_router(pipeline_deployments_endpoints.router)
|
474
476
|
app.include_router(runs_endpoints.router)
|
477
|
+
app.include_router(run_metadata_endpoints.router)
|
475
478
|
app.include_router(run_templates_endpoints.router)
|
476
479
|
app.include_router(schedule_endpoints.router)
|
477
480
|
app.include_router(secrets_endpoints.router)
|
@@ -487,11 +490,13 @@ app.include_router(stack_components_endpoints.router)
|
|
487
490
|
app.include_router(stack_components_endpoints.types_router)
|
488
491
|
app.include_router(steps_endpoints.router)
|
489
492
|
app.include_router(tags_endpoints.router)
|
493
|
+
app.include_router(tag_resource_endpoints.router)
|
490
494
|
app.include_router(triggers_endpoints.router)
|
491
495
|
app.include_router(users_endpoints.router)
|
492
496
|
app.include_router(users_endpoints.current_user_router)
|
493
497
|
app.include_router(webhook_endpoints.router)
|
494
|
-
app.include_router(
|
498
|
+
app.include_router(projects_endpoints.workspace_router)
|
499
|
+
app.include_router(projects_endpoints.router)
|
495
500
|
|
496
501
|
# When the auth scheme is set to EXTERNAL, users cannot be managed via the
|
497
502
|
# API.
|
@@ -33,9 +33,9 @@ from zenml.config.global_config import GlobalConfiguration
|
|
33
33
|
from zenml.config.server_config import ServerConfiguration
|
34
34
|
from zenml.config.store_config import StoreConfiguration
|
35
35
|
from zenml.constants import (
|
36
|
+
DEFAULT_PROJECT_NAME,
|
36
37
|
DEFAULT_STACK_AND_COMPONENT_NAME,
|
37
|
-
|
38
|
-
ENV_ZENML_DEFAULT_WORKSPACE_NAME,
|
38
|
+
ENV_ZENML_DEFAULT_PROJECT_NAME,
|
39
39
|
ENV_ZENML_SERVER,
|
40
40
|
IS_DEBUG_ENV,
|
41
41
|
)
|
@@ -46,6 +46,7 @@ from zenml.enums import (
|
|
46
46
|
from zenml.exceptions import IllegalOperationError
|
47
47
|
from zenml.logger import get_logger
|
48
48
|
from zenml.models import (
|
49
|
+
ProjectResponse,
|
49
50
|
ServerDatabaseType,
|
50
51
|
ServerDeploymentType,
|
51
52
|
ServerModel,
|
@@ -53,7 +54,6 @@ from zenml.models import (
|
|
53
54
|
StackResponse,
|
54
55
|
UserFilter,
|
55
56
|
UserResponse,
|
56
|
-
WorkspaceResponse,
|
57
57
|
)
|
58
58
|
from zenml.utils.pydantic_utils import before_validator_handler
|
59
59
|
from zenml.zen_stores.zen_store_interface import ZenStoreInterface
|
@@ -292,51 +292,55 @@ class BaseZenStore(
|
|
292
292
|
|
293
293
|
def validate_active_config(
|
294
294
|
self,
|
295
|
-
|
295
|
+
active_project_name_or_id: Optional[Union[str, UUID]] = None,
|
296
296
|
active_stack_id: Optional[UUID] = None,
|
297
297
|
config_name: str = "",
|
298
|
-
) -> Tuple[
|
298
|
+
) -> Tuple[Optional[ProjectResponse], StackResponse]:
|
299
299
|
"""Validate the active configuration.
|
300
300
|
|
301
|
-
Call this method to validate the supplied active
|
301
|
+
Call this method to validate the supplied active project and active
|
302
302
|
stack values.
|
303
303
|
|
304
|
-
This method
|
305
|
-
|
306
|
-
|
307
|
-
|
304
|
+
This method returns a valid project and stack values. If the
|
305
|
+
supplied project and stack are not set or are not valid (e.g. they
|
306
|
+
do not exist or are not accessible), the default project and default
|
307
|
+
stack will be returned in their stead.
|
308
308
|
|
309
309
|
Args:
|
310
|
-
|
310
|
+
active_project_name_or_id: The name or ID of the active project.
|
311
311
|
active_stack_id: The ID of the active stack.
|
312
312
|
config_name: The name of the configuration to validate (used in the
|
313
313
|
displayed logs/messages).
|
314
314
|
|
315
315
|
Returns:
|
316
|
-
A tuple containing the active
|
316
|
+
A tuple containing the active project and active stack.
|
317
317
|
"""
|
318
|
-
|
318
|
+
active_project: Optional[ProjectResponse] = None
|
319
319
|
|
320
|
-
if
|
320
|
+
if active_project_name_or_id:
|
321
321
|
try:
|
322
|
-
|
323
|
-
|
322
|
+
active_project = self.get_project(active_project_name_or_id)
|
323
|
+
except (KeyError, IllegalOperationError):
|
324
|
+
active_project_name_or_id = None
|
325
|
+
logger.warning(
|
326
|
+
f"The current {config_name} active project is no longer "
|
327
|
+
f"available."
|
324
328
|
)
|
325
|
-
except KeyError:
|
326
|
-
active_workspace = self._get_default_workspace()
|
327
329
|
|
330
|
+
if active_project is None:
|
331
|
+
try:
|
332
|
+
active_project = self._get_default_project()
|
333
|
+
except (KeyError, IllegalOperationError):
|
328
334
|
logger.warning(
|
329
|
-
|
330
|
-
|
331
|
-
|
335
|
+
"An active project is not set. Please set the active "
|
336
|
+
"project by running `zenml project set "
|
337
|
+
"<project-name>`."
|
338
|
+
)
|
339
|
+
else:
|
340
|
+
logger.info(
|
341
|
+
f"Setting the {config_name} active project "
|
342
|
+
f"to '{active_project.name}'."
|
332
343
|
)
|
333
|
-
else:
|
334
|
-
active_workspace = self._get_default_workspace()
|
335
|
-
|
336
|
-
logger.info(
|
337
|
-
f"Setting the {config_name} active workspace "
|
338
|
-
f"to '{active_workspace.name}'."
|
339
|
-
)
|
340
344
|
|
341
345
|
active_stack: StackResponse
|
342
346
|
|
@@ -351,30 +355,16 @@ class BaseZenStore(
|
|
351
355
|
"Resetting the active stack to default.",
|
352
356
|
config_name,
|
353
357
|
)
|
354
|
-
active_stack = self._get_default_stack(
|
355
|
-
workspace_id=active_workspace.id
|
356
|
-
)
|
357
|
-
else:
|
358
|
-
if active_stack.workspace.id != active_workspace.id:
|
359
|
-
logger.warning(
|
360
|
-
"The current %s active stack is not part of the active "
|
361
|
-
"workspace. Resetting the active stack to default.",
|
362
|
-
config_name,
|
363
|
-
)
|
364
|
-
active_stack = self._get_default_stack(
|
365
|
-
workspace_id=active_workspace.id
|
366
|
-
)
|
358
|
+
active_stack = self._get_default_stack()
|
367
359
|
|
368
360
|
else:
|
369
361
|
logger.warning(
|
370
362
|
"Setting the %s active stack to default.",
|
371
363
|
config_name,
|
372
364
|
)
|
373
|
-
active_stack = self._get_default_stack(
|
374
|
-
workspace_id=active_workspace.id
|
375
|
-
)
|
365
|
+
active_stack = self._get_default_stack()
|
376
366
|
|
377
|
-
return
|
367
|
+
return active_project, active_stack
|
378
368
|
|
379
369
|
def get_store_info(self) -> ServerModel:
|
380
370
|
"""Get information about the store.
|
@@ -432,59 +422,50 @@ class BaseZenStore(
|
|
432
422
|
return self.get_store_info().is_local()
|
433
423
|
|
434
424
|
# -----------------------------
|
435
|
-
# Default
|
425
|
+
# Default projects and stacks
|
436
426
|
# -----------------------------
|
437
427
|
|
438
428
|
@property
|
439
|
-
def
|
440
|
-
"""Get the default
|
429
|
+
def _default_project_name(self) -> str:
|
430
|
+
"""Get the default project name.
|
441
431
|
|
442
432
|
Returns:
|
443
|
-
The default
|
433
|
+
The default project name.
|
444
434
|
"""
|
445
|
-
return os.getenv(
|
446
|
-
ENV_ZENML_DEFAULT_WORKSPACE_NAME, DEFAULT_WORKSPACE_NAME
|
447
|
-
)
|
435
|
+
return os.getenv(ENV_ZENML_DEFAULT_PROJECT_NAME, DEFAULT_PROJECT_NAME)
|
448
436
|
|
449
|
-
def
|
450
|
-
"""Get the default
|
437
|
+
def _get_default_project(self) -> ProjectResponse:
|
438
|
+
"""Get the default project.
|
451
439
|
|
452
440
|
Raises:
|
453
|
-
KeyError: If the default
|
441
|
+
KeyError: If the default project doesn't exist.
|
454
442
|
|
455
443
|
Returns:
|
456
|
-
The default
|
444
|
+
The default project.
|
457
445
|
"""
|
458
446
|
try:
|
459
|
-
return self.
|
447
|
+
return self.get_project(self._default_project_name)
|
460
448
|
except KeyError:
|
461
|
-
raise KeyError("Unable to find default
|
449
|
+
raise KeyError("Unable to find default project.")
|
462
450
|
|
463
451
|
def _get_default_stack(
|
464
452
|
self,
|
465
|
-
workspace_id: UUID,
|
466
453
|
) -> StackResponse:
|
467
|
-
"""Get the default stack
|
468
|
-
|
469
|
-
Args:
|
470
|
-
workspace_id: ID of the workspace.
|
454
|
+
"""Get the default stack.
|
471
455
|
|
472
456
|
Returns:
|
473
|
-
The default stack
|
457
|
+
The default stack.
|
474
458
|
|
475
459
|
Raises:
|
476
|
-
KeyError: if the
|
460
|
+
KeyError: if the default stack doesn't exist.
|
477
461
|
"""
|
478
462
|
default_stacks = self.list_stacks(
|
479
463
|
StackFilter(
|
480
|
-
workspace_id=workspace_id,
|
481
464
|
name=DEFAULT_STACK_AND_COMPONENT_NAME,
|
482
465
|
)
|
483
466
|
)
|
484
467
|
if default_stacks.total == 0:
|
485
|
-
raise KeyError(
|
486
|
-
f"No default stack found in workspace {workspace_id}."
|
487
|
-
)
|
468
|
+
raise KeyError("No default stack found.")
|
488
469
|
return default_stacks.items[0]
|
489
470
|
|
490
471
|
def get_external_user(self, user_id: UUID) -> UserResponse:
|