zenml-nightly 0.64.0.dev20240811__py3-none-any.whl → 0.66.0.dev20240910__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 (291) hide show
  1. README.md +1 -1
  2. RELEASE_NOTES.md +126 -4
  3. zenml/VERSION +1 -1
  4. zenml/artifacts/utils.py +13 -6
  5. zenml/cli/__init__.py +1 -1
  6. zenml/cli/base.py +4 -4
  7. zenml/cli/integration.py +48 -9
  8. zenml/cli/pipeline.py +9 -2
  9. zenml/cli/stack.py +39 -27
  10. zenml/cli/utils.py +13 -0
  11. zenml/client.py +15 -17
  12. zenml/config/compiler.py +34 -0
  13. zenml/config/server_config.py +30 -0
  14. zenml/config/source.py +3 -7
  15. zenml/constants.py +5 -3
  16. zenml/entrypoints/base_entrypoint_configuration.py +41 -27
  17. zenml/entrypoints/step_entrypoint_configuration.py +5 -2
  18. zenml/enums.py +2 -0
  19. zenml/environment.py +31 -0
  20. zenml/feature_stores/base_feature_store.py +4 -6
  21. zenml/integrations/__init__.py +3 -0
  22. zenml/integrations/airflow/flavors/airflow_orchestrator_flavor.py +9 -0
  23. zenml/integrations/aws/__init__.py +2 -2
  24. zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +2 -1
  25. zenml/integrations/azure/__init__.py +2 -2
  26. zenml/integrations/azure/azureml_utils.py +201 -0
  27. zenml/integrations/azure/flavors/azureml.py +139 -0
  28. zenml/integrations/azure/flavors/azureml_orchestrator_flavor.py +20 -118
  29. zenml/integrations/azure/flavors/azureml_step_operator_flavor.py +67 -14
  30. zenml/integrations/azure/orchestrators/azureml_orchestrator.py +58 -172
  31. zenml/integrations/azure/orchestrators/azureml_orchestrator_entrypoint_config.py +1 -0
  32. zenml/integrations/azure/service_connectors/azure_service_connector.py +4 -0
  33. zenml/integrations/azure/step_operators/azureml_step_operator.py +78 -177
  34. zenml/integrations/constants.py +3 -0
  35. zenml/integrations/databricks/__init__.py +22 -4
  36. zenml/integrations/databricks/flavors/databricks_orchestrator_flavor.py +9 -0
  37. zenml/integrations/deepchecks/__init__.py +29 -11
  38. zenml/integrations/deepchecks/materializers/deepchecks_dataset_materializer.py +3 -1
  39. zenml/integrations/deepchecks/validation_checks.py +0 -30
  40. zenml/integrations/evidently/__init__.py +17 -2
  41. zenml/integrations/facets/__init__.py +21 -5
  42. zenml/integrations/feast/__init__.py +19 -6
  43. zenml/integrations/gcp/__init__.py +2 -2
  44. zenml/integrations/gcp/flavors/vertex_orchestrator_flavor.py +9 -0
  45. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +10 -1
  46. zenml/integrations/great_expectations/__init__.py +21 -7
  47. zenml/integrations/huggingface/__init__.py +39 -15
  48. zenml/integrations/huggingface/materializers/__init__.py +3 -0
  49. zenml/integrations/huggingface/materializers/huggingface_datasets_materializer.py +3 -1
  50. zenml/integrations/huggingface/materializers/huggingface_pt_model_materializer.py +1 -1
  51. zenml/integrations/huggingface/materializers/huggingface_t5_materializer.py +107 -0
  52. zenml/integrations/huggingface/materializers/huggingface_tf_model_materializer.py +1 -1
  53. zenml/integrations/huggingface/materializers/huggingface_tokenizer_materializer.py +2 -2
  54. zenml/integrations/huggingface/steps/accelerate_runner.py +108 -85
  55. zenml/integrations/hyperai/flavors/hyperai_orchestrator_flavor.py +9 -0
  56. zenml/integrations/kubeflow/flavors/kubeflow_orchestrator_flavor.py +9 -0
  57. zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py +10 -1
  58. zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +9 -0
  59. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +10 -1
  60. zenml/integrations/lightning/__init__.py +48 -0
  61. zenml/integrations/lightning/flavors/__init__.py +23 -0
  62. zenml/integrations/lightning/flavors/lightning_orchestrator_flavor.py +148 -0
  63. zenml/integrations/lightning/orchestrators/__init__.py +23 -0
  64. zenml/integrations/lightning/orchestrators/lightning_orchestrator.py +596 -0
  65. zenml/integrations/lightning/orchestrators/lightning_orchestrator_entrypoint.py +307 -0
  66. zenml/integrations/lightning/orchestrators/lightning_orchestrator_entrypoint_configuration.py +77 -0
  67. zenml/integrations/lightning/orchestrators/utils.py +67 -0
  68. zenml/integrations/mlflow/__init__.py +43 -5
  69. zenml/integrations/mlflow/services/mlflow_deployment.py +26 -0
  70. zenml/integrations/numpy/__init__.py +32 -0
  71. zenml/integrations/numpy/materializers/__init__.py +18 -0
  72. zenml/integrations/numpy/materializers/numpy_materializer.py +246 -0
  73. zenml/integrations/pandas/__init__.py +32 -0
  74. zenml/integrations/pandas/materializers/__init__.py +18 -0
  75. zenml/integrations/pandas/materializers/pandas_materializer.py +192 -0
  76. zenml/integrations/prodigy/annotators/prodigy_annotator.py +1 -1
  77. zenml/integrations/seldon/__init__.py +18 -3
  78. zenml/integrations/sklearn/__init__.py +1 -1
  79. zenml/integrations/skypilot_azure/__init__.py +1 -1
  80. zenml/integrations/tensorboard/__init__.py +1 -1
  81. zenml/integrations/tensorflow/__init__.py +2 -2
  82. zenml/integrations/tensorflow/materializers/tf_dataset_materializer.py +2 -2
  83. zenml/integrations/whylogs/__init__.py +18 -2
  84. zenml/logging/step_logging.py +9 -2
  85. zenml/materializers/__init__.py +0 -4
  86. zenml/materializers/base_materializer.py +4 -0
  87. zenml/materializers/numpy_materializer.py +23 -234
  88. zenml/materializers/pandas_materializer.py +22 -179
  89. zenml/model/model.py +91 -2
  90. zenml/model/utils.py +5 -5
  91. zenml/models/__init__.py +16 -3
  92. zenml/models/v2/core/model_version.py +1 -1
  93. zenml/models/v2/core/pipeline_run.py +31 -1
  94. zenml/models/v2/core/stack.py +51 -20
  95. zenml/models/v2/core/step_run.py +28 -0
  96. zenml/models/v2/misc/info_models.py +78 -0
  97. zenml/new/pipelines/pipeline.py +65 -25
  98. zenml/new/pipelines/run_utils.py +57 -136
  99. zenml/new/steps/step_context.py +17 -6
  100. zenml/orchestrators/base_orchestrator.py +9 -0
  101. zenml/orchestrators/step_launcher.py +37 -14
  102. zenml/orchestrators/step_runner.py +14 -13
  103. zenml/orchestrators/utils.py +107 -7
  104. zenml/service_connectors/service_connector_utils.py +2 -2
  105. zenml/stack/utils.py +11 -2
  106. zenml/stack_deployments/azure_stack_deployment.py +2 -1
  107. zenml/steps/base_step.py +62 -25
  108. zenml/steps/utils.py +115 -3
  109. zenml/utils/cloud_utils.py +8 -8
  110. zenml/utils/code_utils.py +130 -32
  111. zenml/utils/function_utils.py +7 -7
  112. zenml/utils/notebook_utils.py +14 -0
  113. zenml/utils/pipeline_docker_image_builder.py +1 -11
  114. zenml/utils/pydantic_utils.py +3 -3
  115. zenml/utils/secret_utils.py +2 -2
  116. zenml/utils/settings_utils.py +1 -1
  117. zenml/utils/source_utils.py +67 -21
  118. zenml/utils/string_utils.py +29 -0
  119. zenml/zen_server/dashboard/assets/{404-CRAA_Lew.js → 404-iO8vpun1.js} +1 -1
  120. zenml/zen_server/dashboard/assets/{@radix-BXWm7HOa.js → @radix-DnFH_oo1.js} +1 -1
  121. zenml/zen_server/dashboard/assets/{@react-router-l3lMcXA2.js → @react-router-APVeuk-U.js} +1 -1
  122. zenml/zen_server/dashboard/assets/{@reactflow-CeVxyqYT.js → @reactflow-B6kq9fJZ.js} +2 -2
  123. zenml/zen_server/dashboard/assets/{@tanstack-FmcYZMuX.js → @tanstack-QbMbTrh5.js} +1 -1
  124. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-BXeSvmMY.js +1 -0
  125. zenml/zen_server/dashboard/assets/{CodeSnippet-D0VLxT2A.js → CodeSnippet-DNWdQmbo.js} +2 -2
  126. zenml/zen_server/dashboard/assets/CollapsibleCard-B2OVjWYE.js +1 -0
  127. zenml/zen_server/dashboard/assets/Commands-DsoaVElZ.js +1 -0
  128. zenml/zen_server/dashboard/assets/CopyButton-BqE_-PHO.js +2 -0
  129. zenml/zen_server/dashboard/assets/{CsvVizualization-D3kAypDj.js → CsvVizualization-Dyasr2jU.js} +6 -6
  130. zenml/zen_server/dashboard/assets/{edit-C0MVvPD2.js → DialogItem-Cz1VLRwa.js} +1 -1
  131. zenml/zen_server/dashboard/assets/{DisplayDate-DizbSeT-.js → DisplayDate-DkCy54Bp.js} +1 -1
  132. zenml/zen_server/dashboard/assets/EditSecretDialog-Du423_3U.js +1 -0
  133. zenml/zen_server/dashboard/assets/{EmptyState-BHblM39I.js → EmptyState-Cs3DEmso.js} +1 -1
  134. zenml/zen_server/dashboard/assets/{Error-C6LeJSER.js → Error-DorJD_va.js} +1 -1
  135. zenml/zen_server/dashboard/assets/ExecutionStatus-CIfQTutR.js +1 -0
  136. zenml/zen_server/dashboard/assets/{Helpbox-aAB2XP-z.js → Helpbox-CmfvtNeq.js} +1 -1
  137. zenml/zen_server/dashboard/assets/Infobox-BL9NOS37.js +1 -0
  138. zenml/zen_server/dashboard/assets/{InlineAvatar-DpTLgM3Q.js → InlineAvatar-Ds2ZFHPc.js} +1 -1
  139. zenml/zen_server/dashboard/assets/{Lock-CNyJvf2r.js → Lock-CmIn0szs.js} +1 -1
  140. zenml/zen_server/dashboard/assets/{MarkdownVisualization-Bajxn0HY.js → MarkdownVisualization-DS05sfBm.js} +1 -1
  141. zenml/zen_server/dashboard/assets/{NumberBox-BmKE0qnO.js → NumberBox-CrN0_kqI.js} +1 -1
  142. zenml/zen_server/dashboard/assets/Partials-DX-8iEa1.js +1 -0
  143. zenml/zen_server/dashboard/assets/{PasswordChecker-yGGoJSB-.js → PasswordChecker-DE71J_3F.js} +1 -1
  144. zenml/zen_server/dashboard/assets/ProviderIcon-BOQJgapd.js +1 -0
  145. zenml/zen_server/dashboard/assets/ProviderRadio-BsYBw9YA.js +1 -0
  146. zenml/zen_server/dashboard/assets/SearchField-W3GXpLlI.js +1 -0
  147. zenml/zen_server/dashboard/assets/SetPassword-B-0a8UCj.js +1 -0
  148. zenml/zen_server/dashboard/assets/{Tick-uxv80Q6a.js → Tick-i1DYsVcX.js} +1 -1
  149. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-oN4G3sKz.js → UpdatePasswordSchemas-C6Zb7ASL.js} +1 -1
  150. zenml/zen_server/dashboard/assets/UsageReason-CCnzmwS8.js +1 -0
  151. zenml/zen_server/dashboard/assets/WizardFooter-BHbO7zOa.js +1 -0
  152. zenml/zen_server/dashboard/assets/all-pipeline-runs-query-BBEe6I9-.js +1 -0
  153. zenml/zen_server/dashboard/assets/{check-circle-1_I207rW.js → check-circle-DOoS4yhF.js} +1 -1
  154. zenml/zen_server/dashboard/assets/{chevron-down-BpaF8JqM.js → chevron-down-Cwb-W_B_.js} +1 -1
  155. zenml/zen_server/dashboard/assets/{chevron-right-double-Dk8e2L99.js → chevron-right-double-c9H46Kl8.js} +1 -1
  156. zenml/zen_server/dashboard/assets/{cloud-only-BkUuI0lZ.js → cloud-only-BuP4Kt_7.js} +1 -1
  157. zenml/zen_server/dashboard/assets/code-browser-BJYErIjr.js +1 -0
  158. zenml/zen_server/dashboard/assets/codespaces-BitYDX9d.gif +0 -0
  159. zenml/zen_server/dashboard/assets/{copy-f3XGPPxt.js → copy-CaGlDsUy.js} +1 -1
  160. zenml/zen_server/dashboard/assets/create-stack-B2x2d4r1.js +1 -0
  161. zenml/zen_server/dashboard/assets/{docker-8uj__HHK.js → docker-BFAFXr2_.js} +1 -1
  162. zenml/zen_server/dashboard/assets/{dots-horizontal-sKQlWEni.js → dots-horizontal-C6K59vUm.js} +1 -1
  163. zenml/zen_server/dashboard/assets/flyte-Cj-xy_8I.svg +10 -0
  164. zenml/zen_server/dashboard/assets/form-schemas-Bap0f854.js +1 -0
  165. zenml/zen_server/dashboard/assets/gcp-Dj6ntk0L.js +1 -0
  166. zenml/zen_server/dashboard/assets/{help-FuHlZwn0.js → help-CwN931fX.js} +1 -1
  167. zenml/zen_server/dashboard/assets/{index-Bd1xgUQG.js → index-5GJ5ysEZ.js} +1 -1
  168. zenml/zen_server/dashboard/assets/{index-DaGknux4.css → index-6DYjZgDn.css} +1 -1
  169. zenml/zen_server/dashboard/assets/index-B9wVwe7u.js +55 -0
  170. zenml/zen_server/dashboard/assets/index-DFi8BroH.js +1 -0
  171. zenml/zen_server/dashboard/assets/{index.esm-DT4uyn2i.js → index.esm-BE1uqCX5.js} +1 -1
  172. zenml/zen_server/dashboard/assets/kubernetes-BjbR6D-1.js +1 -0
  173. zenml/zen_server/dashboard/assets/{layout-D6oiSbfd.js → layout-Dru15_XR.js} +1 -1
  174. zenml/zen_server/dashboard/assets/link-external-BT2L8hAQ.js +1 -0
  175. zenml/zen_server/dashboard/assets/{login-mutation-13A_JSVA.js → login-mutation-DwxUz8VA.js} +1 -1
  176. zenml/zen_server/dashboard/assets/{logs-CgeE2vZP.js → logs-GiDJXbLS.js} +1 -1
  177. zenml/zen_server/dashboard/assets/metaflow-weOkWNyT.svg +10 -0
  178. zenml/zen_server/dashboard/assets/{not-found-B0Mmb90p.js → not-found-D5i9DunU.js} +1 -1
  179. zenml/zen_server/dashboard/assets/{package-DdkziX79.js → package-DYKZ5jKW.js} +1 -1
  180. zenml/zen_server/dashboard/assets/page-BFuJICXM.js +9 -0
  181. zenml/zen_server/dashboard/assets/{page-BGwA9B1M.js → page-BiF8hLbO.js} +1 -1
  182. zenml/zen_server/dashboard/assets/{page-DugsjcQ_.js → page-BitfWsiW.js} +1 -1
  183. zenml/zen_server/dashboard/assets/page-CDOQLrPC.js +1 -0
  184. zenml/zen_server/dashboard/assets/page-CEJWu1YO.js +1 -0
  185. zenml/zen_server/dashboard/assets/page-CIbehp7V.js +1 -0
  186. zenml/zen_server/dashboard/assets/page-CLiRGfWo.js +1 -0
  187. zenml/zen_server/dashboard/assets/page-CV44mQn9.js +1 -0
  188. zenml/zen_server/dashboard/assets/page-CrSdkteO.js +2 -0
  189. zenml/zen_server/dashboard/assets/page-D5F3DJjm.js +1 -0
  190. zenml/zen_server/dashboard/assets/page-DE03uZZR.js +1 -0
  191. zenml/zen_server/dashboard/assets/page-DFCK65G9.js +1 -0
  192. zenml/zen_server/dashboard/assets/{page-RnG-qhv9.js → page-DGMa3ZQL.js} +1 -1
  193. zenml/zen_server/dashboard/assets/page-DI-qTWrm.js +1 -0
  194. zenml/zen_server/dashboard/assets/page-DQGCHKrQ.js +1 -0
  195. zenml/zen_server/dashboard/assets/{page-DSTQnBk-.js → page-DQdwZZ9x.js} +1 -1
  196. zenml/zen_server/dashboard/assets/page-DgM-N9RL.js +1 -0
  197. zenml/zen_server/dashboard/assets/page-Dt8VgzbE.js +1 -0
  198. zenml/zen_server/dashboard/assets/{page-DLpOnf7u.js → page-J0s8Sq3N.js} +1 -1
  199. zenml/zen_server/dashboard/assets/page-WCQ659by.js +1 -0
  200. zenml/zen_server/dashboard/assets/page-bimkItOg.js +1 -0
  201. zenml/zen_server/dashboard/assets/{page-hQaiQXfg.js → page-iwoJnwPv.js} +1 -1
  202. zenml/zen_server/dashboard/assets/{page-YiF_fNbe.js → page-oS4hqS8M.js} +1 -1
  203. zenml/zen_server/dashboard/assets/page-oSqx9dkH.js +1 -0
  204. zenml/zen_server/dashboard/assets/page-p3GqEAUW.js +1 -0
  205. zenml/zen_server/dashboard/assets/page-qvcUVPE-.js +1 -0
  206. zenml/zen_server/dashboard/assets/page-xQG6GmFJ.js +1 -0
  207. zenml/zen_server/dashboard/assets/{persist-3-5nOJ6m.js → persist-mEZN_fgH.js} +1 -1
  208. zenml/zen_server/dashboard/assets/persist-xsYgVtR1.js +1 -0
  209. zenml/zen_server/dashboard/assets/{plus-FB9-lEq_.js → plus-Bc8eLSDM.js} +1 -1
  210. zenml/zen_server/dashboard/assets/{refresh-COb6KYDi.js → refresh-hfgWPeto.js} +1 -1
  211. zenml/zen_server/dashboard/assets/rocket-SESCGQXm.js +1 -0
  212. zenml/zen_server/dashboard/assets/sharedSchema-BfZcy7aP.js +14 -0
  213. zenml/zen_server/dashboard/assets/stack-detail-query-CU4egfhp.js +1 -0
  214. zenml/zen_server/dashboard/assets/templates-1S_8WeSK.webp +0 -0
  215. zenml/zen_server/dashboard/assets/{trash-Cd5CSFqA.js → trash-DUWZWzse.js} +1 -1
  216. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-B8GB_ubU.js → update-server-settings-mutation-DNqmQXDM.js} +1 -1
  217. zenml/zen_server/dashboard/assets/{url-hcMJkz8p.js → url-DwbuKk1b.js} +1 -1
  218. zenml/zen_server/dashboard/assets/{zod-CnykDKJj.js → zod-uFd1wBcd.js} +1 -1
  219. zenml/zen_server/dashboard/index.html +7 -7
  220. zenml/zen_server/dashboard_legacy/asset-manifest.json +4 -4
  221. zenml/zen_server/dashboard_legacy/index.html +1 -1
  222. zenml/zen_server/dashboard_legacy/{precache-manifest.9c473c96a43298343a7ce1256183123b.js → precache-manifest.290b95d5b43efa3368b3dc63d20c4782.js} +4 -4
  223. zenml/zen_server/dashboard_legacy/service-worker.js +1 -1
  224. zenml/zen_server/dashboard_legacy/static/js/{main.463c90b9.chunk.js → main.840d1bf0.chunk.js} +2 -2
  225. zenml/zen_server/dashboard_legacy/static/js/{main.463c90b9.chunk.js.map → main.840d1bf0.chunk.js.map} +1 -1
  226. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  227. zenml/zen_server/deploy/helm/README.md +2 -2
  228. zenml/zen_server/routers/service_connectors_endpoints.py +2 -4
  229. zenml/zen_server/routers/workspaces_endpoints.py +20 -66
  230. zenml/zen_server/secure_headers.py +120 -0
  231. zenml/zen_server/template_execution/runner_entrypoint_configuration.py +0 -2
  232. zenml/zen_server/template_execution/utils.py +1 -0
  233. zenml/zen_server/utils.py +0 -100
  234. zenml/zen_server/zen_server_api.py +4 -2
  235. zenml/zen_stores/migrations/versions/0.65.0_release.py +23 -0
  236. zenml/zen_stores/migrations/versions/0.66.0_release.py +23 -0
  237. zenml/zen_stores/migrations/versions/bf2120261b5a_add_configured_model_version_id.py +74 -0
  238. zenml/zen_stores/rest_zen_store.py +4 -21
  239. zenml/zen_stores/schemas/constants.py +16 -0
  240. zenml/zen_stores/schemas/model_schemas.py +9 -3
  241. zenml/zen_stores/schemas/pipeline_run_schemas.py +22 -8
  242. zenml/zen_stores/schemas/step_run_schemas.py +23 -12
  243. zenml/zen_stores/sql_zen_store.py +312 -300
  244. zenml/zen_stores/zen_store_interface.py +0 -16
  245. {zenml_nightly-0.64.0.dev20240811.dist-info → zenml_nightly-0.66.0.dev20240910.dist-info}/METADATA +10 -12
  246. {zenml_nightly-0.64.0.dev20240811.dist-info → zenml_nightly-0.66.0.dev20240910.dist-info}/RECORD +249 -217
  247. zenml/models/v2/misc/full_stack.py +0 -129
  248. zenml/new/pipelines/model_utils.py +0 -72
  249. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-ErO9aOgK.js +0 -1
  250. zenml/zen_server/dashboard/assets/AwarenessChannel-CLXo5rKM.js +0 -1
  251. zenml/zen_server/dashboard/assets/CollapsibleCard-BaUPiVg0.js +0 -1
  252. zenml/zen_server/dashboard/assets/Commands-JrcZK-3j.js +0 -1
  253. zenml/zen_server/dashboard/assets/CopyButton-Dbo52T1K.js +0 -2
  254. zenml/zen_server/dashboard/assets/EditSecretDialog-Bd7mFLS4.js +0 -1
  255. zenml/zen_server/dashboard/assets/ExecutionStatus-jH4OrWBq.js +0 -1
  256. zenml/zen_server/dashboard/assets/Infobox-BQ0aty32.js +0 -1
  257. zenml/zen_server/dashboard/assets/ProviderRadio-BBqkIuTd.js +0 -1
  258. zenml/zen_server/dashboard/assets/RadioItem-xLhXoiFV.js +0 -1
  259. zenml/zen_server/dashboard/assets/SearchField-C9R0mdaX.js +0 -1
  260. zenml/zen_server/dashboard/assets/SetPassword-52sNxNiO.js +0 -1
  261. zenml/zen_server/dashboard/assets/SuccessStep-DlkItqYG.js +0 -1
  262. zenml/zen_server/dashboard/assets/aws-0_3UsPif.js +0 -1
  263. zenml/zen_server/dashboard/assets/database-cXYNX9tt.js +0 -1
  264. zenml/zen_server/dashboard/assets/file-text-B9JibxTs.js +0 -1
  265. zenml/zen_server/dashboard/assets/index-DhIZtpxB.js +0 -55
  266. zenml/zen_server/dashboard/assets/page-7-v2OBm-.js +0 -1
  267. zenml/zen_server/dashboard/assets/page-B3ozwdD1.js +0 -1
  268. zenml/zen_server/dashboard/assets/page-BkjAUyTA.js +0 -1
  269. zenml/zen_server/dashboard/assets/page-BnacgBiy.js +0 -1
  270. zenml/zen_server/dashboard/assets/page-BxF_KMQ3.js +0 -2
  271. zenml/zen_server/dashboard/assets/page-C4POHC0K.js +0 -1
  272. zenml/zen_server/dashboard/assets/page-C9kudd44.js +0 -9
  273. zenml/zen_server/dashboard/assets/page-CA1j3GpJ.js +0 -1
  274. zenml/zen_server/dashboard/assets/page-CCY6yfmu.js +0 -1
  275. zenml/zen_server/dashboard/assets/page-CgTe7Bme.js +0 -1
  276. zenml/zen_server/dashboard/assets/page-Cgn-6v2Y.js +0 -1
  277. zenml/zen_server/dashboard/assets/page-CxQmQqDw.js +0 -1
  278. zenml/zen_server/dashboard/assets/page-D2Goey3H.js +0 -1
  279. zenml/zen_server/dashboard/assets/page-DTysUGOy.js +0 -1
  280. zenml/zen_server/dashboard/assets/page-D_EXUFJb.js +0 -1
  281. zenml/zen_server/dashboard/assets/page-Db15QzsM.js +0 -1
  282. zenml/zen_server/dashboard/assets/page-OFKSPyN7.js +0 -1
  283. zenml/zen_server/dashboard/assets/page-T2BtjwPl.js +0 -1
  284. zenml/zen_server/dashboard/assets/page-TXe1Eo3Z.js +0 -1
  285. zenml/zen_server/dashboard/assets/play-circle-XSkLR12B.js +0 -1
  286. zenml/zen_server/dashboard/assets/sharedSchema-BoYx_B_L.js +0 -14
  287. zenml/zen_server/dashboard/assets/stack-detail-query-B-US_-wa.js +0 -1
  288. zenml/zen_server/dashboard/assets/terminal-grtjrIEJ.js +0 -1
  289. {zenml_nightly-0.64.0.dev20240811.dist-info → zenml_nightly-0.66.0.dev20240910.dist-info}/LICENSE +0 -0
  290. {zenml_nightly-0.64.0.dev20240811.dist-info → zenml_nightly-0.66.0.dev20240910.dist-info}/WHEEL +0 -0
  291. {zenml_nightly-0.64.0.dev20240811.dist-info → zenml_nightly-0.66.0.dev20240910.dist-info}/entry_points.txt +0 -0
