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
@@ -31,12 +31,12 @@ from pydantic import Field
|
|
31
31
|
|
32
32
|
from zenml.models.v2.base.base import BaseZenModel
|
33
33
|
from zenml.models.v2.base.scoped import (
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
34
|
+
ProjectScopedFilter,
|
35
|
+
ProjectScopedRequest,
|
36
|
+
ProjectScopedResponse,
|
37
|
+
ProjectScopedResponseBody,
|
38
|
+
ProjectScopedResponseMetadata,
|
39
|
+
ProjectScopedResponseResources,
|
40
40
|
)
|
41
41
|
from zenml.models.v2.misc.build_item import BuildItem
|
42
42
|
|
@@ -171,7 +171,7 @@ class PipelineBuildBase(BaseZenModel):
|
|
171
171
|
)
|
172
172
|
|
173
173
|
|
174
|
-
class PipelineBuildRequest(PipelineBuildBase,
|
174
|
+
class PipelineBuildRequest(PipelineBuildBase, ProjectScopedRequest):
|
175
175
|
"""Request model for pipelines builds."""
|
176
176
|
|
177
177
|
checksum: Optional[str] = Field(title="The build checksum.", default=None)
|
@@ -193,11 +193,11 @@ class PipelineBuildRequest(PipelineBuildBase, WorkspaceScopedRequest):
|
|
193
193
|
|
194
194
|
|
195
195
|
# ------------------ Response Model ------------------
|
196
|
-
class PipelineBuildResponseBody(
|
196
|
+
class PipelineBuildResponseBody(ProjectScopedResponseBody):
|
197
197
|
"""Response body for pipeline builds."""
|
198
198
|
|
199
199
|
|
200
|
-
class PipelineBuildResponseMetadata(
|
200
|
+
class PipelineBuildResponseMetadata(ProjectScopedResponseMetadata):
|
201
201
|
"""Response metadata for pipeline builds."""
|
202
202
|
|
203
203
|
pipeline: Optional["PipelineResponse"] = Field(
|
@@ -231,12 +231,12 @@ class PipelineBuildResponseMetadata(WorkspaceScopedResponseMetadata):
|
|
231
231
|
)
|
232
232
|
|
233
233
|
|
234
|
-
class PipelineBuildResponseResources(
|
234
|
+
class PipelineBuildResponseResources(ProjectScopedResponseResources):
|
235
235
|
"""Class for all resource models associated with the pipeline build entity."""
|
236
236
|
|
237
237
|
|
238
238
|
class PipelineBuildResponse(
|
239
|
-
|
239
|
+
ProjectScopedResponse[
|
240
240
|
PipelineBuildResponseBody,
|
241
241
|
PipelineBuildResponseMetadata,
|
242
242
|
PipelineBuildResponseResources,
|
@@ -278,7 +278,7 @@ class PipelineBuildResponse(
|
|
278
278
|
exclude={
|
279
279
|
"pipeline",
|
280
280
|
"stack",
|
281
|
-
"
|
281
|
+
"project",
|
282
282
|
}
|
283
283
|
)
|
284
284
|
)
|
@@ -473,11 +473,11 @@ class PipelineBuildResponse(
|
|
473
473
|
# ------------------ Filter Model ------------------
|
474
474
|
|
475
475
|
|
476
|
-
class PipelineBuildFilter(
|
476
|
+
class PipelineBuildFilter(ProjectScopedFilter):
|
477
477
|
"""Model to enable advanced filtering of all pipeline builds."""
|
478
478
|
|
479
479
|
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
480
|
-
*
|
480
|
+
*ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
|
481
481
|
"container_registry_id",
|
482
482
|
]
|
483
483
|
|
@@ -24,12 +24,12 @@ from zenml.config.step_configurations import Step
|
|
24
24
|
from zenml.models.v2.base.base import BaseZenModel
|
25
25
|
from zenml.models.v2.base.page import Page
|
26
26
|
from zenml.models.v2.base.scoped import (
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
27
|
+
ProjectScopedFilter,
|
28
|
+
ProjectScopedRequest,
|
29
|
+
ProjectScopedResponse,
|
30
|
+
ProjectScopedResponseBody,
|
31
|
+
ProjectScopedResponseMetadata,
|
32
|
+
ProjectScopedResponseResources,
|
33
33
|
)
|
34
34
|
from zenml.models.v2.core.code_reference import (
|
35
35
|
CodeReferenceRequest,
|
@@ -93,9 +93,7 @@ class PipelineDeploymentBase(BaseZenModel):
|
|
93
93
|
)
|
94
94
|
|
95
95
|
|
96
|
-
class PipelineDeploymentRequest(
|
97
|
-
PipelineDeploymentBase, WorkspaceScopedRequest
|
98
|
-
):
|
96
|
+
class PipelineDeploymentRequest(PipelineDeploymentBase, ProjectScopedRequest):
|
99
97
|
"""Request model for pipeline deployments."""
|
100
98
|
|
101
99
|
stack: UUID = Field(title="The stack associated with the deployment.")
|
@@ -129,11 +127,11 @@ class PipelineDeploymentRequest(
|
|
129
127
|
# ------------------ Response Model ------------------
|
130
128
|
|
131
129
|
|
132
|
-
class PipelineDeploymentResponseBody(
|
130
|
+
class PipelineDeploymentResponseBody(ProjectScopedResponseBody):
|
133
131
|
"""Response body for pipeline deployments."""
|
134
132
|
|
135
133
|
|
136
|
-
class PipelineDeploymentResponseMetadata(
|
134
|
+
class PipelineDeploymentResponseMetadata(ProjectScopedResponseMetadata):
|
137
135
|
"""Response metadata for pipeline deployments."""
|
138
136
|
|
139
137
|
run_name_template: str = Field(
|
@@ -188,7 +186,7 @@ class PipelineDeploymentResponseMetadata(WorkspaceScopedResponseMetadata):
|
|
188
186
|
)
|
189
187
|
|
190
188
|
|
191
|
-
class PipelineDeploymentResponseResources(
|
189
|
+
class PipelineDeploymentResponseResources(ProjectScopedResponseResources):
|
192
190
|
"""Class for all resource models associated with the pipeline deployment entity."""
|
193
191
|
|
194
192
|
triggers: TriggerPage = Field( # type: ignore[valid-type]
|
@@ -197,7 +195,7 @@ class PipelineDeploymentResponseResources(WorkspaceScopedResponseResources):
|
|
197
195
|
|
198
196
|
|
199
197
|
class PipelineDeploymentResponse(
|
200
|
-
|
198
|
+
ProjectScopedResponse[
|
201
199
|
PipelineDeploymentResponseBody,
|
202
200
|
PipelineDeploymentResponseMetadata,
|
203
201
|
PipelineDeploymentResponseResources,
|
@@ -355,7 +353,7 @@ class PipelineDeploymentResponse(
|
|
355
353
|
# ------------------ Filter Model ------------------
|
356
354
|
|
357
355
|
|
358
|
-
class PipelineDeploymentFilter(
|
356
|
+
class PipelineDeploymentFilter(ProjectScopedFilter):
|
359
357
|
"""Model to enable advanced filtering of all pipeline deployments."""
|
360
358
|
|
361
359
|
pipeline_id: Optional[Union[UUID, str]] = Field(
|
@@ -28,23 +28,25 @@ from typing import (
|
|
28
28
|
)
|
29
29
|
from uuid import UUID
|
30
30
|
|
31
|
-
from pydantic import
|
31
|
+
from pydantic import ConfigDict, Field
|
32
32
|
|
33
33
|
from zenml.config.pipeline_configurations import PipelineConfiguration
|
34
34
|
from zenml.constants import STR_FIELD_MAX_LENGTH
|
35
35
|
from zenml.enums import ExecutionStatus
|
36
36
|
from zenml.metadata.metadata_types import MetadataType
|
37
|
+
from zenml.models.v2.base.base import BaseUpdate
|
37
38
|
from zenml.models.v2.base.scoped import (
|
39
|
+
ProjectScopedFilter,
|
40
|
+
ProjectScopedRequest,
|
41
|
+
ProjectScopedResponse,
|
42
|
+
ProjectScopedResponseBody,
|
43
|
+
ProjectScopedResponseMetadata,
|
44
|
+
ProjectScopedResponseResources,
|
38
45
|
TaggableFilter,
|
39
|
-
WorkspaceScopedFilter,
|
40
|
-
WorkspaceScopedRequest,
|
41
|
-
WorkspaceScopedResponse,
|
42
|
-
WorkspaceScopedResponseBody,
|
43
|
-
WorkspaceScopedResponseMetadata,
|
44
|
-
WorkspaceScopedResponseResources,
|
45
46
|
)
|
46
47
|
from zenml.models.v2.core.model_version import ModelVersionResponse
|
47
48
|
from zenml.models.v2.core.tag import TagResponse
|
49
|
+
from zenml.utils.tag_utils import Tag
|
48
50
|
|
49
51
|
if TYPE_CHECKING:
|
50
52
|
from sqlalchemy.sql.elements import ColumnElement
|
@@ -69,7 +71,7 @@ AnyQuery = TypeVar("AnyQuery", bound=Any)
|
|
69
71
|
# ------------------ Request Model ------------------
|
70
72
|
|
71
73
|
|
72
|
-
class PipelineRunRequest(
|
74
|
+
class PipelineRunRequest(ProjectScopedRequest):
|
73
75
|
"""Request model for pipeline runs."""
|
74
76
|
|
75
77
|
name: str = Field(
|
@@ -117,15 +119,10 @@ class PipelineRunRequest(WorkspaceScopedRequest):
|
|
117
119
|
default=None,
|
118
120
|
title="ID of the trigger execution that triggered this run.",
|
119
121
|
)
|
120
|
-
tags: Optional[List[str]] = Field(
|
122
|
+
tags: Optional[List[Union[str, Tag]]] = Field(
|
121
123
|
default=None,
|
122
124
|
title="Tags of the pipeline run.",
|
123
125
|
)
|
124
|
-
model_version_id: Optional[UUID] = Field(
|
125
|
-
title="The ID of the model version that was "
|
126
|
-
"configured by this pipeline run explicitly.",
|
127
|
-
default=None,
|
128
|
-
)
|
129
126
|
|
130
127
|
model_config = ConfigDict(protected_namespaces=())
|
131
128
|
|
@@ -133,16 +130,11 @@ class PipelineRunRequest(WorkspaceScopedRequest):
|
|
133
130
|
# ------------------ Update Model ------------------
|
134
131
|
|
135
132
|
|
136
|
-
class PipelineRunUpdate(
|
133
|
+
class PipelineRunUpdate(BaseUpdate):
|
137
134
|
"""Pipeline run update model."""
|
138
135
|
|
139
136
|
status: Optional[ExecutionStatus] = None
|
140
137
|
end_time: Optional[datetime] = None
|
141
|
-
model_version_id: Optional[UUID] = Field(
|
142
|
-
title="The ID of the model version that was "
|
143
|
-
"configured by this pipeline run explicitly.",
|
144
|
-
default=None,
|
145
|
-
)
|
146
138
|
# TODO: we should maybe have a different update model here, the upper
|
147
139
|
# three attributes should only be for internal use
|
148
140
|
add_tags: Optional[List[str]] = Field(
|
@@ -158,7 +150,7 @@ class PipelineRunUpdate(BaseModel):
|
|
158
150
|
# ------------------ Response Model ------------------
|
159
151
|
|
160
152
|
|
161
|
-
class PipelineRunResponseBody(
|
153
|
+
class PipelineRunResponseBody(ProjectScopedResponseBody):
|
162
154
|
"""Response body for pipeline runs."""
|
163
155
|
|
164
156
|
status: ExecutionStatus = Field(
|
@@ -194,7 +186,7 @@ class PipelineRunResponseBody(WorkspaceScopedResponseBody):
|
|
194
186
|
model_config = ConfigDict(protected_namespaces=())
|
195
187
|
|
196
188
|
|
197
|
-
class PipelineRunResponseMetadata(
|
189
|
+
class PipelineRunResponseMetadata(ProjectScopedResponseMetadata):
|
198
190
|
"""Response metadata for pipeline runs."""
|
199
191
|
|
200
192
|
run_metadata: Dict[str, MetadataType] = Field(
|
@@ -252,7 +244,7 @@ class PipelineRunResponseMetadata(WorkspaceScopedResponseMetadata):
|
|
252
244
|
)
|
253
245
|
|
254
246
|
|
255
|
-
class PipelineRunResponseResources(
|
247
|
+
class PipelineRunResponseResources(ProjectScopedResponseResources):
|
256
248
|
"""Class for all resource models associated with the pipeline run entity."""
|
257
249
|
|
258
250
|
model_version: Optional[ModelVersionResponse] = None
|
@@ -270,7 +262,7 @@ class PipelineRunResponseResources(WorkspaceScopedResponseResources):
|
|
270
262
|
|
271
263
|
|
272
264
|
class PipelineRunResponse(
|
273
|
-
|
265
|
+
ProjectScopedResponse[
|
274
266
|
PipelineRunResponseBody,
|
275
267
|
PipelineRunResponseMetadata,
|
276
268
|
PipelineRunResponseResources,
|
@@ -590,11 +582,11 @@ class PipelineRunResponse(
|
|
590
582
|
# ------------------ Filter Model ------------------
|
591
583
|
|
592
584
|
|
593
|
-
class PipelineRunFilter(
|
594
|
-
"""Model to enable advanced filtering of all
|
585
|
+
class PipelineRunFilter(ProjectScopedFilter, TaggableFilter):
|
586
|
+
"""Model to enable advanced filtering of all pipeline runs."""
|
595
587
|
|
596
588
|
CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
|
597
|
-
*
|
589
|
+
*ProjectScopedFilter.CUSTOM_SORTING_OPTIONS,
|
598
590
|
*TaggableFilter.CUSTOM_SORTING_OPTIONS,
|
599
591
|
"tag",
|
600
592
|
"stack",
|
@@ -603,7 +595,7 @@ class PipelineRunFilter(WorkspaceScopedFilter, TaggableFilter):
|
|
603
595
|
"model_version",
|
604
596
|
]
|
605
597
|
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
606
|
-
*
|
598
|
+
*ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
|
607
599
|
*TaggableFilter.FILTER_EXCLUDE_FIELDS,
|
608
600
|
"unlisted",
|
609
601
|
"code_repository_id",
|
@@ -621,7 +613,7 @@ class PipelineRunFilter(WorkspaceScopedFilter, TaggableFilter):
|
|
621
613
|
"run_metadata",
|
622
614
|
]
|
623
615
|
CLI_EXCLUDE_FIELDS = [
|
624
|
-
*
|
616
|
+
*ProjectScopedFilter.CLI_EXCLUDE_FIELDS,
|
625
617
|
*TaggableFilter.CLI_EXCLUDE_FIELDS,
|
626
618
|
]
|
627
619
|
|
@@ -0,0 +1,203 @@
|
|
1
|
+
# Copyright (c) ZenML GmbH 2023. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at:
|
6
|
+
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
12
|
+
# or implied. See the License for the specific language governing
|
13
|
+
# permissions and limitations under the License.
|
14
|
+
"""Models representing projects."""
|
15
|
+
|
16
|
+
import re
|
17
|
+
from typing import Any, Dict, Optional
|
18
|
+
|
19
|
+
from pydantic import Field, model_validator
|
20
|
+
|
21
|
+
from zenml.constants import STR_FIELD_MAX_LENGTH, STR_ID_FIELD_MAX_LENGTH
|
22
|
+
from zenml.models.v2.base.base import (
|
23
|
+
BaseDatedResponseBody,
|
24
|
+
BaseIdentifiedResponse,
|
25
|
+
BaseRequest,
|
26
|
+
BaseResponseMetadata,
|
27
|
+
BaseResponseResources,
|
28
|
+
BaseUpdate,
|
29
|
+
)
|
30
|
+
from zenml.models.v2.base.filter import BaseFilter
|
31
|
+
from zenml.utils.pydantic_utils import before_validator_handler
|
32
|
+
|
33
|
+
# ------------------ Request Model ------------------
|
34
|
+
|
35
|
+
|
36
|
+
class ProjectRequest(BaseRequest):
|
37
|
+
"""Request model for projects."""
|
38
|
+
|
39
|
+
name: str = Field(
|
40
|
+
title="The unique name of the project. The project name must only "
|
41
|
+
"contain only lowercase letters, numbers, underscores, and hyphens and "
|
42
|
+
"be at most 50 characters long.",
|
43
|
+
min_length=1,
|
44
|
+
max_length=STR_ID_FIELD_MAX_LENGTH,
|
45
|
+
pattern=r"^[a-z0-9_-]+$",
|
46
|
+
)
|
47
|
+
display_name: str = Field(
|
48
|
+
default="",
|
49
|
+
title="The display name of the project.",
|
50
|
+
max_length=STR_FIELD_MAX_LENGTH,
|
51
|
+
)
|
52
|
+
description: str = Field(
|
53
|
+
default="",
|
54
|
+
title="The description of the project.",
|
55
|
+
max_length=STR_FIELD_MAX_LENGTH,
|
56
|
+
)
|
57
|
+
|
58
|
+
@model_validator(mode="before")
|
59
|
+
@classmethod
|
60
|
+
@before_validator_handler
|
61
|
+
def _validate_project_name(cls, data: Dict[str, Any]) -> Dict[str, Any]:
|
62
|
+
"""Validate the project name.
|
63
|
+
|
64
|
+
Args:
|
65
|
+
data: The values to validate.
|
66
|
+
|
67
|
+
Returns:
|
68
|
+
The validated values.
|
69
|
+
"""
|
70
|
+
name = data.get("name")
|
71
|
+
display_name = data.get("display_name")
|
72
|
+
|
73
|
+
if not name and not display_name:
|
74
|
+
return data
|
75
|
+
|
76
|
+
if not name:
|
77
|
+
assert display_name
|
78
|
+
|
79
|
+
project_name = display_name.lower().replace(" ", "-")
|
80
|
+
project_name = re.sub(r"[^a-z0-9_-]", "", project_name)
|
81
|
+
|
82
|
+
data["name"] = project_name
|
83
|
+
|
84
|
+
if not display_name:
|
85
|
+
# We just use the name as the display name
|
86
|
+
data["display_name"] = name
|
87
|
+
|
88
|
+
return data
|
89
|
+
|
90
|
+
|
91
|
+
# ------------------ Update Model ------------------
|
92
|
+
|
93
|
+
|
94
|
+
class ProjectUpdate(BaseUpdate):
|
95
|
+
"""Update model for projects."""
|
96
|
+
|
97
|
+
name: Optional[str] = Field(
|
98
|
+
title="The unique name of the project. The project name must only "
|
99
|
+
"contain only lowercase letters, numbers, underscores, and hyphens and "
|
100
|
+
"be at most 50 characters long.",
|
101
|
+
min_length=1,
|
102
|
+
max_length=STR_ID_FIELD_MAX_LENGTH,
|
103
|
+
pattern=r"^[a-z0-9_-]+$",
|
104
|
+
default=None,
|
105
|
+
)
|
106
|
+
display_name: Optional[str] = Field(
|
107
|
+
title="The display name of the project.",
|
108
|
+
max_length=STR_FIELD_MAX_LENGTH,
|
109
|
+
default=None,
|
110
|
+
)
|
111
|
+
description: Optional[str] = Field(
|
112
|
+
title="The description of the project.",
|
113
|
+
max_length=STR_FIELD_MAX_LENGTH,
|
114
|
+
default=None,
|
115
|
+
)
|
116
|
+
|
117
|
+
|
118
|
+
# ------------------ Response Model ------------------
|
119
|
+
|
120
|
+
|
121
|
+
class ProjectResponseBody(BaseDatedResponseBody):
|
122
|
+
"""Response body for projects."""
|
123
|
+
|
124
|
+
display_name: str = Field(
|
125
|
+
title="The display name of the project.",
|
126
|
+
max_length=STR_FIELD_MAX_LENGTH,
|
127
|
+
)
|
128
|
+
|
129
|
+
|
130
|
+
class ProjectResponseMetadata(BaseResponseMetadata):
|
131
|
+
"""Response metadata for projects."""
|
132
|
+
|
133
|
+
description: str = Field(
|
134
|
+
default="",
|
135
|
+
title="The description of the project.",
|
136
|
+
max_length=STR_FIELD_MAX_LENGTH,
|
137
|
+
)
|
138
|
+
|
139
|
+
|
140
|
+
class ProjectResponseResources(BaseResponseResources):
|
141
|
+
"""Class for all resource models associated with the project entity."""
|
142
|
+
|
143
|
+
|
144
|
+
class ProjectResponse(
|
145
|
+
BaseIdentifiedResponse[
|
146
|
+
ProjectResponseBody,
|
147
|
+
ProjectResponseMetadata,
|
148
|
+
ProjectResponseResources,
|
149
|
+
]
|
150
|
+
):
|
151
|
+
"""Response model for projects."""
|
152
|
+
|
153
|
+
name: str = Field(
|
154
|
+
title="The unique name of the project.",
|
155
|
+
max_length=STR_ID_FIELD_MAX_LENGTH,
|
156
|
+
)
|
157
|
+
|
158
|
+
def get_hydrated_version(self) -> "ProjectResponse":
|
159
|
+
"""Get the hydrated version of this project.
|
160
|
+
|
161
|
+
Returns:
|
162
|
+
an instance of the same entity with the metadata field attached.
|
163
|
+
"""
|
164
|
+
from zenml.client import Client
|
165
|
+
|
166
|
+
return Client().zen_store.get_project(self.id)
|
167
|
+
|
168
|
+
# Body and metadata properties
|
169
|
+
|
170
|
+
@property
|
171
|
+
def display_name(self) -> str:
|
172
|
+
"""The `display_name` property.
|
173
|
+
|
174
|
+
Returns:
|
175
|
+
the value of the property.
|
176
|
+
"""
|
177
|
+
return self.get_body().display_name
|
178
|
+
|
179
|
+
@property
|
180
|
+
def description(self) -> str:
|
181
|
+
"""The `description` property.
|
182
|
+
|
183
|
+
Returns:
|
184
|
+
the value of the property.
|
185
|
+
"""
|
186
|
+
return self.get_metadata().description
|
187
|
+
|
188
|
+
|
189
|
+
# ------------------ Filter Model ------------------
|
190
|
+
|
191
|
+
|
192
|
+
class ProjectFilter(BaseFilter):
|
193
|
+
"""Model to enable advanced filtering of all projects."""
|
194
|
+
|
195
|
+
name: Optional[str] = Field(
|
196
|
+
default=None,
|
197
|
+
description="Name of the project",
|
198
|
+
)
|
199
|
+
|
200
|
+
display_name: Optional[str] = Field(
|
201
|
+
default=None,
|
202
|
+
description="Display name of the project",
|
203
|
+
)
|
@@ -20,14 +20,14 @@ from pydantic import Field, model_validator
|
|
20
20
|
|
21
21
|
from zenml.metadata.metadata_types import MetadataType, MetadataTypeEnum
|
22
22
|
from zenml.models.v2.base.scoped import (
|
23
|
-
|
23
|
+
ProjectScopedRequest,
|
24
24
|
)
|
25
25
|
from zenml.models.v2.misc.run_metadata import RunMetadataResource
|
26
26
|
|
27
27
|
# ------------------ Request Model ------------------
|
28
28
|
|
29
29
|
|
30
|
-
class RunMetadataRequest(
|
30
|
+
class RunMetadataRequest(ProjectScopedRequest):
|
31
31
|
"""Request model for run metadata."""
|
32
32
|
|
33
33
|
resources: List[RunMetadataResource] = Field(
|
@@ -33,13 +33,13 @@ from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
|
|
33
33
|
from zenml.enums import ExecutionStatus
|
34
34
|
from zenml.models.v2.base.base import BaseUpdate
|
35
35
|
from zenml.models.v2.base.scoped import (
|
36
|
+
ProjectScopedFilter,
|
37
|
+
ProjectScopedRequest,
|
38
|
+
ProjectScopedResponse,
|
39
|
+
ProjectScopedResponseBody,
|
40
|
+
ProjectScopedResponseMetadata,
|
41
|
+
ProjectScopedResponseResources,
|
36
42
|
TaggableFilter,
|
37
|
-
WorkspaceScopedFilter,
|
38
|
-
WorkspaceScopedRequest,
|
39
|
-
WorkspaceScopedResponse,
|
40
|
-
WorkspaceScopedResponseBody,
|
41
|
-
WorkspaceScopedResponseMetadata,
|
42
|
-
WorkspaceScopedResponseResources,
|
43
43
|
)
|
44
44
|
from zenml.models.v2.core.code_reference import (
|
45
45
|
CodeReferenceResponse,
|
@@ -64,7 +64,7 @@ if TYPE_CHECKING:
|
|
64
64
|
# ------------------ Request Model ------------------
|
65
65
|
|
66
66
|
|
67
|
-
class RunTemplateRequest(
|
67
|
+
class RunTemplateRequest(ProjectScopedRequest):
|
68
68
|
"""Request model for run templates."""
|
69
69
|
|
70
70
|
name: str = Field(
|
@@ -112,7 +112,7 @@ class RunTemplateUpdate(BaseUpdate):
|
|
112
112
|
# ------------------ Response Model ------------------
|
113
113
|
|
114
114
|
|
115
|
-
class RunTemplateResponseBody(
|
115
|
+
class RunTemplateResponseBody(ProjectScopedResponseBody):
|
116
116
|
"""Response body for run templates."""
|
117
117
|
|
118
118
|
runnable: bool = Field(
|
@@ -128,7 +128,7 @@ class RunTemplateResponseBody(WorkspaceScopedResponseBody):
|
|
128
128
|
)
|
129
129
|
|
130
130
|
|
131
|
-
class RunTemplateResponseMetadata(
|
131
|
+
class RunTemplateResponseMetadata(ProjectScopedResponseMetadata):
|
132
132
|
"""Response metadata for run templates."""
|
133
133
|
|
134
134
|
description: Optional[str] = Field(
|
@@ -146,7 +146,7 @@ class RunTemplateResponseMetadata(WorkspaceScopedResponseMetadata):
|
|
146
146
|
)
|
147
147
|
|
148
148
|
|
149
|
-
class RunTemplateResponseResources(
|
149
|
+
class RunTemplateResponseResources(ProjectScopedResponseResources):
|
150
150
|
"""All resource models associated with the run template."""
|
151
151
|
|
152
152
|
source_deployment: Optional[PipelineDeploymentResponse] = Field(
|
@@ -170,7 +170,7 @@ class RunTemplateResponseResources(WorkspaceScopedResponseResources):
|
|
170
170
|
|
171
171
|
|
172
172
|
class RunTemplateResponse(
|
173
|
-
|
173
|
+
ProjectScopedResponse[
|
174
174
|
RunTemplateResponseBody,
|
175
175
|
RunTemplateResponseMetadata,
|
176
176
|
RunTemplateResponseResources,
|
@@ -308,26 +308,25 @@ class RunTemplateResponse(
|
|
308
308
|
# ------------------ Filter Model ------------------
|
309
309
|
|
310
310
|
|
311
|
-
class RunTemplateFilter(
|
311
|
+
class RunTemplateFilter(ProjectScopedFilter, TaggableFilter):
|
312
312
|
"""Model for filtering of run templates."""
|
313
313
|
|
314
314
|
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
315
|
-
*
|
315
|
+
*ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
|
316
316
|
*TaggableFilter.FILTER_EXCLUDE_FIELDS,
|
317
317
|
"code_repository_id",
|
318
318
|
"stack_id",
|
319
319
|
"build_id",
|
320
320
|
"pipeline_id",
|
321
|
-
"user",
|
322
321
|
"pipeline",
|
323
322
|
"stack",
|
324
323
|
]
|
325
324
|
CUSTOM_SORTING_OPTIONS = [
|
326
|
-
*
|
325
|
+
*ProjectScopedFilter.CUSTOM_SORTING_OPTIONS,
|
327
326
|
*TaggableFilter.CUSTOM_SORTING_OPTIONS,
|
328
327
|
]
|
329
|
-
CLI_EXCLUDE_FIELDS = [
|
330
|
-
*
|
328
|
+
CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
329
|
+
*ProjectScopedFilter.CLI_EXCLUDE_FIELDS,
|
331
330
|
*TaggableFilter.CLI_EXCLUDE_FIELDS,
|
332
331
|
]
|
333
332
|
|
zenml/models/v2/core/schedule.py
CHANGED
@@ -24,12 +24,12 @@ from zenml.logger import get_logger
|
|
24
24
|
from zenml.metadata.metadata_types import MetadataType
|
25
25
|
from zenml.models.v2.base.base import BaseUpdate
|
26
26
|
from zenml.models.v2.base.scoped import (
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
27
|
+
ProjectScopedFilter,
|
28
|
+
ProjectScopedRequest,
|
29
|
+
ProjectScopedResponse,
|
30
|
+
ProjectScopedResponseBody,
|
31
|
+
ProjectScopedResponseMetadata,
|
32
|
+
ProjectScopedResponseResources,
|
33
33
|
)
|
34
34
|
from zenml.utils.time_utils import to_utc_timezone
|
35
35
|
|
@@ -39,7 +39,7 @@ logger = get_logger(__name__)
|
|
39
39
|
# ------------------ Request Model ------------------
|
40
40
|
|
41
41
|
|
42
|
-
class ScheduleRequest(
|
42
|
+
class ScheduleRequest(ProjectScopedRequest):
|
43
43
|
"""Request model for schedules."""
|
44
44
|
|
45
45
|
name: str
|
@@ -127,21 +127,12 @@ class ScheduleUpdate(BaseUpdate):
|
|
127
127
|
"""Update model for schedules."""
|
128
128
|
|
129
129
|
name: Optional[str] = None
|
130
|
-
active: Optional[bool] = None
|
131
|
-
cron_expression: Optional[str] = None
|
132
|
-
start_time: Optional[datetime] = None
|
133
|
-
end_time: Optional[datetime] = None
|
134
|
-
interval_second: Optional[timedelta] = None
|
135
|
-
catchup: Optional[bool] = None
|
136
|
-
run_once_start_time: Optional[datetime] = None
|
137
|
-
orchestrator_id: Optional[UUID] = None
|
138
|
-
pipeline_id: Optional[UUID] = None
|
139
130
|
|
140
131
|
|
141
132
|
# ------------------ Response Model ------------------
|
142
133
|
|
143
134
|
|
144
|
-
class ScheduleResponseBody(
|
135
|
+
class ScheduleResponseBody(ProjectScopedResponseBody):
|
145
136
|
"""Response body for schedules."""
|
146
137
|
|
147
138
|
active: bool
|
@@ -153,7 +144,7 @@ class ScheduleResponseBody(WorkspaceScopedResponseBody):
|
|
153
144
|
run_once_start_time: Optional[datetime] = None
|
154
145
|
|
155
146
|
|
156
|
-
class ScheduleResponseMetadata(
|
147
|
+
class ScheduleResponseMetadata(ProjectScopedResponseMetadata):
|
157
148
|
"""Response metadata for schedules."""
|
158
149
|
|
159
150
|
orchestrator_id: Optional[UUID]
|
@@ -165,12 +156,12 @@ class ScheduleResponseMetadata(WorkspaceScopedResponseMetadata):
|
|
165
156
|
)
|
166
157
|
|
167
158
|
|
168
|
-
class ScheduleResponseResources(
|
159
|
+
class ScheduleResponseResources(ProjectScopedResponseResources):
|
169
160
|
"""Class for all resource models associated with the schedule entity."""
|
170
161
|
|
171
162
|
|
172
163
|
class ScheduleResponse(
|
173
|
-
|
164
|
+
ProjectScopedResponse[
|
174
165
|
ScheduleResponseBody,
|
175
166
|
ScheduleResponseMetadata,
|
176
167
|
ScheduleResponseResources,
|
@@ -313,7 +304,7 @@ class ScheduleResponse(
|
|
313
304
|
# ------------------ Filter Model ------------------
|
314
305
|
|
315
306
|
|
316
|
-
class ScheduleFilter(
|
307
|
+
class ScheduleFilter(ProjectScopedFilter):
|
317
308
|
"""Model to enable advanced filtering of all Users."""
|
318
309
|
|
319
310
|
pipeline_id: Optional[Union[UUID, str]] = Field(
|