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.
- zenml/VERSION +1 -1
- zenml/client.py +6 -1
- zenml/code_repositories/git/local_git_repository_context.py +3 -4
- zenml/constants.py +28 -0
- zenml/integrations/azure/service_connectors/azure_service_connector.py +20 -9
- zenml/integrations/gcp/__init__.py +4 -1
- zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +20 -1
- zenml/integrations/kubernetes/orchestrators/kube_utils.py +80 -3
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +18 -14
- zenml/logging/__init__.py +0 -11
- zenml/logging/step_logging.py +255 -149
- zenml/models/__init__.py +6 -0
- zenml/models/v2/core/service_account.py +87 -1
- zenml/models/v2/core/step_run.py +13 -0
- zenml/models/v2/core/user.py +20 -6
- zenml/models/v2/misc/exception_info.py +30 -0
- zenml/models/v2/misc/external_user.py +4 -1
- zenml/orchestrators/publish_utils.py +10 -0
- zenml/orchestrators/step_launcher.py +11 -6
- zenml/orchestrators/step_runner.py +26 -1
- zenml/utils/exception_utils.py +90 -0
- zenml/zen_server/auth.py +138 -27
- zenml/zen_server/dashboard/assets/{404-B5cfnwZ1.js → 404-CMbwR10f.js} +1 -1
- zenml/zen_server/dashboard/assets/{@radix-C_LirfyT.js → @radix-B1sy0Lhr.js} +1 -1
- zenml/zen_server/dashboard/assets/{@react-router-BSsrkPOd.js → @react-router-CHjLNlgw.js} +1 -1
- zenml/zen_server/dashboard/assets/{@reactflow-D9hglKLF.js → @reactflow-gbyyU3kq.js} +2 -2
- zenml/zen_server/dashboard/assets/{@tanstack-C0SeHZng.js → @tanstack-Dwlisomv.js} +1 -1
- zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-BpLj419i.js +1 -0
- zenml/zen_server/dashboard/assets/ButtonGroup-DVhzbQxV.js +1 -0
- zenml/zen_server/dashboard/assets/{CodeSnippet-D8iBqOVv.js → CodeSnippet-B7Wd4R8u.js} +1 -1
- zenml/zen_server/dashboard/assets/{CollapsibleCard-D0-pQi1n.js → CollapsibleCard-DSZzbjx5.js} +1 -1
- zenml/zen_server/dashboard/assets/{ComponentBadge-mw2Ja_ON.js → ComponentBadge-MVT08kBV.js} +1 -1
- zenml/zen_server/dashboard/assets/{ComponentIcon-BXgpt-jw.js → ComponentIcon-C9AY8usJ.js} +1 -1
- zenml/zen_server/dashboard/assets/DeleteAlertDialog-CzhTVQaC.js +1 -0
- zenml/zen_server/dashboard/assets/{DialogItem-DeME0oSt.js → DialogItem-DD_7v3UY.js} +1 -1
- zenml/zen_server/dashboard/assets/{DisplayDate-v3KW7oez.js → DisplayDate-57lUNS79.js} +1 -1
- zenml/zen_server/dashboard/assets/{EmptyState-DG0m-CGv.js → EmptyState-BMA34iVR.js} +1 -1
- zenml/zen_server/dashboard/assets/{Error-DcVLcrLs.js → Error-Cakgjexo.js} +1 -1
- zenml/zen_server/dashboard/assets/{ExecutionStatus-C4tlFnlh.js → ExecutionStatus-CQbWovhV.js} +1 -1
- zenml/zen_server/dashboard/assets/{Helpbox-C-RGHz3S.js → Helpbox-7FZpmsHB.js} +1 -1
- zenml/zen_server/dashboard/assets/{Infobox-DFCWPbMb.js → Infobox-DnduZjNU.js} +1 -1
- zenml/zen_server/dashboard/assets/{LeftSideMenu-Czev0KCA.js → LeftSideMenu-D5UEs4vB.js} +1 -1
- zenml/zen_server/dashboard/assets/{Lock-CRP5J_su.js → Lock-u8WOoTTd.js} +1 -1
- zenml/zen_server/dashboard/assets/NestedCollapsible-0yviIfaA.js +1 -0
- zenml/zen_server/dashboard/assets/{NumberBox-CoQjQYDJ.js → NumberBox-C2Pju4PR.js} +1 -1
- zenml/zen_server/dashboard/assets/{Pagination-CcDD5yHh.js → Pagination-C1sE5Nzn.js} +1 -1
- zenml/zen_server/dashboard/assets/{Partials-DlMzfKgs.js → Partials-DosysQMU.js} +1 -1
- zenml/zen_server/dashboard/assets/{PasswordChecker-BZwoeQIm.js → PasswordChecker-DOPLfvg7.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProCta-CU2ycJDo.js → ProCta-CUkpV3PJ.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderIcon-BMAn9Jld.js → ProviderIcon-aQjTuTRX.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderRadio-D_q9tE3G.js → ProviderRadio-C6pLVNxC.js} +1 -1
- zenml/zen_server/dashboard/assets/RunsBody-CZAiSxYK.js +1 -0
- zenml/zen_server/dashboard/assets/{SearchField-D_0-uAPj.js → SearchField-Byv1PtST.js} +1 -1
- zenml/zen_server/dashboard/assets/{SecretTooltip-BcWMKb9f.js → SecretTooltip-CErfhVgF.js} +1 -1
- zenml/zen_server/dashboard/assets/{SetPassword-CaKVSqAL.js → SetPassword-C4OH-cn1.js} +1 -1
- zenml/zen_server/dashboard/assets/{SheetHeader-7vwlsY_i.js → SheetHeader-Bb3v9rha.js} +1 -1
- zenml/zen_server/dashboard/assets/StackComponentList-D85oab98.js +1 -0
- zenml/zen_server/dashboard/assets/StackList-DSAjbVb5.js +1 -0
- zenml/zen_server/dashboard/assets/Tabs-2uwqXsdL.js +1 -0
- zenml/zen_server/dashboard/assets/Tick-BQ7_xDBl.js +1 -0
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Da5RndbV.js → UpdatePasswordSchemas-DNkYgzN6.js} +1 -1
- zenml/zen_server/dashboard/assets/{Wizard-8aJzxUjb.js → Wizard-2FIi8JNY.js} +1 -1
- zenml/zen_server/dashboard/assets/WizardFooter-DQEnlDmZ.js +1 -0
- zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-gorNNEaT.js → all-pipeline-runs-query-CdvWtiAY.js} +1 -1
- zenml/zen_server/dashboard/assets/{arrow-left-hcj2H8HY.js → arrow-left-BFB2mgJo.js} +1 -1
- zenml/zen_server/dashboard/assets/{bar-chart-square-check-9siI9icm.js → bar-chart-square-check-_m-oYysN.js} +1 -1
- zenml/zen_server/dashboard/assets/{bulk-delete-B5RTlnD_.js → bulk-delete-wdObjfps.js} +2 -2
- zenml/zen_server/dashboard/assets/{check-D1bHMJkL.js → check-C9Nye5lR.js} +1 -1
- zenml/zen_server/dashboard/assets/{check-circle-mnEgPhPF.js → check-circle-CG6XAdk-.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-down-Z3nUe-0U.js → chevron-down-Bl7WwQAL.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-right-double-CbRQKN4Q.js → chevron-right-double-CbMG1dOM.js} +1 -1
- zenml/zen_server/dashboard/assets/{clock-BMjHXT3f.js → clock-BnPvxp3D.js} +1 -1
- zenml/zen_server/dashboard/assets/{code-browser-DftoiCIg.js → code-browser-CzWvJ4S6.js} +1 -1
- zenml/zen_server/dashboard/assets/configuration-form-BbcNBQTO.js +1 -0
- zenml/zen_server/dashboard/assets/constants-DfvsDtcH.js +1 -0
- zenml/zen_server/dashboard/assets/{create-stack-BruqH_6X.js → create-stack-D4Sf7QpF.js} +1 -1
- zenml/zen_server/dashboard/assets/{credit-card-CH1BHrXY.js → credit-card-DfBA6dBb.js} +1 -1
- zenml/zen_server/dashboard/assets/{dataflow-2-qHjWt7zp.js → dataflow-2-BLkaTH0Q.js} +1 -1
- zenml/zen_server/dashboard/assets/{delete-run-ibBtciMR.js → delete-run-XSre8ru-.js} +1 -1
- zenml/zen_server/dashboard/assets/{expand-full-CD4fFvM-.js → expand-full-C8p_0jQv.js} +1 -1
- zenml/zen_server/dashboard/assets/{eye-CLNgIh_K.js → eye-BXcQevds.js} +1 -1
- zenml/zen_server/dashboard/assets/{file-text-CltVhgwZ.js → file-text-TdPXNd7s.js} +1 -1
- zenml/zen_server/dashboard/assets/form-C1jJgRy1.js +1 -0
- zenml/zen_server/dashboard/assets/{form-schemas-B9XgTS1V.js → form-schemas-BjWDRvGd.js} +1 -1
- zenml/zen_server/dashboard/assets/{help-B0CvBhCm.js → help-CRPfbPTO.js} +1 -1
- zenml/zen_server/dashboard/assets/{icon-hDriJUXY.js → icon--Tp6obFZ.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-mA8kL088.js → index-B4ZeIaPd.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-dCcVgFNl.js → index-BYHxFvoG.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-BQWlHo1Y.js → index-BYzR7YrM.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-BacoJBEQ.js → index-CO6UN3UX.js} +11 -11
- zenml/zen_server/dashboard/assets/{index-B7CRNU8l.js → index-d_QrPL-8.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-BRhKF2z-.js → index-g7wOyc86.js} +1 -1
- zenml/zen_server/dashboard/assets/index-n_sn2ITN.css +1 -0
- zenml/zen_server/dashboard/assets/{index.es-DcVFDpJU.js → index.es-CZMSrR6z.js} +1 -1
- zenml/zen_server/dashboard/assets/{index.esm-COnaHLSh.js → index.esm-SBF9nn_P.js} +1 -1
- zenml/zen_server/dashboard/assets/{info-CyMih3vQ.js → info-CI2szPUG.js} +1 -1
- zenml/zen_server/dashboard/assets/{key-icon-HOx2gazv.js → key-icon-BiV171aI.js} +1 -1
- zenml/zen_server/dashboard/assets/layout-Cyc-V16c.js +1 -0
- zenml/zen_server/dashboard/assets/{layout-C5dgIReC.js → layout-GIiNvS10.js} +1 -1
- zenml/zen_server/dashboard/assets/{login-mutation-CidpsqyH.js → login-mutation-CDgTlQBD.js} +1 -1
- zenml/zen_server/dashboard/assets/{logs-DoLoTEfj.js → logs-lNLbZqHL.js} +1 -1
- zenml/zen_server/dashboard/assets/{mail-C160gvB0.js → mail-DBJRSzyu.js} +1 -1
- zenml/zen_server/dashboard/assets/{message-chat-square-DLz6XmPS.js → message-chat-square-C3CRCQvD.js} +1 -1
- zenml/zen_server/dashboard/assets/{package-BhYXGPxF.js → package-pR4bbXJp.js} +1 -1
- zenml/zen_server/dashboard/assets/page-1DXG7hp8.js +1 -0
- zenml/zen_server/dashboard/assets/{page-BCRXJXC9.js → page-43SWdz4k.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-YdWnx9MX.js → page-AOVMuHDc.js} +1 -1
- zenml/zen_server/dashboard/assets/page-B4QBxV0B.js +22 -0
- zenml/zen_server/dashboard/assets/{page-CvllZMBF.js → page-B8ict_cR.js} +1 -1
- zenml/zen_server/dashboard/assets/page-BDre_qCO.js +1 -0
- zenml/zen_server/dashboard/assets/page-BbsvGfyi.js +18 -0
- zenml/zen_server/dashboard/assets/page-Bi4I23Hs.js +1 -0
- zenml/zen_server/dashboard/assets/page-BnAMyQZb.js +1 -0
- zenml/zen_server/dashboard/assets/{page-D6cvOG8w.js → page-BnZEAhNn.js} +1 -1
- zenml/zen_server/dashboard/assets/page-Bncp08FW.js +1 -0
- zenml/zen_server/dashboard/assets/{page-BTDi81N3.js → page-C4Jnp1qP.js} +1 -1
- zenml/zen_server/dashboard/assets/page-C7Z2sDHE.js +1 -0
- zenml/zen_server/dashboard/assets/page-C8t9qLdV.js +1 -0
- zenml/zen_server/dashboard/assets/{page-BByayrO-.js → page-C9IsnFid.js} +2 -2
- zenml/zen_server/dashboard/assets/page-CEHZzQ1Q.js +1 -0
- zenml/zen_server/dashboard/assets/page-CGtll3Jk.js +1 -0
- zenml/zen_server/dashboard/assets/{page-q41JNDWO.js → page-CKPkbOoE.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DF4FVxxW.js → page-CMvcoaSZ.js} +2 -2
- zenml/zen_server/dashboard/assets/page-CVwTAlzd.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DSZfclXt.js → page-ClqRvz_V.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-7CJ4Wq3O.js → page-CzDjN1wE.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BK59rZvf.js → page-D654xHWd.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DcXrWWWh.js → page-DLrYW-Dn.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DOnAInjC.js +1 -0
- zenml/zen_server/dashboard/assets/{page-Cc8owYXQ.js → page-DQncGJeH.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DQzNmXk3.js +1 -0
- zenml/zen_server/dashboard/assets/{page-FQxi1Otg.js → page-DSn1Jcvs.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DZ5hcS1o.js +1 -0
- zenml/zen_server/dashboard/assets/page-DerIbaqa.js +1 -0
- zenml/zen_server/dashboard/assets/{page-8U20Tu_8.js → page-DgOEl3Bc.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DgldL5UB.js → page-DgSu4pTE.js} +2 -2
- zenml/zen_server/dashboard/assets/page-DgblJuXC.js +1 -0
- zenml/zen_server/dashboard/assets/{page-CY0LPcAJ.js → page-Dpw-xP4q.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DsFXol8x.js +1 -0
- zenml/zen_server/dashboard/assets/page-Du6bFZTS.js +1 -0
- zenml/zen_server/dashboard/assets/{page-CeGBDh1Q.js → page-DznxxpKA.js} +1 -1
- zenml/zen_server/dashboard/assets/page-E9Mx9_rn.js +1 -0
- zenml/zen_server/dashboard/assets/page-HrebZOAM.js +1 -0
- zenml/zen_server/dashboard/assets/{page-BX67x4iL.js → page-O5xnz_nW.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DDWW21kl.js → page-hX7NkNdA.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-BKKcL1Kp.js → persist-B3Hb8HDW.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-DxiyfAax.js → persist-Dkbp9MFP.js} +1 -1
- zenml/zen_server/dashboard/assets/{pipeline-BJ8liDnl.js → pipeline-CDJSAXrb.js} +1 -1
- zenml/zen_server/dashboard/assets/{plus-cI8zD2xh.js → plus-DOrkJCmy.js} +1 -1
- zenml/zen_server/dashboard/assets/primary-role-CjkpP9fL.js +1 -0
- zenml/zen_server/dashboard/assets/{react-error-boundary.esm-DoXxY4pT.js → react-error-boundary.esm-DgOYA0wh.js} +1 -1
- zenml/zen_server/dashboard/assets/{refresh-3EF2R7ja.js → refresh-C8BXS3Fb.js} +1 -1
- zenml/zen_server/dashboard/assets/{resource-tyes-list-B5rkZcbc.js → resource-tyes-list-CugyWUAE.js} +1 -1
- zenml/zen_server/dashboard/assets/{resource-type-tooltip-E97WGqfk.js → resource-type-tooltip-V-zdiLKz.js} +1 -1
- zenml/zen_server/dashboard/assets/{service-B9aVzfAF.js → service-FjqYTmBw.js} +2 -2
- zenml/zen_server/dashboard/assets/{service-connectors-DL2-k_E2.js → service-connectors-nF4-OXB9.js} +1 -1
- zenml/zen_server/dashboard/assets/{sharedSchema-DyUO09BR.js → sharedSchema-Br1JPr8d.js} +1 -1
- zenml/zen_server/dashboard/assets/{slash-circle-D2Lb2FyR.js → slash-circle-B0xMh8q6.js} +1 -1
- zenml/zen_server/dashboard/assets/{stack-detail-query-Bc4QKlWg.js → stack-detail-query-DnyMCdVE.js} +1 -1
- zenml/zen_server/dashboard/assets/{terminal-BObrvDlO.js → terminal-C2tAF2XG.js} +1 -1
- zenml/zen_server/dashboard/assets/{terminal-square-BObrvDlO.js → terminal-square-C2tAF2XG.js} +1 -1
- zenml/zen_server/dashboard/assets/{transform-DFpKTKgF.js → transform-S7omcvTm.js} +1 -1
- zenml/zen_server/dashboard/assets/{trash-HKxXWbSG.js → trash-D9LA4VFD.js} +1 -1
- zenml/zen_server/dashboard/assets/{update-current-user-mutation-DSyUyHVj.js → update-current-user-mutation-B3Dpv3u6.js} +1 -1
- zenml/zen_server/dashboard/assets/{update-server-settings-mutation-CdM-Sdds.js → update-server-settings-mutation-s7tlHN8s.js} +1 -1
- zenml/zen_server/dashboard/assets/{zod-DgEcN9jD.js → zod-D48zuELD.js} +1 -1
- zenml/zen_server/dashboard/index.html +7 -7
- zenml/zen_server/rbac/zenml_cloud_rbac.py +8 -4
- zenml/zen_server/routers/service_accounts_endpoints.py +71 -12
- zenml/zen_stores/base_zen_store.py +0 -19
- zenml/zen_stores/migrations/versions/8d4b9ba22c1f_add_user_avatar.py +39 -0
- zenml/zen_stores/migrations/versions/d4591f95ac07_step_exception_info.py +43 -0
- zenml/zen_stores/schemas/step_run_schemas.py +19 -0
- zenml/zen_stores/schemas/user_schemas.py +16 -5
- zenml/zen_stores/sql_zen_store.py +5 -1
- {zenml_nightly-0.84.0.dev20250728.dist-info → zenml_nightly-0.84.0.dev20250730.dist-info}/METADATA +1 -1
- {zenml_nightly-0.84.0.dev20250728.dist-info → zenml_nightly-0.84.0.dev20250730.dist-info}/RECORD +180 -176
- zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-druRNuO2.js +0 -1
- zenml/zen_server/dashboard/assets/ButtonGroup-SF2DlzHV.js +0 -1
- zenml/zen_server/dashboard/assets/DeleteAlertDialog-BbyFVnVI.js +0 -1
- zenml/zen_server/dashboard/assets/NestedCollapsible-CN9scBUn.js +0 -1
- zenml/zen_server/dashboard/assets/RunsBody-BToytB8e.js +0 -1
- zenml/zen_server/dashboard/assets/StackComponentList-s7eSfm8o.js +0 -1
- zenml/zen_server/dashboard/assets/StackList-Dt0FrIkM.js +0 -1
- zenml/zen_server/dashboard/assets/Tabs-B27AHUfo.js +0 -1
- zenml/zen_server/dashboard/assets/Tick-DDeDgTuT.js +0 -1
- zenml/zen_server/dashboard/assets/WizardFooter-Bt7_UE14.js +0 -1
- zenml/zen_server/dashboard/assets/configuration-form-Yz8m0QIG.js +0 -1
- zenml/zen_server/dashboard/assets/constants-DeV48DuZ.js +0 -1
- zenml/zen_server/dashboard/assets/form-6aSt3tIl.js +0 -1
- zenml/zen_server/dashboard/assets/index-eggipFZS.css +0 -1
- zenml/zen_server/dashboard/assets/layout-CFLL6-CM.js +0 -1
- zenml/zen_server/dashboard/assets/page-6huxSHEu.js +0 -1
- zenml/zen_server/dashboard/assets/page-BMpXak4U.js +0 -1
- zenml/zen_server/dashboard/assets/page-Bjmcdg64.js +0 -1
- zenml/zen_server/dashboard/assets/page-BsAn8p4m.js +0 -1
- zenml/zen_server/dashboard/assets/page-BwjPRuaY.js +0 -1
- zenml/zen_server/dashboard/assets/page-CDtSVkNc.js +0 -1
- zenml/zen_server/dashboard/assets/page-CEDU0L2T.js +0 -1
- zenml/zen_server/dashboard/assets/page-COJK90rG.js +0 -1
- zenml/zen_server/dashboard/assets/page-C_XMn4GU.js +0 -1
- zenml/zen_server/dashboard/assets/page-Cb3KGsPK.js +0 -22
- zenml/zen_server/dashboard/assets/page-CiGOVsj3.js +0 -1
- zenml/zen_server/dashboard/assets/page-CmLSFMkW.js +0 -1
- zenml/zen_server/dashboard/assets/page-CnfCptXq.js +0 -1
- zenml/zen_server/dashboard/assets/page-CxzglV3-.js +0 -1
- zenml/zen_server/dashboard/assets/page-DVLez4R1.js +0 -1
- zenml/zen_server/dashboard/assets/page-Dg7-H_9i.js +0 -1
- zenml/zen_server/dashboard/assets/page-Dw7XuiSo.js +0 -18
- zenml/zen_server/dashboard/assets/page-XrmOHHg7.js +0 -1
- zenml/zen_server/dashboard/assets/page-oRm7D4TC.js +0 -1
- zenml/zen_server/dashboard/assets/page-x2GXC8sI.js +0 -1
- zenml/zen_server/dashboard/assets/page-z2FXP4GY.js +0 -1
- zenml/zen_server/dashboard/assets/primary-role-CPGHymjN.js +0 -1
- {zenml_nightly-0.84.0.dev20250728.dist-info → zenml_nightly-0.84.0.dev20250730.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.84.0.dev20250728.dist-info → zenml_nightly-0.84.0.dev20250730.dist-info}/WHEEL +0 -0
- {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.
|
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,
|
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
|
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
|
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
|
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
|
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.
|
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
|
-
|
1814
|
+
cs_client = ContainerServiceClient(credential, subscription_id)
|
1813
1815
|
|
1814
|
-
creds =
|
1815
|
-
|
1816
|
-
|
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
|
-
|
1820
|
-
|
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
|
-
|
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
|
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
|
-
|
379
|
+
pods = core_api.list_namespaced_pod(
|
378
380
|
label_selector=f"job-name={job_name}",
|
379
381
|
namespace=namespace,
|
380
382
|
).items
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
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
|