zenml-nightly 0.66.0.dev20240927__py3-none-any.whl → 0.68.1.dev20241102__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 (597) hide show
  1. README.md +18 -12
  2. RELEASE_NOTES.md +236 -0
  3. zenml/VERSION +1 -1
  4. zenml/__init__.py +5 -10
  5. zenml/analytics/context.py +16 -1
  6. zenml/analytics/enums.py +0 -13
  7. zenml/analytics/utils.py +18 -7
  8. zenml/artifact_stores/base_artifact_store.py +11 -0
  9. zenml/artifacts/artifact_config.py +19 -65
  10. zenml/artifacts/external_artifact.py +7 -53
  11. zenml/artifacts/external_artifact_config.py +21 -40
  12. zenml/artifacts/load_directory_materializer.py +91 -0
  13. zenml/artifacts/utils.py +204 -145
  14. zenml/cli/__init__.py +62 -127
  15. zenml/cli/base.py +8 -8
  16. zenml/cli/integration.py +0 -9
  17. zenml/cli/login.py +951 -0
  18. zenml/cli/pipeline.py +1 -1
  19. zenml/cli/served_model.py +8 -1
  20. zenml/cli/server.py +462 -577
  21. zenml/cli/service_accounts.py +4 -4
  22. zenml/cli/stack.py +78 -569
  23. zenml/cli/stack_components.py +5 -594
  24. zenml/cli/user_management.py +0 -12
  25. zenml/cli/utils.py +24 -142
  26. zenml/client.py +57 -40
  27. zenml/client_lazy_loader.py +29 -12
  28. zenml/config/compiler.py +7 -11
  29. zenml/config/global_config.py +9 -0
  30. zenml/config/pipeline_configurations.py +2 -1
  31. zenml/config/pipeline_run_configuration.py +2 -1
  32. zenml/config/server_config.py +7 -5
  33. zenml/config/step_configurations.py +2 -0
  34. zenml/constants.py +6 -42
  35. zenml/enums.py +1 -4
  36. zenml/environment.py +1 -315
  37. zenml/exceptions.py +12 -41
  38. zenml/hooks/hook_validators.py +1 -8
  39. zenml/integrations/airflow/orchestrators/airflow_orchestrator.py +2 -3
  40. zenml/integrations/argilla/__init__.py +1 -1
  41. zenml/integrations/argilla/annotators/argilla_annotator.py +234 -89
  42. zenml/integrations/argilla/flavors/argilla_annotator_flavor.py +10 -5
  43. zenml/integrations/aws/flavors/sagemaker_orchestrator_flavor.py +9 -5
  44. zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +15 -2
  45. zenml/integrations/aws/service_connectors/aws_service_connector.py +6 -0
  46. zenml/integrations/azure/__init__.py +6 -2
  47. zenml/integrations/azure/flavors/azureml_orchestrator_flavor.py +5 -4
  48. zenml/integrations/azure/orchestrators/azureml_orchestrator.py +1 -1
  49. zenml/integrations/bentoml/model_deployers/bentoml_model_deployer.py +85 -19
  50. zenml/integrations/bentoml/services/__init__.py +15 -4
  51. zenml/integrations/bentoml/services/bentoml_container_deployment.py +399 -0
  52. zenml/integrations/bentoml/services/{bentoml_deployment.py → bentoml_local_deployment.py} +81 -40
  53. zenml/{steps/base_parameters.py → integrations/bentoml/services/deployment_type.py} +8 -5
  54. zenml/integrations/bentoml/steps/bento_builder.py +1 -0
  55. zenml/integrations/bentoml/steps/bentoml_deployer.py +93 -41
  56. zenml/integrations/github/code_repositories/github_code_repository.py +1 -1
  57. zenml/integrations/gitlab/code_repositories/gitlab_code_repository.py +6 -1
  58. zenml/integrations/huggingface/__init__.py +1 -6
  59. zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +3 -3
  60. zenml/integrations/lightning/orchestrators/lightning_orchestrator.py +3 -3
  61. zenml/integrations/lightning/orchestrators/lightning_orchestrator_entrypoint.py +2 -2
  62. zenml/integrations/mlflow/experiment_trackers/mlflow_experiment_tracker.py +6 -3
  63. zenml/integrations/mlflow/model_registries/mlflow_model_registry.py +6 -0
  64. zenml/integrations/mlflow/services/mlflow_deployment.py +2 -2
  65. zenml/integrations/mlflow/steps/mlflow_deployer.py +1 -1
  66. zenml/integrations/mlflow/steps/mlflow_registry.py +1 -1
  67. zenml/integrations/neptune/experiment_trackers/run_state.py +2 -2
  68. zenml/integrations/pytorch/materializers/base_pytorch_materializer.py +8 -2
  69. zenml/integrations/pytorch/materializers/pytorch_module_materializer.py +4 -1
  70. zenml/integrations/s3/artifact_stores/s3_artifact_store.py +98 -0
  71. zenml/integrations/s3/flavors/s3_artifact_store_flavor.py +14 -0
  72. zenml/integrations/s3/utils.py +40 -0
  73. zenml/integrations/tensorflow/__init__.py +0 -9
  74. zenml/logging/step_logging.py +13 -15
  75. zenml/{new/pipelines → login}/__init__.py +4 -1
  76. zenml/login/credentials.py +346 -0
  77. zenml/login/credentials_store.py +603 -0
  78. zenml/{new → login/pro}/__init__.py +4 -1
  79. zenml/login/pro/client.py +496 -0
  80. zenml/login/pro/constants.py +34 -0
  81. zenml/{lineage_graph/edge.py → login/pro/models.py} +9 -8
  82. zenml/{zen_server/deploy/terraform/providers → login/pro/organization}/__init__.py +2 -2
  83. zenml/login/pro/organization/client.py +79 -0
  84. zenml/{lineage_graph/node/base_node.py → login/pro/organization/models.py} +13 -12
  85. zenml/{new/steps → login/pro/tenant}/__init__.py +2 -1
  86. zenml/login/pro/tenant/client.py +92 -0
  87. zenml/login/pro/tenant/models.py +174 -0
  88. zenml/login/pro/utils.py +121 -0
  89. zenml/{cli → login}/web_login.py +64 -28
  90. zenml/materializers/__init__.py +2 -0
  91. zenml/materializers/base_materializer.py +43 -9
  92. zenml/materializers/built_in_materializer.py +1 -1
  93. zenml/materializers/uuid_materializer.py +79 -0
  94. zenml/metadata/lazy_load.py +10 -7
  95. zenml/metadata/metadata_types.py +49 -0
  96. zenml/model/lazy_load.py +85 -4
  97. zenml/model/model.py +61 -83
  98. zenml/model/utils.py +47 -118
  99. zenml/models/__init__.py +6 -0
  100. zenml/models/v2/base/base.py +12 -8
  101. zenml/models/v2/base/filter.py +9 -0
  102. zenml/models/v2/core/artifact_version.py +53 -25
  103. zenml/models/v2/core/component.py +54 -19
  104. zenml/models/v2/core/flavor.py +13 -13
  105. zenml/models/v2/core/model.py +4 -1
  106. zenml/models/v2/core/model_version.py +4 -6
  107. zenml/models/v2/core/model_version_artifact.py +3 -1
  108. zenml/models/v2/core/model_version_pipeline_run.py +3 -1
  109. zenml/models/v2/core/pipeline.py +3 -1
  110. zenml/models/v2/core/pipeline_run.py +24 -3
  111. zenml/models/v2/core/run_metadata.py +2 -2
  112. zenml/models/v2/core/run_template.py +3 -1
  113. zenml/models/v2/core/stack.py +7 -3
  114. zenml/models/v2/core/step_run.py +58 -14
  115. zenml/models/v2/misc/auth_models.py +11 -2
  116. zenml/models/v2/misc/server_models.py +2 -4
  117. zenml/orchestrators/base_orchestrator.py +41 -4
  118. zenml/orchestrators/input_utils.py +52 -36
  119. zenml/orchestrators/step_launcher.py +50 -171
  120. zenml/orchestrators/step_run_utils.py +574 -0
  121. zenml/orchestrators/step_runner.py +83 -120
  122. zenml/orchestrators/utils.py +46 -180
  123. zenml/pipelines/__init__.py +3 -16
  124. zenml/{new/pipelines → pipelines}/pipeline_context.py +3 -18
  125. zenml/pipelines/pipeline_decorator.py +34 -60
  126. zenml/{new/pipelines/pipeline.py → pipelines/pipeline_definition.py} +210 -207
  127. zenml/{new/pipelines → pipelines}/run_utils.py +11 -10
  128. zenml/services/local/local_daemon_entrypoint.py +4 -4
  129. zenml/services/service.py +2 -2
  130. zenml/stack/stack.py +3 -108
  131. zenml/stack/stack_component.py +2 -78
  132. zenml/stack/utils.py +26 -14
  133. zenml/stack_deployments/aws_stack_deployment.py +3 -0
  134. zenml/step_operators/step_operator_entrypoint_configuration.py +1 -1
  135. zenml/steps/__init__.py +3 -9
  136. zenml/steps/base_step.py +25 -267
  137. zenml/steps/entrypoint_function_utils.py +2 -80
  138. zenml/{new/steps → steps}/step_context.py +12 -66
  139. zenml/steps/step_decorator.py +42 -89
  140. zenml/steps/step_invocation.py +16 -60
  141. zenml/steps/utils.py +4 -23
  142. zenml/utils/dashboard_utils.py +16 -51
  143. zenml/utils/materializer_utils.py +1 -1
  144. zenml/utils/requirements_utils.py +71 -0
  145. zenml/utils/singleton.py +15 -3
  146. zenml/utils/source_utils.py +39 -2
  147. zenml/utils/typing_utils.py +8 -28
  148. zenml/utils/visualization_utils.py +1 -1
  149. zenml/zen_server/auth.py +44 -39
  150. zenml/zen_server/dashboard/assets/{404-Y50hSt65.js → 404-DT4QRUqN.js} +1 -1
  151. zenml/zen_server/dashboard/assets/@radix-DP6vWzyx.js +85 -0
  152. zenml/zen_server/dashboard/assets/@react-router-BMhZulnd.js +29 -0
  153. zenml/zen_server/dashboard/assets/@reactflow-8U9qNlMR.js +17 -0
  154. zenml/zen_server/dashboard/assets/@tanstack-BUCbhJyH.js +22 -0
  155. zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-xLR9a1iw.js → AlertDialogDropdownItem-C6N2rGrB.js} +1 -1
  156. zenml/zen_server/dashboard/assets/{CodeSnippet-IxXNxUDa.js → CodeSnippet-CqybNv0k.js} +1 -1
  157. zenml/zen_server/dashboard/assets/{CollapsibleCard-BhutZbBL.js → CollapsibleCard-0r_8G2Lj.js} +1 -1
  158. zenml/zen_server/dashboard/assets/{Commands-Bf-rd1z8.js → Commands-BDjgBQKi.js} +1 -1
  159. zenml/zen_server/dashboard/assets/ComponentBadge-DUiEYJHu.js +1 -0
  160. zenml/zen_server/dashboard/assets/ComponentFallbackDialog-BFoH5K4V.js +1 -0
  161. zenml/zen_server/dashboard/assets/ComponentIcon-CAIoUis2.js +1 -0
  162. zenml/zen_server/dashboard/assets/{CopyButton-DcFHidFJ.js → CopyButton-C745BrKi.js} +1 -1
  163. zenml/zen_server/dashboard/assets/{CsvVizualization-QSbjrfxw.js → CsvVizualization-PpAq0CeZ.js} +5 -5
  164. zenml/zen_server/dashboard/assets/{DialogItem-Cd3HqST4.js → DialogItem-DcVCZEew.js} +1 -1
  165. zenml/zen_server/dashboard/assets/{DisplayDate-DkCy54Bp.js → DisplayDate-BeXgUG_C.js} +1 -1
  166. zenml/zen_server/dashboard/assets/{EmptyState-Cs3DEmso.js → EmptyState-DeK7H4pr.js} +1 -1
  167. zenml/zen_server/dashboard/assets/{Error-BhwdmqK7.js → Error-BMlzibXj.js} +1 -1
  168. zenml/zen_server/dashboard/assets/{Helpbox-0pBpTwTm.js → Helpbox-BLf40fLV.js} +1 -1
  169. zenml/zen_server/dashboard/assets/{Infobox-BTK_EUKT.js → Infobox-BwisKifi.js} +1 -1
  170. zenml/zen_server/dashboard/assets/{InlineAvatar-CA3DFMcM.js → InlineAvatar-jEgodSgX.js} +1 -1
  171. zenml/zen_server/dashboard/assets/{Lock-CmIn0szs.js → Lock-3lLt1ih0.js} +1 -1
  172. zenml/zen_server/dashboard/assets/MarkdownVisualization-8O9kTr-2.js +14 -0
  173. zenml/zen_server/dashboard/assets/{NumberBox-CrN0_kqI.js → NumberBox-T9eELfLZ.js} +1 -1
  174. zenml/zen_server/dashboard/assets/{Partials-QLOZw624.js → Partials-YPBB3V4q.js} +1 -1
  175. zenml/zen_server/dashboard/assets/{PasswordChecker-DE71J_3F.js → PasswordChecker-CW0kqY0W.js} +1 -1
  176. zenml/zen_server/dashboard/assets/{ProviderIcon-C16CCIN4.js → ProviderIcon-Bb3Xha5A.js} +1 -1
  177. zenml/zen_server/dashboard/assets/{ProviderRadio-D3FuCHf3.js → ProviderRadio-BROY1700.js} +1 -1
  178. zenml/zen_server/dashboard/assets/RunSelector-DCiL3M1c.js +1 -0
  179. zenml/zen_server/dashboard/assets/SearchField-DfUiGFVd.js +1 -0
  180. zenml/zen_server/dashboard/assets/{SecretTooltip-BaMwHF-Q.js → SecretTooltip-C_qByGWB.js} +1 -1
  181. zenml/zen_server/dashboard/assets/{SetPassword-DuIC65H9.js → SetPassword-7pRB00El.js} +1 -1
  182. zenml/zen_server/dashboard/assets/{Tick-DJTCF0Re.js → Tick-CykQFPj2.js} +1 -1
  183. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-CUm-DMpw.js → UpdatePasswordSchemas-DckMEkFf.js} +1 -1
  184. zenml/zen_server/dashboard/assets/{UsageReason-CKw0juLF.js → UsageReason-DVceN14P.js} +1 -1
  185. zenml/zen_server/dashboard/assets/{WizardFooter-Cv9ApYWU.js → WizardFooter-CW0Cvd70.js} +1 -1
  186. zenml/zen_server/dashboard/assets/{check-circle-DOoS4yhF.js → check-circle-Dwxliy1Z.js} +1 -1
  187. zenml/zen_server/dashboard/assets/{chevron-down-Cwb-W_B_.js → chevron-down-8wLBS5pQ.js} +1 -1
  188. zenml/zen_server/dashboard/assets/{chevron-right-double-c9H46Kl8.js → chevron-right-double-DoD8iXWM.js} +1 -1
  189. zenml/zen_server/dashboard/assets/{cloud-only-BB4BVa6E.js → cloud-only-B-s_HMDm.js} +1 -1
  190. zenml/zen_server/dashboard/assets/{code-browser-BJYErIjr.js → code-browser-CZUQs3Wa.js} +1 -1
  191. zenml/zen_server/dashboard/assets/{copy-CaGlDsUy.js → copy-CaSMXwiU.js} +1 -1
  192. zenml/zen_server/dashboard/assets/{create-stack-F29xAUEx.js → create-stack-CEmaPZ4c.js} +1 -1
  193. zenml/zen_server/dashboard/assets/delete-run-D-LKbGyz.js +1 -0
  194. zenml/zen_server/dashboard/assets/{docker-BFAFXr2_.js → docker-BFNgg-z3.js} +1 -1
  195. zenml/zen_server/dashboard/assets/{dots-horizontal-C6K59vUm.js → dots-horizontal-DK5Duzx4.js} +1 -1
  196. zenml/zen_server/dashboard/assets/{form-schemas-BKXwSDK2.js → form-schemas-1AyOCx90.js} +1 -1
  197. zenml/zen_server/dashboard/assets/{gcp-Dj6ntk0L.js → gcp-7M2Yf3ZK.js} +1 -1
  198. zenml/zen_server/dashboard/assets/{help-CwN931fX.js → help-Dam461dC.js} +1 -1
  199. zenml/zen_server/dashboard/assets/{index-5GJ5ysEZ.js → index-BVJ8n2-j.js} +1 -1
  200. zenml/zen_server/dashboard/assets/index-Bpmj40BI.js +1 -0
  201. zenml/zen_server/dashboard/assets/index-CbU4Ln_E.css +1 -0
  202. zenml/zen_server/dashboard/assets/{index-D-mtoBj3.js → index-DKPhqP2B.js} +1 -1
  203. zenml/zen_server/dashboard/assets/index-QQb7wQEC.js +55 -0
  204. zenml/zen_server/dashboard/assets/index.esm-cuVep_NJ.js +1 -0
  205. zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-BLGc9T1a.woff2 +0 -0
  206. zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-ZzOtrSSW.woff +0 -0
  207. zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-D4Vwzodn.woff2 +0 -0
  208. zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-DH2hs3aW.woff +0 -0
  209. zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-BGBWG807.woff2 +0 -0
  210. zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-BuzJQFbW.woff +0 -0
  211. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-BPnxn4xp.woff +0 -0
  212. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-Dc4VJyIJ.woff2 +0 -0
  213. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-BShVwWPj.woff2 +0 -0
  214. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-CUiC4oBV.woff +0 -0
  215. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-Bt9VVOA-.woff +0 -0
  216. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-CaqZN2hq.woff2 +0 -0
  217. zenml/zen_server/dashboard/assets/inter-greek-400-normal-BZzXV7-1.woff +0 -0
  218. zenml/zen_server/dashboard/assets/inter-greek-400-normal-DxZsaF_h.woff2 +0 -0
  219. zenml/zen_server/dashboard/assets/inter-greek-500-normal-CeQXL5ds.woff2 +0 -0
  220. zenml/zen_server/dashboard/assets/inter-greek-500-normal-d_eO-yCQ.woff +0 -0
  221. zenml/zen_server/dashboard/assets/inter-greek-600-normal-CwicyhtI.woff +0 -0
  222. zenml/zen_server/dashboard/assets/inter-greek-600-normal-Dhlb-90d.woff2 +0 -0
  223. zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-Bput3-QP.woff2 +0 -0
  224. zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-DCpCPQOf.woff +0 -0
  225. zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-B6guLgqG.woff2 +0 -0
  226. zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-M2hEX8vc.woff +0 -0
  227. zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-C9WLioJ8.woff +0 -0
  228. zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-Cnui8OiR.woff2 +0 -0
  229. zenml/zen_server/dashboard/assets/inter-latin-400-normal-BOOGhInR.woff2 +0 -0
  230. zenml/zen_server/dashboard/assets/inter-latin-400-normal-gitzw0hO.woff +0 -0
  231. zenml/zen_server/dashboard/assets/inter-latin-500-normal-D2bGa7uu.woff2 +0 -0
  232. zenml/zen_server/dashboard/assets/inter-latin-500-normal-deR1Tlfd.woff +0 -0
  233. zenml/zen_server/dashboard/assets/inter-latin-600-normal-B5cFAncS.woff +0 -0
  234. zenml/zen_server/dashboard/assets/inter-latin-600-normal-D273HNI0.woff2 +0 -0
  235. zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-C1t-h-pH.woff +0 -0
  236. zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-hnt3BR84.woff2 +0 -0
  237. zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-CIS2RHJS.woff2 +0 -0
  238. zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-UMdmhHu2.woff +0 -0
  239. zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-BnYJhD27.woff2 +0 -0
  240. zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-CAF0vJDd.woff +0 -0
  241. zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-BUNmGMP1.woff +0 -0
  242. zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  243. zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
  244. zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-DQPw2Hwd.woff +0 -0
  245. zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
  246. zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-Cm6aH8_k.woff +0 -0
  247. zenml/zen_server/dashboard/assets/{kubernetes-BjbR6D-1.js → kubernetes--g7r02Zu.js} +1 -1
  248. zenml/zen_server/dashboard/assets/{layout-Dru15_XR.js → layout-DCSYN7-C.js} +1 -1
  249. zenml/zen_server/dashboard/assets/{link-external-BT2L8hAQ.js → link-external-CBEk6kEG.js} +1 -1
  250. zenml/zen_server/dashboard/assets/{login-mutation-ax6iL2Mb.js → login-mutation-DTcAFP1l.js} +1 -1
  251. zenml/zen_server/dashboard/assets/{logs-GiDJXbLS.js → logs-D5bdJGur.js} +1 -1
  252. zenml/zen_server/dashboard/assets/not-found-Cc-JkRH2.js +1 -0
  253. zenml/zen_server/dashboard/assets/{package-DYKZ5jKW.js → package-Cs35Szwh.js} +1 -1
  254. zenml/zen_server/dashboard/assets/{page-HkVBdZl6.js → page-9yplj5JT.js} +1 -1
  255. zenml/zen_server/dashboard/assets/{page-uORspyRu.js → page-B-y2XKIc.js} +1 -1
  256. zenml/zen_server/dashboard/assets/page-BBpOxVcY.js +1 -0
  257. zenml/zen_server/dashboard/assets/{page-BDg1F-Ug.js → page-BQQKaabe.js} +2 -2
  258. zenml/zen_server/dashboard/assets/page-BRInM1Lg.js +1 -0
  259. zenml/zen_server/dashboard/assets/{page-CvKnNK1S.js → page-BjjlMk7s.js} +1 -1
  260. zenml/zen_server/dashboard/assets/{page-BukXK1Aa.js → page-Bvd7YH2A.js} +1 -1
  261. zenml/zen_server/dashboard/assets/{page-DcTjHmYZ.js → page-C0N5q3l7.js} +1 -1
  262. zenml/zen_server/dashboard/assets/page-CT3Nep8W.js +1 -0
  263. zenml/zen_server/dashboard/assets/{page-DuqYMYmH.js → page-C_f47pBf.js} +1 -1
  264. zenml/zen_server/dashboard/assets/{page-DRfcRK1w.js → page-ClUVkl-O.js} +1 -1
  265. zenml/zen_server/dashboard/assets/page-Cmv8C_yM.js +3 -0
  266. zenml/zen_server/dashboard/assets/{page-p0BhSAWx.js → page-CyN2bdWG.js} +1 -1
  267. zenml/zen_server/dashboard/assets/page-CzzXH4fs.js +1 -0
  268. zenml/zen_server/dashboard/assets/{page-6mfzecin.js → page-DH_Z7iW1.js} +1 -1
  269. zenml/zen_server/dashboard/assets/{page-8kYmrh0B.js → page-DIOXwhiD.js} +1 -1
  270. zenml/zen_server/dashboard/assets/{page-BXarY9K2.js → page-DLixvR-7.js} +1 -1
  271. zenml/zen_server/dashboard/assets/page-DTlGjgnG.js +1 -0
  272. zenml/zen_server/dashboard/assets/page-Dbpl86h0.js +1 -0
  273. zenml/zen_server/dashboard/assets/{page-MAXyfXBq.js → page-Ddgy6kDS.js} +1 -1
  274. zenml/zen_server/dashboard/assets/page-DtCAfBLy.js +9 -0
  275. zenml/zen_server/dashboard/assets/{page-CKHNAq7z.js → page-Dx16z7nA.js} +1 -1
  276. zenml/zen_server/dashboard/assets/{page-DMSLXKGT.js → page-DzpVUZ8f.js} +1 -1
  277. zenml/zen_server/dashboard/assets/page-McUyYbo1.js +1 -0
  278. zenml/zen_server/dashboard/assets/{page-miU2rhYG.js → page-N4qoPHKb.js} +1 -1
  279. zenml/zen_server/dashboard/assets/page-T1P3RyAR.js +1 -0
  280. zenml/zen_server/dashboard/assets/{page-3qPX9WYH.js → page-bKaULTGG.js} +1 -1
  281. zenml/zen_server/dashboard/assets/page-sbXUJy9t.js +1 -0
  282. zenml/zen_server/dashboard/assets/{persist-CfJMar_k.js → persist-CP0JmYZ4.js} +1 -1
  283. zenml/zen_server/dashboard/assets/{persist-BxIR2XZs.js → persist-DNb5cdrU.js} +1 -1
  284. zenml/zen_server/dashboard/assets/{plus-Bc8eLSDM.js → plus-C9IxgN2M.js} +1 -1
  285. zenml/zen_server/dashboard/assets/{refresh-hfgWPeto.js → refresh-BVu22P_C.js} +1 -1
  286. zenml/zen_server/dashboard/assets/{rocket-SESCGQXm.js → rocket-CONEmRmB.js} +1 -1
  287. zenml/zen_server/dashboard/assets/{sharedSchema-vub0rii3.js → sharedSchema-TMLu-nYQ.js} +1 -1
  288. zenml/zen_server/dashboard/assets/stack-detail-query-xmYxSsUY.js +1 -0
  289. zenml/zen_server/dashboard/assets/{tick-circle-m-hJG8i9.js → tick-circle-CM1ZScbQ.js} +1 -1
  290. zenml/zen_server/dashboard/assets/{trash-DUWZWzse.js → trash-DkJHMOg7.js} +1 -1
  291. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-FGVP7X2U.js → update-server-settings-mutation-DsU8cNVl.js} +1 -1
  292. zenml/zen_server/dashboard/assets/{url-CbAPzsmT.js → url-D5le3J4q.js} +1 -1
  293. zenml/zen_server/dashboard/assets/zod-D89GC_vc.js +1 -0
  294. zenml/zen_server/dashboard/index.html +7 -7
  295. zenml/zen_server/deploy/__init__.py +7 -16
  296. zenml/zen_server/deploy/base_provider.py +46 -73
  297. zenml/zen_server/deploy/{local → daemon}/__init__.py +3 -3
  298. zenml/zen_server/deploy/{local/local_provider.py → daemon/daemon_provider.py} +44 -63
  299. zenml/zen_server/deploy/{local/local_zen_server.py → daemon/daemon_zen_server.py} +50 -28
  300. zenml/zen_server/deploy/deployer.py +90 -171
  301. zenml/zen_server/deploy/deployment.py +20 -12
  302. zenml/zen_server/deploy/docker/docker_provider.py +9 -28
  303. zenml/zen_server/deploy/docker/docker_zen_server.py +19 -9
  304. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  305. zenml/zen_server/deploy/helm/README.md +2 -2
  306. zenml/zen_server/exceptions.py +11 -0
  307. zenml/zen_server/feature_gate/zenml_cloud_feature_gate.py +1 -1
  308. zenml/zen_server/jwt.py +9 -9
  309. zenml/zen_server/routers/artifact_version_endpoints.py +1 -1
  310. zenml/zen_server/routers/auth_endpoints.py +30 -8
  311. zenml/zen_server/routers/runs_endpoints.py +0 -28
  312. zenml/zen_server/routers/stack_components_endpoints.py +1 -1
  313. zenml/zen_server/routers/workspaces_endpoints.py +1 -1
  314. zenml/zen_server/template_execution/runner_entrypoint_configuration.py +7 -4
  315. zenml/zen_server/template_execution/utils.py +8 -63
  316. zenml/zen_server/utils.py +67 -69
  317. zenml/zen_server/zen_server_api.py +107 -17
  318. zenml/zen_stores/base_zen_store.py +4 -51
  319. zenml/zen_stores/migrations/versions/0.67.0_release.py +23 -0
  320. zenml/zen_stores/migrations/versions/0.68.0_release.py +23 -0
  321. zenml/zen_stores/migrations/versions/0.68.1_release.py +23 -0
  322. zenml/zen_stores/migrations/versions/1d8f30c54477_migrate_to_new_.py +124 -0
  323. zenml/zen_stores/migrations/versions/c22561cbb3a9_add_artifact_unique_constraints.py +86 -0
  324. zenml/zen_stores/rest_zen_store.py +325 -147
  325. zenml/zen_stores/schemas/api_key_schemas.py +9 -4
  326. zenml/zen_stores/schemas/artifact_schemas.py +21 -2
  327. zenml/zen_stores/schemas/artifact_visualization_schemas.py +1 -1
  328. zenml/zen_stores/schemas/component_schemas.py +49 -6
  329. zenml/zen_stores/schemas/device_schemas.py +9 -4
  330. zenml/zen_stores/schemas/flavor_schemas.py +1 -1
  331. zenml/zen_stores/schemas/model_schemas.py +1 -1
  332. zenml/zen_stores/schemas/pipeline_run_schemas.py +12 -4
  333. zenml/zen_stores/schemas/service_schemas.py +1 -1
  334. zenml/zen_stores/schemas/step_run_schemas.py +3 -3
  335. zenml/zen_stores/schemas/trigger_schemas.py +1 -1
  336. zenml/zen_stores/sql_zen_store.py +422 -145
  337. zenml/zen_stores/template_utils.py +3 -1
  338. {zenml_nightly-0.66.0.dev20240927.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/METADATA +20 -18
  339. {zenml_nightly-0.66.0.dev20240927.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/RECORD +344 -506
  340. {zenml_nightly-0.66.0.dev20240927.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/WHEEL +1 -1
  341. zenml/api.py +0 -60
  342. zenml/cli/stack_recipes.py +0 -469
  343. zenml/lineage_graph/__init__.py +0 -34
  344. zenml/lineage_graph/lineage_graph.py +0 -244
  345. zenml/lineage_graph/node/__init__.py +0 -32
  346. zenml/lineage_graph/node/artifact_node.py +0 -51
  347. zenml/lineage_graph/node/step_node.py +0 -41
  348. zenml/model/model_version.py +0 -38
  349. zenml/new/pipelines/code_archive.py +0 -157
  350. zenml/new/pipelines/pipeline_decorator.py +0 -118
  351. zenml/new/steps/step_decorator.py +0 -176
  352. zenml/pipelines/base_pipeline.py +0 -273
  353. zenml/post_execution/__init__.py +0 -30
  354. zenml/post_execution/pipeline.py +0 -55
  355. zenml/post_execution/pipeline_run.py +0 -55
  356. zenml/services/terraform/__init__.py +0 -14
  357. zenml/services/terraform/terraform_service.py +0 -441
  358. zenml/steps/external_artifact.py +0 -26
  359. zenml/steps/step_environment.py +0 -108
  360. zenml/steps/step_output.py +0 -36
  361. zenml/utils/mlstacks_utils.py +0 -635
  362. zenml/utils/terraform_utils.py +0 -43
  363. zenml/zen_server/dashboard/assets/@radix-DnFH_oo1.js +0 -85
  364. zenml/zen_server/dashboard/assets/@react-router-APVeuk-U.js +0 -29
  365. zenml/zen_server/dashboard/assets/@reactflow-ytavUpwh.js +0 -17
  366. zenml/zen_server/dashboard/assets/@tanstack-QbMbTrh5.js +0 -22
  367. zenml/zen_server/dashboard/assets/ComponentBadge-gKR1OIwG.js +0 -1
  368. zenml/zen_server/dashboard/assets/ExecutionStatus-D6r6aK8J.js +0 -1
  369. zenml/zen_server/dashboard/assets/MarkdownVisualization-DS05sfBm.js +0 -14
  370. zenml/zen_server/dashboard/assets/SearchField-BzmfxS0L.js +0 -1
  371. zenml/zen_server/dashboard/assets/all-pipeline-runs-query-BA3R2Sey.js +0 -1
  372. zenml/zen_server/dashboard/assets/delete-run-CP0pcJ3U.js +0 -1
  373. zenml/zen_server/dashboard/assets/index-BhJ6ZJxv.css +0 -1
  374. zenml/zen_server/dashboard/assets/index-Ci0nJ8EZ.js +0 -55
  375. zenml/zen_server/dashboard/assets/index.esm-BE1uqCX5.js +0 -1
  376. zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-Df6ckaLK.woff2 +0 -0
  377. zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-JrS_4yms.woff +0 -0
  378. zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-BRrLR67x.woff2 +0 -0
  379. zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-DskEQOpE.woff +0 -0
  380. zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-DDpWG8g5.woff2 +0 -0
  381. zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-iz1--dBq.woff +0 -0
  382. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-CzG7Kr3z.woff +0 -0
  383. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-tyfMZHQw.woff2 +0 -0
  384. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-DOnSzjnx.woff2 +0 -0
  385. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-Xebo2OyJ.woff +0 -0
  386. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-DpA2xaRd.woff2 +0 -0
  387. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-KAwcVx6H.woff +0 -0
  388. zenml/zen_server/dashboard/assets/inter-greek-400-normal-DQXyrmoy.woff2 +0 -0
  389. zenml/zen_server/dashboard/assets/inter-greek-400-normal-DvIPHDQ7.woff +0 -0
  390. zenml/zen_server/dashboard/assets/inter-greek-500-normal-BjpBGs91.woff +0 -0
  391. zenml/zen_server/dashboard/assets/inter-greek-500-normal-CmOavsDc.woff2 +0 -0
  392. zenml/zen_server/dashboard/assets/inter-greek-600-normal-B-l8Lzzd.woff2 +0 -0
  393. zenml/zen_server/dashboard/assets/inter-greek-600-normal-BLZsI-P3.woff +0 -0
  394. zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-CIdlr5YK.woff2 +0 -0
  395. zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-_Rr29XE2.woff +0 -0
  396. zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-2pdUafRD.woff2 +0 -0
  397. zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-Dtavx3qw.woff +0 -0
  398. zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-BmtRFZgT.woff +0 -0
  399. zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-CkBLDEl_.woff2 +0 -0
  400. zenml/zen_server/dashboard/assets/inter-latin-400-normal-BT1H-PT_.woff2 +0 -0
  401. zenml/zen_server/dashboard/assets/inter-latin-400-normal-Cdi8t5Mu.woff +0 -0
  402. zenml/zen_server/dashboard/assets/inter-latin-500-normal-D4I8BKCx.woff +0 -0
  403. zenml/zen_server/dashboard/assets/inter-latin-500-normal-kWhwEdDH.woff2 +0 -0
  404. zenml/zen_server/dashboard/assets/inter-latin-600-normal-B2Ssfs8e.woff2 +0 -0
  405. zenml/zen_server/dashboard/assets/inter-latin-600-normal-Dbvh0wvx.woff +0 -0
  406. zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-8tIzm-yw.woff +0 -0
  407. zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-D3W-OpO-.woff2 +0 -0
  408. zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-B9u8Q_zH.woff2 +0 -0
  409. zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-SuUkSNTU.woff +0 -0
  410. zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-Dg0Bk0Yr.woff +0 -0
  411. zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-ao35dkSb.woff2 +0 -0
  412. zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-Cnt0N5Vm.woff2 +0 -0
  413. zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-DIOGfGLL.woff +0 -0
  414. zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-0i6yoQMg.woff +0 -0
  415. zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-5IkPJ6Nk.woff2 +0 -0
  416. zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-BQ_dbMbg.woff +0 -0
  417. zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-DjnxGF-L.woff2 +0 -0
  418. zenml/zen_server/dashboard/assets/not-found-DbjllLY_.js +0 -1
  419. zenml/zen_server/dashboard/assets/page-B1n7_W7z.js +0 -1
  420. zenml/zen_server/dashboard/assets/page-BZZhLo2u.js +0 -1
  421. zenml/zen_server/dashboard/assets/page-Bbf_oBjn.js +0 -1
  422. zenml/zen_server/dashboard/assets/page-BjjuBvZG.js +0 -9
  423. zenml/zen_server/dashboard/assets/page-CHaQkFK5.js +0 -1
  424. zenml/zen_server/dashboard/assets/page-CS0SYFK8.js +0 -1
  425. zenml/zen_server/dashboard/assets/page-DGM1CbYT.js +0 -2
  426. zenml/zen_server/dashboard/assets/page-DOmIZ2ra.js +0 -1
  427. zenml/zen_server/dashboard/assets/page-DYVmJ9_w.js +0 -3
  428. zenml/zen_server/dashboard/assets/page-Dwow2doB.js +0 -1
  429. zenml/zen_server/dashboard/assets/stack-detail-query-DQcyzG-2.js +0 -1
  430. zenml/zen_server/dashboard/assets/zod-uFd1wBcd.js +0 -1
  431. zenml/zen_server/dashboard_legacy/_redirects +0 -1
  432. zenml/zen_server/dashboard_legacy/asset-manifest.json +0 -131
  433. zenml/zen_server/dashboard_legacy/favicon.ico +0 -0
  434. zenml/zen_server/dashboard_legacy/index.html +0 -1
  435. zenml/zen_server/dashboard_legacy/manifest.json +0 -25
  436. zenml/zen_server/dashboard_legacy/precache-manifest.6d320abb70db612019dda6c4948e7a90.js +0 -462
  437. zenml/zen_server/dashboard_legacy/robots.txt +0 -2
  438. zenml/zen_server/dashboard_legacy/service-worker.js +0 -39
  439. zenml/zen_server/dashboard_legacy/static/css/2.5b37d44a.chunk.css +0 -16
  440. zenml/zen_server/dashboard_legacy/static/css/2.5b37d44a.chunk.css.map +0 -1
  441. zenml/zen_server/dashboard_legacy/static/css/main.e79dff04.chunk.css +0 -2
  442. zenml/zen_server/dashboard_legacy/static/css/main.e79dff04.chunk.css.map +0 -1
  443. zenml/zen_server/dashboard_legacy/static/js/2.7934458d.chunk.js +0 -3
  444. zenml/zen_server/dashboard_legacy/static/js/2.7934458d.chunk.js.LICENSE.txt +0 -95
  445. zenml/zen_server/dashboard_legacy/static/js/2.7934458d.chunk.js.map +0 -1
  446. zenml/zen_server/dashboard_legacy/static/js/main.fa9299d5.chunk.js +0 -2
  447. zenml/zen_server/dashboard_legacy/static/js/main.fa9299d5.chunk.js.map +0 -1
  448. zenml/zen_server/dashboard_legacy/static/js/runtime-main.bfca2edd.js +0 -2
  449. zenml/zen_server/dashboard_legacy/static/js/runtime-main.bfca2edd.js.map +0 -1
  450. zenml/zen_server/dashboard_legacy/static/media/AlertTriangle.28aee535.svg +0 -5
  451. zenml/zen_server/dashboard_legacy/static/media/ArrowSquareOut.abfb9bc7.svg +0 -5
  452. zenml/zen_server/dashboard_legacy/static/media/Back.86c23a22.svg +0 -4
  453. zenml/zen_server/dashboard_legacy/static/media/BookOpen.5cb101ff.svg +0 -4
  454. zenml/zen_server/dashboard_legacy/static/media/BoundingBox.1eb98717.svg +0 -10
  455. zenml/zen_server/dashboard_legacy/static/media/Burger.9b1c67d7.svg +0 -3
  456. zenml/zen_server/dashboard_legacy/static/media/Cached.2381fb8d.svg +0 -1
  457. zenml/zen_server/dashboard_legacy/static/media/Calendar.356e11c7.svg +0 -3
  458. zenml/zen_server/dashboard_legacy/static/media/ChartBarHorizontal.0247447b.svg +0 -6
  459. zenml/zen_server/dashboard_legacy/static/media/ChartLine.0d79e18d.svg +0 -4
  460. zenml/zen_server/dashboard_legacy/static/media/ChatDots.2e1c9211.svg +0 -6
  461. zenml/zen_server/dashboard_legacy/static/media/Check.dad6beb2.svg +0 -3
  462. zenml/zen_server/dashboard_legacy/static/media/CheckCircleFilled.c19566d0.svg +0 -3
  463. zenml/zen_server/dashboard_legacy/static/media/Checkbox.af50e31e.svg +0 -3
  464. zenml/zen_server/dashboard_legacy/static/media/ChevronDown.f860ce32.svg +0 -3
  465. zenml/zen_server/dashboard_legacy/static/media/ChevronDownLight.6642d756.svg +0 -3
  466. zenml/zen_server/dashboard_legacy/static/media/ChevronLeft.f6edfcdb.svg +0 -3
  467. zenml/zen_server/dashboard_legacy/static/media/CircleCheck.f98fd6ca.svg +0 -1
  468. zenml/zen_server/dashboard_legacy/static/media/Clock.ffc9de95.svg +0 -3
  469. zenml/zen_server/dashboard_legacy/static/media/Close.74e9efbc.svg +0 -5
  470. zenml/zen_server/dashboard_legacy/static/media/CloseWithBorder.6960930a.svg +0 -3
  471. zenml/zen_server/dashboard_legacy/static/media/CloseWithoutBorder.cd6f71df.svg +0 -3
  472. zenml/zen_server/dashboard_legacy/static/media/CloudArrowUp.0aecb235.svg +0 -6
  473. zenml/zen_server/dashboard_legacy/static/media/Code.ef0f33b5.svg +0 -3
  474. zenml/zen_server/dashboard_legacy/static/media/Config.0be63f8a.svg +0 -1
  475. zenml/zen_server/dashboard_legacy/static/media/Connector.9fd46ef1.svg +0 -10
  476. zenml/zen_server/dashboard_legacy/static/media/Copy.36e2112a.svg +0 -1
  477. zenml/zen_server/dashboard_legacy/static/media/Dashboard.d05787e0.svg +0 -3
  478. zenml/zen_server/dashboard_legacy/static/media/Data.b1c3b5f8.svg +0 -3
  479. zenml/zen_server/dashboard_legacy/static/media/Delete.3c361b28.svg +0 -8
  480. zenml/zen_server/dashboard_legacy/static/media/Docs.7541d478.svg +0 -7
  481. zenml/zen_server/dashboard_legacy/static/media/Download.fba04d87.svg +0 -5
  482. zenml/zen_server/dashboard_legacy/static/media/Edit.490eb294.svg +0 -6
  483. zenml/zen_server/dashboard_legacy/static/media/EmptyRightArrow.23749d01.svg +0 -3
  484. zenml/zen_server/dashboard_legacy/static/media/Example.6396cd37.svg +0 -5
  485. zenml/zen_server/dashboard_legacy/static/media/Extension.1394cd4a.svg +0 -3
  486. zenml/zen_server/dashboard_legacy/static/media/Eye.d9e4ee62.svg +0 -4
  487. zenml/zen_server/dashboard_legacy/static/media/Failed.0213c1a0.svg +0 -1
  488. zenml/zen_server/dashboard_legacy/static/media/FileText.1f15bacd.svg +0 -7
  489. zenml/zen_server/dashboard_legacy/static/media/Filter.ab6b9c0d.svg +0 -3
  490. zenml/zen_server/dashboard_legacy/static/media/Folders.12b29887.svg +0 -5
  491. zenml/zen_server/dashboard_legacy/static/media/FunnelFill.6df4c143.svg +0 -3
  492. zenml/zen_server/dashboard_legacy/static/media/GitCommit.7dd9c2aa.svg +0 -5
  493. zenml/zen_server/dashboard_legacy/static/media/GitHub_Logo.cefc2023.png +0 -0
  494. zenml/zen_server/dashboard_legacy/static/media/Graph.2c63a892.svg +0 -11
  495. zenml/zen_server/dashboard_legacy/static/media/History.08329240.svg +0 -3
  496. zenml/zen_server/dashboard_legacy/static/media/Home.0843b0d5.svg +0 -3
  497. zenml/zen_server/dashboard_legacy/static/media/ImageBuilder.ea762d9c.svg +0 -6
  498. zenml/zen_server/dashboard_legacy/static/media/InProgress.304a0edc.svg +0 -1
  499. zenml/zen_server/dashboard_legacy/static/media/Info.9fe10c5c.svg +0 -3
  500. zenml/zen_server/dashboard_legacy/static/media/KeyboardReturn.491afbe3.svg +0 -3
  501. zenml/zen_server/dashboard_legacy/static/media/Link.72bbb55d.svg +0 -4
  502. zenml/zen_server/dashboard_legacy/static/media/Lock.30f5e1fe.svg +0 -5
  503. zenml/zen_server/dashboard_legacy/static/media/Lock2.a769ea52.svg +0 -3
  504. zenml/zen_server/dashboard_legacy/static/media/LockKey.92f21621.svg +0 -6
  505. zenml/zen_server/dashboard_legacy/static/media/Logs.8bf4d005.svg +0 -5
  506. zenml/zen_server/dashboard_legacy/static/media/MinusCircle.4188f418.svg +0 -4
  507. zenml/zen_server/dashboard_legacy/static/media/ModelRegistry.f0de050a.svg +0 -6
  508. zenml/zen_server/dashboard_legacy/static/media/MultiUser.a2ba7c67.svg +0 -10
  509. zenml/zen_server/dashboard_legacy/static/media/PaginationFirst.92628634.svg +0 -4
  510. zenml/zen_server/dashboard_legacy/static/media/PaginationLast.00d3c732.svg +0 -4
  511. zenml/zen_server/dashboard_legacy/static/media/PaginationNext.86158845.svg +0 -3
  512. zenml/zen_server/dashboard_legacy/static/media/PaginationPrev.60c18a88.svg +0 -3
  513. zenml/zen_server/dashboard_legacy/static/media/Pen.f2d831d4.svg +0 -6
  514. zenml/zen_server/dashboard_legacy/static/media/PhotoCamera.179d6d4c.svg +0 -3
  515. zenml/zen_server/dashboard_legacy/static/media/Pipeline.30d298b0.svg +0 -7
  516. zenml/zen_server/dashboard_legacy/static/media/Plus.5aa1c16b.svg +0 -3
  517. zenml/zen_server/dashboard_legacy/static/media/PlusCircle.92d860dd.svg +0 -5
  518. zenml/zen_server/dashboard_legacy/static/media/Repositories.71a36b8c.svg +0 -3
  519. zenml/zen_server/dashboard_legacy/static/media/RightArrow.f30d3871.svg +0 -29
  520. zenml/zen_server/dashboard_legacy/static/media/Rocket.63bf7b9d.svg +0 -3
  521. zenml/zen_server/dashboard_legacy/static/media/RocketLaunch.1bff2b59.svg +0 -6
  522. zenml/zen_server/dashboard_legacy/static/media/Rubik-Medium.c87313aa.ttf +0 -0
  523. zenml/zen_server/dashboard_legacy/static/media/Rubik-Regular.b3d0902b.ttf +0 -0
  524. zenml/zen_server/dashboard_legacy/static/media/Run.daec4fb2.svg +0 -6
  525. zenml/zen_server/dashboard_legacy/static/media/Search.d1afcce5.svg +0 -4
  526. zenml/zen_server/dashboard_legacy/static/media/Settings.59ca73ae.svg +0 -4
  527. zenml/zen_server/dashboard_legacy/static/media/Share2.46c3ff66.svg +0 -3
  528. zenml/zen_server/dashboard_legacy/static/media/SignOut.6aa718c5.svg +0 -3
  529. zenml/zen_server/dashboard_legacy/static/media/SimplePlus.5cf7ec20.svg +0 -3
  530. zenml/zen_server/dashboard_legacy/static/media/SingleUser.bef3a095.svg +0 -4
  531. zenml/zen_server/dashboard_legacy/static/media/SourceCodePro-Regular.b484b32f.ttf +0 -0
  532. zenml/zen_server/dashboard_legacy/static/media/Stack.19b604ac.svg +0 -5
  533. zenml/zen_server/dashboard_legacy/static/media/StackComponent.b1ba90b5.svg +0 -4
  534. zenml/zen_server/dashboard_legacy/static/media/Star.f0c25022.svg +0 -9
  535. zenml/zen_server/dashboard_legacy/static/media/StarOutline.94ca8cd9.svg +0 -3
  536. zenml/zen_server/dashboard_legacy/static/media/Storefront.4b4796fe.svg +0 -3
  537. zenml/zen_server/dashboard_legacy/static/media/Stream.543e3039.svg +0 -3
  538. zenml/zen_server/dashboard_legacy/static/media/SupportAgent.510ddf1f.svg +0 -8
  539. zenml/zen_server/dashboard_legacy/static/media/Table.77033750.svg +0 -6
  540. zenml/zen_server/dashboard_legacy/static/media/Tool.d5785486.svg +0 -3
  541. zenml/zen_server/dashboard_legacy/static/media/UserPlus.741a99d7.svg +0 -6
  542. zenml/zen_server/dashboard_legacy/static/media/Verified.0625b2a0.svg +0 -3
  543. zenml/zen_server/dashboard_legacy/static/media/addNew.4fb6c939.svg +0 -8
  544. zenml/zen_server/dashboard_legacy/static/media/arrowClose.cbd53f3f.svg +0 -3
  545. zenml/zen_server/dashboard_legacy/static/media/arrowOpen.6ceef0af.svg +0 -3
  546. zenml/zen_server/dashboard_legacy/static/media/check_small.30bc0138.svg +0 -3
  547. zenml/zen_server/dashboard_legacy/static/media/circleArrowSideClose.98d6013e.svg +0 -18
  548. zenml/zen_server/dashboard_legacy/static/media/circleArrowSideOpen.63653df6.svg +0 -18
  549. zenml/zen_server/dashboard_legacy/static/media/image.104fd14b.png +0 -0
  550. zenml/zen_server/dashboard_legacy/static/media/imageAddIcon.e83004a9.svg +0 -7
  551. zenml/zen_server/dashboard_legacy/static/media/logo.93333e5c.svg +0 -1
  552. zenml/zen_server/dashboard_legacy/static/media/logo_small.4204397d.svg +0 -3
  553. zenml/zen_server/dashboard_legacy/static/media/logo_white.d4b4414e.svg +0 -20
  554. zenml/zen_server/dashboard_legacy/static/media/notConnected.5e2c8ea7.svg +0 -8
  555. zenml/zen_server/dashboard_legacy/static/media/plugin-fallback.72c294e6.svg +0 -6
  556. zenml/zen_server/dashboard_legacy/static/media/share.bcd998b0.svg +0 -5
  557. zenml/zen_server/dashboard_legacy/static/media/stars.08a9b19a.svg +0 -8
  558. zenml/zen_server/deploy/terraform/__init__.py +0 -41
  559. zenml/zen_server/deploy/terraform/providers/aws_provider.py +0 -61
  560. zenml/zen_server/deploy/terraform/providers/azure_provider.py +0 -59
  561. zenml/zen_server/deploy/terraform/providers/gcp_provider.py +0 -59
  562. zenml/zen_server/deploy/terraform/providers/terraform_provider.py +0 -331
  563. zenml/zen_server/deploy/terraform/recipes/aws/.gitignore +0 -8
  564. zenml/zen_server/deploy/terraform/recipes/aws/helm.tf +0 -20
  565. zenml/zen_server/deploy/terraform/recipes/aws/ingress.tf +0 -30
  566. zenml/zen_server/deploy/terraform/recipes/aws/outputs.tf +0 -7
  567. zenml/zen_server/deploy/terraform/recipes/aws/printf.cmd +0 -2
  568. zenml/zen_server/deploy/terraform/recipes/aws/sql.tf +0 -62
  569. zenml/zen_server/deploy/terraform/recipes/aws/terraform.tf +0 -44
  570. zenml/zen_server/deploy/terraform/recipes/aws/variables.tf +0 -167
  571. zenml/zen_server/deploy/terraform/recipes/aws/vpc.tf +0 -47
  572. zenml/zen_server/deploy/terraform/recipes/aws/zen_server.tf +0 -103
  573. zenml/zen_server/deploy/terraform/recipes/azure/.gitignore +0 -8
  574. zenml/zen_server/deploy/terraform/recipes/azure/helm.tf +0 -20
  575. zenml/zen_server/deploy/terraform/recipes/azure/ingress.tf +0 -30
  576. zenml/zen_server/deploy/terraform/recipes/azure/key_vault.tf +0 -73
  577. zenml/zen_server/deploy/terraform/recipes/azure/outputs.tf +0 -7
  578. zenml/zen_server/deploy/terraform/recipes/azure/printf.cmd +0 -2
  579. zenml/zen_server/deploy/terraform/recipes/azure/rg.tf +0 -36
  580. zenml/zen_server/deploy/terraform/recipes/azure/sql.tf +0 -65
  581. zenml/zen_server/deploy/terraform/recipes/azure/terraform.tf +0 -52
  582. zenml/zen_server/deploy/terraform/recipes/azure/variables.tf +0 -176
  583. zenml/zen_server/deploy/terraform/recipes/azure/zen_server.tf +0 -103
  584. zenml/zen_server/deploy/terraform/recipes/gcp/.gitignore +0 -8
  585. zenml/zen_server/deploy/terraform/recipes/gcp/helm.tf +0 -20
  586. zenml/zen_server/deploy/terraform/recipes/gcp/ingress.tf +0 -30
  587. zenml/zen_server/deploy/terraform/recipes/gcp/outputs.tf +0 -7
  588. zenml/zen_server/deploy/terraform/recipes/gcp/printf.cmd +0 -2
  589. zenml/zen_server/deploy/terraform/recipes/gcp/sql.tf +0 -64
  590. zenml/zen_server/deploy/terraform/recipes/gcp/terraform.tf +0 -44
  591. zenml/zen_server/deploy/terraform/recipes/gcp/variables.tf +0 -171
  592. zenml/zen_server/deploy/terraform/recipes/gcp/zen_server.tf +0 -114
  593. zenml/zen_server/deploy/terraform/terraform_zen_server.py +0 -246
  594. /zenml/{new/pipelines → pipelines}/build_utils.py +0 -0
  595. /zenml/{new/steps → steps}/decorated_step.py +0 -0
  596. {zenml_nightly-0.66.0.dev20240927.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/LICENSE +0 -0
  597. {zenml_nightly-0.66.0.dev20240927.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/entry_points.txt +0 -0
zenml/cli/login.py ADDED
@@ -0,0 +1,951 @@
1
+ # Copyright (c) ZenML GmbH 2022. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at:
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12
+ # or implied. See the License for the specific language governing
13
+ # permissions and limitations under the License.
14
+ """CLI for managing ZenML server deployments."""
15
+
16
+ import ipaddress
17
+ import re
18
+ import sys
19
+ import time
20
+ from typing import Any, Dict, Optional, Union
21
+ from uuid import UUID
22
+
23
+ import click
24
+
25
+ from zenml.cli import utils as cli_utils
26
+ from zenml.cli.cli import cli
27
+ from zenml.config.global_config import GlobalConfiguration
28
+ from zenml.console import console
29
+ from zenml.enums import ServerProviderType, StoreType
30
+ from zenml.exceptions import (
31
+ AuthorizationException,
32
+ CredentialsNotValid,
33
+ IllegalOperationError,
34
+ )
35
+ from zenml.logger import get_logger
36
+ from zenml.login.pro.utils import is_zenml_pro_server_url
37
+ from zenml.login.web_login import web_login
38
+ from zenml.zen_server.utils import (
39
+ connected_to_local_server,
40
+ get_local_server,
41
+ show_dashboard,
42
+ )
43
+
44
+ logger = get_logger(__name__)
45
+
46
+
47
+ def start_local_server(
48
+ docker: bool = False,
49
+ ip_address: Union[
50
+ ipaddress.IPv4Address, ipaddress.IPv6Address, None
51
+ ] = None,
52
+ port: Optional[int] = None,
53
+ blocking: bool = False,
54
+ image: Optional[str] = None,
55
+ ngrok_token: Optional[str] = None,
56
+ restart: bool = False,
57
+ ) -> None:
58
+ """Start the ZenML dashboard locally and connect the client to it.
59
+
60
+ Args:
61
+ docker: Use a docker deployment instead of the local process.
62
+ ip_address: The IP address to bind the server to.
63
+ port: The port to bind the server to.
64
+ blocking: Block the CLI while the server is running.
65
+ image: A custom Docker image to use for the server, when the
66
+ `--docker` flag is set.
67
+ ngrok_token: An ngrok auth token to use for exposing the ZenML dashboard
68
+ on a public domain. Primarily used for accessing the dashboard in
69
+ Colab.
70
+ restart: Restart the local ZenML server if it is already running.
71
+ """
72
+ from zenml.zen_server.deploy.deployer import LocalServerDeployer
73
+
74
+ if docker:
75
+ from zenml.utils.docker_utils import check_docker
76
+
77
+ if not check_docker():
78
+ cli_utils.error(
79
+ "Docker does not seem to be installed on your system. Please "
80
+ "install Docker to use the Docker ZenML server local "
81
+ "deployment or use one of the other deployment options."
82
+ )
83
+ provider = ServerProviderType.DOCKER
84
+ else:
85
+ if sys.platform == "win32" and not blocking:
86
+ cli_utils.error(
87
+ "Running the ZenML server locally as a background process is "
88
+ "not supported on Windows. Please use the `--blocking` flag "
89
+ "to run the server in blocking mode, or run the server in "
90
+ "a Docker container by setting `--docker` instead."
91
+ )
92
+ else:
93
+ pass
94
+ provider = ServerProviderType.DAEMON
95
+ if cli_utils.requires_mac_env_var_warning():
96
+ cli_utils.error(
97
+ "The `OBJC_DISABLE_INITIALIZE_FORK_SAFETY` environment variable "
98
+ "is recommended to run the ZenML server locally on a Mac. "
99
+ "Please set it to `YES` and try again."
100
+ )
101
+
102
+ deployer = LocalServerDeployer()
103
+
104
+ config_attrs: Dict[str, Any] = dict(
105
+ provider=provider,
106
+ )
107
+ if not docker:
108
+ config_attrs["blocking"] = blocking
109
+ elif image:
110
+ config_attrs["image"] = image
111
+ if port is not None:
112
+ config_attrs["port"] = port
113
+ if ip_address is not None:
114
+ config_attrs["ip_address"] = ip_address
115
+
116
+ from zenml.zen_server.deploy.deployment import LocalServerDeploymentConfig
117
+
118
+ server_config = LocalServerDeploymentConfig(**config_attrs)
119
+ if blocking:
120
+ deployer.remove_server()
121
+ cli_utils.declare(
122
+ "The local ZenML dashboard is about to deploy in a "
123
+ "blocking process."
124
+ )
125
+
126
+ server = deployer.deploy_server(server_config, restart=restart)
127
+
128
+ if not blocking:
129
+ deployer.connect_to_server()
130
+
131
+ if server.status and server.status.url:
132
+ cli_utils.declare(
133
+ f"The local ZenML dashboard is available at "
134
+ f"'{server.status.url}'."
135
+ )
136
+ show_dashboard(
137
+ local=True,
138
+ ngrok_token=ngrok_token,
139
+ )
140
+
141
+
142
+ def connect_to_server(
143
+ url: str,
144
+ api_key: Optional[str] = None,
145
+ verify_ssl: Union[str, bool] = True,
146
+ refresh: bool = False,
147
+ ) -> None:
148
+ """Connect the client to a ZenML server or a SQL database.
149
+
150
+ Args:
151
+ url: The URL of the ZenML server or the SQL database to connect to.
152
+ api_key: The API key to use to authenticate with the ZenML server.
153
+ verify_ssl: Whether to verify the server's TLS certificate. If a string
154
+ is passed, it is interpreted as the path to a CA bundle file.
155
+ refresh: Whether to force a new login flow with the ZenML server.
156
+ """
157
+ from zenml.login.credentials_store import get_credentials_store
158
+ from zenml.zen_stores.base_zen_store import BaseZenStore
159
+
160
+ url = url.rstrip("/")
161
+
162
+ store_type = BaseZenStore.get_store_type(url)
163
+ if store_type == StoreType.REST:
164
+ from zenml.zen_stores.rest_zen_store import RestZenStoreConfiguration
165
+
166
+ credentials_store = get_credentials_store()
167
+ if api_key:
168
+ cli_utils.declare(
169
+ f"Authenticating to ZenML server '{url}' using an API key..."
170
+ )
171
+ credentials_store.set_api_key(url, api_key)
172
+ elif not is_zenml_pro_server_url(url):
173
+ if refresh or not credentials_store.has_valid_authentication(url):
174
+ cli_utils.declare(
175
+ f"Authenticating to ZenML server '{url}' using the web "
176
+ "login..."
177
+ )
178
+ web_login(url=url, verify_ssl=verify_ssl)
179
+ else:
180
+ cli_utils.declare(f"Connecting to ZenML server '{url}'...")
181
+ else:
182
+ # We don't have to do anything here assuming the user has already
183
+ # logged in to the ZenML Pro server using the ZenML Pro web login
184
+ # flow.
185
+ cli_utils.declare(f"Authenticating to ZenML server '{url}'...")
186
+
187
+ rest_store_config = RestZenStoreConfiguration(
188
+ url=url,
189
+ verify_ssl=verify_ssl,
190
+ )
191
+ try:
192
+ GlobalConfiguration().set_store(rest_store_config)
193
+ except IllegalOperationError:
194
+ cli_utils.error(
195
+ f"You do not have sufficient permissions to "
196
+ f"access the server at '{url}'."
197
+ )
198
+ except CredentialsNotValid as e:
199
+ cli_utils.error(f"Authorization error: {e}")
200
+
201
+ else:
202
+ from zenml.zen_stores.sql_zen_store import SqlZenStoreConfiguration
203
+
204
+ # Connect to a SQL database
205
+ sql_store_config = SqlZenStoreConfiguration(
206
+ url=url,
207
+ )
208
+ cli_utils.declare(f"Connecting to SQL database '{url}'...")
209
+
210
+ try:
211
+ GlobalConfiguration().set_store(sql_store_config)
212
+ except IllegalOperationError:
213
+ cli_utils.warning(
214
+ f"You do not have sufficient permissions to "
215
+ f"access the SQL database at '{url}'."
216
+ )
217
+ except CredentialsNotValid as e:
218
+ cli_utils.warning(f"Authorization error: {e}")
219
+
220
+ cli_utils.declare(f"Connected to SQL database '{url}'")
221
+
222
+
223
+ def connect_to_pro_server(
224
+ pro_server: Optional[str] = None,
225
+ api_key: Optional[str] = None,
226
+ refresh: bool = False,
227
+ ) -> None:
228
+ """Connect the client to a ZenML Pro server.
229
+
230
+ Args:
231
+ pro_server: The UUID, name or URL of the ZenML Pro server to connect to.
232
+ If not provided, the web login flow will be initiated.
233
+ api_key: The API key to use to authenticate with the ZenML Pro server.
234
+ refresh: Whether to force a new login flow with the ZenML Pro server.
235
+
236
+ Raises:
237
+ ValueError: If incorrect parameters are provided.
238
+ AuthorizationException: If the user does not have access to the ZenML
239
+ Pro server.
240
+ """
241
+ from zenml.login.credentials_store import get_credentials_store
242
+ from zenml.login.pro.client import ZenMLProClient
243
+ from zenml.login.pro.tenant.models import TenantStatus
244
+
245
+ server_id, server_url, server_name = None, None, None
246
+ login = False
247
+ if not pro_server:
248
+ login = True
249
+ if api_key:
250
+ raise ValueError(
251
+ "You must provide the URL of the ZenML Pro server when "
252
+ "connecting with an API key."
253
+ )
254
+
255
+ elif not re.match(r"^https?://", pro_server):
256
+ # The server argument is not a URL, so it must be a ZenML Pro server
257
+ # name or UUID.
258
+ try:
259
+ server_id = UUID(pro_server)
260
+ except ValueError:
261
+ # The server argument is not a UUID, so it must be a ZenML Pro
262
+ # server name.
263
+ server_name = pro_server
264
+ else:
265
+ server_url = pro_server
266
+ if not is_zenml_pro_server_url(server_url):
267
+ raise ValueError(
268
+ f"The URL '{server_url}' does not seem to belong to a ZenML Pro "
269
+ "server. Please check the server URL and try again."
270
+ )
271
+
272
+ credentials_store = get_credentials_store()
273
+ if not credentials_store.has_valid_pro_authentication():
274
+ # Without valid ZenML Pro credentials, we can only connect to a ZenML
275
+ # Pro server with an API key and we also need to know the URL of the
276
+ # server to connect to.
277
+ if api_key:
278
+ if server_url:
279
+ connect_to_server(server_url, api_key=api_key)
280
+ return
281
+ else:
282
+ raise ValueError(
283
+ "You must provide the URL of the ZenML Pro server when "
284
+ "connecting with an API key."
285
+ )
286
+ else:
287
+ login = True
288
+
289
+ if login or refresh:
290
+ try:
291
+ token = web_login()
292
+ except AuthorizationException as e:
293
+ cli_utils.error(f"Authorization error: {e}")
294
+
295
+ cli_utils.declare(
296
+ "You can now run 'zenml server list' to view the available ZenML "
297
+ "Pro servers and then 'zenml login <server-url-name-or-id>' to "
298
+ "connect to a specific server without having to log in again until "
299
+ "your session expires."
300
+ )
301
+
302
+ tenant_id: Optional[str] = None
303
+ if token.device_metadata:
304
+ tenant_id = token.device_metadata.get("tenant_id")
305
+
306
+ if tenant_id is None and pro_server is None:
307
+ # This is not really supposed to happen, because the implementation
308
+ # of the web login workflow should always return a tenant ID, but
309
+ # we're handling it just in case.
310
+ cli_utils.declare(
311
+ "A valid server was not selected during the login process. "
312
+ "Please run `zenml server list` to display a list of available "
313
+ "servers and then `zenml login <server-url-name-or-id>` to "
314
+ "connect to a server."
315
+ )
316
+ return
317
+
318
+ # The server selected during the web login process overrides any
319
+ # server argument passed to the command.
320
+ server_id = UUID(tenant_id)
321
+
322
+ client = ZenMLProClient()
323
+
324
+ if server_id:
325
+ server = client.tenant.get(server_id)
326
+ elif server_url:
327
+ servers = client.tenant.list(url=server_url, member_only=True)
328
+ if not servers:
329
+ raise AuthorizationException(
330
+ f"The '{server_url}' URL belongs to a ZenML Pro server, "
331
+ "but it doesn't look like you have access to it. Please "
332
+ "check the server URL and your permissions and try again."
333
+ )
334
+
335
+ server = servers[0]
336
+ elif server_name:
337
+ servers = client.tenant.list(tenant_name=server_name, member_only=True)
338
+ if not servers:
339
+ raise AuthorizationException(
340
+ f"No ZenML Pro server with the name '{server_name}' exists "
341
+ "or you don't have access to it. Please check the server name "
342
+ "and your permissions and try again."
343
+ )
344
+ server = servers[0]
345
+ else:
346
+ raise ValueError(
347
+ "No server ID, URL, or name was provided. Please provide one of "
348
+ "these values to connect to a ZenML Pro server."
349
+ )
350
+
351
+ server_id = server.id
352
+
353
+ if server.status == TenantStatus.PENDING:
354
+ with console.status(
355
+ f"Waiting for your `{server.name}` ZenML Pro server to be set up..."
356
+ ):
357
+ timeout = 180 # 3 minutes
358
+ while True:
359
+ time.sleep(5)
360
+ server = client.tenant.get(server_id)
361
+ if server.status != TenantStatus.PENDING:
362
+ break
363
+ timeout -= 5
364
+ if timeout <= 0:
365
+ cli_utils.error(
366
+ f"Your `{server.name}` ZenML Pro server is taking "
367
+ "longer than expected to set up. Please try again "
368
+ "later or manage the server state by visiting the "
369
+ f"ZenML Pro dashboard at {server.dashboard_url}."
370
+ )
371
+
372
+ if server.status == TenantStatus.FAILED:
373
+ cli_utils.error(
374
+ f"Your `{server.name}` ZenML Pro server is currently in a "
375
+ "failed state. Please manage the server state by visiting the "
376
+ f"ZenML Pro dashboard at {server.dashboard_url}, or contact "
377
+ "your server administrator."
378
+ )
379
+
380
+ elif server.status == TenantStatus.DEACTIVATED:
381
+ cli_utils.error(
382
+ f"Your `{server.name}` ZenML Pro server is currently "
383
+ "deactivated. Please manage the server state by visiting the "
384
+ f"ZenML Pro dashboard at {server.dashboard_url}, or contact "
385
+ "your server administrator."
386
+ )
387
+
388
+ elif server.status == TenantStatus.AVAILABLE:
389
+ if not server.url:
390
+ cli_utils.error(
391
+ f"The ZenML Pro server '{server.name}' is not currently "
392
+ f"running. Visit the ZenML Pro dashboard to manage the server "
393
+ f"status at: {server.dashboard_url}"
394
+ )
395
+ else:
396
+ cli_utils.error(
397
+ f"Your `{server.name}` ZenML Pro server is currently "
398
+ "being deleted. Please select a different server or set up a "
399
+ "new server by visiting the ZenML Pro dashboard at "
400
+ f"{server.dashboard_organization_url}."
401
+ )
402
+
403
+ cli_utils.declare(
404
+ f"Connecting to ZenML Pro server: {server.name} [{str(server.id)}] "
405
+ )
406
+
407
+ connect_to_server(server.url, api_key=api_key)
408
+
409
+ # Update the stored server info with more accurate data taken from the
410
+ # ZenML Pro tenant object.
411
+ credentials_store.update_server_info(server.url, server)
412
+
413
+ cli_utils.declare(f"Connected to ZenML Pro server: {server.name}.")
414
+
415
+
416
+ @cli.command(
417
+ "login",
418
+ help=(
419
+ """Login to a ZenML server.
420
+
421
+ Call `zenml login` to connect and authenticate your client to a ZenML
422
+ server. This can be used with ZenML Pro servers or self-hosted ZenML
423
+ servers. The same command can also be used to start and connect to a
424
+ local ZenML server deployment running on your machine and managed by the
425
+ ZenML CLI.
426
+
427
+ Quick start:
428
+
429
+ * To connect to a ZenML Pro server, simply run: `zenml login`. This
430
+ also works if you have never signed up for ZenML Pro before and is a
431
+ great way to get started with the ZenML Pro trial in less than 2 minutes
432
+ hassle-free.
433
+
434
+ * To connect to any remote ZenML server, run: `zenml login <server-url>`
435
+
436
+ * To start a local ZenML server and connect to it, run:
437
+ `zenml login --local`
438
+
439
+ When used without any arguments, the command has a different behavior based
440
+ on the current client state:
441
+
442
+ * if the client is not connected to a non-local ZenML server, the command
443
+ will take the user to the ZenML Pro login / signup page to authenticate
444
+ and connect to a ZenML Pro server.
445
+
446
+ * if the client is already connected to a non-local ZenML server, the
447
+ command triggers a new web login flow with the same server. This allows
448
+ you to simply call `zenml login` again when your CLI session expires to
449
+ refresh the current session and continue using the same server. The
450
+ `--pro` flag can be used to launch a ZenML Pro server login regardless
451
+ of the current client state.
452
+
453
+ This command accepts an optional SERVER argument. This is meant to
454
+ be used to log in to a specific ZenML server and easily switch between
455
+ different ZenML servers that the client is already logged in to.
456
+ The SERVER argument can be one of the following:
457
+
458
+ * a URL to a ZenML server
459
+
460
+ * a ZenML Pro server name
461
+
462
+ * a ZenML Pro server UUID
463
+
464
+ * a SQL database URL in the format `mysql://<username>:<password>@<host>:<port>/<database>`
465
+
466
+ NOTE: Passing a SERVER argument will not trigger a web login flow if the
467
+ current session is still valid. To force a new login flow to be triggered
468
+ to re-authenticate with the target server regardless of the current CLI
469
+ session state, you can pass the `--refresh` flag.
470
+
471
+ The CLI can be authenticated to multiple ZenML servers at the same time,
472
+ even though it can only be connected to one server at a time. You can list
473
+ all the ZenML servers that the client is currently authenticated to by
474
+ running `zenml server list`. Any of these servers can be used as the SERVER
475
+ argument to connect to them.
476
+
477
+ When the `--local` flag is used, the command will start a local ZenML
478
+ server running as a daemon process or a Docker container on your machine.
479
+ The following options can be used to customize the local server deployment:
480
+
481
+ * `--blocking`: run the local ZenML server in blocking mode. Use this to
482
+ run the server as a foreground process instead of a daemon. The CLI will
483
+ not return until the server exits or is stopped with CTRL+C
484
+
485
+ * `--docker`: start the local ZenML server as a Docker container instead
486
+ of a local process
487
+
488
+ * `--port`: use a custom TCP port value for the local ZenML server
489
+
490
+ * `--ip-address`: have the local ZenML server listen on an IP address
491
+ different than the default localhost
492
+
493
+ * `--image`: use a custom Docker image for the local Docker server. Only
494
+ relevant when `--docker` is also set
495
+
496
+ * `--ngrok-token`: specify an ngrok auth token to use for exposing the
497
+ local ZenML dashboard on a public domain. Primarily used for accessing
498
+ the dashboard in Google Colab
499
+
500
+ * `--restart`: force a restart of the local ZenML server.
501
+
502
+ The `--api-key` flag can be used to authenticate with a ZenML server using
503
+ an API key instead of the web login flow.
504
+
505
+ Examples:
506
+
507
+ * connect to a ZenML Pro server using the web login flow:
508
+
509
+ zenml login
510
+
511
+ * connect to a remote ZenML server using the web login flow:
512
+
513
+ zenml login https://zenml.example.com
514
+
515
+ * start a local ZenML server running as a background daemon process and
516
+ connect to it:
517
+
518
+ zenml login --local
519
+
520
+ * start a local ZenML server running as a docker container and
521
+ connect to it:
522
+
523
+ zenml login --local --docker
524
+
525
+ * login and connect to a ZenML server with an API key:
526
+
527
+ zenml login https://zenml.example.com --api-key
528
+ """
529
+ ),
530
+ )
531
+ @click.argument("server", type=str, required=False)
532
+ @click.option(
533
+ "--pro",
534
+ is_flag=True,
535
+ help="Login to ZenML Pro.",
536
+ default=False,
537
+ type=click.BOOL,
538
+ )
539
+ @click.option(
540
+ "--refresh",
541
+ is_flag=True,
542
+ help="Force a new login flow with the ZenML server, even if the client "
543
+ "is already authenticated.",
544
+ default=False,
545
+ type=click.BOOL,
546
+ )
547
+ @click.option(
548
+ "--api-key",
549
+ help="Use an API key to authenticate with a ZenML server. If "
550
+ "omitted, the web login will be used. If set, you will be prompted "
551
+ "to enter the API key.",
552
+ is_flag=True,
553
+ default=False,
554
+ type=click.BOOL,
555
+ )
556
+ @click.option(
557
+ "--no-verify-ssl",
558
+ is_flag=True,
559
+ help="Whether to verify the server's TLS certificate",
560
+ default=False,
561
+ )
562
+ @click.option(
563
+ "--ssl-ca-cert",
564
+ help="A path to a CA bundle file to use to verify the server's TLS "
565
+ "certificate or the CA bundle value itself",
566
+ required=False,
567
+ type=str,
568
+ )
569
+ @click.option(
570
+ "--local",
571
+ is_flag=True,
572
+ help="Start a local ZenML server as a background process and connect the "
573
+ "client to it.",
574
+ default=False,
575
+ type=click.BOOL,
576
+ )
577
+ @click.option(
578
+ "--docker",
579
+ is_flag=True,
580
+ help="Start a local ZenML server as a Docker container instead of a local "
581
+ "background process. Only used when running `zenml login --local`.",
582
+ default=False,
583
+ type=click.BOOL,
584
+ )
585
+ @click.option(
586
+ "--restart",
587
+ is_flag=True,
588
+ help="Force a restart of the local ZenML server. Only used when running "
589
+ "`zenml login --local`.",
590
+ default=False,
591
+ type=click.BOOL,
592
+ )
593
+ @click.option(
594
+ "--port",
595
+ type=int,
596
+ default=None,
597
+ help="Use a custom TCP port value for the local ZenML server. Only used "
598
+ "when running `zenml login --local`.",
599
+ )
600
+ @click.option(
601
+ "--ip-address",
602
+ type=ipaddress.ip_address,
603
+ default=None,
604
+ help="Have the local ZenML server listen on an IP address different than "
605
+ "the default localhost. Only used when running `zenml login --local`.",
606
+ )
607
+ @click.option(
608
+ "--blocking",
609
+ is_flag=True,
610
+ help="Run the local ZenML server in blocking mode. The CLI will not return "
611
+ "until the server exits or is stopped with CTRL+C. Only used when running "
612
+ "`zenml login --local`.",
613
+ default=False,
614
+ type=click.BOOL,
615
+ )
616
+ @click.option(
617
+ "--image",
618
+ type=str,
619
+ default=None,
620
+ help="Use a custom Docker image for the local ZenML server. Only used when "
621
+ "running `zenml login --local --docker`.",
622
+ )
623
+ @click.option(
624
+ "--ngrok-token",
625
+ type=str,
626
+ default=None,
627
+ help="Specify an ngrok auth token to use for exposing the local ZenML "
628
+ "dashboard on a public domain. Primarily used for accessing the "
629
+ "dashboard in Colab. Only used when running `zenml login --local`.",
630
+ )
631
+ def login(
632
+ server: Optional[str] = None,
633
+ pro: bool = False,
634
+ refresh: bool = False,
635
+ api_key: bool = False,
636
+ no_verify_ssl: bool = False,
637
+ ssl_ca_cert: Optional[str] = None,
638
+ local: bool = False,
639
+ docker: bool = False,
640
+ restart: bool = False,
641
+ ip_address: Union[
642
+ ipaddress.IPv4Address, ipaddress.IPv6Address, None
643
+ ] = None,
644
+ port: Optional[int] = None,
645
+ blocking: bool = False,
646
+ image: Optional[str] = None,
647
+ ngrok_token: Optional[str] = None,
648
+ ) -> None:
649
+ """Connect to a remote ZenML server.
650
+
651
+ Args:
652
+ server: The URL where the ZenML server is reachable, or a ZenML Pro
653
+ server name or ID.
654
+ pro: Log in to a ZenML Pro server.
655
+ refresh: Force a new login flow with the ZenML server.
656
+ api_key: Whether to use an API key to authenticate with the ZenML
657
+ server.
658
+ no_verify_ssl: Whether to verify the server's TLS certificate.
659
+ ssl_ca_cert: A path to a CA bundle to use to verify the server's TLS
660
+ certificate or the CA bundle value itself.
661
+ local: Start a local ZenML server and connect the client to it.
662
+ docker: Use a local Docker server instead of a local process.
663
+ restart: Force a restart of the local ZenML server.
664
+ ip_address: The IP address to bind the local server to.
665
+ port: The port to bind the local server to.
666
+ blocking: Block the CLI while the local server is running.
667
+ image: A custom Docker image to use for the local Docker server, when
668
+ the `docker` flag is set.
669
+ ngrok_token: An ngrok auth token to use for exposing the local ZenML
670
+ dashboard on a public domain. Primarily used for accessing the
671
+ dashboard in Colab.
672
+ """
673
+ if local:
674
+ if api_key:
675
+ cli_utils.error(
676
+ "An API key cannot be used with the local ZenML server."
677
+ )
678
+
679
+ start_local_server(
680
+ docker=docker,
681
+ ip_address=ip_address,
682
+ port=port,
683
+ blocking=blocking,
684
+ image=image,
685
+ ngrok_token=ngrok_token,
686
+ restart=restart,
687
+ )
688
+ return
689
+
690
+ if pro:
691
+ connect_to_pro_server(
692
+ pro_server=server,
693
+ refresh=True,
694
+ )
695
+ return
696
+
697
+ # Get the server that the client is currently connected to, if any
698
+ current_non_local_server: Optional[str] = None
699
+ gc = GlobalConfiguration()
700
+ store_cfg = gc.store_configuration
701
+ if store_cfg.type == StoreType.REST:
702
+ if not connected_to_local_server():
703
+ current_non_local_server = store_cfg.url
704
+
705
+ api_key_value: Optional[str] = None
706
+ if api_key:
707
+ # Read the API key from the user
708
+ api_key_value = click.prompt(
709
+ "Please enter the API key for the ZenML server",
710
+ type=str,
711
+ hide_input=True,
712
+ )
713
+
714
+ verify_ssl: Union[str, bool] = (
715
+ ssl_ca_cert if ssl_ca_cert is not None else not no_verify_ssl
716
+ )
717
+
718
+ if server is not None:
719
+ if is_zenml_pro_server_url(server) or not re.match(
720
+ r"^(https?|mysql)://", server
721
+ ):
722
+ # The server argument is a ZenML Pro server URL, server name or UUID
723
+ connect_to_pro_server(
724
+ pro_server=server,
725
+ api_key=api_key_value,
726
+ refresh=refresh,
727
+ )
728
+ else:
729
+ connect_to_server(
730
+ url=server,
731
+ api_key=api_key_value,
732
+ verify_ssl=verify_ssl,
733
+ refresh=refresh,
734
+ )
735
+
736
+ elif current_non_local_server:
737
+ # The server argument is not provided, so we default to
738
+ # re-authenticating to the current non-local server that the client is
739
+ # connected to.
740
+ server = current_non_local_server
741
+ if is_zenml_pro_server_url(server):
742
+ cli_utils.declare(
743
+ "No server argument was provided. Re-authenticating to "
744
+ "ZenML Pro...\n"
745
+ "Hint: You can run 'zenml login <server-url-id-or-name>' to "
746
+ "connect to a specific ZenML Pro server."
747
+ )
748
+ connect_to_pro_server(
749
+ pro_server=server,
750
+ api_key=api_key_value,
751
+ refresh=True,
752
+ )
753
+ else:
754
+ cli_utils.declare(
755
+ "No server argument was provided. Re-authenticating to "
756
+ f"the current ZenML server at '{server}'...\n"
757
+ "Hint: You can run zenml login <server-url>' to connect "
758
+ "to a specific ZenML server. If you wish to login to a ZenML Pro "
759
+ "server, you can run 'zenml login --pro'."
760
+ )
761
+ connect_to_server(
762
+ url=server,
763
+ api_key=api_key_value,
764
+ verify_ssl=verify_ssl,
765
+ refresh=True,
766
+ )
767
+ else:
768
+ # If no server argument is provided, and the client is not currently
769
+ # connected to any non-local server, we default to logging in to ZenML
770
+ # Pro.
771
+ cli_utils.declare(
772
+ "No server argument was provided. Logging to ZenML Pro...\n"
773
+ "Hint: You can run 'zenml login --local' to start a local ZenML "
774
+ "server and connect to it or 'zenml login <server-url>' to connect "
775
+ "to a specific ZenML server. If you wish to login to a ZenML Pro "
776
+ "server, you can run 'zenml login --pro'."
777
+ )
778
+ connect_to_pro_server(
779
+ api_key=api_key_value,
780
+ )
781
+
782
+
783
+ @cli.command(
784
+ "logout",
785
+ help="""Log out from a ZenML server and optionally clear stored credentials.
786
+
787
+ When called without any arguments, the command will log out from the ZenML
788
+ server that the client is currently connected to. If the client is connected
789
+ to a local ZenML server, the command will also shut down the local server.
790
+
791
+ Examples:
792
+
793
+ * log out from the ZenML server the client is currently connected to:
794
+
795
+ zenml logout
796
+
797
+ * disconnect from the local ZenML server and shut it down, if running:
798
+
799
+ zenml logout --local
800
+
801
+ * clear all stored credentials (API keys and tokens) for a specific ZenML
802
+ server:
803
+
804
+ zenml logout https://zenml.example.com --clear
805
+
806
+ * log out from all ZenML Pro servers and clear all stored ZenML Pro
807
+ credentials with the exception of API keys:
808
+
809
+ zenml logout --pro --clear
810
+
811
+ """,
812
+ )
813
+ @click.argument("server", type=str, required=False)
814
+ @click.option(
815
+ "--clear",
816
+ is_flag=True,
817
+ help="Clear all stored credentials for the specified server(s).",
818
+ default=False,
819
+ type=click.BOOL,
820
+ )
821
+ @click.option(
822
+ "--local",
823
+ is_flag=True,
824
+ help="Disconnect from and shut down the local ZenML server.",
825
+ default=False,
826
+ type=click.BOOL,
827
+ )
828
+ @click.option(
829
+ "--pro",
830
+ is_flag=True,
831
+ help="Log out from ZenML Pro. Use this with the --clear flag to clear all "
832
+ "stored ZenML Pro credentials with the exception of API keys.",
833
+ default=False,
834
+ type=click.BOOL,
835
+ )
836
+ def logout(
837
+ server: Optional[str] = None,
838
+ local: bool = False,
839
+ clear: bool = False,
840
+ pro: bool = False,
841
+ ) -> None:
842
+ """Disconnect from a ZenML server.
843
+
844
+ Args:
845
+ server: The URL of the ZenML server to disconnect from.
846
+ clear: Clear all stored credentials and tokens.
847
+ local: Disconnect from the local ZenML server.
848
+ pro: Log out from ZenML Pro.
849
+ """
850
+ from zenml.login.credentials_store import get_credentials_store
851
+
852
+ credentials_store = get_credentials_store()
853
+ gc = GlobalConfiguration()
854
+ store_cfg = gc.store_configuration
855
+
856
+ if pro:
857
+ if server:
858
+ cli_utils.error(
859
+ "The `--pro` flag cannot be used with a specific server URL."
860
+ )
861
+
862
+ if credentials_store.has_valid_pro_authentication():
863
+ credentials_store.clear_pro_credentials()
864
+ cli_utils.declare("Logged out from ZenML Pro.")
865
+ else:
866
+ cli_utils.declare(
867
+ "The client is not currently connected to ZenML Pro."
868
+ )
869
+
870
+ if clear:
871
+ if is_zenml_pro_server_url(store_cfg.url):
872
+ gc.set_default_store()
873
+
874
+ credentials_store.clear_all_pro_tokens()
875
+ cli_utils.declare("Logged out from all ZenML Pro servers.")
876
+ return
877
+
878
+ if server is None:
879
+ # Log out from the current server
880
+
881
+ if gc.uses_default_store():
882
+ cli_utils.declare(
883
+ "The client is not currently connected to a ZenML server.\n"
884
+ "Hint: You can run 'zenml server list' to view the available "
885
+ "ZenML servers and then 'zenml login <server-url-name-or-id>' "
886
+ "to connect to a specific server."
887
+ )
888
+ return
889
+
890
+ if connected_to_local_server():
891
+ local = True
892
+ else:
893
+ server = store_cfg.url
894
+
895
+ if local:
896
+ from zenml.zen_server.deploy.deployer import LocalServerDeployer
897
+
898
+ deployer = LocalServerDeployer()
899
+
900
+ if not get_local_server():
901
+ cli_utils.declare("The local ZenML dashboard is not running.")
902
+ else:
903
+ cli_utils.declare("Logging out from the local ZenML server...")
904
+ deployer.remove_server()
905
+ cli_utils.declare(
906
+ "The local ZenML dashboard has been shut down.\n"
907
+ "Hint: You can run 'zenml login --local' to start it again."
908
+ )
909
+ return
910
+
911
+ assert server is not None
912
+
913
+ if is_zenml_pro_server_url(server):
914
+ gc.set_default_store()
915
+ credentials = credentials_store.get_credentials(server)
916
+ if credentials and (clear or store_cfg.url == server):
917
+ cli_utils.declare(
918
+ f"Logging out from ZenML Pro server '{credentials.server_name}'."
919
+ )
920
+ if clear:
921
+ credentials_store.clear_credentials(server_url=server)
922
+ cli_utils.declare(
923
+ "Logged out from ZenML Pro.\n"
924
+ f"Hint: You can run 'zenml login {credentials.server_name}' to "
925
+ "login again to the same ZenML Pro server or 'zenml server "
926
+ "list' to view other available servers that you can connect to "
927
+ "with 'zenml login <server-id-name-or-url>'."
928
+ )
929
+ else:
930
+ cli_utils.declare(
931
+ f"The client is not currently connected to the ZenML Pro server "
932
+ f"at '{server}'."
933
+ )
934
+ else:
935
+ gc.set_default_store()
936
+ credentials = credentials_store.get_credentials(server)
937
+ if credentials and (clear or store_cfg.url == server):
938
+ cli_utils.declare(f"Logging out from {server}.")
939
+ if clear:
940
+ credentials_store.clear_credentials(server_url=server)
941
+ cli_utils.declare(
942
+ f"Logged out from {server}."
943
+ f"Hint: You can run 'zenml login {server}' to log in again "
944
+ "to the same server or 'zenml server list' to view other available "
945
+ "servers that you can connect to with 'zenml login <server-url>'."
946
+ )
947
+ else:
948
+ cli_utils.declare(
949
+ f"The client is not currently connected to the ZenML server at "
950
+ f"'{server}'."
951
+ )