zenml-nightly 0.70.0.dev20241201__py3-none-any.whl → 0.71.0.dev20241220__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.
- README.md +4 -4
- RELEASE_NOTES.md +112 -0
- zenml/VERSION +1 -1
- zenml/artifacts/artifact_config.py +8 -5
- zenml/artifacts/utils.py +3 -1
- zenml/cli/__init__.py +4 -4
- zenml/cli/base.py +1 -1
- zenml/cli/pipeline.py +48 -79
- zenml/cli/server.py +19 -19
- zenml/client.py +54 -2
- zenml/config/secret_reference_mixin.py +1 -1
- zenml/config/server_config.py +4 -0
- zenml/constants.py +10 -0
- zenml/image_builders/base_image_builder.py +5 -2
- zenml/image_builders/build_context.py +7 -16
- zenml/integrations/aws/__init__.py +3 -0
- zenml/integrations/aws/flavors/__init__.py +6 -0
- zenml/integrations/aws/flavors/aws_image_builder_flavor.py +146 -0
- zenml/integrations/aws/image_builders/__init__.py +20 -0
- zenml/integrations/aws/image_builders/aws_image_builder.py +307 -0
- zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +1 -1
- zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +2 -1
- zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +11 -0
- zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py +0 -1
- zenml/integrations/lightning/flavors/lightning_orchestrator_flavor.py +11 -0
- zenml/integrations/neptune/experiment_trackers/neptune_experiment_tracker.py +7 -5
- zenml/integrations/neptune/experiment_trackers/run_state.py +69 -53
- zenml/integrations/registry.py +2 -2
- zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +12 -0
- zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +13 -5
- zenml/materializers/built_in_materializer.py +1 -1
- zenml/model/model.py +12 -16
- zenml/model/utils.py +3 -1
- zenml/models/v2/base/filter.py +26 -30
- zenml/models/v2/base/scoped.py +258 -5
- zenml/models/v2/core/artifact_version.py +15 -26
- zenml/models/v2/core/code_repository.py +1 -12
- zenml/models/v2/core/component.py +5 -46
- zenml/models/v2/core/flavor.py +1 -11
- zenml/models/v2/core/model.py +1 -57
- zenml/models/v2/core/model_version.py +5 -33
- zenml/models/v2/core/model_version_artifact.py +11 -3
- zenml/models/v2/core/model_version_pipeline_run.py +14 -3
- zenml/models/v2/core/pipeline.py +47 -55
- zenml/models/v2/core/pipeline_build.py +67 -12
- zenml/models/v2/core/pipeline_deployment.py +0 -10
- zenml/models/v2/core/pipeline_run.py +91 -29
- zenml/models/v2/core/run_template.py +21 -29
- zenml/models/v2/core/schedule.py +0 -10
- zenml/models/v2/core/secret.py +0 -14
- zenml/models/v2/core/service.py +9 -16
- zenml/models/v2/core/service_connector.py +0 -11
- zenml/models/v2/core/stack.py +21 -30
- zenml/models/v2/core/step_run.py +18 -14
- zenml/models/v2/core/trigger.py +19 -3
- zenml/orchestrators/base_orchestrator.py +13 -1
- zenml/orchestrators/output_utils.py +5 -1
- zenml/orchestrators/step_launcher.py +9 -13
- zenml/orchestrators/step_run_utils.py +8 -204
- zenml/orchestrators/utils.py +55 -27
- zenml/pipelines/build_utils.py +12 -0
- zenml/service_connectors/service_connector_utils.py +3 -9
- zenml/stack/stack_component.py +1 -1
- zenml/stack_deployments/aws_stack_deployment.py +22 -0
- zenml/utils/archivable.py +65 -36
- zenml/utils/code_utils.py +8 -4
- zenml/utils/docker_utils.py +9 -0
- zenml/zen_server/auth.py +9 -10
- zenml/zen_server/dashboard/assets/{404-NVXKFp-x.js → 404-Cqu3EDCm.js} +1 -1
- zenml/zen_server/dashboard/assets/{@reactflow-CK0KJUen.js → @reactflow-D2Y7BWwz.js} +1 -1
- zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-DezXKmDf.js → AlertDialogDropdownItem-BHd71pVS.js} +1 -1
- zenml/zen_server/dashboard/assets/{CodeSnippet-JzR8CEtw.js → CodeSnippet-DIonwetW.js} +1 -1
- zenml/zen_server/dashboard/assets/{CollapsibleCard-DQW_ktMO.js → CollapsibleCard-CDnC97pB.js} +1 -1
- zenml/zen_server/dashboard/assets/{Commands-DL2kwkRd.js → Commands-BVEXKAOj.js} +1 -1
- zenml/zen_server/dashboard/assets/{ComponentBadge-D_g62Wv8.js → ComponentBadge-CrRvovox.js} +1 -1
- zenml/zen_server/dashboard/assets/{CopyButton-LNcWaa14.js → CopyButton-B6wGAhQv.js} +1 -1
- zenml/zen_server/dashboard/assets/{CsvVizualization-DknpE5ej.js → CsvVizualization-CjcT7LMm.js} +5 -5
- zenml/zen_server/dashboard/assets/DeleteAlertDialog-D2ELtM2W.js +1 -0
- zenml/zen_server/dashboard/assets/{DialogItem-Bxf8FuAT.js → DialogItem-DXIMhBgU.js} +1 -1
- zenml/zen_server/dashboard/assets/{Error-DYflYyps.js → Error-B8uUfTpL.js} +1 -1
- zenml/zen_server/dashboard/assets/{ExecutionStatus-C7zyIQKZ.js → ExecutionStatus-ibAdY-dG.js} +1 -1
- zenml/zen_server/dashboard/assets/{Helpbox-oYSGpLqd.js → Helpbox-BfAfhKHw.js} +1 -1
- zenml/zen_server/dashboard/assets/{Infobox-Cx4xGoXR.js → Infobox-M_SMOu96.js} +1 -1
- zenml/zen_server/dashboard/assets/{InlineAvatar-DiGOWNKF.js → InlineAvatar-DBA0a0-a.js} +1 -1
- zenml/zen_server/dashboard/assets/{NestedCollapsible-DYbgyKxK.js → NestedCollapsible-DpgmEFKw.js} +1 -1
- zenml/zen_server/dashboard/assets/{Partials-03iZf8-N.js → Partials-D_ldD9if.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProBadge-D_EB8HNo.js → ProBadge-DQbfFotM.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProCta-DqNS4v3x.js → ProCta-Bcpb4rcY.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderIcon-Bki2aw8w.js → ProviderIcon-BZpgPigN.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderRadio-8f43sPD4.js → ProviderRadio-DWPnMuQ1.js} +1 -1
- zenml/zen_server/dashboard/assets/RunSelector-DgRGaAc6.js +1 -0
- zenml/zen_server/dashboard/assets/{RunsBody-07YEO7qI.js → RunsBody-KecfSkjY.js} +1 -1
- zenml/zen_server/dashboard/assets/{SearchField-lp1KgU4e.js → SearchField-n-ILHnaP.js} +1 -1
- zenml/zen_server/dashboard/assets/{SecretTooltip-CgnbyeOx.js → SecretTooltip-B8MrX5yu.js} +1 -1
- zenml/zen_server/dashboard/assets/{SetPassword-CpP418A2.js → SetPassword-B_IVq_wg.js} +1 -1
- zenml/zen_server/dashboard/assets/StackList-TWPBYnkF.js +1 -0
- zenml/zen_server/dashboard/assets/{Tabs-BktHkCJJ.js → Tabs-Rg857zmd.js} +1 -1
- zenml/zen_server/dashboard/assets/{Tick-BlMoIlJT.js → Tick-COg4A-xo.js} +1 -1
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Sc0A0pP-.js → UpdatePasswordSchemas-C6Aj3hm6.js} +1 -1
- zenml/zen_server/dashboard/assets/{UsageReason-YYduL4fj.js → UsageReason-BTLbx7w4.js} +1 -1
- zenml/zen_server/dashboard/assets/{WizardFooter-dgmizSJC.js → WizardFooter-BCAj69Vj.js} +1 -1
- zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-D-c2G6lV.js → all-pipeline-runs-query-DMXkDrV2.js} +1 -1
- zenml/zen_server/dashboard/assets/code-snippets-CqONne41.js +13 -0
- zenml/zen_server/dashboard/assets/{create-stack-DM_JPgef.js → create-stack-HfdbhLs4.js} +1 -1
- zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +1 -0
- zenml/zen_server/dashboard/assets/delete-run-DZ4hIXff.js +1 -0
- zenml/zen_server/dashboard/assets/{form-schemas-K6FYKjwa.js → form-schemas-B0AVEd9b.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-BAkC7FXi.js → index-DPqSWjug.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-CEV4Cvaf.js → index-DScjfBRb.js} +1 -1
- zenml/zen_server/dashboard/assets/index-DXvT1_Um.css +1 -0
- zenml/zen_server/dashboard/assets/{index-CCOPpudF.js → index-FO-p0GU7.js} +5 -5
- zenml/zen_server/dashboard/assets/{index-B1mVPYxf.js → index-I3bKUGUj.js} +1 -1
- zenml/zen_server/dashboard/assets/key-icon-aH-QIa5R.js +1 -0
- zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +1 -0
- zenml/zen_server/dashboard/assets/{login-mutation-hf-lK87O.js → login-mutation-BQeo4wTY.js} +1 -1
- zenml/zen_server/dashboard/assets/{not-found-BGirLjU-.js → not-found-gAJ5aDdR.js} +1 -1
- zenml/zen_server/dashboard/assets/page-9Y9-gig0.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DjRJCGb3.js → page-AUwiQ14W.js} +1 -1
- zenml/zen_server/dashboard/assets/page-B6XU7yYT.js +2 -0
- zenml/zen_server/dashboard/assets/{page-C00YAkaB.js → page-BKZYc2Zv.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CdMWnQak.js → page-BU9FG4sR.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D7S3aCbF.js → page-B_Apk3xg.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Djikxq_S.js → page-BdowiCbr.js} +1 -1
- zenml/zen_server/dashboard/assets/page-Bg8OjTRe.js +1 -0
- zenml/zen_server/dashboard/assets/page-BxL4qD4_.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DakHVWXF.js → page-CWxT5K5J.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CXuQufSe.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DLC-bNBP.js → page-CcQr8CPP.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CD-DcWoy.js → page-Ce4Hrjnr.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CiYxgZP_.js +1 -0
- zenml/zen_server/dashboard/assets/page-Cldq1mpe.js +1 -0
- zenml/zen_server/dashboard/assets/{page-BDigxVpo.js → page-D4wdonLm.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D6uU2ax4.js → page-D8ObrbH8.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DXSTpqRD.js → page-DFuAUGt4.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CbpvrsDL.js → page-DGazBpuP.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-COXXJj1k.js → page-DO1UcqPX.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DRYXdL5o.js +1 -0
- zenml/zen_server/dashboard/assets/{page-Df-Fw0aq.js → page-DYEquBC2.js} +1 -1
- zenml/zen_server/dashboard/assets/page-Dk32IeZm.js +1 -0
- zenml/zen_server/dashboard/assets/{page-yYC9OI-E.js → page-I3nKFGie.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-6m6yHHlE.js → page-M0w-n6vn.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Vcxara9U.js → page-R5dx3xGF.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BR68V0V1.js → page-bT5pOvcB.js} +1 -1
- zenml/zen_server/dashboard/assets/page-hUqK889I.js +6 -0
- zenml/zen_server/dashboard/assets/{page-CjGdWY13.js → page-h_Stveon.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D01JhjQB.js → page-r8XK5vR7.js} +1 -1
- zenml/zen_server/dashboard/assets/page-u_-ZXBKb.js +1 -0
- zenml/zen_server/dashboard/assets/page-zaMqB_ao.js +1 -0
- zenml/zen_server/dashboard/assets/{persist-GjC8PZoC.js → persist-AppN1B0J.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-Coz7ZWvz.js → persist-DAUi_3za.js} +1 -1
- zenml/zen_server/dashboard/assets/service-BqqeXLEe.js +2 -0
- zenml/zen_server/dashboard/assets/{sharedSchema-CQb14VSr.js → sharedSchema-uXN9FLLk.js} +1 -1
- zenml/zen_server/dashboard/assets/{stack-detail-query-OPEW-cDJ.js → stack-detail-query-XfZBiBP2.js} +1 -1
- zenml/zen_server/dashboard/assets/{update-server-settings-mutation-LwuQfHYn.js → update-server-settings-mutation-BWmgVJwA.js} +1 -1
- zenml/zen_server/dashboard/assets/{url-CkvKAnwF.js → url-BLwMbzES.js} +1 -1
- zenml/zen_server/dashboard/index.html +4 -4
- zenml/zen_server/deploy/helm/Chart.yaml +1 -1
- zenml/zen_server/deploy/helm/README.md +2 -2
- zenml/zen_server/rbac/rbac_sql_zen_store.py +173 -0
- zenml/zen_server/routers/auth_endpoints.py +22 -11
- zenml/zen_server/routers/steps_endpoints.py +7 -1
- zenml/zen_server/template_execution/utils.py +3 -1
- zenml/zen_server/utils.py +4 -3
- zenml/zen_stores/base_zen_store.py +10 -2
- zenml/zen_stores/migrations/versions/0.71.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/26351d482b9e_add_step_run_unique_constraint.py +37 -0
- zenml/zen_stores/migrations/versions/a1237ba94fd8_add_model_version_producer_run_unique_.py +68 -0
- zenml/zen_stores/rest_zen_store.py +76 -43
- zenml/zen_stores/schemas/model_schemas.py +42 -6
- zenml/zen_stores/schemas/pipeline_deployment_schemas.py +7 -7
- zenml/zen_stores/schemas/pipeline_run_schemas.py +12 -6
- zenml/zen_stores/schemas/pipeline_schemas.py +5 -0
- zenml/zen_stores/schemas/step_run_schemas.py +8 -1
- zenml/zen_stores/sql_zen_store.py +332 -100
- {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/METADATA +5 -5
- {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/RECORD +179 -164
- zenml/zen_server/dashboard/assets/RunSelector-DkPiIiNr.js +0 -1
- zenml/zen_server/dashboard/assets/StackList-WvuKQusZ.js +0 -1
- zenml/zen_server/dashboard/assets/delete-run-CJdh1P_h.js +0 -1
- zenml/zen_server/dashboard/assets/index-DlGvJQPn.css +0 -1
- zenml/zen_server/dashboard/assets/page-0JE_-Ec1.js +0 -1
- zenml/zen_server/dashboard/assets/page-BRLpxOt0.js +0 -1
- zenml/zen_server/dashboard/assets/page-BU7huvKw.js +0 -6
- zenml/zen_server/dashboard/assets/page-BvqLv2Ky.js +0 -1
- zenml/zen_server/dashboard/assets/page-CwxrFarU.js +0 -1
- zenml/zen_server/dashboard/assets/page-DfbXf_8s.js +0 -1
- zenml/zen_server/dashboard/assets/page-Dnovpa0i.js +0 -3
- zenml/zen_server/dashboard/assets/page-Dot3LPmL.js +0 -1
- zenml/zen_server/dashboard/assets/page-Xynx4btY.js +0 -14
- zenml/zen_server/dashboard/assets/page-YpKAqVSa.js +0 -1
- {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/entry_points.txt +0 -0
@@ -13,7 +13,17 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Models representing pipeline templates."""
|
15
15
|
|
16
|
-
from typing import
|
16
|
+
from typing import (
|
17
|
+
TYPE_CHECKING,
|
18
|
+
Any,
|
19
|
+
ClassVar,
|
20
|
+
Dict,
|
21
|
+
List,
|
22
|
+
Optional,
|
23
|
+
Type,
|
24
|
+
TypeVar,
|
25
|
+
Union,
|
26
|
+
)
|
17
27
|
from uuid import UUID
|
18
28
|
|
19
29
|
from pydantic import Field
|
@@ -45,6 +55,11 @@ from zenml.models.v2.core.tag import TagResponse
|
|
45
55
|
if TYPE_CHECKING:
|
46
56
|
from sqlalchemy.sql.elements import ColumnElement
|
47
57
|
|
58
|
+
from zenml.zen_stores.schemas.base_schemas import BaseSchema
|
59
|
+
|
60
|
+
AnySchema = TypeVar("AnySchema", bound=BaseSchema)
|
61
|
+
|
62
|
+
|
48
63
|
# ------------------ Request Model ------------------
|
49
64
|
|
50
65
|
|
@@ -310,16 +325,6 @@ class RunTemplateFilter(WorkspaceScopedTaggableFilter):
|
|
310
325
|
default=None,
|
311
326
|
description="Name of the run template.",
|
312
327
|
)
|
313
|
-
workspace_id: Optional[Union[UUID, str]] = Field(
|
314
|
-
default=None,
|
315
|
-
description="Workspace associated with the template.",
|
316
|
-
union_mode="left_to_right",
|
317
|
-
)
|
318
|
-
user_id: Optional[Union[UUID, str]] = Field(
|
319
|
-
default=None,
|
320
|
-
description="User that created the template.",
|
321
|
-
union_mode="left_to_right",
|
322
|
-
)
|
323
328
|
pipeline_id: Optional[Union[UUID, str]] = Field(
|
324
329
|
default=None,
|
325
330
|
description="Pipeline associated with the template.",
|
@@ -340,10 +345,6 @@ class RunTemplateFilter(WorkspaceScopedTaggableFilter):
|
|
340
345
|
description="Code repository associated with the template.",
|
341
346
|
union_mode="left_to_right",
|
342
347
|
)
|
343
|
-
user: Optional[Union[UUID, str]] = Field(
|
344
|
-
default=None,
|
345
|
-
description="Name/ID of the user that created the template.",
|
346
|
-
)
|
347
348
|
pipeline: Optional[Union[UUID, str]] = Field(
|
348
349
|
default=None,
|
349
350
|
description="Name/ID of the pipeline associated with the template.",
|
@@ -354,14 +355,17 @@ class RunTemplateFilter(WorkspaceScopedTaggableFilter):
|
|
354
355
|
)
|
355
356
|
|
356
357
|
def get_custom_filters(
|
357
|
-
self,
|
358
|
+
self, table: Type["AnySchema"]
|
358
359
|
) -> List["ColumnElement[bool]"]:
|
359
360
|
"""Get custom filters.
|
360
361
|
|
362
|
+
Args:
|
363
|
+
table: The query table.
|
364
|
+
|
361
365
|
Returns:
|
362
366
|
A list of custom filters.
|
363
367
|
"""
|
364
|
-
custom_filters = super().get_custom_filters()
|
368
|
+
custom_filters = super().get_custom_filters(table)
|
365
369
|
|
366
370
|
from sqlmodel import and_
|
367
371
|
|
@@ -371,7 +375,6 @@ class RunTemplateFilter(WorkspaceScopedTaggableFilter):
|
|
371
375
|
PipelineSchema,
|
372
376
|
RunTemplateSchema,
|
373
377
|
StackSchema,
|
374
|
-
UserSchema,
|
375
378
|
)
|
376
379
|
|
377
380
|
if self.code_repository_id:
|
@@ -409,17 +412,6 @@ class RunTemplateFilter(WorkspaceScopedTaggableFilter):
|
|
409
412
|
)
|
410
413
|
custom_filters.append(pipeline_filter)
|
411
414
|
|
412
|
-
if self.user:
|
413
|
-
user_filter = and_(
|
414
|
-
RunTemplateSchema.user_id == UserSchema.id,
|
415
|
-
self.generate_name_or_id_query_conditions(
|
416
|
-
value=self.user,
|
417
|
-
table=UserSchema,
|
418
|
-
additional_columns=["full_name"],
|
419
|
-
),
|
420
|
-
)
|
421
|
-
custom_filters.append(user_filter)
|
422
|
-
|
423
415
|
if self.pipeline:
|
424
416
|
pipeline_filter = and_(
|
425
417
|
RunTemplateSchema.source_deployment_id
|
zenml/models/v2/core/schedule.py
CHANGED
@@ -279,16 +279,6 @@ class ScheduleResponse(
|
|
279
279
|
class ScheduleFilter(WorkspaceScopedFilter):
|
280
280
|
"""Model to enable advanced filtering of all Users."""
|
281
281
|
|
282
|
-
workspace_id: Optional[Union[UUID, str]] = Field(
|
283
|
-
default=None,
|
284
|
-
description="Workspace scope of the schedule.",
|
285
|
-
union_mode="left_to_right",
|
286
|
-
)
|
287
|
-
user_id: Optional[Union[UUID, str]] = Field(
|
288
|
-
default=None,
|
289
|
-
description="User that created the schedule",
|
290
|
-
union_mode="left_to_right",
|
291
|
-
)
|
292
282
|
pipeline_id: Optional[Union[UUID, str]] = Field(
|
293
283
|
default=None,
|
294
284
|
description="Pipeline that the schedule is attached to.",
|
zenml/models/v2/core/secret.py
CHANGED
@@ -15,7 +15,6 @@
|
|
15
15
|
|
16
16
|
from datetime import datetime
|
17
17
|
from typing import Any, ClassVar, Dict, List, Optional, Union
|
18
|
-
from uuid import UUID
|
19
18
|
|
20
19
|
from pydantic import Field, SecretStr
|
21
20
|
|
@@ -253,25 +252,12 @@ class SecretFilter(WorkspaceScopedFilter):
|
|
253
252
|
default=None,
|
254
253
|
description="Name of the secret",
|
255
254
|
)
|
256
|
-
|
257
255
|
scope: Optional[Union[SecretScope, str]] = Field(
|
258
256
|
default=None,
|
259
257
|
description="Scope in which to filter secrets",
|
260
258
|
union_mode="left_to_right",
|
261
259
|
)
|
262
260
|
|
263
|
-
workspace_id: Optional[Union[UUID, str]] = Field(
|
264
|
-
default=None,
|
265
|
-
description="Workspace of the Secret",
|
266
|
-
union_mode="left_to_right",
|
267
|
-
)
|
268
|
-
|
269
|
-
user_id: Optional[Union[UUID, str]] = Field(
|
270
|
-
default=None,
|
271
|
-
description="User that created the Secret",
|
272
|
-
union_mode="left_to_right",
|
273
|
-
)
|
274
|
-
|
275
261
|
@staticmethod
|
276
262
|
def _get_filtering_value(value: Optional[Any]) -> str:
|
277
263
|
"""Convert the value to a string that can be used for lexicographical filtering and sorting.
|
zenml/models/v2/core/service.py
CHANGED
@@ -15,19 +15,20 @@
|
|
15
15
|
|
16
16
|
from datetime import datetime
|
17
17
|
from typing import (
|
18
|
+
TYPE_CHECKING,
|
18
19
|
Any,
|
19
20
|
ClassVar,
|
20
21
|
Dict,
|
21
22
|
List,
|
22
23
|
Optional,
|
23
24
|
Type,
|
25
|
+
TypeVar,
|
24
26
|
Union,
|
25
27
|
)
|
26
28
|
from uuid import UUID
|
27
29
|
|
28
30
|
from pydantic import BaseModel, ConfigDict, Field
|
29
31
|
from sqlalchemy.sql.elements import ColumnElement
|
30
|
-
from sqlmodel import SQLModel
|
31
32
|
|
32
33
|
from zenml.constants import STR_FIELD_MAX_LENGTH
|
33
34
|
from zenml.models.v2.base.scoped import (
|
@@ -37,11 +38,15 @@ from zenml.models.v2.base.scoped import (
|
|
37
38
|
WorkspaceScopedResponseBody,
|
38
39
|
WorkspaceScopedResponseMetadata,
|
39
40
|
WorkspaceScopedResponseResources,
|
40
|
-
WorkspaceScopedTaggableFilter,
|
41
41
|
)
|
42
42
|
from zenml.services.service_status import ServiceState
|
43
43
|
from zenml.services.service_type import ServiceType
|
44
44
|
|
45
|
+
if TYPE_CHECKING:
|
46
|
+
from zenml.zen_stores.schemas import BaseSchema
|
47
|
+
|
48
|
+
AnySchema = TypeVar("AnySchema", bound=BaseSchema)
|
49
|
+
|
45
50
|
# ------------------ Request Model ------------------
|
46
51
|
|
47
52
|
|
@@ -376,16 +381,6 @@ class ServiceFilter(WorkspaceScopedFilter):
|
|
376
381
|
description="Name of the service. Use this to filter services by "
|
377
382
|
"their name.",
|
378
383
|
)
|
379
|
-
workspace_id: Optional[Union[UUID, str]] = Field(
|
380
|
-
default=None,
|
381
|
-
description="Workspace of the service",
|
382
|
-
union_mode="left_to_right",
|
383
|
-
)
|
384
|
-
user_id: Optional[Union[UUID, str]] = Field(
|
385
|
-
default=None,
|
386
|
-
description="User of the service",
|
387
|
-
union_mode="left_to_right",
|
388
|
-
)
|
389
384
|
type: Optional[str] = Field(
|
390
385
|
default=None,
|
391
386
|
description="Type of the service. Filter services by their type.",
|
@@ -457,9 +452,7 @@ class ServiceFilter(WorkspaceScopedFilter):
|
|
457
452
|
"config",
|
458
453
|
]
|
459
454
|
CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
460
|
-
*
|
461
|
-
"workspace_id",
|
462
|
-
"user_id",
|
455
|
+
*WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
|
463
456
|
"flavor",
|
464
457
|
"type",
|
465
458
|
"pipeline_step_name",
|
@@ -468,7 +461,7 @@ class ServiceFilter(WorkspaceScopedFilter):
|
|
468
461
|
]
|
469
462
|
|
470
463
|
def generate_filter(
|
471
|
-
self, table: Type["
|
464
|
+
self, table: Type["AnySchema"]
|
472
465
|
) -> Union["ColumnElement[bool]"]:
|
473
466
|
"""Generate the filter for the query.
|
474
467
|
|
@@ -801,7 +801,6 @@ class ServiceConnectorFilter(WorkspaceScopedFilter):
|
|
801
801
|
default=None,
|
802
802
|
description="The type to scope this query to.",
|
803
803
|
)
|
804
|
-
|
805
804
|
name: Optional[str] = Field(
|
806
805
|
default=None,
|
807
806
|
description="The name to filter by",
|
@@ -810,16 +809,6 @@ class ServiceConnectorFilter(WorkspaceScopedFilter):
|
|
810
809
|
default=None,
|
811
810
|
description="The type of service connector to filter by",
|
812
811
|
)
|
813
|
-
workspace_id: Optional[Union[UUID, str]] = Field(
|
814
|
-
default=None,
|
815
|
-
description="Workspace to filter by",
|
816
|
-
union_mode="left_to_right",
|
817
|
-
)
|
818
|
-
user_id: Optional[Union[UUID, str]] = Field(
|
819
|
-
default=None,
|
820
|
-
description="User to filter by",
|
821
|
-
union_mode="left_to_right",
|
822
|
-
)
|
823
812
|
auth_method: Optional[str] = Field(
|
824
813
|
default=None,
|
825
814
|
title="Filter by the authentication method configured for the "
|
zenml/models/v2/core/stack.py
CHANGED
@@ -14,7 +14,17 @@
|
|
14
14
|
"""Models representing stacks."""
|
15
15
|
|
16
16
|
import json
|
17
|
-
from typing import
|
17
|
+
from typing import (
|
18
|
+
TYPE_CHECKING,
|
19
|
+
Any,
|
20
|
+
ClassVar,
|
21
|
+
Dict,
|
22
|
+
List,
|
23
|
+
Optional,
|
24
|
+
Type,
|
25
|
+
TypeVar,
|
26
|
+
Union,
|
27
|
+
)
|
18
28
|
from uuid import UUID
|
19
29
|
|
20
30
|
from pydantic import Field, model_validator
|
@@ -39,6 +49,9 @@ if TYPE_CHECKING:
|
|
39
49
|
from sqlalchemy.sql.elements import ColumnElement
|
40
50
|
|
41
51
|
from zenml.models.v2.core.component import ComponentResponse
|
52
|
+
from zenml.zen_stores.schemas import BaseSchema
|
53
|
+
|
54
|
+
AnySchema = TypeVar("AnySchema", bound=BaseSchema)
|
42
55
|
|
43
56
|
|
44
57
|
# ------------------ Request Model ------------------
|
@@ -323,7 +336,6 @@ class StackFilter(WorkspaceScopedFilter):
|
|
323
336
|
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
324
337
|
*WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
|
325
338
|
"component_id",
|
326
|
-
"user",
|
327
339
|
"component",
|
328
340
|
]
|
329
341
|
|
@@ -334,42 +346,32 @@ class StackFilter(WorkspaceScopedFilter):
|
|
334
346
|
description: Optional[str] = Field(
|
335
347
|
default=None, description="Description of the stack"
|
336
348
|
)
|
337
|
-
workspace_id: Optional[Union[UUID, str]] = Field(
|
338
|
-
default=None,
|
339
|
-
description="Workspace of the stack",
|
340
|
-
union_mode="left_to_right",
|
341
|
-
)
|
342
|
-
user_id: Optional[Union[UUID, str]] = Field(
|
343
|
-
default=None,
|
344
|
-
description="User of the stack",
|
345
|
-
union_mode="left_to_right",
|
346
|
-
)
|
347
349
|
component_id: Optional[Union[UUID, str]] = Field(
|
348
350
|
default=None,
|
349
351
|
description="Component in the stack",
|
350
352
|
union_mode="left_to_right",
|
351
353
|
)
|
352
|
-
user: Optional[Union[UUID, str]] = Field(
|
353
|
-
default=None,
|
354
|
-
description="Name/ID of the user that created the stack.",
|
355
|
-
)
|
356
354
|
component: Optional[Union[UUID, str]] = Field(
|
357
355
|
default=None, description="Name/ID of a component in the stack."
|
358
356
|
)
|
359
357
|
|
360
|
-
def get_custom_filters(
|
358
|
+
def get_custom_filters(
|
359
|
+
self, table: Type["AnySchema"]
|
360
|
+
) -> List["ColumnElement[bool]"]:
|
361
361
|
"""Get custom filters.
|
362
362
|
|
363
|
+
Args:
|
364
|
+
table: The query table.
|
365
|
+
|
363
366
|
Returns:
|
364
367
|
A list of custom filters.
|
365
368
|
"""
|
366
|
-
custom_filters = super().get_custom_filters()
|
369
|
+
custom_filters = super().get_custom_filters(table)
|
367
370
|
|
368
371
|
from zenml.zen_stores.schemas import (
|
369
372
|
StackComponentSchema,
|
370
373
|
StackCompositionSchema,
|
371
374
|
StackSchema,
|
372
|
-
UserSchema,
|
373
375
|
)
|
374
376
|
|
375
377
|
if self.component_id:
|
@@ -379,17 +381,6 @@ class StackFilter(WorkspaceScopedFilter):
|
|
379
381
|
)
|
380
382
|
custom_filters.append(component_id_filter)
|
381
383
|
|
382
|
-
if self.user:
|
383
|
-
user_filter = and_(
|
384
|
-
StackSchema.user_id == UserSchema.id,
|
385
|
-
self.generate_name_or_id_query_conditions(
|
386
|
-
value=self.user,
|
387
|
-
table=UserSchema,
|
388
|
-
additional_columns=["full_name"],
|
389
|
-
),
|
390
|
-
)
|
391
|
-
custom_filters.append(user_filter)
|
392
|
-
|
393
384
|
if self.component:
|
394
385
|
component_filter = and_(
|
395
386
|
StackCompositionSchema.stack_id == StackSchema.id,
|
zenml/models/v2/core/step_run.py
CHANGED
@@ -14,7 +14,16 @@
|
|
14
14
|
"""Models representing steps runs."""
|
15
15
|
|
16
16
|
from datetime import datetime
|
17
|
-
from typing import
|
17
|
+
from typing import (
|
18
|
+
TYPE_CHECKING,
|
19
|
+
ClassVar,
|
20
|
+
Dict,
|
21
|
+
List,
|
22
|
+
Optional,
|
23
|
+
Type,
|
24
|
+
TypeVar,
|
25
|
+
Union,
|
26
|
+
)
|
18
27
|
from uuid import UUID
|
19
28
|
|
20
29
|
from pydantic import BaseModel, ConfigDict, Field
|
@@ -41,6 +50,9 @@ if TYPE_CHECKING:
|
|
41
50
|
LogsRequest,
|
42
51
|
LogsResponse,
|
43
52
|
)
|
53
|
+
from zenml.zen_stores.schemas import BaseSchema
|
54
|
+
|
55
|
+
AnySchema = TypeVar("AnySchema", bound=BaseSchema)
|
44
56
|
|
45
57
|
|
46
58
|
class StepRunInputResponse(ArtifactVersionResponse):
|
@@ -553,16 +565,6 @@ class StepRunFilter(WorkspaceScopedFilter):
|
|
553
565
|
description="Original id for this step run",
|
554
566
|
union_mode="left_to_right",
|
555
567
|
)
|
556
|
-
user_id: Optional[Union[UUID, str]] = Field(
|
557
|
-
default=None,
|
558
|
-
description="User that produced this step run",
|
559
|
-
union_mode="left_to_right",
|
560
|
-
)
|
561
|
-
workspace_id: Optional[Union[UUID, str]] = Field(
|
562
|
-
default=None,
|
563
|
-
description="Workspace of this step run",
|
564
|
-
union_mode="left_to_right",
|
565
|
-
)
|
566
568
|
model_version_id: Optional[Union[UUID, str]] = Field(
|
567
569
|
default=None,
|
568
570
|
description="Model version associated with the step run.",
|
@@ -576,18 +578,20 @@ class StepRunFilter(WorkspaceScopedFilter):
|
|
576
578
|
default=None,
|
577
579
|
description="The run_metadata to filter the step runs by.",
|
578
580
|
)
|
579
|
-
|
580
581
|
model_config = ConfigDict(protected_namespaces=())
|
581
582
|
|
582
583
|
def get_custom_filters(
|
583
|
-
self,
|
584
|
+
self, table: Type["AnySchema"]
|
584
585
|
) -> List["ColumnElement[bool]"]:
|
585
586
|
"""Get custom filters.
|
586
587
|
|
588
|
+
Args:
|
589
|
+
table: The query table.
|
590
|
+
|
587
591
|
Returns:
|
588
592
|
A list of custom filters.
|
589
593
|
"""
|
590
|
-
custom_filters = super().get_custom_filters()
|
594
|
+
custom_filters = super().get_custom_filters(table)
|
591
595
|
|
592
596
|
from sqlmodel import and_
|
593
597
|
|
zenml/models/v2/core/trigger.py
CHANGED
@@ -13,7 +13,17 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Collection of all models concerning triggers."""
|
15
15
|
|
16
|
-
from typing import
|
16
|
+
from typing import (
|
17
|
+
TYPE_CHECKING,
|
18
|
+
Any,
|
19
|
+
ClassVar,
|
20
|
+
Dict,
|
21
|
+
List,
|
22
|
+
Optional,
|
23
|
+
Type,
|
24
|
+
TypeVar,
|
25
|
+
Union,
|
26
|
+
)
|
17
27
|
from uuid import UUID
|
18
28
|
|
19
29
|
from pydantic import Field, model_validator
|
@@ -39,6 +49,9 @@ if TYPE_CHECKING:
|
|
39
49
|
ActionResponse,
|
40
50
|
)
|
41
51
|
from zenml.models.v2.core.event_source import EventSourceResponse
|
52
|
+
from zenml.zen_stores.schemas import BaseSchema
|
53
|
+
|
54
|
+
AnySchema = TypeVar("AnySchema", bound=BaseSchema)
|
42
55
|
|
43
56
|
|
44
57
|
# ------------------ Request Model ------------------
|
@@ -358,10 +371,13 @@ class TriggerFilter(WorkspaceScopedFilter):
|
|
358
371
|
)
|
359
372
|
|
360
373
|
def get_custom_filters(
|
361
|
-
self,
|
374
|
+
self, table: Type["AnySchema"]
|
362
375
|
) -> List["ColumnElement[bool]"]:
|
363
376
|
"""Get custom filters.
|
364
377
|
|
378
|
+
Args:
|
379
|
+
table: The query table.
|
380
|
+
|
365
381
|
Returns:
|
366
382
|
A list of custom filters.
|
367
383
|
"""
|
@@ -373,7 +389,7 @@ class TriggerFilter(WorkspaceScopedFilter):
|
|
373
389
|
TriggerSchema,
|
374
390
|
)
|
375
391
|
|
376
|
-
custom_filters = super().get_custom_filters()
|
392
|
+
custom_filters = super().get_custom_filters(table)
|
377
393
|
|
378
394
|
if self.event_source_flavor:
|
379
395
|
event_source_flavor_filter = and_(
|
@@ -61,7 +61,7 @@ class BaseOrchestratorConfig(StackComponentConfig):
|
|
61
61
|
"The 'custom_docker_base_image_name' field has been "
|
62
62
|
"deprecated. To use a custom base container image with your "
|
63
63
|
"orchestrators, please use the DockerSettings in your "
|
64
|
-
"pipeline (see https://docs.zenml.io/how-to/customize-docker-builds)."
|
64
|
+
"pipeline (see https://docs.zenml.io/how-to/infrastructure-deployment/customize-docker-builds)."
|
65
65
|
)
|
66
66
|
|
67
67
|
return data
|
@@ -84,6 +84,15 @@ class BaseOrchestratorConfig(StackComponentConfig):
|
|
84
84
|
"""
|
85
85
|
return False
|
86
86
|
|
87
|
+
@property
|
88
|
+
def supports_client_side_caching(self) -> bool:
|
89
|
+
"""Whether the orchestrator supports client side caching.
|
90
|
+
|
91
|
+
Returns:
|
92
|
+
Whether the orchestrator supports client side caching.
|
93
|
+
"""
|
94
|
+
return True
|
95
|
+
|
87
96
|
|
88
97
|
class BaseOrchestrator(StackComponent, ABC):
|
89
98
|
"""Base class for all orchestrators.
|
@@ -205,6 +214,7 @@ class BaseOrchestrator(StackComponent, ABC):
|
|
205
214
|
|
206
215
|
if (
|
207
216
|
placeholder_run
|
217
|
+
and self.config.supports_client_side_caching
|
208
218
|
and not deployment.schedule
|
209
219
|
and not prevent_client_side_caching
|
210
220
|
):
|
@@ -232,6 +242,8 @@ class BaseOrchestrator(StackComponent, ABC):
|
|
232
242
|
self._cleanup_run()
|
233
243
|
logger.info("All steps of the pipeline run were cached.")
|
234
244
|
return
|
245
|
+
else:
|
246
|
+
logger.debug("Skipping client-side caching.")
|
235
247
|
|
236
248
|
try:
|
237
249
|
if metadata_iterator := self.prepare_or_run_pipeline(
|
@@ -19,6 +19,7 @@ from uuid import uuid4
|
|
19
19
|
|
20
20
|
from zenml.client import Client
|
21
21
|
from zenml.logger import get_logger
|
22
|
+
from zenml.utils import string_utils
|
22
23
|
|
23
24
|
if TYPE_CHECKING:
|
24
25
|
from zenml.artifact_stores import BaseArtifactStore
|
@@ -75,10 +76,13 @@ def prepare_output_artifact_uris(
|
|
75
76
|
artifact_store = stack.artifact_store
|
76
77
|
output_artifact_uris: Dict[str, str] = {}
|
77
78
|
for output_name in step.config.outputs.keys():
|
79
|
+
substituted_output_name = string_utils.format_name_template(
|
80
|
+
output_name, substitutions=step_run.config.substitutions
|
81
|
+
)
|
78
82
|
artifact_uri = generate_artifact_uri(
|
79
83
|
artifact_store=stack.artifact_store,
|
80
84
|
step_run=step_run,
|
81
|
-
output_name=
|
85
|
+
output_name=substituted_output_name,
|
82
86
|
)
|
83
87
|
if artifact_store.exists(artifact_uri):
|
84
88
|
raise RuntimeError("Artifact already exists")
|
@@ -179,12 +179,10 @@ class StepLauncher:
|
|
179
179
|
pipeline_run_id=pipeline_run.id,
|
180
180
|
pipeline_run_metadata=pipeline_run_metadata,
|
181
181
|
)
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
)
|
187
|
-
)
|
182
|
+
if model_version := pipeline_run.model_version:
|
183
|
+
step_run_utils.log_model_version_dashboard_url(
|
184
|
+
model_version=model_version
|
185
|
+
)
|
188
186
|
|
189
187
|
request_factory = step_run_utils.StepRunRequestFactory(
|
190
188
|
deployment=self._deployment,
|
@@ -209,12 +207,10 @@ class StepLauncher:
|
|
209
207
|
step_run = Client().zen_store.create_run_step(
|
210
208
|
step_run_request
|
211
209
|
)
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
step_run=step_run, pipeline_run=pipeline_run
|
210
|
+
if model_version := step_run.model_version:
|
211
|
+
step_run_utils.log_model_version_dashboard_url(
|
212
|
+
model_version=model_version
|
216
213
|
)
|
217
|
-
)
|
218
214
|
|
219
215
|
if not step_run.status.is_finished:
|
220
216
|
logger.info(f"Step `{self._step_name}` has started.")
|
@@ -289,8 +285,8 @@ class StepLauncher:
|
|
289
285
|
f"Using cached version of step `{self._step_name}`."
|
290
286
|
)
|
291
287
|
if (
|
292
|
-
model_version :=
|
293
|
-
or
|
288
|
+
model_version := step_run.model_version
|
289
|
+
or pipeline_run.model_version
|
294
290
|
):
|
295
291
|
step_run_utils.link_output_artifacts_to_model_version(
|
296
292
|
artifacts=step_run.outputs,
|