zenml-nightly 0.80.1.dev20250408__py3-none-any.whl → 0.80.2.dev20250410__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/cli/integration.py +36 -0
- zenml/client.py +6 -0
- zenml/config/step_configurations.py +3 -2
- zenml/constants.py +2 -1
- zenml/entrypoints/step_entrypoint_configuration.py +2 -0
- zenml/integrations/airflow/orchestrators/airflow_orchestrator.py +7 -2
- zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +2 -0
- zenml/integrations/azure/orchestrators/azureml_orchestrator.py +2 -0
- zenml/integrations/databricks/orchestrators/databricks_orchestrator.py +3 -1
- zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +2 -0
- zenml/integrations/hyperai/orchestrators/hyperai_orchestrator.py +3 -1
- zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py +3 -1
- zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +12 -0
- zenml/integrations/kubernetes/orchestrators/kube_utils.py +3 -0
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +4 -1
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +164 -19
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint_configuration.py +8 -1
- zenml/integrations/lightning/orchestrators/lightning_orchestrator.py +3 -1
- zenml/integrations/mlflow/__init__.py +0 -27
- zenml/integrations/mlflow/services/mlflow_deployment.py +25 -7
- zenml/integrations/seldon/services/seldon_deployment.py +1 -1
- zenml/integrations/skypilot/orchestrators/skypilot_base_vm_orchestrator.py +3 -1
- zenml/integrations/tekton/orchestrators/tekton_orchestrator.py +3 -1
- zenml/integrations/vllm/services/vllm_deployment.py +1 -1
- zenml/logging/step_logging.py +1 -1
- zenml/materializers/__init__.py +4 -3
- zenml/materializers/built_in_materializer.py +24 -0
- zenml/materializers/path_materializer.py +119 -0
- zenml/model/model.py +3 -1
- zenml/models/__init__.py +5 -0
- zenml/models/v2/core/run_template.py +32 -1
- zenml/orchestrators/base_orchestrator.py +3 -0
- zenml/orchestrators/dag_runner.py +48 -15
- zenml/orchestrators/local/local_orchestrator.py +3 -1
- zenml/orchestrators/local_docker/local_docker_orchestrator.py +3 -1
- zenml/orchestrators/step_launcher.py +2 -2
- zenml/utils/secret_utils.py +2 -2
- zenml/zen_server/dashboard/assets/{404-2I8egBQu.js → 404-CYPi9d8E.js} +1 -1
- zenml/zen_server/dashboard/assets/@radix-C7hRs6Kx.js +95 -0
- zenml/zen_server/dashboard/assets/{@react-router-BUo5vhN4.js → @react-router-BGgzhn5D.js} +5 -5
- zenml/zen_server/dashboard/assets/@reactflow-CQi1Z1Wq.js +17 -0
- zenml/zen_server/dashboard/assets/@tanstack-CSxjHCME.js +22 -0
- zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-D7KZcPFw.js → AlertDialogDropdownItem-Dn8bgaXG.js} +1 -1
- zenml/zen_server/dashboard/assets/{CodeSnippet-DUkCnBpQ.js → CodeSnippet-CSINAl3I.js} +1 -1
- zenml/zen_server/dashboard/assets/{CollapsibleCard-B5-5Plnd.js → CollapsibleCard-CQOb53t9.js} +1 -1
- zenml/zen_server/dashboard/assets/{Commands-CbOMmarC.js → Commands-CPleXvse.js} +1 -1
- zenml/zen_server/dashboard/assets/{ComponentBadge-FrujKBC6.js → ComponentBadge-CIFj0W7T.js} +1 -1
- zenml/zen_server/dashboard/assets/{ComponentIcon-Dx5fBrDX.js → ComponentIcon-D3JHFhJU.js} +1 -1
- zenml/zen_server/dashboard/assets/{CsvVizualization-B8E3p9we.js → CsvVizualization-Cklc1Vb5.js} +6 -6
- zenml/zen_server/dashboard/assets/{DeleteAlertDialog-BgTZbbAt.js → DeleteAlertDialog-Bzq-uSd7.js} +1 -1
- zenml/zen_server/dashboard/assets/{DialogItem-CNWLiJcc.js → DialogItem-zjMgCmCl.js} +1 -1
- zenml/zen_server/dashboard/assets/{DisplayDate-C5Aw-Yca.js → DisplayDate-CYVBBSgr.js} +1 -1
- zenml/zen_server/dashboard/assets/{EmptyState-DpbfQBDE.js → EmptyState-M1jafpg6.js} +1 -1
- zenml/zen_server/dashboard/assets/{Error-BkUP4Luv.js → Error-kdeNHm_o.js} +1 -1
- zenml/zen_server/dashboard/assets/{ExecutionStatus-CD8Vj7sp.js → ExecutionStatus-UE6Rbmtk.js} +1 -1
- zenml/zen_server/dashboard/assets/{Helpbox-DIx6mDOH.js → Helpbox-CeM-FPQl.js} +1 -1
- zenml/zen_server/dashboard/assets/{Infobox-BHEdNmME.js → Infobox-CD0fDbYF.js} +1 -1
- zenml/zen_server/dashboard/assets/{InlineAvatar-Bin9UPKJ.js → InlineAvatar-CrHWwlf4.js} +1 -1
- zenml/zen_server/dashboard/assets/{Lock-tO9Z41I9.js → Lock-DW-0_M0o.js} +1 -1
- zenml/zen_server/dashboard/assets/{MarkdownVisualization-C3JLiPCY.js → MarkdownVisualization-URCyUPcZ.js} +2 -2
- zenml/zen_server/dashboard/assets/{NestedCollapsible-Da-k0Mff.js → NestedCollapsible-DfTTGG8u.js} +1 -1
- zenml/zen_server/dashboard/assets/{NumberBox-BvBJYxCu.js → NumberBox-D2A7ENHb.js} +1 -1
- zenml/zen_server/dashboard/assets/Partials-DggkUpWp.js +1 -0
- zenml/zen_server/dashboard/assets/{PasswordChecker-B4Uw6BJZ.js → PasswordChecker-lYTOtNom.js} +1 -1
- zenml/zen_server/dashboard/assets/ProBadge-BCdprj69.js +1 -0
- zenml/zen_server/dashboard/assets/{ProCta-7_FtpX3I.js → ProCta-szzPO0Y7.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderIcon-CxeziA5a.js → ProviderIcon-MdqWDO6-.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderRadio-DPmZHff_.js → ProviderRadio-B4CB4vzP.js} +1 -1
- zenml/zen_server/dashboard/assets/{RunSelector-BVKB4Z8F.js → RunSelector-Bhb83FyB.js} +1 -1
- zenml/zen_server/dashboard/assets/{RunsBody-Cj4sIqQB.js → RunsBody-Csn2VEOE.js} +1 -1
- zenml/zen_server/dashboard/assets/{SearchField-DjAOZic5.js → SearchField-Cce00eQL.js} +1 -1
- zenml/zen_server/dashboard/assets/{SecretTooltip-mMAAP4dM.js → SecretTooltip-DaDLBVj-.js} +1 -1
- zenml/zen_server/dashboard/assets/{SetPassword-B0o5kSJU.js → SetPassword-tX6fom1Y.js} +1 -1
- zenml/zen_server/dashboard/assets/{StackList-5UB8LoEq.js → StackList-CQt1xGRh.js} +1 -1
- zenml/zen_server/dashboard/assets/{Tabs-AuhCyzle.js → Tabs-CCQyIqRb.js} +1 -1
- zenml/zen_server/dashboard/assets/{Tick-CHW0jc8Y.js → Tick-D63_jhf1.js} +1 -1
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Bauivjf-.js → UpdatePasswordSchemas-CbbvoGYV.js} +1 -1
- zenml/zen_server/dashboard/assets/{UsageReason-Dr5ca5M4.js → UsageReason-C2cNrUeS.js} +1 -1
- zenml/zen_server/dashboard/assets/{Wizard-XEp9rGmf.js → Wizard-BVkN2a2x.js} +1 -1
- zenml/zen_server/dashboard/assets/WizardFooter-Bk7gIKiS.js +1 -0
- zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-COvsm3bC.js → all-pipeline-runs-query-BLclwQSi.js} +1 -1
- zenml/zen_server/dashboard/assets/{arrow-left-B2hyhFky.js → arrow-left-CwgF2MEM.js} +1 -1
- zenml/zen_server/dashboard/assets/{check-DZ0KAh3W.js → check-DK77doTf.js} +1 -1
- zenml/zen_server/dashboard/assets/{check-circle-DyCCYTA0.js → check-circle-mvyzYvIW.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-down-A3PXOshS.js → chevron-down-A-rmltmI.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-right-double-zKz7rAaU.js → chevron-right-double-uNWbJT-C.js} +1 -1
- zenml/zen_server/dashboard/assets/{clock-k5T5tYrt.js → clock-CPA5cYxq.js} +1 -1
- zenml/zen_server/dashboard/assets/{code-browser-DvB0W2Ix.js → code-browser-j2EpcxIA.js} +1 -1
- zenml/zen_server/dashboard/assets/{configuration-form-BJUCr0wl.js → configuration-form-CjrAp0GS.js} +1 -1
- zenml/zen_server/dashboard/assets/{create-stack-B2c98UlP.js → create-stack-Bd2JdQer.js} +1 -1
- zenml/zen_server/dashboard/assets/delete-run-Cwpxu1-d.js +1 -0
- zenml/zen_server/dashboard/assets/{docker-B3Sqzd8J.js → docker-BuDBFEDL.js} +1 -1
- zenml/zen_server/dashboard/assets/{file-text-CgxVzNph.js → file-text-BdxZdjP_.js} +1 -1
- zenml/zen_server/dashboard/assets/{flavor-select-D8CranSY.js → flavor-select-c0w-6o9w.js} +1 -1
- zenml/zen_server/dashboard/assets/{form-schemas-Bm-dTV3L.js → form-schemas-B5Ax1SZf.js} +1 -1
- zenml/zen_server/dashboard/assets/{gcp-0u4le6mC.js → gcp-CHNvgEss.js} +1 -1
- zenml/zen_server/dashboard/assets/{help-CfT0tY2I.js → help-DyMolRxD.js} +1 -1
- zenml/zen_server/dashboard/assets/index-BW-KaQ2p.js +1 -0
- zenml/zen_server/dashboard/assets/{index-DPjvk73v.js → index-Be2jLIYM.js} +8 -8
- zenml/zen_server/dashboard/assets/{index-D-n6tspq.js → index-CjdtNrfJ.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-BVVKxTWC.js → index-DR30v9MZ.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-CzhJC6pc.js → index-d_40qKeY.js} +1 -1
- zenml/zen_server/dashboard/assets/index.esm-D7jFlf5N.js +1 -0
- zenml/zen_server/dashboard/assets/{key-icon-CjwWwoOU.js → key-icon-DO4DPJHZ.js} +1 -1
- zenml/zen_server/dashboard/assets/{kubernetes-eA-Y6gE7.js → kubernetes-D6OUjwSK.js} +1 -1
- zenml/zen_server/dashboard/assets/{layout-3_rgDUxf.js → layout-h3cbx8WZ.js} +1 -1
- zenml/zen_server/dashboard/assets/{link-external-BYm_zH_8.js → link-external-DUhCSKNm.js} +1 -1
- zenml/zen_server/dashboard/assets/{login-mutation-D6uiKsKk.js → login-mutation-DOajKct8.js} +1 -1
- zenml/zen_server/dashboard/assets/{logs-D6_diV2k.js → logs-B5n0U7tB.js} +1 -1
- zenml/zen_server/dashboard/assets/{not-found-DFrksY0r.js → not-found-DolTp0dr.js} +1 -1
- zenml/zen_server/dashboard/assets/{package-BOms6B-A.js → package-D1Mhqeh8.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DBNBYSwq.js → page-48DMcIQw.js} +2 -2
- zenml/zen_server/dashboard/assets/{page-DOzFoJuo.js → page-B32kCGPe.js} +1 -1
- zenml/zen_server/dashboard/assets/page-BAjhc2bs.js +1 -0
- zenml/zen_server/dashboard/assets/{page-D5GZlpKq.js → page-BBNrvxC1.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DF9q7ySu.js → page-BEAx6ZvH.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DDvwWgKP.js → page-BRfeowe0.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BJ15SGwt.js → page-BbRtQC2E.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D2F0Rvak.js → page-BgUR_5z3.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D0Zt2-7X.js → page-BiAjLLww.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-B80TE04v.js → page-BkPPfNfG.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DkJfgcDi.js → page-BmTf1Lf1.js} +2 -2
- zenml/zen_server/dashboard/assets/{page-CAKBSE9f.js → page-BuZC8z6N.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BwAFqFCf.js → page-C4zMMcaH.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BnUwQBeg.js → page-CKVbEdX2.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BXh1mF-D.js → page-CPRymOIS.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BMZaECzB.js → page-CaTJVICi.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-NIWnUdVg.js → page-CmzmFF4S.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BIseZTJt.js → page-CwAbTnvK.js} +2 -2
- zenml/zen_server/dashboard/assets/{page-BeFiRx31.js → page-D-MjLTXS.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-B1Un9vAU.js → page-D3m9-YWJ.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DhNnHHmX.js → page-DCpZju6a.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DEUeF3mO.js +1 -0
- zenml/zen_server/dashboard/assets/{page-B150LbzG.js → page-DWOAh8Pp.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-EhqRFAZc.js → page-DezabeEO.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BTvnIFGR.js → page-DivlNKt9.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BqQ6y8Hb.js → page-DmOcZO8U.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DnY59jOg.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DaHH2ZEF.js → page-Dv3qtvm8.js} +1 -1
- zenml/zen_server/dashboard/assets/page-P81CcE2L.js +1 -0
- zenml/zen_server/dashboard/assets/{page-Dd-0y3SU.js → page-a1c6o4vv.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BJrZsPSh.js → page-bS5tHLDW.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-C11vPVkH.js → page-gRfUvR0E.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BZUxCBoD.js → page-hNHJPQtK.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-kYlFrH53.js → page-ir7Scz2Y.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-ygCPGHAV.js → page-mtwS5oci.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-DHGuHP2H.js → persist-BUqILw7G.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-C5RlwSq6.js → persist-BbdfLc0W.js} +1 -1
- zenml/zen_server/dashboard/assets/{plus-CoKtHiA9.js → plus-COjQg3AG.js} +1 -1
- zenml/zen_server/dashboard/assets/{react-error-boundary.esm-BkGIR1Du.js → react-error-boundary.esm-fyoUBS25.js} +1 -1
- zenml/zen_server/dashboard/assets/{refresh-CupyU1Vs.js → refresh-CM5T3QeU.js} +1 -1
- zenml/zen_server/dashboard/assets/{rocket-k68ONPDS.js → rocket-Cf-B-XOR.js} +1 -1
- zenml/zen_server/dashboard/assets/{service-Do7yitqe.js → service-CV2zjc-p.js} +1 -1
- zenml/zen_server/dashboard/assets/{sharedSchema-i_9Y4WcA.js → sharedSchema-DpGc9kQg.js} +1 -1
- zenml/zen_server/dashboard/assets/stack-detail-query-BpzLZjvw.js +1 -0
- zenml/zen_server/dashboard/assets/{terminal-square-URAPn9DB.js → terminal-square-DMtel8mb.js} +1 -1
- zenml/zen_server/dashboard/assets/{tick-circle-AaVBszPn.js → tick-circle-m94Aa6Zt.js} +1 -1
- zenml/zen_server/dashboard/assets/{trash-B_JgTgqd.js → trash-BWSZ7NRK.js} +1 -1
- zenml/zen_server/dashboard/assets/update-server-settings-mutation-Dv6qHtK9.js +1 -0
- zenml/zen_server/dashboard/assets/{zod-CRNUMWWg.js → zod-C0xYeTvL.js} +1 -1
- zenml/zen_server/dashboard/index.html +6 -6
- zenml/zen_server/template_execution/utils.py +53 -33
- zenml/zen_stores/migrations/versions/0.80.2_release.py +23 -0
- zenml/zen_stores/migrations/versions/6611d4bcc95b_add_hidden_option_for_templates.py +47 -0
- zenml/zen_stores/schemas/run_template_schemas.py +7 -0
- {zenml_nightly-0.80.1.dev20250408.dist-info → zenml_nightly-0.80.2.dev20250410.dist-info}/METADATA +3 -3
- {zenml_nightly-0.80.1.dev20250408.dist-info → zenml_nightly-0.80.2.dev20250410.dist-info}/RECORD +171 -168
- zenml/zen_server/dashboard/assets/@radix-AvWw-1nd.js +0 -95
- zenml/zen_server/dashboard/assets/@reactflow-BHoFKFSZ.js +0 -17
- zenml/zen_server/dashboard/assets/@tanstack-CcI3lvwB.js +0 -22
- zenml/zen_server/dashboard/assets/Partials-TNaYjHsV.js +0 -1
- zenml/zen_server/dashboard/assets/ProBadge-BfPp-B97.js +0 -1
- zenml/zen_server/dashboard/assets/WizardFooter-BtL1Gi1k.js +0 -1
- zenml/zen_server/dashboard/assets/delete-run-Do3XyF4W.js +0 -1
- zenml/zen_server/dashboard/assets/index-eIIP-0dQ.js +0 -1
- zenml/zen_server/dashboard/assets/index.esm-cf-8NBxV.js +0 -1
- zenml/zen_server/dashboard/assets/page-B-uHUFcm.js +0 -1
- zenml/zen_server/dashboard/assets/page-B0Llmzo_.js +0 -1
- zenml/zen_server/dashboard/assets/page-BzlVs5tC.js +0 -1
- zenml/zen_server/dashboard/assets/page-CPe9nQSo.js +0 -1
- zenml/zen_server/dashboard/assets/stack-detail-query-omCumL7U.js +0 -1
- zenml/zen_server/dashboard/assets/update-server-settings-mutation-B4eE33z-.js +0 -1
- {zenml_nightly-0.80.1.dev20250408.dist-info → zenml_nightly-0.80.2.dev20250410.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.80.1.dev20250408.dist-info → zenml_nightly-0.80.2.dev20250410.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.80.1.dev20250408.dist-info → zenml_nightly-0.80.2.dev20250410.dist-info}/entry_points.txt +0 -0
@@ -17,7 +17,7 @@ import threading
|
|
17
17
|
import time
|
18
18
|
from collections import defaultdict
|
19
19
|
from enum import Enum
|
20
|
-
from typing import Any, Callable, Dict, List
|
20
|
+
from typing import Any, Callable, Dict, List, Optional
|
21
21
|
|
22
22
|
from zenml.logger import get_logger
|
23
23
|
|
@@ -54,6 +54,7 @@ class NodeStatus(Enum):
|
|
54
54
|
WAITING = "Waiting"
|
55
55
|
RUNNING = "Running"
|
56
56
|
COMPLETED = "Completed"
|
57
|
+
FAILED = "Failed"
|
57
58
|
|
58
59
|
|
59
60
|
class ThreadedDagRunner:
|
@@ -70,6 +71,7 @@ class ThreadedDagRunner:
|
|
70
71
|
self,
|
71
72
|
dag: Dict[str, List[str]],
|
72
73
|
run_fn: Callable[[str], Any],
|
74
|
+
finalize_fn: Optional[Callable[[Dict[str, NodeStatus]], None]] = None,
|
73
75
|
parallel_node_startup_waiting_period: float = 0.0,
|
74
76
|
) -> None:
|
75
77
|
"""Define attributes and initialize all nodes in waiting state.
|
@@ -79,6 +81,8 @@ class ThreadedDagRunner:
|
|
79
81
|
E.g.: [(1->2), (1->3), (2->4), (3->4)] should be represented as
|
80
82
|
`dag={2: [1], 3: [1], 4: [2, 3]}`
|
81
83
|
run_fn: A function `run_fn(node)` that runs a single node
|
84
|
+
finalize_fn: A function `finalize_fn(node_states)` that is called
|
85
|
+
when all nodes have completed.
|
82
86
|
parallel_node_startup_waiting_period: Delay in seconds to wait in
|
83
87
|
between starting parallel nodes.
|
84
88
|
"""
|
@@ -88,6 +92,7 @@ class ThreadedDagRunner:
|
|
88
92
|
self.dag = dag
|
89
93
|
self.reversed_dag = reverse_dag(dag)
|
90
94
|
self.run_fn = run_fn
|
95
|
+
self.finalize_fn = finalize_fn
|
91
96
|
self.nodes = dag.keys()
|
92
97
|
self.node_states = {node: NodeStatus.WAITING for node in self.nodes}
|
93
98
|
self._lock = threading.Lock()
|
@@ -123,8 +128,12 @@ class ThreadedDagRunner:
|
|
123
128
|
Args:
|
124
129
|
node: The node.
|
125
130
|
"""
|
126
|
-
|
127
|
-
|
131
|
+
try:
|
132
|
+
self.run_fn(node)
|
133
|
+
self._finish_node(node)
|
134
|
+
except Exception as e:
|
135
|
+
self._finish_node(node, failed=True)
|
136
|
+
logger.exception(f"Node `{node}` failed: {e}")
|
128
137
|
|
129
138
|
def _run_node_in_thread(self, node: str) -> threading.Thread:
|
130
139
|
"""Run a single node in a separate thread.
|
@@ -148,7 +157,7 @@ class ThreadedDagRunner:
|
|
148
157
|
thread.start()
|
149
158
|
return thread
|
150
159
|
|
151
|
-
def _finish_node(self, node: str) -> None:
|
160
|
+
def _finish_node(self, node: str, failed: bool = False) -> None:
|
152
161
|
"""Finish a node run.
|
153
162
|
|
154
163
|
First updates the node status to completed.
|
@@ -156,20 +165,28 @@ class ThreadedDagRunner:
|
|
156
165
|
|
157
166
|
Args:
|
158
167
|
node: The node.
|
168
|
+
failed: Whether the node failed.
|
159
169
|
"""
|
160
170
|
# Update node status to completed.
|
161
171
|
assert self.node_states[node] == NodeStatus.RUNNING
|
162
172
|
with self._lock:
|
163
|
-
|
173
|
+
if failed:
|
174
|
+
self.node_states[node] = NodeStatus.FAILED
|
175
|
+
else:
|
176
|
+
self.node_states[node] = NodeStatus.COMPLETED
|
177
|
+
|
178
|
+
if failed:
|
179
|
+
# If the node failed, we don't need to run any downstream nodes.
|
180
|
+
return
|
164
181
|
|
165
182
|
# Run downstream nodes.
|
166
183
|
threads: List[threading.Thread] = []
|
167
|
-
for
|
168
|
-
if self._can_run(
|
184
|
+
for downstream_node in self.reversed_dag[node]:
|
185
|
+
if self._can_run(downstream_node):
|
169
186
|
if threads and self.parallel_node_startup_waiting_period > 0:
|
170
187
|
time.sleep(self.parallel_node_startup_waiting_period)
|
171
188
|
|
172
|
-
thread = self._run_node_in_thread(
|
189
|
+
thread = self._run_node_in_thread(downstream_node)
|
173
190
|
threads.append(thread)
|
174
191
|
|
175
192
|
# Wait for all downstream nodes to complete.
|
@@ -198,11 +215,27 @@ class ThreadedDagRunner:
|
|
198
215
|
for thread in threads:
|
199
216
|
thread.join()
|
200
217
|
|
201
|
-
#
|
218
|
+
# Call the finalize function.
|
219
|
+
if self.finalize_fn:
|
220
|
+
self.finalize_fn(self.node_states)
|
221
|
+
|
222
|
+
# Print a status report.
|
223
|
+
failed_nodes = []
|
224
|
+
skipped_nodes = []
|
202
225
|
for node in self.nodes:
|
203
|
-
if self.node_states[node] == NodeStatus.
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
226
|
+
if self.node_states[node] == NodeStatus.FAILED:
|
227
|
+
failed_nodes.append(node)
|
228
|
+
elif self.node_states[node] == NodeStatus.WAITING:
|
229
|
+
skipped_nodes.append(node)
|
230
|
+
|
231
|
+
if failed_nodes:
|
232
|
+
logger.error(
|
233
|
+
"The following nodes failed: " + ", ".join(failed_nodes)
|
234
|
+
)
|
235
|
+
if skipped_nodes:
|
236
|
+
logger.warning(
|
237
|
+
"The following nodes were not run because they depend on other "
|
238
|
+
"nodes that didn't complete: " + ", ".join(skipped_nodes)
|
239
|
+
)
|
240
|
+
if not failed_nodes and not skipped_nodes:
|
241
|
+
logger.info("All nodes completed successfully.")
|
@@ -27,7 +27,7 @@ from zenml.stack import Stack
|
|
27
27
|
from zenml.utils import string_utils
|
28
28
|
|
29
29
|
if TYPE_CHECKING:
|
30
|
-
from zenml.models import PipelineDeploymentResponse
|
30
|
+
from zenml.models import PipelineDeploymentResponse, PipelineRunResponse
|
31
31
|
|
32
32
|
logger = get_logger(__name__)
|
33
33
|
|
@@ -46,6 +46,7 @@ class LocalOrchestrator(BaseOrchestrator):
|
|
46
46
|
deployment: "PipelineDeploymentResponse",
|
47
47
|
stack: "Stack",
|
48
48
|
environment: Dict[str, str],
|
49
|
+
placeholder_run: Optional["PipelineRunResponse"] = None,
|
49
50
|
) -> Any:
|
50
51
|
"""Iterates through all steps and executes them sequentially.
|
51
52
|
|
@@ -54,6 +55,7 @@ class LocalOrchestrator(BaseOrchestrator):
|
|
54
55
|
stack: The stack on which the pipeline is deployed.
|
55
56
|
environment: Environment variables to set in the orchestration
|
56
57
|
environment.
|
58
|
+
placeholder_run: An optional placeholder run for the deployment.
|
57
59
|
"""
|
58
60
|
if deployment.schedule:
|
59
61
|
logger.warning(
|
@@ -39,7 +39,7 @@ from zenml.stack import Stack, StackValidator
|
|
39
39
|
from zenml.utils import docker_utils, string_utils
|
40
40
|
|
41
41
|
if TYPE_CHECKING:
|
42
|
-
from zenml.models import PipelineDeploymentResponse
|
42
|
+
from zenml.models import PipelineDeploymentResponse, PipelineRunResponse
|
43
43
|
|
44
44
|
logger = get_logger(__name__)
|
45
45
|
|
@@ -96,6 +96,7 @@ class LocalDockerOrchestrator(ContainerizedOrchestrator):
|
|
96
96
|
deployment: "PipelineDeploymentResponse",
|
97
97
|
stack: "Stack",
|
98
98
|
environment: Dict[str, str],
|
99
|
+
placeholder_run: Optional["PipelineRunResponse"] = None,
|
99
100
|
) -> Any:
|
100
101
|
"""Sequentially runs all pipeline steps in local Docker containers.
|
101
102
|
|
@@ -104,6 +105,7 @@ class LocalDockerOrchestrator(ContainerizedOrchestrator):
|
|
104
105
|
stack: The stack the pipeline will run on.
|
105
106
|
environment: Environment variables to set in the orchestration
|
106
107
|
environment.
|
108
|
+
placeholder_run: An optional placeholder run for the deployment.
|
107
109
|
|
108
110
|
Raises:
|
109
111
|
RuntimeError: If a step fails.
|
@@ -154,8 +154,8 @@ class StepLauncher:
|
|
154
154
|
if step_logging_enabled:
|
155
155
|
# Configure the logs
|
156
156
|
logs_uri = step_logging.prepare_logs_uri(
|
157
|
-
self._stack.artifact_store,
|
158
|
-
self.
|
157
|
+
artifact_store=self._stack.artifact_store,
|
158
|
+
step_name=self._step_name,
|
159
159
|
)
|
160
160
|
|
161
161
|
logs_context = step_logging.StepLogsStorageContext(
|
zenml/utils/secret_utils.py
CHANGED
@@ -102,7 +102,7 @@ def SecretField(*args: Any, **kwargs: Any) -> Any:
|
|
102
102
|
"""
|
103
103
|
json_schema_extra = kwargs.get("json_schema_extra", {})
|
104
104
|
json_schema_extra.update({PYDANTIC_SENSITIVE_FIELD_MARKER: True})
|
105
|
-
return Field(json_schema_extra=json_schema_extra, *args, **kwargs)
|
105
|
+
return Field(json_schema_extra=json_schema_extra, *args, **kwargs)
|
106
106
|
|
107
107
|
|
108
108
|
def ClearTextField(*args: Any, **kwargs: Any) -> Any:
|
@@ -119,7 +119,7 @@ def ClearTextField(*args: Any, **kwargs: Any) -> Any:
|
|
119
119
|
"""
|
120
120
|
json_schema_extra = kwargs.get("json_schema_extra", {})
|
121
121
|
json_schema_extra.update({PYDANTIC_CLEAR_TEXT_FIELD_MARKER: True})
|
122
|
-
return Field(json_schema_extra=json_schema_extra, *args, **kwargs)
|
122
|
+
return Field(json_schema_extra=json_schema_extra, *args, **kwargs)
|
123
123
|
|
124
124
|
|
125
125
|
def is_secret_field(field: "FieldInfo") -> bool:
|
@@ -1 +1 @@
|
|
1
|
-
import{j as e}from"./@radix-
|
1
|
+
import{j as e}from"./@radix-C7hRs6Kx.js";import{h as s,r as t}from"./index-Be2jLIYM.js";import{E as r}from"./EmptyState-M1jafpg6.js";import{S as a}from"./help-DyMolRxD.js";import{L as o}from"./@react-router-BGgzhn5D.js";import"./@tanstack-CSxjHCME.js";import"./@reactflow-CQi1Z1Wq.js";function d(){return e.jsx("div",{className:"flex min-h-screen w-full flex-col",children:e.jsx(r,{icon:e.jsx(a,{className:"h-[120px] w-[120px] fill-neutral-300"}),children:e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"mb-2 text-display-xs font-semibold",children:"We can't find the page you are looking for"}),e.jsx("p",{className:"text-lg text-theme-text-secondary",children:"You can try typing a different URL or we can bring you back to your Homepage."}),e.jsx("div",{className:"mt-5 flex justify-center",children:e.jsx(s,{size:"md",asChild:!0,children:e.jsx(o,{className:"w-min self-center whitespace-nowrap",to:t.home,children:e.jsx("span",{className:"px-0.5",children:"Go to Home"})})})})]})})})}export{d as default};
|