@@ -177,7 +177,6 @@ from zenml.models import (
177
177
  FlavorRequest,
178
178
  FlavorResponse,
179
179
  FlavorUpdate,
180
- FullStackRequest,
181
180
  LogsResponse,
182
181
  ModelFilter,
183
182
  ModelRequest,
@@ -283,7 +282,6 @@ from zenml.models import (
283
282
  WorkspaceUpdate,
284
283
  )
285
284
  from zenml.models.v2.core.component import InternalComponentRequest
286
- from zenml.models.v2.core.stack import InternalStackRequest
287
285
  from zenml.service_connectors.service_connector_registry import (
288
286
  service_connector_registry,
289
287
  )
@@ -3193,6 +3191,22 @@ class SqlZenStore(BaseZenStore):
3193
3191
  session=session,
3194
3192
  )
3195
3193
 
3194
+ # We have to skip the validation of the default components
3195
+ # as it creates a loop of initialization.
3196
+ if component.name != "default" or (
3197
+ component.type != StackComponentType.ORCHESTRATOR
3198
+ and component.type != StackComponentType.ARTIFACT_STORE
3199
+ ):
3200
+ from zenml.stack.utils import validate_stack_component_config
3201
+
3202
+ validate_stack_component_config(
3203
+ configuration_dict=component.configuration,
3204
+ flavor_name=component.flavor,
3205
+ component_type=component.type,
3206
+ zen_store=self,
3207
+ validate_custom_flavors=False,
3208
+ )
3209
+
3196
3210
  service_connector: Optional[ServiceConnectorSchema] = None
