zenml-nightly 0.84.0.dev20250728__py3-none-any.whl → 0.84.0.dev20250730__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 (217) hide show
  1. zenml/VERSION +1 -1
  2. zenml/client.py +6 -1
  3. zenml/code_repositories/git/local_git_repository_context.py +3 -4
  4. zenml/constants.py +28 -0
  5. zenml/integrations/azure/service_connectors/azure_service_connector.py +20 -9
  6. zenml/integrations/gcp/__init__.py +4 -1
  7. zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +20 -1
  8. zenml/integrations/kubernetes/orchestrators/kube_utils.py +80 -3
  9. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +18 -14
  10. zenml/logging/__init__.py +0 -11
  11. zenml/logging/step_logging.py +255 -149
  12. zenml/models/__init__.py +6 -0
  13. zenml/models/v2/core/service_account.py +87 -1
  14. zenml/models/v2/core/step_run.py +13 -0
  15. zenml/models/v2/core/user.py +20 -6
  16. zenml/models/v2/misc/exception_info.py +30 -0
  17. zenml/models/v2/misc/external_user.py +4 -1
  18. zenml/orchestrators/publish_utils.py +10 -0
  19. zenml/orchestrators/step_launcher.py +11 -6
  20. zenml/orchestrators/step_runner.py +26 -1
  21. zenml/utils/exception_utils.py +90 -0
  22. zenml/zen_server/auth.py +138 -27
  23. zenml/zen_server/dashboard/assets/{404-B5cfnwZ1.js → 404-CMbwR10f.js} +1 -1
  24. zenml/zen_server/dashboard/assets/{@radix-C_LirfyT.js → @radix-B1sy0Lhr.js} +1 -1
  25. zenml/zen_server/dashboard/assets/{@react-router-BSsrkPOd.js → @react-router-CHjLNlgw.js} +1 -1
  26. zenml/zen_server/dashboard/assets/{@reactflow-D9hglKLF.js → @reactflow-gbyyU3kq.js} +2 -2
  27. zenml/zen_server/dashboard/assets/{@tanstack-C0SeHZng.js → @tanstack-Dwlisomv.js} +1 -1
  28. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-BpLj419i.js +1 -0
  29. zenml/zen_server/dashboard/assets/ButtonGroup-DVhzbQxV.js +1 -0
  30. zenml/zen_server/dashboard/assets/{CodeSnippet-D8iBqOVv.js → CodeSnippet-B7Wd4R8u.js} +1 -1
  31. zenml/zen_server/dashboard/assets/{CollapsibleCard-D0-pQi1n.js → CollapsibleCard-DSZzbjx5.js} +1 -1
  32. zenml/zen_server/dashboard/assets/{ComponentBadge-mw2Ja_ON.js → ComponentBadge-MVT08kBV.js} +1 -1
  33. zenml/zen_server/dashboard/assets/{ComponentIcon-BXgpt-jw.js → ComponentIcon-C9AY8usJ.js} +1 -1
  34. zenml/zen_server/dashboard/assets/DeleteAlertDialog-CzhTVQaC.js +1 -0
  35. zenml/zen_server/dashboard/assets/{DialogItem-DeME0oSt.js → DialogItem-DD_7v3UY.js} +1 -1
  36. zenml/zen_server/dashboard/assets/{DisplayDate-v3KW7oez.js → DisplayDate-57lUNS79.js} +1 -1
  37. zenml/zen_server/dashboard/assets/{EmptyState-DG0m-CGv.js → EmptyState-BMA34iVR.js} +1 -1
  38. zenml/zen_server/dashboard/assets/{Error-DcVLcrLs.js → Error-Cakgjexo.js} +1 -1
  39. zenml/zen_server/dashboard/assets/{ExecutionStatus-C4tlFnlh.js → ExecutionStatus-CQbWovhV.js} +1 -1
  40. zenml/zen_server/dashboard/assets/{Helpbox-C-RGHz3S.js → Helpbox-7FZpmsHB.js} +1 -1
  41. zenml/zen_server/dashboard/assets/{Infobox-DFCWPbMb.js → Infobox-DnduZjNU.js} +1 -1
  42. zenml/zen_server/dashboard/assets/{LeftSideMenu-Czev0KCA.js → LeftSideMenu-D5UEs4vB.js} +1 -1
  43. zenml/zen_server/dashboard/assets/{Lock-CRP5J_su.js → Lock-u8WOoTTd.js} +1 -1
  44. zenml/zen_server/dashboard/assets/NestedCollapsible-0yviIfaA.js +1 -0
  45. zenml/zen_server/dashboard/assets/{NumberBox-CoQjQYDJ.js → NumberBox-C2Pju4PR.js} +1 -1
  46. zenml/zen_server/dashboard/assets/{Pagination-CcDD5yHh.js → Pagination-C1sE5Nzn.js} +1 -1
  47. zenml/zen_server/dashboard/assets/{Partials-DlMzfKgs.js → Partials-DosysQMU.js} +1 -1
  48. zenml/zen_server/dashboard/assets/{PasswordChecker-BZwoeQIm.js → PasswordChecker-DOPLfvg7.js} +1 -1
  49. zenml/zen_server/dashboard/assets/{ProCta-CU2ycJDo.js → ProCta-CUkpV3PJ.js} +1 -1
  50. zenml/zen_server/dashboard/assets/{ProviderIcon-BMAn9Jld.js → ProviderIcon-aQjTuTRX.js} +1 -1
  51. zenml/zen_server/dashboard/assets/{ProviderRadio-D_q9tE3G.js → ProviderRadio-C6pLVNxC.js} +1 -1
  52. zenml/zen_server/dashboard/assets/RunsBody-CZAiSxYK.js +1 -0
  53. zenml/zen_server/dashboard/assets/{SearchField-D_0-uAPj.js → SearchField-Byv1PtST.js} +1 -1
  54. zenml/zen_server/dashboard/assets/{SecretTooltip-BcWMKb9f.js → SecretTooltip-CErfhVgF.js} +1 -1
  55. zenml/zen_server/dashboard/assets/{SetPassword-CaKVSqAL.js → SetPassword-C4OH-cn1.js} +1 -1
  56. zenml/zen_server/dashboard/assets/{SheetHeader-7vwlsY_i.js → SheetHeader-Bb3v9rha.js} +1 -1
  57. zenml/zen_server/dashboard/assets/StackComponentList-D85oab98.js +1 -0
  58. zenml/zen_server/dashboard/assets/StackList-DSAjbVb5.js +1 -0
  59. zenml/zen_server/dashboard/assets/Tabs-2uwqXsdL.js +1 -0
  60. zenml/zen_server/dashboard/assets/Tick-BQ7_xDBl.js +1 -0
  61. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Da5RndbV.js → UpdatePasswordSchemas-DNkYgzN6.js} +1 -1
  62. zenml/zen_server/dashboard/assets/{Wizard-8aJzxUjb.js → Wizard-2FIi8JNY.js} +1 -1
  63. zenml/zen_server/dashboard/assets/WizardFooter-DQEnlDmZ.js +1 -0
  64. zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-gorNNEaT.js → all-pipeline-runs-query-CdvWtiAY.js} +1 -1
  65. zenml/zen_server/dashboard/assets/{arrow-left-hcj2H8HY.js → arrow-left-BFB2mgJo.js} +1 -1
  66. zenml/zen_server/dashboard/assets/{bar-chart-square-check-9siI9icm.js → bar-chart-square-check-_m-oYysN.js} +1 -1
  67. zenml/zen_server/dashboard/assets/{bulk-delete-B5RTlnD_.js → bulk-delete-wdObjfps.js} +2 -2
  68. zenml/zen_server/dashboard/assets/{check-D1bHMJkL.js → check-C9Nye5lR.js} +1 -1
  69. zenml/zen_server/dashboard/assets/{check-circle-mnEgPhPF.js → check-circle-CG6XAdk-.js} +1 -1
  70. zenml/zen_server/dashboard/assets/{chevron-down-Z3nUe-0U.js → chevron-down-Bl7WwQAL.js} +1 -1
  71. zenml/zen_server/dashboard/assets/{chevron-right-double-CbRQKN4Q.js → chevron-right-double-CbMG1dOM.js} +1 -1
  72. zenml/zen_server/dashboard/assets/{clock-BMjHXT3f.js → clock-BnPvxp3D.js} +1 -1
  73. zenml/zen_server/dashboard/assets/{code-browser-DftoiCIg.js → code-browser-CzWvJ4S6.js} +1 -1
  74. zenml/zen_server/dashboard/assets/configuration-form-BbcNBQTO.js +1 -0
  75. zenml/zen_server/dashboard/assets/constants-DfvsDtcH.js +1 -0
  76. zenml/zen_server/dashboard/assets/{create-stack-BruqH_6X.js → create-stack-D4Sf7QpF.js} +1 -1
  77. zenml/zen_server/dashboard/assets/{credit-card-CH1BHrXY.js → credit-card-DfBA6dBb.js} +1 -1
  78. zenml/zen_server/dashboard/assets/{dataflow-2-qHjWt7zp.js → dataflow-2-BLkaTH0Q.js} +1 -1
  79. zenml/zen_server/dashboard/assets/{delete-run-ibBtciMR.js → delete-run-XSre8ru-.js} +1 -1
  80. zenml/zen_server/dashboard/assets/{expand-full-CD4fFvM-.js → expand-full-C8p_0jQv.js} +1 -1
  81. zenml/zen_server/dashboard/assets/{eye-CLNgIh_K.js → eye-BXcQevds.js} +1 -1
  82. zenml/zen_server/dashboard/assets/{file-text-CltVhgwZ.js → file-text-TdPXNd7s.js} +1 -1
  83. zenml/zen_server/dashboard/assets/form-C1jJgRy1.js +1 -0
  84. zenml/zen_server/dashboard/assets/{form-schemas-B9XgTS1V.js → form-schemas-BjWDRvGd.js} +1 -1
  85. zenml/zen_server/dashboard/assets/{help-B0CvBhCm.js → help-CRPfbPTO.js} +1 -1
  86. zenml/zen_server/dashboard/assets/{icon-hDriJUXY.js → icon--Tp6obFZ.js} +1 -1
  87. zenml/zen_server/dashboard/assets/{index-mA8kL088.js → index-B4ZeIaPd.js} +1 -1
  88. zenml/zen_server/dashboard/assets/{index-dCcVgFNl.js → index-BYHxFvoG.js} +1 -1
  89. zenml/zen_server/dashboard/assets/{index-BQWlHo1Y.js → index-BYzR7YrM.js} +1 -1
  90. zenml/zen_server/dashboard/assets/{index-BacoJBEQ.js → index-CO6UN3UX.js} +11 -11
  91. zenml/zen_server/dashboard/assets/{index-B7CRNU8l.js → index-d_QrPL-8.js} +1 -1
  92. zenml/zen_server/dashboard/assets/{index-BRhKF2z-.js → index-g7wOyc86.js} +1 -1
  93. zenml/zen_server/dashboard/assets/index-n_sn2ITN.css +1 -0
  94. zenml/zen_server/dashboard/assets/{index.es-DcVFDpJU.js → index.es-CZMSrR6z.js} +1 -1
  95. zenml/zen_server/dashboard/assets/{index.esm-COnaHLSh.js → index.esm-SBF9nn_P.js} +1 -1
  96. zenml/zen_server/dashboard/assets/{info-CyMih3vQ.js → info-CI2szPUG.js} +1 -1
  97. zenml/zen_server/dashboard/assets/{key-icon-HOx2gazv.js → key-icon-BiV171aI.js} +1 -1
  98. zenml/zen_server/dashboard/assets/layout-Cyc-V16c.js +1 -0
  99. zenml/zen_server/dashboard/assets/{layout-C5dgIReC.js → layout-GIiNvS10.js} +1 -1
  100. zenml/zen_server/dashboard/assets/{login-mutation-CidpsqyH.js → login-mutation-CDgTlQBD.js} +1 -1
  101. zenml/zen_server/dashboard/assets/{logs-DoLoTEfj.js → logs-lNLbZqHL.js} +1 -1
  102. zenml/zen_server/dashboard/assets/{mail-C160gvB0.js → mail-DBJRSzyu.js} +1 -1
  103. zenml/zen_server/dashboard/assets/{message-chat-square-DLz6XmPS.js → message-chat-square-C3CRCQvD.js} +1 -1
  104. zenml/zen_server/dashboard/assets/{package-BhYXGPxF.js → package-pR4bbXJp.js} +1 -1
  105. zenml/zen_server/dashboard/assets/page-1DXG7hp8.js +1 -0
  106. zenml/zen_server/dashboard/assets/{page-BCRXJXC9.js → page-43SWdz4k.js} +1 -1
  107. zenml/zen_server/dashboard/assets/{page-YdWnx9MX.js → page-AOVMuHDc.js} +1 -1
  108. zenml/zen_server/dashboard/assets/page-B4QBxV0B.js +22 -0
  109. zenml/zen_server/dashboard/assets/{page-CvllZMBF.js → page-B8ict_cR.js} +1 -1
  110. zenml/zen_server/dashboard/assets/page-BDre_qCO.js +1 -0
  111. zenml/zen_server/dashboard/assets/page-BbsvGfyi.js +18 -0
  112. zenml/zen_server/dashboard/assets/page-Bi4I23Hs.js +1 -0
  113. zenml/zen_server/dashboard/assets/page-BnAMyQZb.js +1 -0
  114. zenml/zen_server/dashboard/assets/{page-D6cvOG8w.js → page-BnZEAhNn.js} +1 -1
  115. zenml/zen_server/dashboard/assets/page-Bncp08FW.js +1 -0
  116. zenml/zen_server/dashboard/assets/{page-BTDi81N3.js → page-C4Jnp1qP.js} +1 -1
  117. zenml/zen_server/dashboard/assets/page-C7Z2sDHE.js +1 -0
  118. zenml/zen_server/dashboard/assets/page-C8t9qLdV.js +1 -0
  119. zenml/zen_server/dashboard/assets/{page-BByayrO-.js → page-C9IsnFid.js} +2 -2
  120. zenml/zen_server/dashboard/assets/page-CEHZzQ1Q.js +1 -0
  121. zenml/zen_server/dashboard/assets/page-CGtll3Jk.js +1 -0
  122. zenml/zen_server/dashboard/assets/{page-q41JNDWO.js → page-CKPkbOoE.js} +1 -1
  123. zenml/zen_server/dashboard/assets/{page-DF4FVxxW.js → page-CMvcoaSZ.js} +2 -2
  124. zenml/zen_server/dashboard/assets/page-CVwTAlzd.js +1 -0
  125. zenml/zen_server/dashboard/assets/{page-DSZfclXt.js → page-ClqRvz_V.js} +1 -1
  126. zenml/zen_server/dashboard/assets/{page-7CJ4Wq3O.js → page-CzDjN1wE.js} +1 -1
  127. zenml/zen_server/dashboard/assets/{page-BK59rZvf.js → page-D654xHWd.js} +1 -1
  128. zenml/zen_server/dashboard/assets/{page-DcXrWWWh.js → page-DLrYW-Dn.js} +1 -1
  129. zenml/zen_server/dashboard/assets/page-DOnAInjC.js +1 -0
  130. zenml/zen_server/dashboard/assets/{page-Cc8owYXQ.js → page-DQncGJeH.js} +1 -1
  131. zenml/zen_server/dashboard/assets/page-DQzNmXk3.js +1 -0
  132. zenml/zen_server/dashboard/assets/{page-FQxi1Otg.js → page-DSn1Jcvs.js} +1 -1
  133. zenml/zen_server/dashboard/assets/page-DZ5hcS1o.js +1 -0
  134. zenml/zen_server/dashboard/assets/page-DerIbaqa.js +1 -0
  135. zenml/zen_server/dashboard/assets/{page-8U20Tu_8.js → page-DgOEl3Bc.js} +1 -1
  136. zenml/zen_server/dashboard/assets/{page-DgldL5UB.js → page-DgSu4pTE.js} +2 -2
  137. zenml/zen_server/dashboard/assets/page-DgblJuXC.js +1 -0
  138. zenml/zen_server/dashboard/assets/{page-CY0LPcAJ.js → page-Dpw-xP4q.js} +1 -1
  139. zenml/zen_server/dashboard/assets/page-DsFXol8x.js +1 -0
  140. zenml/zen_server/dashboard/assets/page-Du6bFZTS.js +1 -0
  141. zenml/zen_server/dashboard/assets/{page-CeGBDh1Q.js → page-DznxxpKA.js} +1 -1
  142. zenml/zen_server/dashboard/assets/page-E9Mx9_rn.js +1 -0
  143. zenml/zen_server/dashboard/assets/page-HrebZOAM.js +1 -0
  144. zenml/zen_server/dashboard/assets/{page-BX67x4iL.js → page-O5xnz_nW.js} +1 -1
  145. zenml/zen_server/dashboard/assets/{page-DDWW21kl.js → page-hX7NkNdA.js} +1 -1
  146. zenml/zen_server/dashboard/assets/{persist-BKKcL1Kp.js → persist-B3Hb8HDW.js} +1 -1
  147. zenml/zen_server/dashboard/assets/{persist-DxiyfAax.js → persist-Dkbp9MFP.js} +1 -1
  148. zenml/zen_server/dashboard/assets/{pipeline-BJ8liDnl.js → pipeline-CDJSAXrb.js} +1 -1
  149. zenml/zen_server/dashboard/assets/{plus-cI8zD2xh.js → plus-DOrkJCmy.js} +1 -1
  150. zenml/zen_server/dashboard/assets/primary-role-CjkpP9fL.js +1 -0
  151. zenml/zen_server/dashboard/assets/{react-error-boundary.esm-DoXxY4pT.js → react-error-boundary.esm-DgOYA0wh.js} +1 -1
  152. zenml/zen_server/dashboard/assets/{refresh-3EF2R7ja.js → refresh-C8BXS3Fb.js} +1 -1
  153. zenml/zen_server/dashboard/assets/{resource-tyes-list-B5rkZcbc.js → resource-tyes-list-CugyWUAE.js} +1 -1
  154. zenml/zen_server/dashboard/assets/{resource-type-tooltip-E97WGqfk.js → resource-type-tooltip-V-zdiLKz.js} +1 -1
  155. zenml/zen_server/dashboard/assets/{service-B9aVzfAF.js → service-FjqYTmBw.js} +2 -2
  156. zenml/zen_server/dashboard/assets/{service-connectors-DL2-k_E2.js → service-connectors-nF4-OXB9.js} +1 -1
  157. zenml/zen_server/dashboard/assets/{sharedSchema-DyUO09BR.js → sharedSchema-Br1JPr8d.js} +1 -1
  158. zenml/zen_server/dashboard/assets/{slash-circle-D2Lb2FyR.js → slash-circle-B0xMh8q6.js} +1 -1
  159. zenml/zen_server/dashboard/assets/{stack-detail-query-Bc4QKlWg.js → stack-detail-query-DnyMCdVE.js} +1 -1
  160. zenml/zen_server/dashboard/assets/{terminal-BObrvDlO.js → terminal-C2tAF2XG.js} +1 -1
  161. zenml/zen_server/dashboard/assets/{terminal-square-BObrvDlO.js → terminal-square-C2tAF2XG.js} +1 -1
  162. zenml/zen_server/dashboard/assets/{transform-DFpKTKgF.js → transform-S7omcvTm.js} +1 -1
  163. zenml/zen_server/dashboard/assets/{trash-HKxXWbSG.js → trash-D9LA4VFD.js} +1 -1
  164. zenml/zen_server/dashboard/assets/{update-current-user-mutation-DSyUyHVj.js → update-current-user-mutation-B3Dpv3u6.js} +1 -1
  165. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-CdM-Sdds.js → update-server-settings-mutation-s7tlHN8s.js} +1 -1
  166. zenml/zen_server/dashboard/assets/{zod-DgEcN9jD.js → zod-D48zuELD.js} +1 -1
  167. zenml/zen_server/dashboard/index.html +7 -7
  168. zenml/zen_server/rbac/zenml_cloud_rbac.py +8 -4
  169. zenml/zen_server/routers/service_accounts_endpoints.py +71 -12
  170. zenml/zen_stores/base_zen_store.py +0 -19
  171. zenml/zen_stores/migrations/versions/8d4b9ba22c1f_add_user_avatar.py +39 -0
  172. zenml/zen_stores/migrations/versions/d4591f95ac07_step_exception_info.py +43 -0
  173. zenml/zen_stores/schemas/step_run_schemas.py +19 -0
  174. zenml/zen_stores/schemas/user_schemas.py +16 -5
  175. zenml/zen_stores/sql_zen_store.py +5 -1
  176. {zenml_nightly-0.84.0.dev20250728.dist-info → zenml_nightly-0.84.0.dev20250730.dist-info}/METADATA +1 -1
  177. {zenml_nightly-0.84.0.dev20250728.dist-info → zenml_nightly-0.84.0.dev20250730.dist-info}/RECORD +180 -176
  178. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-druRNuO2.js +0 -1
  179. zenml/zen_server/dashboard/assets/ButtonGroup-SF2DlzHV.js +0 -1
  180. zenml/zen_server/dashboard/assets/DeleteAlertDialog-BbyFVnVI.js +0 -1
  181. zenml/zen_server/dashboard/assets/NestedCollapsible-CN9scBUn.js +0 -1
  182. zenml/zen_server/dashboard/assets/RunsBody-BToytB8e.js +0 -1
  183. zenml/zen_server/dashboard/assets/StackComponentList-s7eSfm8o.js +0 -1
  184. zenml/zen_server/dashboard/assets/StackList-Dt0FrIkM.js +0 -1
  185. zenml/zen_server/dashboard/assets/Tabs-B27AHUfo.js +0 -1
  186. zenml/zen_server/dashboard/assets/Tick-DDeDgTuT.js +0 -1
  187. zenml/zen_server/dashboard/assets/WizardFooter-Bt7_UE14.js +0 -1
  188. zenml/zen_server/dashboard/assets/configuration-form-Yz8m0QIG.js +0 -1
  189. zenml/zen_server/dashboard/assets/constants-DeV48DuZ.js +0 -1
  190. zenml/zen_server/dashboard/assets/form-6aSt3tIl.js +0 -1
  191. zenml/zen_server/dashboard/assets/index-eggipFZS.css +0 -1
  192. zenml/zen_server/dashboard/assets/layout-CFLL6-CM.js +0 -1
  193. zenml/zen_server/dashboard/assets/page-6huxSHEu.js +0 -1
  194. zenml/zen_server/dashboard/assets/page-BMpXak4U.js +0 -1
  195. zenml/zen_server/dashboard/assets/page-Bjmcdg64.js +0 -1
  196. zenml/zen_server/dashboard/assets/page-BsAn8p4m.js +0 -1
  197. zenml/zen_server/dashboard/assets/page-BwjPRuaY.js +0 -1
  198. zenml/zen_server/dashboard/assets/page-CDtSVkNc.js +0 -1
  199. zenml/zen_server/dashboard/assets/page-CEDU0L2T.js +0 -1
  200. zenml/zen_server/dashboard/assets/page-COJK90rG.js +0 -1
  201. zenml/zen_server/dashboard/assets/page-C_XMn4GU.js +0 -1
  202. zenml/zen_server/dashboard/assets/page-Cb3KGsPK.js +0 -22
  203. zenml/zen_server/dashboard/assets/page-CiGOVsj3.js +0 -1
  204. zenml/zen_server/dashboard/assets/page-CmLSFMkW.js +0 -1
  205. zenml/zen_server/dashboard/assets/page-CnfCptXq.js +0 -1
  206. zenml/zen_server/dashboard/assets/page-CxzglV3-.js +0 -1
  207. zenml/zen_server/dashboard/assets/page-DVLez4R1.js +0 -1
  208. zenml/zen_server/dashboard/assets/page-Dg7-H_9i.js +0 -1
  209. zenml/zen_server/dashboard/assets/page-Dw7XuiSo.js +0 -18
  210. zenml/zen_server/dashboard/assets/page-XrmOHHg7.js +0 -1
  211. zenml/zen_server/dashboard/assets/page-oRm7D4TC.js +0 -1
  212. zenml/zen_server/dashboard/assets/page-x2GXC8sI.js +0 -1
  213. zenml/zen_server/dashboard/assets/page-z2FXP4GY.js +0 -1
  214. zenml/zen_server/dashboard/assets/primary-role-CPGHymjN.js +0 -1
  215. {zenml_nightly-0.84.0.dev20250728.dist-info → zenml_nightly-0.84.0.dev20250730.dist-info}/LICENSE +0 -0
  216. {zenml_nightly-0.84.0.dev20250728.dist-info → zenml_nightly-0.84.0.dev20250730.dist-info}/WHEEL +0 -0
  217. {zenml_nightly-0.84.0.dev20250728.dist-info → zenml_nightly-0.84.0.dev20250730.dist-info}/entry_points.txt +0 -0
