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.
Files changed (186) hide show
  1. zenml/VERSION +1 -1
  2. zenml/cli/integration.py +36 -0
  3. zenml/client.py +6 -0
  4. zenml/config/step_configurations.py +3 -2
  5. zenml/constants.py +2 -1
  6. zenml/entrypoints/step_entrypoint_configuration.py +2 -0
  7. zenml/integrations/airflow/orchestrators/airflow_orchestrator.py +7 -2
  8. zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +2 -0
  9. zenml/integrations/azure/orchestrators/azureml_orchestrator.py +2 -0
  10. zenml/integrations/databricks/orchestrators/databricks_orchestrator.py +3 -1
  11. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +2 -0
  12. zenml/integrations/hyperai/orchestrators/hyperai_orchestrator.py +3 -1
  13. zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py +3 -1
  14. zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +12 -0
  15. zenml/integrations/kubernetes/orchestrators/kube_utils.py +3 -0
  16. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +4 -1
  17. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +164 -19
  18. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint_configuration.py +8 -1
  19. zenml/integrations/lightning/orchestrators/lightning_orchestrator.py +3 -1
  20. zenml/integrations/mlflow/__init__.py +0 -27
  21. zenml/integrations/mlflow/services/mlflow_deployment.py +25 -7
  22. zenml/integrations/seldon/services/seldon_deployment.py +1 -1
  23. zenml/integrations/skypilot/orchestrators/skypilot_base_vm_orchestrator.py +3 -1
  24. zenml/integrations/tekton/orchestrators/tekton_orchestrator.py +3 -1
  25. zenml/integrations/vllm/services/vllm_deployment.py +1 -1
  26. zenml/logging/step_logging.py +1 -1
  27. zenml/materializers/__init__.py +4 -3
  28. zenml/materializers/built_in_materializer.py +24 -0
  29. zenml/materializers/path_materializer.py +119 -0
  30. zenml/model/model.py +3 -1
  31. zenml/models/__init__.py +5 -0
  32. zenml/models/v2/core/run_template.py +32 -1
  33. zenml/orchestrators/base_orchestrator.py +3 -0
  34. zenml/orchestrators/dag_runner.py +48 -15
  35. zenml/orchestrators/local/local_orchestrator.py +3 -1
  36. zenml/orchestrators/local_docker/local_docker_orchestrator.py +3 -1
  37. zenml/orchestrators/step_launcher.py +2 -2
  38. zenml/utils/secret_utils.py +2 -2
  39. zenml/zen_server/dashboard/assets/{404-2I8egBQu.js → 404-CYPi9d8E.js} +1 -1
  40. zenml/zen_server/dashboard/assets/@radix-C7hRs6Kx.js +95 -0
  41. zenml/zen_server/dashboard/assets/{@react-router-BUo5vhN4.js → @react-router-BGgzhn5D.js} +5 -5
  42. zenml/zen_server/dashboard/assets/@reactflow-CQi1Z1Wq.js +17 -0
  43. zenml/zen_server/dashboard/assets/@tanstack-CSxjHCME.js +22 -0
  44. zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-D7KZcPFw.js → AlertDialogDropdownItem-Dn8bgaXG.js} +1 -1
  45. zenml/zen_server/dashboard/assets/{CodeSnippet-DUkCnBpQ.js → CodeSnippet-CSINAl3I.js} +1 -1
  46. zenml/zen_server/dashboard/assets/{CollapsibleCard-B5-5Plnd.js → CollapsibleCard-CQOb53t9.js} +1 -1
  47. zenml/zen_server/dashboard/assets/{Commands-CbOMmarC.js → Commands-CPleXvse.js} +1 -1
  48. zenml/zen_server/dashboard/assets/{ComponentBadge-FrujKBC6.js → ComponentBadge-CIFj0W7T.js} +1 -1
  49. zenml/zen_server/dashboard/assets/{ComponentIcon-Dx5fBrDX.js → ComponentIcon-D3JHFhJU.js} +1 -1
  50. zenml/zen_server/dashboard/assets/{CsvVizualization-B8E3p9we.js → CsvVizualization-Cklc1Vb5.js} +6 -6
  51. zenml/zen_server/dashboard/assets/{DeleteAlertDialog-BgTZbbAt.js → DeleteAlertDialog-Bzq-uSd7.js} +1 -1
  52. zenml/zen_server/dashboard/assets/{DialogItem-CNWLiJcc.js → DialogItem-zjMgCmCl.js} +1 -1
  53. zenml/zen_server/dashboard/assets/{DisplayDate-C5Aw-Yca.js → DisplayDate-CYVBBSgr.js} +1 -1
  54. zenml/zen_server/dashboard/assets/{EmptyState-DpbfQBDE.js → EmptyState-M1jafpg6.js} +1 -1
  55. zenml/zen_server/dashboard/assets/{Error-BkUP4Luv.js → Error-kdeNHm_o.js} +1 -1
  56. zenml/zen_server/dashboard/assets/{ExecutionStatus-CD8Vj7sp.js → ExecutionStatus-UE6Rbmtk.js} +1 -1
  57. zenml/zen_server/dashboard/assets/{Helpbox-DIx6mDOH.js → Helpbox-CeM-FPQl.js} +1 -1
  58. zenml/zen_server/dashboard/assets/{Infobox-BHEdNmME.js → Infobox-CD0fDbYF.js} +1 -1
  59. zenml/zen_server/dashboard/assets/{InlineAvatar-Bin9UPKJ.js → InlineAvatar-CrHWwlf4.js} +1 -1
  60. zenml/zen_server/dashboard/assets/{Lock-tO9Z41I9.js → Lock-DW-0_M0o.js} +1 -1
  61. zenml/zen_server/dashboard/assets/{MarkdownVisualization-C3JLiPCY.js → MarkdownVisualization-URCyUPcZ.js} +2 -2
  62. zenml/zen_server/dashboard/assets/{NestedCollapsible-Da-k0Mff.js → NestedCollapsible-DfTTGG8u.js} +1 -1
  63. zenml/zen_server/dashboard/assets/{NumberBox-BvBJYxCu.js → NumberBox-D2A7ENHb.js} +1 -1
  64. zenml/zen_server/dashboard/assets/Partials-DggkUpWp.js +1 -0
  65. zenml/zen_server/dashboard/assets/{PasswordChecker-B4Uw6BJZ.js → PasswordChecker-lYTOtNom.js} +1 -1
  66. zenml/zen_server/dashboard/assets/ProBadge-BCdprj69.js +1 -0
  67. zenml/zen_server/dashboard/assets/{ProCta-7_FtpX3I.js → ProCta-szzPO0Y7.js} +1 -1
  68. zenml/zen_server/dashboard/assets/{ProviderIcon-CxeziA5a.js → ProviderIcon-MdqWDO6-.js} +1 -1
  69. zenml/zen_server/dashboard/assets/{ProviderRadio-DPmZHff_.js → ProviderRadio-B4CB4vzP.js} +1 -1
  70. zenml/zen_server/dashboard/assets/{RunSelector-BVKB4Z8F.js → RunSelector-Bhb83FyB.js} +1 -1
  71. zenml/zen_server/dashboard/assets/{RunsBody-Cj4sIqQB.js → RunsBody-Csn2VEOE.js} +1 -1
  72. zenml/zen_server/dashboard/assets/{SearchField-DjAOZic5.js → SearchField-Cce00eQL.js} +1 -1
  73. zenml/zen_server/dashboard/assets/{SecretTooltip-mMAAP4dM.js → SecretTooltip-DaDLBVj-.js} +1 -1
  74. zenml/zen_server/dashboard/assets/{SetPassword-B0o5kSJU.js → SetPassword-tX6fom1Y.js} +1 -1
  75. zenml/zen_server/dashboard/assets/{StackList-5UB8LoEq.js → StackList-CQt1xGRh.js} +1 -1
  76. zenml/zen_server/dashboard/assets/{Tabs-AuhCyzle.js → Tabs-CCQyIqRb.js} +1 -1
  77. zenml/zen_server/dashboard/assets/{Tick-CHW0jc8Y.js → Tick-D63_jhf1.js} +1 -1
  78. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Bauivjf-.js → UpdatePasswordSchemas-CbbvoGYV.js} +1 -1
  79. zenml/zen_server/dashboard/assets/{UsageReason-Dr5ca5M4.js → UsageReason-C2cNrUeS.js} +1 -1
  80. zenml/zen_server/dashboard/assets/{Wizard-XEp9rGmf.js → Wizard-BVkN2a2x.js} +1 -1
  81. zenml/zen_server/dashboard/assets/WizardFooter-Bk7gIKiS.js +1 -0
  82. zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-COvsm3bC.js → all-pipeline-runs-query-BLclwQSi.js} +1 -1
  83. zenml/zen_server/dashboard/assets/{arrow-left-B2hyhFky.js → arrow-left-CwgF2MEM.js} +1 -1
  84. zenml/zen_server/dashboard/assets/{check-DZ0KAh3W.js → check-DK77doTf.js} +1 -1
  85. zenml/zen_server/dashboard/assets/{check-circle-DyCCYTA0.js → check-circle-mvyzYvIW.js} +1 -1
  86. zenml/zen_server/dashboard/assets/{chevron-down-A3PXOshS.js → chevron-down-A-rmltmI.js} +1 -1
  87. zenml/zen_server/dashboard/assets/{chevron-right-double-zKz7rAaU.js → chevron-right-double-uNWbJT-C.js} +1 -1
  88. zenml/zen_server/dashboard/assets/{clock-k5T5tYrt.js → clock-CPA5cYxq.js} +1 -1
  89. zenml/zen_server/dashboard/assets/{code-browser-DvB0W2Ix.js → code-browser-j2EpcxIA.js} +1 -1
  90. zenml/zen_server/dashboard/assets/{configuration-form-BJUCr0wl.js → configuration-form-CjrAp0GS.js} +1 -1
  91. zenml/zen_server/dashboard/assets/{create-stack-B2c98UlP.js → create-stack-Bd2JdQer.js} +1 -1
  92. zenml/zen_server/dashboard/assets/delete-run-Cwpxu1-d.js +1 -0
  93. zenml/zen_server/dashboard/assets/{docker-B3Sqzd8J.js → docker-BuDBFEDL.js} +1 -1
  94. zenml/zen_server/dashboard/assets/{file-text-CgxVzNph.js → file-text-BdxZdjP_.js} +1 -1
  95. zenml/zen_server/dashboard/assets/{flavor-select-D8CranSY.js → flavor-select-c0w-6o9w.js} +1 -1
  96. zenml/zen_server/dashboard/assets/{form-schemas-Bm-dTV3L.js → form-schemas-B5Ax1SZf.js} +1 -1
  97. zenml/zen_server/dashboard/assets/{gcp-0u4le6mC.js → gcp-CHNvgEss.js} +1 -1
  98. zenml/zen_server/dashboard/assets/{help-CfT0tY2I.js → help-DyMolRxD.js} +1 -1
  99. zenml/zen_server/dashboard/assets/index-BW-KaQ2p.js +1 -0
  100. zenml/zen_server/dashboard/assets/{index-DPjvk73v.js → index-Be2jLIYM.js} +8 -8
  101. zenml/zen_server/dashboard/assets/{index-D-n6tspq.js → index-CjdtNrfJ.js} +1 -1
  102. zenml/zen_server/dashboard/assets/{index-BVVKxTWC.js → index-DR30v9MZ.js} +1 -1
  103. zenml/zen_server/dashboard/assets/{index-CzhJC6pc.js → index-d_40qKeY.js} +1 -1
  104. zenml/zen_server/dashboard/assets/index.esm-D7jFlf5N.js +1 -0
  105. zenml/zen_server/dashboard/assets/{key-icon-CjwWwoOU.js → key-icon-DO4DPJHZ.js} +1 -1
  106. zenml/zen_server/dashboard/assets/{kubernetes-eA-Y6gE7.js → kubernetes-D6OUjwSK.js} +1 -1
  107. zenml/zen_server/dashboard/assets/{layout-3_rgDUxf.js → layout-h3cbx8WZ.js} +1 -1
  108. zenml/zen_server/dashboard/assets/{link-external-BYm_zH_8.js → link-external-DUhCSKNm.js} +1 -1
  109. zenml/zen_server/dashboard/assets/{login-mutation-D6uiKsKk.js → login-mutation-DOajKct8.js} +1 -1
  110. zenml/zen_server/dashboard/assets/{logs-D6_diV2k.js → logs-B5n0U7tB.js} +1 -1
  111. zenml/zen_server/dashboard/assets/{not-found-DFrksY0r.js → not-found-DolTp0dr.js} +1 -1
  112. zenml/zen_server/dashboard/assets/{package-BOms6B-A.js → package-D1Mhqeh8.js} +1 -1
  113. zenml/zen_server/dashboard/assets/{page-DBNBYSwq.js → page-48DMcIQw.js} +2 -2
  114. zenml/zen_server/dashboard/assets/{page-DOzFoJuo.js → page-B32kCGPe.js} +1 -1
  115. zenml/zen_server/dashboard/assets/page-BAjhc2bs.js +1 -0
  116. zenml/zen_server/dashboard/assets/{page-D5GZlpKq.js → page-BBNrvxC1.js} +1 -1
  117. zenml/zen_server/dashboard/assets/{page-DF9q7ySu.js → page-BEAx6ZvH.js} +1 -1
  118. zenml/zen_server/dashboard/assets/{page-DDvwWgKP.js → page-BRfeowe0.js} +1 -1
  119. zenml/zen_server/dashboard/assets/{page-BJ15SGwt.js → page-BbRtQC2E.js} +1 -1
  120. zenml/zen_server/dashboard/assets/{page-D2F0Rvak.js → page-BgUR_5z3.js} +1 -1
  121. zenml/zen_server/dashboard/assets/{page-D0Zt2-7X.js → page-BiAjLLww.js} +1 -1
  122. zenml/zen_server/dashboard/assets/{page-B80TE04v.js → page-BkPPfNfG.js} +1 -1
  123. zenml/zen_server/dashboard/assets/{page-DkJfgcDi.js → page-BmTf1Lf1.js} +2 -2
  124. zenml/zen_server/dashboard/assets/{page-CAKBSE9f.js → page-BuZC8z6N.js} +1 -1
  125. zenml/zen_server/dashboard/assets/{page-BwAFqFCf.js → page-C4zMMcaH.js} +1 -1
  126. zenml/zen_server/dashboard/assets/{page-BnUwQBeg.js → page-CKVbEdX2.js} +1 -1
  127. zenml/zen_server/dashboard/assets/{page-BXh1mF-D.js → page-CPRymOIS.js} +1 -1
  128. zenml/zen_server/dashboard/assets/{page-BMZaECzB.js → page-CaTJVICi.js} +1 -1
  129. zenml/zen_server/dashboard/assets/{page-NIWnUdVg.js → page-CmzmFF4S.js} +1 -1
  130. zenml/zen_server/dashboard/assets/{page-BIseZTJt.js → page-CwAbTnvK.js} +2 -2
  131. zenml/zen_server/dashboard/assets/{page-BeFiRx31.js → page-D-MjLTXS.js} +1 -1
  132. zenml/zen_server/dashboard/assets/{page-B1Un9vAU.js → page-D3m9-YWJ.js} +1 -1
  133. zenml/zen_server/dashboard/assets/{page-DhNnHHmX.js → page-DCpZju6a.js} +1 -1
  134. zenml/zen_server/dashboard/assets/page-DEUeF3mO.js +1 -0
  135. zenml/zen_server/dashboard/assets/{page-B150LbzG.js → page-DWOAh8Pp.js} +1 -1
  136. zenml/zen_server/dashboard/assets/{page-EhqRFAZc.js → page-DezabeEO.js} +1 -1
  137. zenml/zen_server/dashboard/assets/{page-BTvnIFGR.js → page-DivlNKt9.js} +1 -1
  138. zenml/zen_server/dashboard/assets/{page-BqQ6y8Hb.js → page-DmOcZO8U.js} +1 -1
  139. zenml/zen_server/dashboard/assets/page-DnY59jOg.js +1 -0
  140. zenml/zen_server/dashboard/assets/{page-DaHH2ZEF.js → page-Dv3qtvm8.js} +1 -1
  141. zenml/zen_server/dashboard/assets/page-P81CcE2L.js +1 -0
  142. zenml/zen_server/dashboard/assets/{page-Dd-0y3SU.js → page-a1c6o4vv.js} +1 -1
  143. zenml/zen_server/dashboard/assets/{page-BJrZsPSh.js → page-bS5tHLDW.js} +1 -1
  144. zenml/zen_server/dashboard/assets/{page-C11vPVkH.js → page-gRfUvR0E.js} +1 -1
  145. zenml/zen_server/dashboard/assets/{page-BZUxCBoD.js → page-hNHJPQtK.js} +1 -1
  146. zenml/zen_server/dashboard/assets/{page-kYlFrH53.js → page-ir7Scz2Y.js} +1 -1
  147. zenml/zen_server/dashboard/assets/{page-ygCPGHAV.js → page-mtwS5oci.js} +1 -1
  148. zenml/zen_server/dashboard/assets/{persist-DHGuHP2H.js → persist-BUqILw7G.js} +1 -1
  149. zenml/zen_server/dashboard/assets/{persist-C5RlwSq6.js → persist-BbdfLc0W.js} +1 -1
  150. zenml/zen_server/dashboard/assets/{plus-CoKtHiA9.js → plus-COjQg3AG.js} +1 -1
  151. zenml/zen_server/dashboard/assets/{react-error-boundary.esm-BkGIR1Du.js → react-error-boundary.esm-fyoUBS25.js} +1 -1
  152. zenml/zen_server/dashboard/assets/{refresh-CupyU1Vs.js → refresh-CM5T3QeU.js} +1 -1
  153. zenml/zen_server/dashboard/assets/{rocket-k68ONPDS.js → rocket-Cf-B-XOR.js} +1 -1
  154. zenml/zen_server/dashboard/assets/{service-Do7yitqe.js → service-CV2zjc-p.js} +1 -1
  155. zenml/zen_server/dashboard/assets/{sharedSchema-i_9Y4WcA.js → sharedSchema-DpGc9kQg.js} +1 -1
  156. zenml/zen_server/dashboard/assets/stack-detail-query-BpzLZjvw.js +1 -0
  157. zenml/zen_server/dashboard/assets/{terminal-square-URAPn9DB.js → terminal-square-DMtel8mb.js} +1 -1
  158. zenml/zen_server/dashboard/assets/{tick-circle-AaVBszPn.js → tick-circle-m94Aa6Zt.js} +1 -1
  159. zenml/zen_server/dashboard/assets/{trash-B_JgTgqd.js → trash-BWSZ7NRK.js} +1 -1
  160. zenml/zen_server/dashboard/assets/update-server-settings-mutation-Dv6qHtK9.js +1 -0
  161. zenml/zen_server/dashboard/assets/{zod-CRNUMWWg.js → zod-C0xYeTvL.js} +1 -1
  162. zenml/zen_server/dashboard/index.html +6 -6
  163. zenml/zen_server/template_execution/utils.py +53 -33
  164. zenml/zen_stores/migrations/versions/0.80.2_release.py +23 -0
  165. zenml/zen_stores/migrations/versions/6611d4bcc95b_add_hidden_option_for_templates.py +47 -0
  166. zenml/zen_stores/schemas/run_template_schemas.py +7 -0
  167. {zenml_nightly-0.80.1.dev20250408.dist-info → zenml_nightly-0.80.2.dev20250410.dist-info}/METADATA +3 -3
  168. {zenml_nightly-0.80.1.dev20250408.dist-info → zenml_nightly-0.80.2.dev20250410.dist-info}/RECORD +171 -168
  169. zenml/zen_server/dashboard/assets/@radix-AvWw-1nd.js +0 -95
  170. zenml/zen_server/dashboard/assets/@reactflow-BHoFKFSZ.js +0 -17
  171. zenml/zen_server/dashboard/assets/@tanstack-CcI3lvwB.js +0 -22
  172. zenml/zen_server/dashboard/assets/Partials-TNaYjHsV.js +0 -1
  173. zenml/zen_server/dashboard/assets/ProBadge-BfPp-B97.js +0 -1
  174. zenml/zen_server/dashboard/assets/WizardFooter-BtL1Gi1k.js +0 -1
  175. zenml/zen_server/dashboard/assets/delete-run-Do3XyF4W.js +0 -1
  176. zenml/zen_server/dashboard/assets/index-eIIP-0dQ.js +0 -1
  177. zenml/zen_server/dashboard/assets/index.esm-cf-8NBxV.js +0 -1
  178. zenml/zen_server/dashboard/assets/page-B-uHUFcm.js +0 -1
  179. zenml/zen_server/dashboard/assets/page-B0Llmzo_.js +0 -1
  180. zenml/zen_server/dashboard/assets/page-BzlVs5tC.js +0 -1
  181. zenml/zen_server/dashboard/assets/page-CPe9nQSo.js +0 -1
  182. zenml/zen_server/dashboard/assets/stack-detail-query-omCumL7U.js +0 -1
  183. zenml/zen_server/dashboard/assets/update-server-settings-mutation-B4eE33z-.js +0 -1
  184. {zenml_nightly-0.80.1.dev20250408.dist-info → zenml_nightly-0.80.2.dev20250410.dist-info}/LICENSE +0 -0
  185. {zenml_nightly-0.80.1.dev20250408.dist-info → zenml_nightly-0.80.2.dev20250410.dist-info}/WHEEL +0 -0
  186. {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
- self.run_fn(node)
127
- self._finish_node(node)
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
- self.node_states[node] = NodeStatus.COMPLETED
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 downstram_node in self.reversed_dag[node]:
168
- if self._can_run(downstram_node):
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(downstram_node)
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
- # Make sure all nodes were run, otherwise print a warning.
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.WAITING:
204
- upstream_nodes = self.dag[node]
205
- logger.warning(
206
- f"Node `{node}` was never run, because it was still"
207
- f" waiting for the following nodes: `{upstream_nodes}`."
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._step.config.name,
157
+ artifact_store=self._stack.artifact_store,
158
+ step_name=self._step_name,
159
159
  )
160
160
 
161
161
  logs_context = step_logging.StepLogsStorageContext(
@@ -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) # type: ignore[pydantic-field]
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) # type: ignore[pydantic-field]
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-AvWw-1nd.js";import{h as s,r as t}from"./index-DPjvk73v.js";import{E as r}from"./EmptyState-DpbfQBDE.js";import{S as a}from"./help-CfT0tY2I.js";import{L as o}from"./@react-router-BUo5vhN4.js";import"./@tanstack-CcI3lvwB.js";import"./@reactflow-BHoFKFSZ.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};
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};