3197
3211
  if component.connector:
3198
3212
  service_connector = session.exec(
@@ -3223,10 +3237,12 @@ class SqlZenStore(BaseZenStore):
3223
3237
  not in skypilot_regions
3224
3238
  ):
3225
3239
  logger.warning(
3226
- f"Region `{component.configuration['region']}` is not enabled in Skypilot "
3227
- f"by default. Supported regions by default are: {skypilot_regions}. "
3228
- "Check the Skypilot documentation to learn how to enable regions rather "
3229
- "than default ones. (If you have already extended your configuration - "
3240
+ f"Region `{component.configuration['region']}` is "
3241
+ "not enabled in Skypilot by default. Supported regions "
3242
+ f"by default are: {skypilot_regions}. Check the "
3243
+ "Skypilot documentation to learn how to enable "
3244
+ "regions rather than default ones. (If you have "
3245
+ "already extended your configuration - "
3230
3246
  "simply ignore this warning)"
3231
3247
  )
3232
3248
 
@@ -3345,6 +3361,17 @@ class SqlZenStore(BaseZenStore):
3345
3361
  f"existing component with this id."
3346
3362
  )
3347
3363
 
3364
+ if component_update.configuration is not None:
3365
+ from zenml.stack.utils import validate_stack_component_config
3366
+
3367
+ validate_stack_component_config(
3368
+ configuration_dict=component_update.configuration,
3369
+ flavor_name=existing_component.flavor,
3370
+ component_type=StackComponentType(existing_component.type),
3371
+ zen_store=self,
3372
+ validate_custom_flavors=False,
3373
+ )
3374
+
3348
3375
  if (
3349
3376
  existing_component.name == DEFAULT_STACK_AND_COMPONENT_NAME
3350
3377
  and existing_component.type
@@ -4937,7 +4964,7 @@ class SqlZenStore(BaseZenStore):
4937
4964
  # orchestrator_run_id.
4938
4965
  # Note: This only locks a single row if the where clause of
4939
4966
  # the query is indexed (we have a unique index due to the
4940
- # unique constraint on those columns). Otherwise this will lock
4967
+ # unique constraint on those columns). Otherwise, this will lock
4941
4968
  # multiple rows or even the complete table which we want to
4942
4969
  # avoid.
4943
4970
  .with_for_update()
@@ -7191,77 +7218,11 @@ class SqlZenStore(BaseZenStore):
7191
7218
  )