zenml/VERSION CHANGED
@@ -1 +1 @@
1
- 0.84.0.dev20250728
1
+ 0.84.0.dev20250730
zenml/client.py CHANGED
@@ -7339,19 +7339,24 @@ class Client(metaclass=ClientMetaClass):
7339
7339
  def create_service_account(
7340
7340
  self,
7341
7341
  name: str,
7342
+ full_name: Optional[str] = None,
7342
7343
  description: str = "",
7343
7344
  ) -> ServiceAccountResponse:
7344
7345
  """Create a new service account.
7345
7346
 
7346
7347
  Args:
7347
7348
  name: The name of the service account.
7349
+ full_name: The display name of the service account.
7348
7350
  description: The description of the service account.
7349
7351
 
7350
7352
  Returns:
7351
7353
  The created service account.
7352
7354
  """
7353
7355
  service_account = ServiceAccountRequest(
7354
- name=name, description=description, active=True
7356
+ name=name,
7357
+ full_name=full_name or "",
7358
+ description=description,
7359
+ active=True,
7355
7360
  )
7356
7361
  created_service_account = self.zen_store.create_service_account(
7357
7362
  service_account=service_account
@@ -13,7 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """Implementation of the Local git repository context."""
15
15
 
16
- from typing import TYPE_CHECKING, Callable, Optional, cast
16
+ from typing import TYPE_CHECKING, Callable, Optional
17
17
 
18
18
  from zenml.code_repositories import (
19
19
  LocalRepositoryContext,
@@ -25,7 +25,6 @@ from zenml.constants import (
25
25
  from zenml.logger import get_logger
26
26
 
27
27
  if TYPE_CHECKING:
28
- from git.objects import Commit
29
28
  from git.remote import Remote
30
29
  from git.repo.base import Repo
31
30
 
@@ -180,7 +179,7 @@ class LocalGitRepositoryContext(LocalRepositoryContext):
180
179
  # Branch doesn't exist on remote
181
180
  return True
182
181
 
183
- return cast("Commit", remote_commit_object) != local_commit_object
182
+ return remote_commit_object != local_commit_object
184
183
 
185
184
  @property
186
185
  def current_commit(self) -> str:
@@ -189,4 +188,4 @@ class LocalGitRepositoryContext(LocalRepositoryContext):
189
188
  Returns:
190
189
  The current commit sha.
191
190
  """
192
- return cast(str, self.git_repo.head.object.hexsha)
191
+ return self.git_repo.head.object.hexsha
zenml/constants.py CHANGED
@@ -174,6 +174,12 @@ ENV_ZENML_ENABLE_IMPLICIT_AUTH_METHODS = "ZENML_ENABLE_IMPLICIT_AUTH_METHODS"
174
174
  ENV_ZENML_DISABLE_PIPELINE_LOGS_STORAGE = "ZENML_DISABLE_PIPELINE_LOGS_STORAGE"
175
175
  ENV_ZENML_DISABLE_STEP_LOGS_STORAGE = "ZENML_DISABLE_STEP_LOGS_STORAGE"
176
176
  ENV_ZENML_DISABLE_STEP_NAMES_IN_LOGS = "ZENML_DISABLE_STEP_NAMES_IN_LOGS"
177
+ ENV_ZENML_LOGS_STORAGE_MAX_QUEUE_SIZE = "ZENML_LOGS_STORAGE_MAX_QUEUE_SIZE"
178
+ ENV_ZENML_LOGS_STORAGE_QUEUE_TIMEOUT = "ZENML_LOGS_STORAGE_QUEUE_TIMEOUT"
179
+
180
+ ENV_ZENML_LOGS_WRITE_INTERVAL_SECONDS = "ZENML_LOGS_WRITE_INTERVAL_SECONDS"
181
+ ENV_ZENML_LOGS_MERGE_INTERVAL_SECONDS = "ZENML_LOGS_MERGE_INTERVAL_SECONDS"
182
+
177
183
  ENV_ZENML_CUSTOM_SOURCE_ROOT = "ZENML_CUSTOM_SOURCE_ROOT"
178
184
  ENV_ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION = (
179
185
  "ZENML_PIPELINE_API_TOKEN_EXPIRATION"
@@ -181,6 +187,9 @@ ENV_ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION = (
181
187
  ENV_ZENML_CODE_REPOSITORY_IGNORE_UNTRACKED_FILES = (
182
188
  "ZENML_CODE_REPOSITORY_IGNORE_UNTRACKED_FILES"
183
189
  )
190
+ # Environment variable that indicates whether the current environment is running
191
+ # a step operator.
192
+ ENV_ZENML_STEP_OPERATOR = "ZENML_STEP_OPERATOR"
184
193
 
185
194
  # Materializer environment variables
186
195
  ENV_ZENML_MATERIALIZER_ALLOW_NON_ASCII_JSON_DUMPS = (
@@ -501,3 +510,22 @@ STACK_DEPLOYMENT_API_TOKEN_EXPIRATION = 60 * 6 # 6 hours
501
510
  ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION = handle_int_env_var(
502
511
  ENV_ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION, default=0
503
512
  )
513
+
514
+ # Logs storage constants
515
+ # Maximum number of log batches to queue.
516
+ LOGS_STORAGE_MAX_QUEUE_SIZE = handle_int_env_var(
517
+ ENV_ZENML_LOGS_STORAGE_MAX_QUEUE_SIZE, default=100000
518
+ )
519
+ # Queue timeout controls log dropping vs application blocking:
520
+ # - Positive value (e.g., 30): Wait N seconds, then drop logs if queue full
521
+ # - Negative value (e.g., -1): Block indefinitely until queue has space (never drop logs)
522
+ LOGS_STORAGE_QUEUE_TIMEOUT = handle_int_env_var(
523
+ ENV_ZENML_LOGS_STORAGE_QUEUE_TIMEOUT, default=-1
524
+ )
525
+ # Log batch-write and merge windows in seconds.
526
+ LOGS_WRITE_INTERVAL_SECONDS = handle_int_env_var(
527
+ ENV_ZENML_LOGS_WRITE_INTERVAL_SECONDS, default=2
528
+ )
529
+ LOGS_MERGE_INTERVAL_SECONDS = handle_int_env_var(
530
+ ENV_ZENML_LOGS_MERGE_INTERVAL_SECONDS, default=10 * 60
531
+ )
@@ -1490,7 +1490,8 @@ class AzureServiceConnector(ServiceConnector):
1490
1490
  aks_clusters = [
1491
1491
  cluster
1492
1492
  for cluster in aks_clusters
1493
- if self._get_resource_group(cluster.id)
1493
+ if cluster.id
1494
+ and self._get_resource_group(cluster.id)
1494
1495
  == self.config.resource_group
1495
1496
  ]
1496
1497
 
@@ -1507,7 +1508,8 @@ class AzureServiceConnector(ServiceConnector):
1507
1508
  clusters = [
1508
1509
  (cluster.name, self._get_resource_group(cluster.id))
1509
1510
  for cluster in aks_clusters
1510
- if cluster.name
1511
+ if cluster.id
1512
+ and cluster.name
1511
1513
  and (not cluster_name or cluster.name == cluster_name)
1512
1514
  ]
1513
1515
 
@@ -1809,16 +1811,25 @@ class AzureServiceConnector(ServiceConnector):
1809
1811
  cluster_name, resource_group = clusters[0]
1810
1812
 
1811
1813
  try:
1812
- client = ContainerServiceClient(credential, subscription_id)
1814
+ cs_client = ContainerServiceClient(credential, subscription_id)
1813
1815
 
1814
- creds = client.managed_clusters.list_cluster_admin_credentials(
1815
- resource_group_name=resource_group,
1816
- resource_name=cluster_name,
1816
+ creds = (
1817
+ cs_client.managed_clusters.list_cluster_admin_credentials(
1818
+ resource_group_name=resource_group,
1819
+ resource_name=cluster_name,
1820
+ )
1817
1821
  )
1818
1822
 
1819
- kubeconfig_yaml = creds.kubeconfigs[0].value.decode(
1820
- encoding="UTF-8"
1821
- )
1823
+ if creds.kubeconfigs and creds.kubeconfigs[0].value:
1824
+ kubeconfig_yaml = creds.kubeconfigs[0].value.decode(
1825
+ encoding="UTF-8"
1826
+ )
1827
+ else:
1828
+ raise AuthorizationException(
1829
+ f"failed to list credentials for Azure Kubernetes "
1830
+ f"Service cluster '{cluster_name}' in resource group "
1831
+ f"'{resource_group}': no kubeconfig found"
1832
+ )
1822
1833
  except AzureError as e:
1823
1834
  raise AuthorizationException(
1824
1835
  f"failed to list credentials for Azure Kubernetes "
@@ -43,9 +43,12 @@ class GcpIntegration(Integration):
43
43
  """Definition of Google Cloud Platform integration for ZenML."""
44
44
 
45
45
  NAME = GCP
46
+ # Adding the gcsfs<=2024.12.0 for now to solve the issue with the
47
+ # increased number of list calls. This is a temporary fix and should be
48
+ # removed once the issue is resolved.
46
49
  REQUIREMENTS = [
47
50
  "kfp>=2.6.0",
48
- "gcsfs!=2025.5.0,!=2025.5.0.post1",
51
+ "gcsfs!=2025.5.0,!=2025.5.0.post1,<=2024.12.0",
49
52
  "google-cloud-secret-manager",
50
53
  "google-cloud-container>=2.21.0",
51
54
  "google-cloud-artifact-registry>=1.11.3",
@@ -13,7 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """Kubernetes orchestrator flavor."""
15
15
 
16
- from typing import TYPE_CHECKING, Any, Dict, Optional, Type
16
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Type
17
17
 
18
18
  from pydantic import Field, NonNegativeInt, PositiveInt, field_validator
19
19
 
@@ -131,6 +131,25 @@ class KubernetesOrchestratorSettings(BaseSettings):
131
131
  "the chance of the server receiving the maximum amount of retry "
132
132
  "requests.",
133
133
  )
134
+ fail_on_container_waiting_reasons: Optional[List[str]] = Field(
135
+ default=[
136
+ "InvalidImageName",
137
+ "ErrImagePull",
138
+ "ImagePullBackOff",
139
+ "CreateContainerConfigError",
140
+ ],
141
+ description="List of container waiting reasons that should cause the "
142
+ "job to fail immediately. This should be set to a list of "
143
+ "nonrecoverable reasons, which if found in any "
144
+ "`pod.status.containerStatuses[*].state.waiting.reason` of a job pod, "
145
+ "should cause the job to fail immediately.",
146
+ )
147
+ job_monitoring_interval: int = Field(
148
+ default=3,
149
+ description="The interval in seconds to monitor the job. Each interval "
150
+ "is used to check for container issues and streaming logs for the "
151
+ "job pods.",
152
+ )
134
153
  pod_failure_policy: Optional[Dict[str, Any]] = Field(
135
154
  default=None,
136
155
  description="The pod failure policy to use for the job that is "
@@ -37,7 +37,7 @@ import json
37
37
  import re
38
38
  import time
39
39
  from collections import defaultdict
40
- from typing import Any, Callable, Dict, List, Optional, TypeVar, cast
40
+ from typing import Any, Callable, Dict, List, Optional, Tuple, TypeVar, cast
41
41
 
42
42
  from kubernetes import client as k8s_client
43
43
  from kubernetes import config as k8s_config
@@ -657,6 +657,50 @@ def create_job(
657
657
  )
658
658
 
659
659
 
660
+ def get_container_status(
661
+ pod: k8s_client.V1Pod, container_name: str
662
+ ) -> Optional[k8s_client.V1ContainerState]:
663
+ """Get the status of a container.
664
+
665
+ Args:
666
+ pod: The pod to get the container status for.
667
+ container_name: The container name.
668
+
669
+ Returns:
670
+ The container status.
671
+ """
672
+ if not pod.status or not pod.status.container_statuses:
673
+ return None
674
+
675
+ for container_status in pod.status.container_statuses:
676
+ if container_status.name == container_name:
677
+ return container_status.state
678
+
679
+ return None
680
+
681
+
682
+ def get_container_termination_reason(
683
+ pod: k8s_client.V1Pod, container_name: str
684
+ ) -> Optional[Tuple[int, str]]:
685
+ """Get the termination reason for a container.
686
+
687
+ Args:
688
+ pod: The pod to get the termination reason for.
689
+ container_name: The container name.
690
+
691
+ Returns:
692
+ The exit code and termination reason for the container.
693
+ """
694
+ container_state = get_container_status(pod, container_name)
695
+ if not container_state or not container_state.terminated:
696
+ return None
697
+
698
+ return (
699
+ container_state.terminated.exit_code,
700
+ container_state.terminated.reason or "Unknown",
701
+ )
702
+
703
+
660
704
  def wait_for_job_to_finish(
661
705
  batch_api: k8s_client.BatchV1Api,
662
706
  core_api: k8s_client.CoreV1Api,
@@ -665,8 +709,9 @@ def wait_for_job_to_finish(
665
709
  backoff_interval: float = 1,
666
710
  maximum_backoff: float = 32,
667
711
  exponential_backoff: bool = False,
668
- container_name: Optional[str] = None,
712
+ fail_on_container_waiting_reasons: Optional[List[str]] = None,
669
713
  stream_logs: bool = True,
714
+ container_name: Optional[str] = None,
670
715
  ) -> None:
671
716
  """Wait for a job to finish.
672
717
 
@@ -679,6 +724,8 @@ def wait_for_job_to_finish(
679
724
  maximum_backoff: The maximum interval to wait between polling the job
680
725
  status.
681
726
  exponential_backoff: Whether to use exponential backoff.
727
+ fail_on_container_waiting_reasons: List of container waiting reasons
728
+ that will cause the job to fail.
682
729
  stream_logs: Whether to stream the job logs.
683
730
  container_name: Name of the container to stream logs from.
684
731
 
@@ -703,9 +750,39 @@ def wait_for_job_to_finish(
703
750
  f"{condition.message}"
704
751
  )
705
752
 
753
+ if fail_on_container_waiting_reasons:
754
+ pod_list: k8s_client.V1PodList = retry_on_api_exception(
755
+ core_api.list_namespaced_pod
756
+ )(
757
+ namespace=namespace,
758
+ label_selector=f"job-name={job_name}",
759
+ field_selector="status.phase=Pending",
760
+ )
761
+ for pod in pod_list.items:
762
+ container_state = get_container_status(
763
+ pod, container_name or "main"
764
+ )
765
+
766
+ if (
767
+ container_state
768
+ and (waiting_state := container_state.waiting)
769
+ and waiting_state.reason
770
+ in fail_on_container_waiting_reasons
771
+ ):
772
+ retry_on_api_exception(batch_api.delete_namespaced_job)(
773
+ name=job_name,
774
+ namespace=namespace,
775
+ propagation_policy="Foreground",
776
+ )
777
+ raise RuntimeError(
778
+ f"Job `{namespace}:{job_name}` failed: "
779
+ f"Detected container in state "
780
+ f"{waiting_state.reason}"
781
+ )
782
+
706
783
  if stream_logs:
707
784
  try:
708
- pod_list: k8s_client.V1PodList = core_api.list_namespaced_pod(
785
+ pod_list = core_api.list_namespaced_pod(
709
786
  namespace=namespace,
710
787
  label_selector=f"job-name={job_name}",
711
788
  )
@@ -367,33 +367,37 @@ def main() -> None:
367
367
  core_api=core_api,
368
368
  namespace=namespace,
369
369
  job_name=job_name,
370
+ fail_on_container_waiting_reasons=settings.fail_on_container_waiting_reasons,
370
371
  stream_logs=pipeline_settings.stream_step_logs,
372
+ backoff_interval=settings.job_monitoring_interval,
371
373
  )
372
374
 
373
375
  logger.info(f"Job for step `{step_name}` completed.")
374
376
  except Exception:
375
- reason = ""
377
+ reason = "Unknown"
376
378
  try:
377
- pods_by_job = core_api.list_namespaced_pod(
379
+ pods = core_api.list_namespaced_pod(
378
380
  label_selector=f"job-name={job_name}",
379
381
  namespace=namespace,
380
382
  ).items
381
- first_pod = pods_by_job[0]
382
- if status := first_pod.status:
383
- if container_statuses := status.container_statuses:
384
- for cs in container_statuses:
385
- if cs.name == "main":
386
- if state := cs.state:
387
- if terminated := state.terminated:
388
- if terminated.exit_code != 0:
389
- reason = f"{terminated.reason}(exit_code={terminated.exit_code})"
390
- break
383
+ # Sort pods by creation timestamp, oldest first
384
+ pods.sort(
385
+ key=lambda pod: pod.metadata.creation_timestamp,
386
+ )
387
+ if pods:
388
+ if (
389
+ termination_reason
390
+ := kube_utils.get_container_termination_reason(
391
+ pods[-1], "main"
392
+ )
393
+ ):
394
+ exit_code, reason = termination_reason
395
+ if exit_code != 0:
396
+ reason = f"{reason} (exit_code={exit_code})"
391
397
  except Exception:
392
398
  pass
393
399
  logger.error(
394
400
  f"Job for step `{step_name}` failed. Reason: {reason}"
395
- if reason
396
- else ""
397
401
  )
398
402
 
399
403
  raise
zenml/logging/__init__.py CHANGED
@@ -11,14 +11,3 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12
12
  # or implied. See the License for the specific language governing
13
13
  # permissions and limitations under the License.
14
-
15
- """Logging utilities."""
16
-
17
- # How many seconds to wait before uploading logs to the artifact store
18
- STEP_LOGS_STORAGE_INTERVAL_SECONDS: int = 15
19
-
20
- # How many messages to buffer before uploading logs to the artifact store
21
- STEP_LOGS_STORAGE_MAX_MESSAGES: int = 100
22
-
23
- # How often to merge logs into a single file
24
- STEP_LOGS_STORAGE_MERGE_INTERVAL_SECONDS: int = 10 * 60