zenml-nightly 0.62.0.dev20240729__py3-none-any.whl → 0.64.0.dev20240809__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 (240) hide show
  1. README.md +2 -2
  2. RELEASE_NOTES.md +120 -0
  3. zenml/VERSION +1 -1
  4. zenml/__init__.py +0 -4
  5. zenml/actions/pipeline_run/pipeline_run_action.py +19 -17
  6. zenml/analytics/enums.py +4 -6
  7. zenml/cli/__init__.py +28 -76
  8. zenml/cli/base.py +2 -2
  9. zenml/cli/pipeline.py +54 -61
  10. zenml/cli/stack.py +6 -8
  11. zenml/cli/web_login.py +8 -0
  12. zenml/client.py +232 -103
  13. zenml/config/build_configuration.py +43 -17
  14. zenml/config/compiler.py +14 -22
  15. zenml/config/docker_settings.py +80 -57
  16. zenml/config/pipeline_run_configuration.py +3 -0
  17. zenml/config/server_config.py +3 -0
  18. zenml/config/source.py +60 -1
  19. zenml/constants.py +11 -2
  20. zenml/entrypoints/base_entrypoint_configuration.py +53 -8
  21. zenml/enums.py +4 -1
  22. zenml/environment.py +25 -9
  23. zenml/image_builders/base_image_builder.py +1 -1
  24. zenml/image_builders/build_context.py +25 -72
  25. zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +13 -4
  26. zenml/integrations/azure/__init__.py +4 -0
  27. zenml/integrations/azure/flavors/__init__.py +11 -0
  28. zenml/integrations/azure/flavors/azureml_orchestrator_flavor.py +263 -0
  29. zenml/{_hub → integrations/azure/orchestrators}/__init__.py +7 -2
  30. zenml/integrations/azure/orchestrators/azureml_orchestrator.py +544 -0
  31. zenml/integrations/azure/orchestrators/azureml_orchestrator_entrypoint_config.py +86 -0
  32. zenml/integrations/azure/step_operators/azureml_step_operator.py +3 -0
  33. zenml/integrations/databricks/flavors/databricks_orchestrator_flavor.py +20 -2
  34. zenml/integrations/databricks/orchestrators/databricks_orchestrator.py +19 -13
  35. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +7 -2
  36. zenml/integrations/gcp/service_connectors/gcp_service_connector.py +123 -6
  37. zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +1 -1
  38. zenml/integrations/mlflow/__init__.py +1 -1
  39. zenml/integrations/mlflow/experiment_trackers/mlflow_experiment_tracker.py +3 -1
  40. zenml/integrations/mlflow/flavors/mlflow_experiment_tracker_flavor.py +3 -0
  41. zenml/logger.py +13 -0
  42. zenml/models/__init__.py +26 -22
  43. zenml/models/v2/base/filter.py +32 -0
  44. zenml/models/v2/core/pipeline.py +73 -89
  45. zenml/models/v2/core/pipeline_build.py +15 -11
  46. zenml/models/v2/core/pipeline_deployment.py +72 -24
  47. zenml/models/v2/core/pipeline_run.py +65 -1
  48. zenml/models/v2/core/run_template.py +393 -0
  49. zenml/models/v2/core/server_settings.py +12 -0
  50. zenml/models/v2/core/user.py +0 -21
  51. zenml/models/v2/misc/server_models.py +7 -1
  52. zenml/models/v2/misc/stack_deployment.py +5 -0
  53. zenml/models/v2/misc/user_auth.py +0 -7
  54. zenml/new/pipelines/build_utils.py +220 -89
  55. zenml/new/pipelines/code_archive.py +157 -0
  56. zenml/new/pipelines/pipeline.py +46 -78
  57. zenml/new/pipelines/run_utils.py +79 -1
  58. zenml/post_execution/pipeline.py +1 -4
  59. zenml/service_connectors/service_connector_utils.py +18 -2
  60. zenml/stack_deployments/aws_stack_deployment.py +32 -8
  61. zenml/stack_deployments/azure_stack_deployment.py +122 -10
  62. zenml/stack_deployments/gcp_stack_deployment.py +36 -7
  63. zenml/stack_deployments/stack_deployment.py +23 -7
  64. zenml/steps/base_step.py +3 -0
  65. zenml/steps/utils.py +0 -4
  66. zenml/utils/archivable.py +149 -0
  67. zenml/utils/code_utils.py +244 -0
  68. zenml/utils/notebook_utils.py +122 -0
  69. zenml/utils/package_utils.py +39 -0
  70. zenml/utils/pipeline_docker_image_builder.py +3 -96
  71. zenml/utils/source_utils.py +109 -1
  72. zenml/zen_server/dashboard/assets/{404-B_YdvmwS.js → 404-CRAA_Lew.js} +1 -1
  73. zenml/zen_server/dashboard/assets/@radix-BXWm7HOa.js +85 -0
  74. zenml/zen_server/dashboard/assets/{@react-router-CO-OsFwI.js → @react-router-l3lMcXA2.js} +1 -1
  75. zenml/zen_server/dashboard/assets/{@reactflow-l_1hUr1S.js → @reactflow-CeVxyqYT.js} +2 -2
  76. zenml/zen_server/dashboard/assets/{@tanstack-DYiOyJUL.js → @tanstack-FmcYZMuX.js} +4 -4
  77. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-ErO9aOgK.js +1 -0
  78. zenml/zen_server/dashboard/assets/{AwarenessChannel-CFg5iX4Z.js → AwarenessChannel-CLXo5rKM.js} +1 -1
  79. zenml/zen_server/dashboard/assets/{CodeSnippet-Dvkx_82E.js → CodeSnippet-D0VLxT2A.js} +2 -2
  80. zenml/zen_server/dashboard/assets/CollapsibleCard-BaUPiVg0.js +1 -0
  81. zenml/zen_server/dashboard/assets/{Commands-DoN1xrEq.js → Commands-JrcZK-3j.js} +1 -1
  82. zenml/zen_server/dashboard/assets/CopyButton-Dbo52T1K.js +2 -0
  83. zenml/zen_server/dashboard/assets/{CsvVizualization-Ck-nZ43m.js → CsvVizualization-D3kAypDj.js} +3 -3
  84. zenml/zen_server/dashboard/assets/DisplayDate-DizbSeT-.js +1 -0
  85. zenml/zen_server/dashboard/assets/EditSecretDialog-Bd7mFLS4.js +1 -0
  86. zenml/zen_server/dashboard/assets/{EmptyState-BMLnFVlB.js → EmptyState-BHblM39I.js} +1 -1
  87. zenml/zen_server/dashboard/assets/{Error-kLtljEOM.js → Error-C6LeJSER.js} +1 -1
  88. zenml/zen_server/dashboard/assets/{ExecutionStatus-DguLLgTK.js → ExecutionStatus-jH4OrWBq.js} +1 -1
  89. zenml/zen_server/dashboard/assets/{Helpbox-BXUMP21n.js → Helpbox-aAB2XP-z.js} +1 -1
  90. zenml/zen_server/dashboard/assets/{Infobox-DSt0O-dm.js → Infobox-BQ0aty32.js} +1 -1
  91. zenml/zen_server/dashboard/assets/{InlineAvatar-xsrsIGE-.js → InlineAvatar-DpTLgM3Q.js} +1 -1
  92. zenml/zen_server/dashboard/assets/Lock-CNyJvf2r.js +1 -0
  93. zenml/zen_server/dashboard/assets/{MarkdownVisualization-xp3hhULl.js → MarkdownVisualization-Bajxn0HY.js} +1 -1
  94. zenml/zen_server/dashboard/assets/NumberBox-BmKE0qnO.js +1 -0
  95. zenml/zen_server/dashboard/assets/{PasswordChecker-DUveqlva.js → PasswordChecker-yGGoJSB-.js} +1 -1
  96. zenml/zen_server/dashboard/assets/ProviderRadio-BBqkIuTd.js +1 -0
  97. zenml/zen_server/dashboard/assets/RadioItem-xLhXoiFV.js +1 -0
  98. zenml/zen_server/dashboard/assets/SearchField-C9R0mdaX.js +1 -0
  99. zenml/zen_server/dashboard/assets/{SetPassword-BXGTWiwj.js → SetPassword-52sNxNiO.js} +1 -1
  100. zenml/zen_server/dashboard/assets/{SuccessStep-DZC60t0x.js → SuccessStep-DlkItqYG.js} +1 -1
  101. zenml/zen_server/dashboard/assets/Tick-uxv80Q6a.js +1 -0
  102. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-DGvwFWO1.js → UpdatePasswordSchemas-oN4G3sKz.js} +1 -1
  103. zenml/zen_server/dashboard/assets/{aws-BgKTfTfx.js → aws-0_3UsPif.js} +1 -1
  104. zenml/zen_server/dashboard/assets/{check-circle-i56092KI.js → check-circle-1_I207rW.js} +1 -1
  105. zenml/zen_server/dashboard/assets/chevron-down-BpaF8JqM.js +1 -0
  106. zenml/zen_server/dashboard/assets/{chevron-right-double-CZBOf6JM.js → chevron-right-double-Dk8e2L99.js} +1 -1
  107. zenml/zen_server/dashboard/assets/{cloud-only-C_yFCAkP.js → cloud-only-BkUuI0lZ.js} +1 -1
  108. zenml/zen_server/dashboard/assets/components-Br2ezRib.js +1 -0
  109. zenml/zen_server/dashboard/assets/{copy-BXNk6BjL.js → copy-f3XGPPxt.js} +1 -1
  110. zenml/zen_server/dashboard/assets/{database-1xWSgZfO.js → database-cXYNX9tt.js} +1 -1
  111. zenml/zen_server/dashboard/assets/{docker-CQMVm_4d.js → docker-8uj__HHK.js} +1 -1
  112. zenml/zen_server/dashboard/assets/dots-horizontal-sKQlWEni.js +1 -0
  113. zenml/zen_server/dashboard/assets/edit-C0MVvPD2.js +1 -0
  114. zenml/zen_server/dashboard/assets/{file-text-CqD_iu6l.js → file-text-B9JibxTs.js} +1 -1
  115. zenml/zen_server/dashboard/assets/{help-bu_DgLKI.js → help-FuHlZwn0.js} +1 -1
  116. zenml/zen_server/dashboard/assets/{index-rK_Wuy2W.js → index-Bd1xgUQG.js} +1 -1
  117. zenml/zen_server/dashboard/assets/index-DaGknux4.css +1 -0
  118. zenml/zen_server/dashboard/assets/{index-BczVOqUf.js → index-DhIZtpxB.js} +5 -5
  119. zenml/zen_server/dashboard/assets/index.esm-DT4uyn2i.js +1 -0
  120. zenml/zen_server/dashboard/assets/layout-D6oiSbfd.js +1 -0
  121. zenml/zen_server/dashboard/assets/{login-mutation-CrHrndTI.js → login-mutation-13A_JSVA.js} +1 -1
  122. zenml/zen_server/dashboard/assets/{logs-D8k8BVFf.js → logs-CgeE2vZP.js} +1 -1
  123. zenml/zen_server/dashboard/assets/{not-found-DYa4pC-C.js → not-found-B0Mmb90p.js} +1 -1
  124. zenml/zen_server/dashboard/assets/package-DdkziX79.js +1 -0
  125. zenml/zen_server/dashboard/assets/page-7-v2OBm-.js +1 -0
  126. zenml/zen_server/dashboard/assets/{page-MFQyIJd3.js → page-B3ozwdD1.js} +1 -1
  127. zenml/zen_server/dashboard/assets/{page-BkuQDIf-.js → page-BGwA9B1M.js} +1 -1
  128. zenml/zen_server/dashboard/assets/{page-1iL8aMqs.js → page-BkjAUyTA.js} +1 -1
  129. zenml/zen_server/dashboard/assets/page-BnacgBiy.js +1 -0
  130. zenml/zen_server/dashboard/assets/page-BxF_KMQ3.js +2 -0
  131. zenml/zen_server/dashboard/assets/page-C4POHC0K.js +1 -0
  132. zenml/zen_server/dashboard/assets/page-C9kudd44.js +9 -0
  133. zenml/zen_server/dashboard/assets/page-CA1j3GpJ.js +1 -0
  134. zenml/zen_server/dashboard/assets/page-CCY6yfmu.js +1 -0
  135. zenml/zen_server/dashboard/assets/page-CgTe7Bme.js +1 -0
  136. zenml/zen_server/dashboard/assets/{page-8a4UMKXZ.js → page-Cgn-6v2Y.js} +1 -1
  137. zenml/zen_server/dashboard/assets/page-CxQmQqDw.js +1 -0
  138. zenml/zen_server/dashboard/assets/page-D2Goey3H.js +1 -0
  139. zenml/zen_server/dashboard/assets/page-DLpOnf7u.js +1 -0
  140. zenml/zen_server/dashboard/assets/{page-BhgCDInH.js → page-DSTQnBk-.js} +1 -1
  141. zenml/zen_server/dashboard/assets/{page-1h_sD1jz.js → page-DTysUGOy.js} +1 -1
  142. zenml/zen_server/dashboard/assets/{page-2grKx_MY.js → page-D_EXUFJb.js} +1 -1
  143. zenml/zen_server/dashboard/assets/page-Db15QzsM.js +1 -0
  144. zenml/zen_server/dashboard/assets/{page-BDns21Iz.js → page-DugsjcQ_.js} +1 -1
  145. zenml/zen_server/dashboard/assets/{page-C6-UGEbH.js → page-OFKSPyN7.js} +1 -1
  146. zenml/zen_server/dashboard/assets/{page-BkeAAYwp.js → page-RnG-qhv9.js} +1 -1
  147. zenml/zen_server/dashboard/assets/{page-CCNRIt_f.js → page-T2BtjwPl.js} +1 -1
  148. zenml/zen_server/dashboard/assets/page-TXe1Eo3Z.js +1 -0
  149. zenml/zen_server/dashboard/assets/{page-BnaevhnB.js → page-YiF_fNbe.js} +1 -1
  150. zenml/zen_server/dashboard/assets/{page-uA5prJGY.js → page-hQaiQXfg.js} +1 -1
  151. zenml/zen_server/dashboard/assets/persist-3-5nOJ6m.js +1 -0
  152. zenml/zen_server/dashboard/assets/{play-circle-CNtZKDnW.js → play-circle-XSkLR12B.js} +1 -1
  153. zenml/zen_server/dashboard/assets/plus-FB9-lEq_.js +1 -0
  154. zenml/zen_server/dashboard/assets/refresh-COb6KYDi.js +1 -0
  155. zenml/zen_server/dashboard/assets/sharedSchema-BoYx_B_L.js +14 -0
  156. zenml/zen_server/dashboard/assets/{stack-detail-query-Cficsl6d.js → stack-detail-query-B-US_-wa.js} +1 -1
  157. zenml/zen_server/dashboard/assets/{terminal-By9cErXc.js → terminal-grtjrIEJ.js} +1 -1
  158. zenml/zen_server/dashboard/assets/trash-Cd5CSFqA.js +1 -0
  159. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-7d8xi1tS.js → update-server-settings-mutation-B8GB_ubU.js} +1 -1
  160. zenml/zen_server/dashboard/assets/{url-D7mAQGUM.js → url-hcMJkz8p.js} +1 -1
  161. zenml/zen_server/dashboard/assets/{zod-BhoGpZ63.js → zod-CnykDKJj.js} +1 -1
  162. zenml/zen_server/dashboard/index.html +7 -7
  163. zenml/zen_server/dashboard_legacy/asset-manifest.json +4 -4
  164. zenml/zen_server/dashboard_legacy/index.html +1 -1
  165. zenml/zen_server/dashboard_legacy/{precache-manifest.12246c7548e71e2c4438e496360de80c.js → precache-manifest.9c473c96a43298343a7ce1256183123b.js} +4 -4
  166. zenml/zen_server/dashboard_legacy/service-worker.js +1 -1
  167. zenml/zen_server/dashboard_legacy/static/js/{main.3b27024b.chunk.js → main.463c90b9.chunk.js} +2 -2
  168. zenml/zen_server/dashboard_legacy/static/js/{main.3b27024b.chunk.js.map → main.463c90b9.chunk.js.map} +1 -1
  169. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  170. zenml/zen_server/deploy/helm/README.md +2 -2
  171. zenml/zen_server/rbac/models.py +1 -0
  172. zenml/zen_server/rbac/utils.py +4 -0
  173. zenml/zen_server/routers/pipeline_builds_endpoints.py +2 -66
  174. zenml/zen_server/routers/pipeline_deployments_endpoints.py +2 -53
  175. zenml/zen_server/routers/pipelines_endpoints.py +1 -74
  176. zenml/zen_server/routers/run_templates_endpoints.py +212 -0
  177. zenml/zen_server/routers/stack_deployment_endpoints.py +6 -0
  178. zenml/zen_server/routers/users_endpoints.py +0 -7
  179. zenml/zen_server/routers/workspaces_endpoints.py +79 -0
  180. zenml/zen_server/{pipeline_deployment → template_execution}/runner_entrypoint_configuration.py +1 -8
  181. zenml/zen_server/{pipeline_deployment → template_execution}/utils.py +214 -92
  182. zenml/zen_server/utils.py +77 -2
  183. zenml/zen_server/zen_server_api.py +54 -2
  184. zenml/zen_stores/base_zen_store.py +7 -1
  185. zenml/zen_stores/migrations/versions/0.63.0_release.py +23 -0
  186. zenml/zen_stores/migrations/versions/0.64.0_release.py +23 -0
  187. zenml/zen_stores/migrations/versions/026d4577b6a0_add_code_path.py +39 -0
  188. zenml/zen_stores/migrations/versions/3dcc5d20e82f_add_last_user_activity.py +51 -0
  189. zenml/zen_stores/migrations/versions/7d1919bb1ef0_add_run_templates.py +100 -0
  190. zenml/zen_stores/migrations/versions/909550c7c4da_remove_user_hub_token.py +36 -0
  191. zenml/zen_stores/migrations/versions/b59aa68fdb1f_simplify_pipelines.py +139 -0
  192. zenml/zen_stores/rest_zen_store.py +112 -39
  193. zenml/zen_stores/schemas/__init__.py +2 -0
  194. zenml/zen_stores/schemas/pipeline_build_schemas.py +3 -3
  195. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +32 -2
  196. zenml/zen_stores/schemas/pipeline_run_schemas.py +29 -3
  197. zenml/zen_stores/schemas/pipeline_schemas.py +29 -30
  198. zenml/zen_stores/schemas/run_template_schemas.py +264 -0
  199. zenml/zen_stores/schemas/server_settings_schemas.py +2 -0
  200. zenml/zen_stores/schemas/step_run_schemas.py +11 -4
  201. zenml/zen_stores/schemas/user_schemas.py +0 -2
  202. zenml/zen_stores/sql_zen_store.py +389 -151
  203. zenml/zen_stores/template_utils.py +261 -0
  204. zenml/zen_stores/zen_store_interface.py +93 -20
  205. {zenml_nightly-0.62.0.dev20240729.dist-info → zenml_nightly-0.64.0.dev20240809.dist-info}/METADATA +3 -3
  206. {zenml_nightly-0.62.0.dev20240729.dist-info → zenml_nightly-0.64.0.dev20240809.dist-info}/RECORD +211 -184
  207. zenml/_hub/client.py +0 -289
  208. zenml/_hub/constants.py +0 -21
  209. zenml/_hub/utils.py +0 -79
  210. zenml/cli/hub.py +0 -1116
  211. zenml/models/v2/core/pipeline_namespace.py +0 -113
  212. zenml/models/v2/misc/hub_plugin_models.py +0 -79
  213. zenml/new/pipelines/deserialization_utils.py +0 -292
  214. zenml/zen_server/dashboard/assets/@radix-CFOkMR_E.js +0 -85
  215. zenml/zen_server/dashboard/assets/CollapsibleCard-opiuBHHc.js +0 -1
  216. zenml/zen_server/dashboard/assets/CopyButton-Cr7xYEPb.js +0 -2
  217. zenml/zen_server/dashboard/assets/DisplayDate-DYgIjlDF.js +0 -1
  218. zenml/zen_server/dashboard/assets/Pagination-C6X-mifw.js +0 -1
  219. zenml/zen_server/dashboard/assets/index-EpMIKgrI.css +0 -1
  220. zenml/zen_server/dashboard/assets/index.esm-Corw4lXQ.js +0 -1
  221. zenml/zen_server/dashboard/assets/package-B3fWP-Dh.js +0 -1
  222. zenml/zen_server/dashboard/assets/page-5NCOHOsy.js +0 -1
  223. zenml/zen_server/dashboard/assets/page-B6h3iaHJ.js +0 -1
  224. zenml/zen_server/dashboard/assets/page-Bi-wtWiO.js +0 -5
  225. zenml/zen_server/dashboard/assets/page-Bq0YxkLV.js +0 -1
  226. zenml/zen_server/dashboard/assets/page-Bs2F4eoD.js +0 -2
  227. zenml/zen_server/dashboard/assets/page-CHNxpz3n.js +0 -1
  228. zenml/zen_server/dashboard/assets/page-DgorQFqi.js +0 -1
  229. zenml/zen_server/dashboard/assets/page-K8ebxVIs.js +0 -1
  230. zenml/zen_server/dashboard/assets/page-TgCF0P_U.js +0 -1
  231. zenml/zen_server/dashboard/assets/page-ZnCEe-eK.js +0 -9
  232. zenml/zen_server/dashboard/assets/persist-D7HJNBWx.js +0 -1
  233. zenml/zen_server/dashboard/assets/plus-C8WOyCzt.js +0 -1
  234. zenml/zen_server/dashboard/assets/secrets-video-OBJ6irhH.svg +0 -21
  235. zenml/zen_server/dashboard/assets/stacks-video-7gfxpAq4.svg +0 -21
  236. /zenml/zen_server/{pipeline_deployment → template_execution}/__init__.py +0 -0
  237. /zenml/zen_server/{pipeline_deployment → template_execution}/workload_manager_interface.py +0 -0
  238. {zenml_nightly-0.62.0.dev20240729.dist-info → zenml_nightly-0.64.0.dev20240809.dist-info}/LICENSE +0 -0
  239. {zenml_nightly-0.62.0.dev20240729.dist-info → zenml_nightly-0.64.0.dev20240809.dist-info}/WHEEL +0 -0
  240. {zenml_nightly-0.62.0.dev20240729.dist-info → zenml_nightly-0.64.0.dev20240809.dist-info}/entry_points.txt +0 -0