7192
7219
 
7193
7220
  # ----------------------------- Stacks -----------------------------
7194
-
7195
- @track_decorator(AnalyticsEvent.REGISTERED_STACK)
7196
7221
  def create_stack(self, stack: StackRequest) -> StackResponse:
7197
- """Register a new stack.
7198
-
7199
- Args:
7200
- stack: The stack to register.
7201
-
7202
- Returns:
7203
- The registered stack.
7204
- """
7205
- validate_name(stack)
7206
- with Session(self.engine) as session:
7207
- self._fail_if_stack_with_name_exists(
7208
- stack_name=stack.name,
7209
- workspace_id=stack.workspace,
7210
- session=session,
7211
- )
7212
-
7213
- # Get the Schemas of all components mentioned
7214
- component_ids = (
7215
- [
7216
- component_id
7217
- for list_of_component_ids in stack.components.values()
7218
- for component_id in list_of_component_ids
7219
- ]
7220
- if stack.components is not None
7221
- else []
7222
- )
7223
- filters = [
7224
- (StackComponentSchema.id == component_id)
7225
- for component_id in component_ids
7226
- ]
7227
-
7228
- defined_components = session.exec(
7229
- select(StackComponentSchema).where(or_(*filters))
7230
- ).all()
7231
-
7232
- new_stack_schema = StackSchema(
7233
- workspace_id=stack.workspace,
7234
- user_id=stack.user,
7235
- stack_spec_path=stack.stack_spec_path,
7236
- name=stack.name,
7237
- description=stack.description,
7238
- components=defined_components,
7239
- labels=base64.b64encode(
7240
- json.dumps(stack.labels).encode("utf-8")
7241
- ),
7242
- )
7243
-
7244
- session.add(new_stack_schema)
7245
- session.commit()
7246
- session.refresh(new_stack_schema)
7247
-
7248
- for component in defined_components:
7249
- if component.type == StackComponentType.ORCHESTRATOR:
7250
- if component.flavor not in {"local", "local_docker"}:
7251
- self._update_onboarding_state(
7252
- completed_steps={
7253
- OnboardingStep.STACK_WITH_REMOTE_ORCHESTRATOR_CREATED
7254
- },
7255
- session=session,
7256
- )
7257
-
7258
- return new_stack_schema.to_model(include_metadata=True)
7259
-
7260
- def create_full_stack(self, full_stack: FullStackRequest) -> StackResponse:
7261
7222
  """Register a full stack.
7262
7223
 
7263
7224
  Args:
7264
- full_stack: The full stack configuration.
7225
+ stack: The full stack configuration.
7265
7226
 
7266
7227
  Returns:
7267
7228
  The registered stack.
@@ -7269,254 +7230,304 @@ class SqlZenStore(BaseZenStore):
7269
7230
  Raises:
7270
7231
  ValueError: If the full stack creation fails, due to the corrupted
7271
7232
  input.
7272
- RuntimeError: If the full stack creation fails, due to unforeseen
7233
+ Exception: If the full stack creation fails, due to unforeseen
7273
7234
  errors.
7274
7235
  """
7275
- # For clean-up purposes, each created entity is tracked here
7276
- service_connectors_created_ids: List[UUID] = []
7277
- components_created_ids: List[UUID] = []
7278
-
7279
- try:
7280
- # Validate the name of the new stack
7281
- validate_name(full_stack)
7282
-
7283
- if full_stack.labels is None:
7284
- full_stack.labels = {}
7236
+ with Session(self.engine) as session:
7237
+ # For clean-up purposes, each created entity is tracked here
7238
+ service_connectors_created_ids: List[UUID] = []
7239
+ components_created_ids: List[UUID] = []
7285
7240
 
7286
- full_stack.labels.update({"zenml:full_stack": True})
7241
+ try:
7242
+ # Validate the name of the new stack
7243
+ validate_name(stack)
7287
7244
 
7288
- # Service Connectors
7289
- service_connectors: List[ServiceConnectorResponse] = []
7245
+ if stack.labels is None:
7246
+ stack.labels = {}
7290
7247
 
7291
- need_to_generate_permanent_tokens = False
7292
- orchestrator_component = full_stack.components[
7293
- StackComponentType.ORCHESTRATOR
7294
- ]
7295
- if isinstance(orchestrator_component, UUID):
7296
- orchestrator = self.get_stack_component(
7297
- orchestrator_component,
7298
- hydrate=False,
7299
- )
7300
- need_to_generate_permanent_tokens = (
7301
- orchestrator.flavor.startswith("vm_")
7302
- )
7303
- else:
7304
- need_to_generate_permanent_tokens = (
7305
- orchestrator_component.flavor.startswith("vm_")
7306
- )
7248
+ # Service Connectors
7249
+ service_connectors: List[ServiceConnectorResponse] = []
7307
7250
 