@@ -22,6 +22,7 @@ To run this file locally, execute:
22
22
 
23
23
  import os
24
24
  from asyncio.log import logger
25
+ from datetime import datetime, timedelta, timezone
25
26
  from genericpath import isfile
26
27
  from typing import Any, List
27
28
 
@@ -36,7 +37,11 @@ from starlette.responses import FileResponse
36
37
 
37
38
  import zenml
38
39
  from zenml.analytics import source_context
39
- from zenml.constants import API, HEALTH
40
+ from zenml.constants import (
41
+ API,
42
+ DEFAULT_ZENML_SERVER_REPORT_USER_ACTIVITY_TO_DB_SECONDS,
43
+ HEALTH,
44
+ )
40
45
  from zenml.enums import AuthScheme, SourceContextTypes
41
46
  from zenml.zen_server.exceptions import error_detail
42
47
  from zenml.zen_server.routers import (
@@ -55,6 +60,7 @@ from zenml.zen_server.routers import (
55
60
  pipelines_endpoints,
56
61
  plugin_endpoints,
57
62
  run_metadata_endpoints,
63
+ run_templates_endpoints,
58
64
  runs_endpoints,
59
65
  schedule_endpoints,
60
66
  secrets_endpoints,
@@ -79,8 +85,10 @@ from zenml.zen_server.utils import (
79
85
  initialize_secure_headers,
80
86
  initialize_workload_manager,
81
87
  initialize_zen_store,
88
+ is_user_request,
82
89
  secure_headers,
83
90
  server_config,
91
+ zen_store,
84
92
  )
85
93
 
86
94
  if server_config().use_legacy_dashboard:
@@ -108,6 +116,12 @@ app = FastAPI(
108
116
  default_response_class=ORJSONResponse,
109
117
  )
110
118
 
119
+ # Initialize last_user_activity
120
+ last_user_activity: datetime = datetime.now(timezone.utc)
121
+ last_user_activity_reported: datetime = datetime.now(timezone.utc) + timedelta(
122
+ seconds=-DEFAULT_ZENML_SERVER_REPORT_USER_ACTIVITY_TO_DB_SECONDS
123
+ )
124
+
111
125
 
112
126
  # Customize the default request validation handler that comes with FastAPI
113
127
  # to return a JSON response that matches the ZenML API spec.
@@ -158,6 +172,44 @@ async def set_secure_headers(request: Request, call_next: Any) -> Any:
158
172
  return response
159
173
 
160
174
 
175
+ @app.middleware("http")
176
+ async def track_last_user_activity(request: Request, call_next: Any) -> Any:
177
+ """A middleware to track last user activity.
178
+
179
+ This middleware checks if the incoming request is a user request and
180
+ updates the last activity timestamp if it is.
181
+
182
+ Args:
183
+ request: The incoming request object.
184
+ call_next: A function that will receive the request as a parameter and
185
+ pass it to the corresponding path operation.
186
+
187
+ Returns:
188
+ The response to the request.
189
+ """
190
+ global last_user_activity
191
+ global last_user_activity_reported
192
+
193
+ try:
194
+ if is_user_request(request):
195
+ last_user_activity = datetime.now(timezone.utc)
196
+ except Exception as e:
197
+ logger.debug(
198
+ f"An unexpected error occurred while checking user activity: {e}"
199
+ )
200
+ if (
201
+ (
202
+ datetime.now(timezone.utc) - last_user_activity_reported
203
+ ).total_seconds()
204
+ > DEFAULT_ZENML_SERVER_REPORT_USER_ACTIVITY_TO_DB_SECONDS
205
+ ):
206
+ last_user_activity_reported = datetime.now(timezone.utc)
207
+ zen_store()._update_last_user_activity_timestamp(
208
+ last_user_activity=last_user_activity
209
+ )
210
+ return await call_next(request)
211
+
212
+
161
213
  @app.middleware("http")
162
214
  async def infer_source_context(request: Request, call_next: Any) -> Any:
163
215
  """A middleware to track the source of an event.
@@ -278,11 +330,11 @@ app.include_router(model_versions_endpoints.router)
278
330
  app.include_router(model_versions_endpoints.model_version_artifacts_router)
279
331
  app.include_router(model_versions_endpoints.model_version_pipeline_runs_router)
280
332
  app.include_router(pipelines_endpoints.router)
281
- app.include_router(pipelines_endpoints.namespace_router)
282
333
  app.include_router(pipeline_builds_endpoints.router)
283
334
  app.include_router(pipeline_deployments_endpoints.router)
284
335
  app.include_router(runs_endpoints.router)
285
336
  app.include_router(run_metadata_endpoints.router)
337
+ app.include_router(run_templates_endpoints.router)
286
338
  app.include_router(schedule_endpoints.router)
287
339
  app.include_router(secrets_endpoints.router)
288
340
  app.include_router(secrets_endpoints.op_router)
@@ -39,6 +39,7 @@ from zenml.constants import (
39
39
  DEFAULT_WORKSPACE_NAME,
40
40
  ENV_ZENML_DEFAULT_WORKSPACE_NAME,
41
41
  IS_DEBUG_ENV,
42
+ ZENML_PRO_CONNECTION_ISSUES_SUSPENDED_PAUSED_TENANT_HINT,
42
43
  )
43
44
  from zenml.enums import (
44
45
  SecretsStoreType,
@@ -171,9 +172,14 @@ class BaseZenStore(
171
172
  )
172
173
 
173
174
  except Exception as e:
175
+ zenml_pro_extra = ""
176
+ if ".zenml.io" in self.url:
177
+ zenml_pro_extra = (
178
+ ZENML_PRO_CONNECTION_ISSUES_SUSPENDED_PAUSED_TENANT_HINT
179
+ )
174
180
  raise RuntimeError(
175
181
  f"Error initializing {self.type.value} store with URL "
176
- f"'{self.url}': {str(e)}"
182
+ f"'{self.url}': {str(e)}" + zenml_pro_extra
177
183
  ) from e
178
184
 
179
185
  if not skip_default_registrations:
@@ -0,0 +1,23 @@
1
+ """Release [0.63.0].
2
+
3
+ Revision ID: 0.63.0
4
+ Revises: 7d1919bb1ef0
5
+ Create Date: 2024-07-29 16:59:59.891939
6
+
7
+ """
8
+
9
+ # revision identifiers, used by Alembic.
10
+ revision = "0.63.0"
11
+ down_revision = "7d1919bb1ef0"
12
+ branch_labels = None
13
+ depends_on = None
14
+
15
+
16
+ def upgrade() -> None:
17
+ """Upgrade database schema and/or data, creating a new revision."""
18
+ pass
19
+
20
+
21
+ def downgrade() -> None:
22
+ """Downgrade database schema and/or data back to the previous revision."""
23
+ pass
@@ -0,0 +1,23 @@
1
+ """Release [0.64.0].
2
+
3
+ Revision ID: 0.64.0
4
+ Revises: 3dcc5d20e82f
5
+ Create Date: 2024-08-08 12:25:12.058636
6
+
7
+ """
8
+
9
+ # revision identifiers, used by Alembic.
10
+ revision = "0.64.0"
11
+ down_revision = "3dcc5d20e82f"
12
+ branch_labels = None
13
+ depends_on = None
14
+
15
+
16
+ def upgrade() -> None:
17
+ """Upgrade database schema and/or data, creating a new revision."""
18
+ pass
19
+
20
+
21
+ def downgrade() -> None:
22
+ """Downgrade database schema and/or data back to the previous revision."""
23
+ pass
@@ -0,0 +1,39 @@
1
+ """Add code path [026d4577b6a0].
2
+
3
+ Revision ID: 026d4577b6a0
4
+ Revises: 909550c7c4da
5
+ Create Date: 2024-07-30 16:53:32.777594
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ import sqlmodel
11
+ from alembic import op
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "026d4577b6a0"
15
+ down_revision = "909550c7c4da"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade() -> None:
21
+ """Upgrade database schema and/or data, creating a new revision."""
22
+ # ### commands auto generated by Alembic - please adjust! ###
23
+ with op.batch_alter_table("pipeline_deployment", schema=None) as batch_op:
24
+ batch_op.add_column(
25
+ sa.Column(
26
+ "code_path", sqlmodel.sql.sqltypes.AutoString(), nullable=True
27
+ )
28
+ )
29
+
30
+ # ### end Alembic commands ###
31
+
32
+
33
+ def downgrade() -> None:
34
+ """Downgrade database schema and/or data back to the previous revision."""
35
+ # ### commands auto generated by Alembic - please adjust! ###
36
+ with op.batch_alter_table("pipeline_deployment", schema=None) as batch_op:
37
+ batch_op.drop_column("code_path")
38
+
39
+ # ### end Alembic commands ###
@@ -0,0 +1,51 @@
1
+ """add last_user_activity [3dcc5d20e82f].
2
+
3
+ Revision ID: 3dcc5d20e82f
4
+ Revises: 909550c7c4da
5
+ Create Date: 2024-08-07 14:49:07.623500
6
+
7
+ """
8
+
9
+ from datetime import datetime, timezone
10
+
11
+ import sqlalchemy as sa
12
+ import sqlmodel
13
+ from alembic import op
14
+
15
+ # revision identifiers, used by Alembic.
16
+ revision = "3dcc5d20e82f"
17
+ down_revision = "026d4577b6a0"
18
+ branch_labels = None
19
+ depends_on = None
20
+
21
+
22
+ def upgrade() -> None:
23
+ """Upgrade database schema and/or data, creating a new revision."""
24
+ bind = op.get_bind()
25
+ session = sqlmodel.Session(bind=bind)
26
+
27
+ with op.batch_alter_table("server_settings", schema=None) as batch_op:
28
+ batch_op.add_column(
29
+ sa.Column("last_user_activity", sa.DateTime(), nullable=True)
30
+ )
31
+
32
+ session.execute(
33
+ sa.text(
34
+ """
35
+ UPDATE server_settings
36
+ SET last_user_activity = :last_user_activity
37
+ """
38
+ ),
39
+ params=(dict(last_user_activity=datetime.now(timezone.utc))),
40
+ )
41
+
42
+ with op.batch_alter_table("server_settings", schema=None) as batch_op:
43
+ batch_op.alter_column(
44
+ "last_user_activity", existing_type=sa.DateTime(), nullable=False
45
+ )
46
+
47
+
48
+ def downgrade() -> None:
49
+ """Downgrade database schema and/or data back to the previous revision."""
50
+ with op.batch_alter_table("server_settings", schema=None) as batch_op:
51
+ batch_op.drop_column("last_user_activity")
@@ -0,0 +1,100 @@
1
+ """Add run templates [7d1919bb1ef0].
2
+
3
+ Revision ID: 7d1919bb1ef0
4
+ Revises: b59aa68fdb1f
5
+ Create Date: 2024-07-22 11:20:00.544451
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ import sqlmodel
11
+ from alembic import op
12
+ from sqlalchemy.dialects import mysql
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision = "7d1919bb1ef0"
16
+ down_revision = "b59aa68fdb1f"
17
+ branch_labels = None
18
+ depends_on = None
19
+
20
+
21
+ def upgrade() -> None:
22
+ """Upgrade database schema and/or data, creating a new revision."""
23
+ # ### commands auto generated by Alembic - please adjust! ###
24
+ op.create_table(
25
+ "run_template",
26
+ sa.Column("id", sqlmodel.sql.sqltypes.GUID(), nullable=False),
27
+ sa.Column("created", sa.DateTime(), nullable=False),
28
+ sa.Column("updated", sa.DateTime(), nullable=False),
29
+ sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
30
+ sa.Column(
31
+ "description",
32
+ sa.String(length=16777215).with_variant(mysql.MEDIUMTEXT, "mysql"),
33
+ nullable=True,
34
+ ),
35
+ sa.Column("user_id", sqlmodel.sql.sqltypes.GUID(), nullable=True),
36
+ sa.Column(
37
+ "workspace_id", sqlmodel.sql.sqltypes.GUID(), nullable=False
38
+ ),
39
+ sa.Column(
40
+ "source_deployment_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
41
+ ),
42
+ sa.ForeignKeyConstraint(
43
+ ["source_deployment_id"],
44
+ ["pipeline_deployment.id"],
45
+ name="fk_run_template_source_deployment_id_pipeline_deployment",
46
+ ondelete="SET NULL",
47
+ ),
48
+ sa.ForeignKeyConstraint(
49
+ ["user_id"],
50
+ ["user.id"],
51
+ name="fk_run_template_user_id_user",
52
+ ondelete="SET NULL",
53
+ ),
54
+ sa.ForeignKeyConstraint(
55
+ ["workspace_id"],
56
+ ["workspace.id"],
57
+ name="fk_run_template_workspace_id_workspace",
58
+ ondelete="CASCADE",
59
+ ),
60
+ sa.PrimaryKeyConstraint("id"),
61
+ sa.UniqueConstraint(
62
+ "name", "workspace_id", name="unique_template_name_in_workspace"
63
+ ),
64
+ )
65
+ with op.batch_alter_table("pipeline_build", schema=None) as batch_op:
66
+ batch_op.add_column(
67
+ sa.Column(
68
+ "stack_checksum",
69
+ sqlmodel.sql.sqltypes.AutoString(),
70
+ nullable=True,
71
+ )
72
+ )
73
+ batch_op.drop_column("template_deployment_id")
74
+
75
+ with op.batch_alter_table("pipeline_deployment", schema=None) as batch_op:
76
+ batch_op.add_column(
77
+ sa.Column(
78
+ "template_id", sqlmodel.sql.sqltypes.GUID(), nullable=True
79
+ )
80
+ )
81
+
82
+ # ### end Alembic commands ###
83
+
84
+
85
+ def downgrade() -> None:
86
+ """Downgrade database schema and/or data back to the previous revision."""
87
+ # ### commands auto generated by Alembic - please adjust! ###
88
+ with op.batch_alter_table("pipeline_deployment", schema=None) as batch_op:
89
+ batch_op.drop_column("template_id")
90
+
91
+ with op.batch_alter_table("pipeline_build", schema=None) as batch_op:
92
+ batch_op.add_column(
93
+ sa.Column(
94
+ "template_deployment_id", sa.CHAR(length=32), nullable=True
95
+ )
96
+ )
97
+ batch_op.drop_column("stack_checksum")
98
+
99
+ op.drop_table("run_template")
100
+ # ### end Alembic commands ###
@@ -0,0 +1,36 @@
1
+ """Remove user hub token [909550c7c4da].
2
+
3
+ Revision ID: 909550c7c4da
4
+ Revises: 0.63.0
5
+ Create Date: 2024-08-05 16:02:48.990897
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "909550c7c4da"
14
+ down_revision = "0.63.0"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ """Upgrade database schema and/or data, creating a new revision."""
21
+ # ### commands auto generated by Alembic - please adjust! ###
22
+ with op.batch_alter_table("user", schema=None) as batch_op:
23
+ batch_op.drop_column("hub_token")
24
+
25
+ # ### end Alembic commands ###
26
+
27
+
28
+ def downgrade() -> None:
29
+ """Downgrade database schema and/or data back to the previous revision."""
30
+ # ### commands auto generated by Alembic - please adjust! ###
31
+ with op.batch_alter_table("user", schema=None) as batch_op:
32
+ batch_op.add_column(
33
+ sa.Column("hub_token", sa.VARCHAR(), nullable=True)
34
+ )
35
+
36
+ # ### end Alembic commands ###
@@ -0,0 +1,139 @@
1
+ """Simplify pipelines [b59aa68fdb1f].
2
+
3
+ Revision ID: b59aa68fdb1f
4
+ Revises: 0.62.0
5
+ Create Date: 2024-07-04 14:00:32.830722
6
+
7
+ """
8
+
9
+ from typing import Dict, Optional
10
+
11
+ import sqlalchemy as sa
12
+ import sqlmodel
13
+ from alembic import op
14
+ from sqlalchemy.dialects import mysql
15
+
16
+ # revision identifiers, used by Alembic.
17
+ revision = "b59aa68fdb1f"
18
+ down_revision = "0.62.0"
19
+ branch_labels = None
20
+ depends_on = None
21
+
22
+
23
+ def upgrade() -> None:
24
+ """Upgrade database schema and/or data, creating a new revision."""
25
+ # ### commands auto generated by Alembic - please adjust! ###
26
+
27
+ with op.batch_alter_table("pipeline_deployment", schema=None) as batch_op:
28
+ batch_op.add_column(
29
+ sa.Column(
30
+ "pipeline_version_hash",
31
+ sqlmodel.sql.sqltypes.AutoString(),
32
+ nullable=True,
33
+ )
34
+ )
35
+ batch_op.add_column(
36
+ sa.Column(
37
+ "pipeline_spec",
38
+ sa.String(length=16777215).with_variant(
39
+ mysql.MEDIUMTEXT, "mysql"
40
+ ),
41
+ nullable=True,
42
+ )
43
+ )
44
+
45
+ connection = op.get_bind()
46
+ meta = sa.MetaData()
47
+ meta.reflect(
48
+ bind=connection,
49
+ only=(
50
+ "pipeline",
51
+ "pipeline_run",
52
+ "pipeline_deployment",
53
+ "pipeline_build",
54
+ "schedule",
55
+ ),
56
+ )
57
+ pipeline_table = sa.Table("pipeline", meta)
58
+ pipeline_run_table = sa.Table("pipeline_run", meta)
59
+ pipeline_deployment_table = sa.Table("pipeline_deployment", meta)
60
+ pipeline_build_table = sa.Table("pipeline_build", meta)
61
+ schedule_table = sa.Table("schedule", meta)
62
+
63
+ def _migrate_pipeline_columns(
64
+ pipeline_id: str,
65
+ version_hash: Optional[str],
66
+ pipeline_spec: Optional[str],
67
+ ) -> None:
68
+ connection.execute(
69
+ sa.update(pipeline_deployment_table)
70
+ .where(pipeline_deployment_table.c.pipeline_id == pipeline_id)
71
+ .values(
72
+ pipeline_version_hash=version_hash, pipeline_spec=pipeline_spec
73
+ )
74
+ )
75
+
76
+ def _update_pipeline_fks(pipeline_id: str, replacement_id: str) -> None:
77
+ for table in [
78
+ pipeline_run_table,
79
+ pipeline_deployment_table,
80
+ pipeline_build_table,
81
+ schedule_table,
82
+ ]:
83
+ connection.execute(
84
+ sa.update(table)
85
+ .where(table.c.pipeline_id == pipeline_id)
86
+ .values(pipeline_id=replacement_id)
87
+ )
88
+
89
+ all_pipelines = connection.execute(sa.select(pipeline_table)).fetchall()
90
+ replacement_mapping: Dict[str, str] = {}
91
+
92
+ for pipeline in all_pipelines:
93
+ _migrate_pipeline_columns(
94
+ pipeline_id=pipeline.id,
95
+ version_hash=pipeline.version_hash,
96
+ pipeline_spec=pipeline.spec,
97
+ )
98
+
99
+ if replacement_id := replacement_mapping.get(pipeline.name):
100
+ _update_pipeline_fks(
101
+ pipeline_id=pipeline.id, replacement_id=replacement_id
102
+ )
103
+ connection.execute(
104
+ sa.delete(pipeline_table).where(
105
+ pipeline_table.c.id == pipeline.id
106
+ )
107
+ )
108
+ else:
109
+ replacement_mapping[pipeline.name] = pipeline.id
110
+
111
+ with op.batch_alter_table("pipeline", schema=None) as batch_op:
112
+ batch_op.add_column(sa.Column("description", sa.TEXT(), nullable=True))
113
+ batch_op.drop_column("spec")
114
+ batch_op.drop_column("docstring")
115
+ batch_op.drop_column("version_hash")
116
+ batch_op.drop_column("version")
117
+
118
+ # ### end Alembic commands ###
119
+
120
+
121
+ def downgrade() -> None:
122
+ """Downgrade database schema and/or data back to the previous revision."""
123
+ # ### commands auto generated by Alembic - please adjust! ###
124
+ with op.batch_alter_table("pipeline_deployment", schema=None) as batch_op:
125
+ batch_op.drop_column("pipeline_spec")
126
+ batch_op.drop_column("pipeline_version_hash")
127
+
128
+ with op.batch_alter_table("pipeline", schema=None) as batch_op:
129
+ batch_op.add_column(sa.Column("version", sa.VARCHAR(), nullable=False))
130
+ batch_op.add_column(
131
+ sa.Column("version_hash", sa.VARCHAR(), nullable=False)
132
+ )
133
+ batch_op.add_column(sa.Column("docstring", sa.TEXT(), nullable=True))
134
+ batch_op.add_column(
135
+ sa.Column("spec", sa.VARCHAR(length=16777215), nullable=False)
136
+ )
137
+ batch_op.drop_column("description")
138
+
139
+ # ### end Alembic commands ###