7308
- for connector_id_or_info in full_stack.service_connectors:
7309
- # Fetch an existing service connector
7310
- if isinstance(connector_id_or_info, UUID):
7311
- existing_service_connector = self.get_service_connector(
7312
- connector_id_or_info
7313
- )
7314
- if need_to_generate_permanent_tokens:
7315
- if (
7316
- existing_service_connector.configuration.get(
7317
- "generate_temporary_tokens", None
7318
- )
7319
- is not False
7320
- ):
7321
- connector_config = (
7322
- existing_service_connector.configuration
7323
- )
7324
- connector_config["generate_temporary_tokens"] = (
7325
- False
7326
- )
7327
- self.update_service_connector(
7328
- existing_service_connector.id,
7329
- ServiceConnectorUpdate(
7330
- configuration=connector_config
7331
- ),
7332
- )
7333
- service_connectors.append(
7334
- self.get_service_connector(connector_id_or_info)
7335
- )
7336
- # Create a new service connector
7337
- else:
7338
- connector_name = full_stack.name
7339
- connector_config = connector_id_or_info.configuration
7340
- connector_config[
7341
- "generate_temporary_tokens"
7342
- ] = not need_to_generate_permanent_tokens
7251
+ orchestrator_components = stack.components[
7252
+ StackComponentType.ORCHESTRATOR
7253
+ ]
7254
+ for orchestrator_component in orchestrator_components:
7255
+ if isinstance(orchestrator_component, UUID):
7256
+ orchestrator = self.get_stack_component(
7257
+ orchestrator_component,
7258
+ hydrate=False,
7259
+ )
7260
+ need_to_generate_permanent_tokens = (
7261
+ orchestrator.flavor.startswith("vm_")
7262
+ )
7263
+ else:
7264
+ need_to_generate_permanent_tokens = (
7265
+ orchestrator_component.flavor.startswith("vm_")
7266
+ )
7343
7267
 
7344
- while True:
7345
- try:
7346
- service_connector_request = ServiceConnectorRequest(
7347
- name=connector_name,
7348
- connector_type=connector_id_or_info.type,
7349
- auth_method=connector_id_or_info.auth_method,
7350
- configuration=connector_config,
7351
- user=full_stack.user,
7352
- workspace=full_stack.workspace,
7353
- labels={
7354
- k: str(v)
7355
- for k, v in full_stack.labels.items()
7356
- },
7357
- )
7358
- service_connector_response = (
7359
- self.create_service_connector(
7268
+ for connector_id_or_info in stack.service_connectors:
7269
+ # Fetch an existing service connector
7270
+ if isinstance(connector_id_or_info, UUID):
7271
+ existing_service_connector = (
7272
+ self.get_service_connector(connector_id_or_info)
7273
+ )
7274
+ if need_to_generate_permanent_tokens:
7275
+ if (
7276
+ existing_service_connector.configuration.get(
7277
+ "generate_temporary_tokens", None
7278
+ )
7279
+ is not False
7280
+ ):
7281
+ connector_config = (
7282
+ existing_service_connector.configuration
7283
+ )
7284
+ connector_config[
7285
+ "generate_temporary_tokens"
7286
+ ] = False
7287
+ self.update_service_connector(
7288
+ existing_service_connector.id,
7289
+ ServiceConnectorUpdate(
7290
+ configuration=connector_config
7291
+ ),
7292
+ )
7293
+ service_connectors.append(
7294
+ self.get_service_connector(connector_id_or_info)
7295
+ )
7296
+ # Create a new service connector
7297
+ else:
7298
+ connector_name = stack.name
7299
+ connector_config = connector_id_or_info.configuration
7300
+ connector_config[
7301
+ "generate_temporary_tokens"
7302
+ ] = not need_to_generate_permanent_tokens
7303
+
7304
+ while True:
7305
+ try:
7306
+ service_connector_request = ServiceConnectorRequest(
7307
+ name=connector_name,
7308
+ connector_type=connector_id_or_info.type,
7309
+ auth_method=connector_id_or_info.auth_method,
7310
+ configuration=connector_config,
7311
+ user=stack.user,
7312
+ workspace=stack.workspace,
7313
+ labels={
7314
+ k: str(v)
7315
+ for k, v in stack.labels.items()
7316
+ },
7317
+ )
7318
+ service_connector_response = self.create_service_connector(
7360
7319
  service_connector=service_connector_request
7361
7320
  )
7321
+ service_connectors.append(
7322
+ service_connector_response
7323
+ )
7324
+ service_connectors_created_ids.append(
7325
+ service_connector_response.id
7326
+ )
7327
+ break
7328
+ except EntityExistsError:
7329
+ connector_name = (
7330
+ f"{stack.name}-{random_str(4)}".lower()
7331
+ )
7332
+ continue
7333
+
7334
+ # Stack Components
7335
+ components_mapping: Dict[StackComponentType, List[UUID]] = {}
7336
+ for (
7337
+ component_type,
7338
+ components,
7339
+ ) in stack.components.items():
7340
+ for component_info in components:
7341
+ # Fetch an existing component
7342
+ if isinstance(component_info, UUID):
7343
+ component = self.get_stack_component(
7344
+ component_id=component_info
7362
7345
  )
7363
- service_connectors.append(
7364
- service_connector_response
7365
- )
7366
- service_connectors_created_ids.append(
7367
- service_connector_response.id
7368
- )
7369
- break
7370
- except EntityExistsError:
7371
- connector_name = (
7372
- f"{full_stack.name}-{random_str(4)}".lower()
7346
+ # Create a new component
7347
+ else:
7348
+ flavor_list = self.list_flavors(
7349
+ flavor_filter_model=FlavorFilter(
7350
+ name=component_info.flavor,
7351
+ type=component_type,
7352
+ )
7373
7353
  )
7374
- continue
7354
+ if not len(flavor_list):
7355
+ raise ValueError(
7356
+ f"Flavor '{component_info.flavor}' not found "
7357
+ f"for component type '{component_type}'."
7358
+ )
7375
7359
 
7376
- # Stack Components
7377
- components_mapping: Dict[StackComponentType, List[UUID]] = {}
7378
- for (
7379
- component_type,
7380
- component_info,
7381
- ) in full_stack.components.items():
7382
- # Fetch an existing component
7383
- if isinstance(component_info, UUID):
7384
- component = self.get_stack_component(
7385
- component_id=component_info
7386
- )
7387
- # Create a new component
7388
- else:
7389
- flavor_list = self.list_flavors(
7390
- flavor_filter_model=FlavorFilter(
7391
- name=component_info.flavor,
7392
- type=component_type,
7393
- )
7394
- )
7395
- if not len(flavor_list):
7396
- raise ValueError(
7397
- f"Flavor '{component_info.flavor}' not found "
7398
- f"for component type '{component_type}'."
7399
- )
7360
+ flavor_model = flavor_list[0]
7361
+
7362
+ component_name = stack.name
7363
+ while True:
7364
+ try:
7365
+ component_request = ComponentRequest(
7366
+ name=component_name,
7367
+ type=component_type,
7368
+ flavor=component_info.flavor,
7369
+ configuration=component_info.configuration,
7370
+ user=stack.user,
7371
+ workspace=stack.workspace,
7372
+ labels=stack.labels,
7373
+ )
7374
+ component = self.create_stack_component(
7375
+ component=component_request
7376
+ )
7377
+ components_created_ids.append(component.id)
7378
+ break
7379
+ except EntityExistsError:
7380
+ component_name = (
7381
+ f"{stack.name}-{random_str(4)}".lower()
7382
+ )
7383
+ continue
7384
+
7385
+ if (
7386
+ component_info.service_connector_index
7387
+ is not None
7388
+ ):
7389
+ service_connector = service_connectors[
7390
+ component_info.service_connector_index
7391
+ ]
7392
+
7393
+ requirements = (
7394
+ flavor_model.connector_requirements
7395
+ )
7400
7396
 
7401
- flavor_model = flavor_list[0]
7397
+ if not requirements:
7398
+ raise ValueError(
7399
+ f"The '{flavor_model.name}' implementation "
7400
+ "does not support using a service "
7401
+ "connector to connect to resources."
7402
+ )
7403
+
7404
+ if component_info.service_connector_resource_id:
7405
+ resource_id = component_info.service_connector_resource_id
7406
+ else:
7407
+ resource_id = None
7408
+ resource_type = requirements.resource_type
7409
+ if (
7410
+ requirements.resource_id_attr
7411
+ is not None
7412
+ ):
7413
+ resource_id = (
7414
+ component_info.configuration.get(
7415
+ requirements.resource_id_attr
7416
+ )
7417
+ )
7418
+
7419
+ satisfied, msg = requirements.is_satisfied_by(
7420
+ connector=service_connector,
7421
+ component=component,
7422
+ )
7402
7423
 
7403
- component_name = full_stack.name
7404
- while True:
7405
- try:
7406
- component_request = ComponentRequest(
7407
- name=component_name,
7408
- type=component_type,
7409
- flavor=component_info.flavor,
7410
- configuration=component_info.configuration,
7411
- user=full_stack.user,
7412
- workspace=full_stack.workspace,
7413
- labels=full_stack.labels,
7414
- )
7415
- component = self.create_stack_component(
7416
- component=component_request
7417
- )
7418
- components_created_ids.append(component.id)
7419
- break
7420
- except EntityExistsError:
7421
- component_name = (
7422
- f"{full_stack.name}-{random_str(4)}".lower()
7423
- )
7424
- continue
7424
+ if not satisfied:
7425
+ raise ValueError(
7426
+ "Please pick a connector that is "
7427
+ "compatible with the component flavor and "
7428
+ "try again.."
7429
+ )
7430
+
7431
+ if not resource_id:
7432
+ if service_connector.resource_id:
7433
+ resource_id = (
7434
+ service_connector.resource_id
7435
+ )
7436
+ elif service_connector.supports_instances:
7437
+ raise ValueError(
7438
+ f"Multiple {resource_type} resources "
7439
+ "are available for the selected "
7440
+ "connector. Please use a `resource_id` "
7441
+ "to configure a "
7442
+ f"{resource_type} resource."
7443
+ )
7444
+
7445
+ component_update = ComponentUpdate(
7446
+ connector=service_connector.id,
7447
+ connector_resource_id=resource_id,
7448
+ )
7449
+ self.update_stack_component(
7450
+ component_id=component.id,
7451
+ component_update=component_update,
7452
+ )
7425
7453
 
7426
- if component_info.service_connector_index is not None:
7427
- service_connector = service_connectors[
7428
- component_info.service_connector_index
7454
+ components_mapping[component_type] = [
7455
+ component.id,
7429
7456
  ]
7430
7457
 
7431
- requirements = flavor_model.connector_requirements
7432
-
7433
- if not requirements:
7434
- raise ValueError(
7435
- f"The '{flavor_model.name}' implementation "
7436
- "does not support using a service connector to "
7437
- "connect to resources."
7438
- )
7458
+ # Stack
7459
+ assert stack.workspace is not None
7439
7460
 
7440
- if component_info.service_connector_resource_id:
7441
- resource_id = (
7442
- component_info.service_connector_resource_id
7443
- )
7444
- else:
7445
- resource_id = None
7446
- resource_type = requirements.resource_type
7447
- if requirements.resource_id_attr is not None:
7448
- resource_id = component_info.configuration.get(
7449
- requirements.resource_id_attr
7450
- )
7461
+ self._fail_if_stack_with_name_exists(
7462
+ stack_name=stack.name,
7463
+ workspace_id=stack.workspace,
7464
+ session=session,
7465
+ )
7451
7466
 
7452
- satisfied, msg = requirements.is_satisfied_by(
7453
- connector=service_connector,
7454
- component=component,
7455
- )
7467
+ component_ids = (
7468
+ [
7469
+ component_id
7470
+ for list_of_component_ids in components_mapping.values()
7471
+ for component_id in list_of_component_ids
7472
+ ]
7473
+ if stack.components is not None
7474
+ else []
7475
+ )
7476
+ filters = [
7477
+ (StackComponentSchema.id == component_id)
7478
+ for component_id in component_ids
7479
+ ]
7456
7480
 
7457
- if not satisfied:
7458
- raise ValueError(
7459
- "Please pick a connector that is "
7460
- "compatible with the component flavor and "
7461
- "try again.."
7462
- )
7481
+ defined_components = session.exec(
7482
+ select(StackComponentSchema).where(or_(*filters))
7483
+ ).all()
7463
7484
 
7464
- if not resource_id:
7465
- if service_connector.resource_id:
7466
- resource_id = service_connector.resource_id
7467
- elif service_connector.supports_instances:
7468
- raise ValueError(
7469
- f"Multiple {resource_type} resources "
7470
- "are available for the selected "
7471
- "connector. Please use a `resource_id` "
7472
- "to configure a "
7473
- f"{resource_type} resource."
7474
- )
7485
+ new_stack_schema = StackSchema(
7486
+ workspace_id=stack.workspace,
7487
+ user_id=stack.user,
7488
+ stack_spec_path=stack.stack_spec_path,
7489
+ name=stack.name,
7490
+ description=stack.description,
7491
+ components=defined_components,
7492
+ labels=base64.b64encode(
7493
+ json.dumps(stack.labels).encode("utf-8")
7494
+ ),
7495
+ )
7475
7496
 
7476
- component_update = ComponentUpdate(
7477
- connector=service_connector.id,
7478
- connector_resource_id=resource_id,
7479
- )
7480
- self.update_stack_component(
7481
- component_id=component.id,
7482
- component_update=component_update,
7483
- )
7497
+ session.add(new_stack_schema)
7498
+ session.commit()
7499
+ session.refresh(new_stack_schema)
7500
+
7501
+ for defined_component in defined_components:
7502
+ if (
7503
+ defined_component.type
7504
+ == StackComponentType.ORCHESTRATOR
7505
+ ):
7506
+ if defined_component.flavor not in {
7507
+ "local",
7508
+ "local_docker",
7509
+ }:
7510
+ self._update_onboarding_state(
7511
+ completed_steps={
7512
+ OnboardingStep.STACK_WITH_REMOTE_ORCHESTRATOR_CREATED
7513
+ },
7514
+ session=session,
7515
+ )
7484
7516
 
7485
- components_mapping[component_type] = [
7486
- component.id,
7487
- ]
7517
+ return new_stack_schema.to_model(include_metadata=True)
7488
7518
 
7489
- # Stack
7490
- stack_name = full_stack.name
7491
- while True:
7492
- try:
7493
- stack_request = StackRequest(
7494
- user=full_stack.user,
7495
- workspace=full_stack.workspace,
7496
- name=stack_name,
7497
- description=full_stack.description,
7498
- components=components_mapping,
7499
- labels=full_stack.labels,
7519
+ except Exception:
7520
+ for component_id in components_created_ids:
7521
+ self.delete_stack_component(component_id=component_id)
7522
+ for service_connector_id in service_connectors_created_ids:
7523
+ self.delete_service_connector(
7524
+ service_connector_id=service_connector_id
7500
7525
  )
7501
- stack_response = self.create_stack(stack_request)
7502
-
7503
- break
7504
- except EntityExistsError:
7505
- stack_name = f"{full_stack.name}-{random_str(4)}".lower()
7506
-
7507
- return stack_response
7508
-
7509
- except Exception as e:
7510
- for component_id in components_created_ids:
7511
- self.delete_stack_component(component_id=component_id)
7512
- for service_connector_id in service_connectors_created_ids:
7513
- self.delete_service_connector(
7514
- service_connector_id=service_connector_id
7526
+ logger.error(
7527
+ "Stack creation has failed. Cleaned up the entities "
7528
+ "that are created in the process."
7515
7529
  )
7516
- raise RuntimeError(
7517
- f"Full Stack creation has failed {e}. Cleaning up the "
7518
- f"created entities."
7519
- ) from e
7530
+ raise
7520
7531
 
7521
7532
  def get_stack(self, stack_id: UUID, hydrate: bool = True) -> StackResponse:
7522
7533
  """Get a stack by its unique ID.
@@ -7731,7 +7742,6 @@ class SqlZenStore(BaseZenStore):
7731
7742
  logger.info(
7732
7743
  f"Creating default stack in workspace {workspace.name}..."
7733
7744
  )
7734
-
7735
7745
  orchestrator = self.create_stack_component(
7736
7746
  component=InternalComponentRequest(
7737
7747
  # Passing `None` for the user here means the orchestrator
@@ -7764,9 +7774,7 @@ class SqlZenStore(BaseZenStore):
7764
7774
  c.type: [c.id] for c in [orchestrator, artifact_store]
7765
7775
  }
7766
7776
 
7767
- stack = InternalStackRequest(
7768
- # Passing `None` for the user here means the stack is owned by
7769
- # the server, which for RBAC indicates that everyone can read it
7777
+ stack = StackRequest(
7770
7778
  user=None,
7771
7779
  name=DEFAULT_STACK_AND_COMPONENT_NAME,
7772
7780
  components=components,
@@ -8736,6 +8744,10 @@ class SqlZenStore(BaseZenStore):
8736
8744
  # For Python versions <3.9, leave out the third parameter to
8737
8745
  # _evaluate
8738
8746
  target_schema = schema_ref._evaluate(vars(zenml_schemas), {})
8747
+ elif sys.version_info >= (3, 12, 4):
8748
+ target_schema = schema_ref._evaluate(
8749
+ vars(zenml_schemas), {}, recursive_guard=frozenset()
8750
+ )
8739
8751
  else:
8740
8752
  target_schema = schema_ref._evaluate(
8741
8753
  vars(zenml_schemas), {}, frozenset()