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
@@ -0,0 +1,92 @@
1
+ # Copyright (c) ZenML GmbH 2024. 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
+ """ZenML Pro tenant client."""
15
+
16
+ from typing import List, Optional
17
+ from uuid import UUID
18
+
19
+ from zenml.logger import get_logger
20
+ from zenml.login.pro.client import ZenMLProClient
21
+ from zenml.login.pro.tenant.models import TenantRead, TenantStatus
22
+
23
+ logger = get_logger(__name__)
24
+
25
+ TENANTS_ROUTE = "/tenants"
26
+
27
+
28
+ class TenantClient:
29
+ """Tenant management client."""
30
+
31
+ def __init__(
32
+ self,
33
+ client: ZenMLProClient,
34
+ ):
35
+ """Initialize the tenant client.
36
+
37
+ Args:
38
+ client: ZenML Pro client.
39
+ """
40
+ self.client = client
41
+
42
+ def get(self, id: UUID) -> TenantRead:
43
+ """Get a tenant by id.
44
+
45
+ Args:
46
+ id: Id. of the tenant to retrieve.
47
+
48
+ Returns:
49
+ A tenant.
50
+ """
51
+ return self.client._get_resource(
52
+ resource_id=id,
53
+ route=TENANTS_ROUTE,
54
+ response_model=TenantRead,
55
+ )
56
+
57
+ def list(
58
+ self,
59
+ offset: int = 0,
60
+ limit: int = 20,
61
+ tenant_name: Optional[str] = None,
62
+ url: Optional[str] = None,
63
+ organization_id: Optional[UUID] = None,
64
+ status: Optional[TenantStatus] = None,
65
+ member_only: bool = False,
66
+ ) -> List[TenantRead]:
67
+ """List tenants.
68
+
69
+ Args:
70
+ offset: Offset to use for filtering.
71
+ limit: Limit used for filtering.
72
+ tenant_name: Tenant name to filter by.
73
+ url: Tenant service URL to filter by.
74
+ organization_id: Organization ID to filter by.
75
+ status: Filter for only tenants with this status.
76
+ member_only: If True, only list tenants where the user is a member
77
+ (i.e. users that can connect to the tenant).
78
+
79
+ Returns:
80
+ List of tenants.
81
+ """
82
+ return self.client._list_resources(
83
+ route=TENANTS_ROUTE,
84
+ response_model=TenantRead,
85
+ offset=offset,
86
+ limit=limit,
87
+ tenant_name=tenant_name,
88
+ url=url,
89
+ organization_id=organization_id,
90
+ status=status,
91
+ member_only=member_only,
92
+ )
@@ -0,0 +1,174 @@
1
+ # Copyright (c) ZenML GmbH 2024. 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
+ """ZenML Pro tenant models."""
15
+
16
+ from typing import Optional
17
+ from uuid import UUID
18
+
19
+ from pydantic import Field
20
+
21
+ from zenml.login.pro.constants import ZENML_PRO_URL
22
+ from zenml.login.pro.models import BaseRestAPIModel
23
+ from zenml.login.pro.organization.models import OrganizationRead
24
+ from zenml.utils.enum_utils import StrEnum
25
+
26
+
27
+ class TenantStatus(StrEnum):
28
+ """Enum that represents the desired state or status of a tenant.
29
+
30
+ These values can be used in two places:
31
+
32
+ * in the `desired_state` field of a tenant object, to indicate the desired
33
+ state of the tenant (with the exception of `PENDING` and `FAILED` which
34
+ are not valid values for `desired_state`)
35
+ * in the `status` field of a tenant object, to indicate the current state
36
+ of the tenant
37
+ """
38
+
39
+ # Tenant hasn't been deployed yet (i.e. newly created) or has been fully
40
+ # deleted by the infrastructure provider
41
+ NOT_INITIALIZED = "not_initialized"
42
+ # Tenant is being processed by the infrastructure provider (is being
43
+ # deployed, updated, deactivated, re-activated or deleted/cleaned up).
44
+ PENDING = "pending"
45
+ # Tenant is up and running
46
+ AVAILABLE = "available"
47
+ # Tenant is in a failure state (i.e. deployment, update or deletion failed)
48
+ FAILED = "failed"
49
+ # Tenant is deactivated
50
+ DEACTIVATED = "deactivated"
51
+ # Tenant resources have been deleted by the infrastructure provider but
52
+ # the tenant object still exists in the database
53
+ DELETED = "deleted"
54
+
55
+
56
+ class ZenMLServiceConfiguration(BaseRestAPIModel):
57
+ """ZenML service configuration."""
58
+
59
+ version: str = Field(
60
+ description="The ZenML version.",
61
+ )
62
+
63
+
64
+ class ZenMLServiceStatus(BaseRestAPIModel):
65
+ """ZenML service status."""
66
+
67
+ server_url: str = Field(
68
+ description="The ZenML server URL.",
69
+ )
70
+ version: Optional[str] = Field(
71
+ default=None,
72
+ description="The ZenML server version.",
73
+ )
74
+
75
+
76
+ class ZenMLServiceRead(BaseRestAPIModel):
77
+ """Pydantic Model for viewing a ZenML service."""
78
+
79
+ configuration: ZenMLServiceConfiguration = Field(
80
+ description="The service configuration."
81
+ )
82
+
83
+ status: Optional[ZenMLServiceStatus] = Field(
84
+ default=None,
85
+ description="Information about the service status. Only set if the "
86
+ "service is deployed and active.",
87
+ )
88
+
89
+
90
+ class TenantRead(BaseRestAPIModel):
91
+ """Pydantic Model for viewing a Tenant."""
92
+
93
+ id: UUID
94
+
95
+ name: str
96
+ description: Optional[str] = Field(
97
+ default=None, description="The description of the tenant."
98
+ )
99
+
100
+ organization: OrganizationRead
101
+
102
+ desired_state: str = Field(description="The desired state of the tenant.")
103
+ state_reason: str = Field(
104
+ description="The reason for the current tenant state.",
105
+ )
106
+ status: str = Field(
107
+ description="The current operational state of the tenant."
108
+ )
109
+ zenml_service: ZenMLServiceRead = Field(description="The ZenML service.")
110
+
111
+ @property
112
+ def organization_id(self) -> UUID:
113
+ """Get the organization id.
114
+
115
+ Returns:
116
+ The organization id.
117
+ """
118
+ return self.organization.id
119
+
120
+ @property
121
+ def organization_name(self) -> str:
122
+ """Get the organization name.
123
+
124
+ Returns:
125
+ The organization name.
126
+ """
127
+ return self.organization.name
128
+
129
+ @property
130
+ def version(self) -> Optional[str]:
131
+ """Get the ZenML service version.
132
+
133
+ Returns:
134
+ The ZenML service version.
135
+ """
136
+ version = self.zenml_service.configuration.version
137
+ if self.zenml_service.status and self.zenml_service.status.version:
138
+ version = self.zenml_service.status.version
139
+
140
+ return version
141
+
142
+ @property
143
+ def url(self) -> Optional[str]:
144
+ """Get the ZenML server URL.
145
+
146
+ Returns:
147
+ The ZenML server URL, if available.
148
+ """
149
+ return (
150
+ self.zenml_service.status.server_url
151
+ if self.zenml_service.status
152
+ else None
153
+ )
154
+
155
+ @property
156
+ def dashboard_url(self) -> str:
157
+ """Get the URL to the ZenML Pro dashboard for this tenant.
158
+
159
+ Returns:
160
+ The URL to the ZenML Pro dashboard for this tenant.
161
+ """
162
+ return (
163
+ ZENML_PRO_URL
164
+ + f"/organizations/{str(self.organization_id)}/tenants/{str(self.id)}"
165
+ )
166
+
167
+ @property
168
+ def dashboard_organization_url(self) -> str:
169
+ """Get the URL to the ZenML Pro dashboard for this tenant's organization.
170
+
171
+ Returns:
172
+ The URL to the ZenML Pro dashboard for this tenant's organization.
173
+ """
174
+ return ZENML_PRO_URL + f"/organizations/{str(self.organization_id)}"
@@ -0,0 +1,121 @@
1
+ # Copyright (c) ZenML GmbH 2024. 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
+ """ZenML Pro login utils."""
15
+
16
+ import re
17
+
18
+ from zenml.logger import get_logger
19
+ from zenml.login.credentials_store import get_credentials_store
20
+ from zenml.login.pro.client import ZenMLProClient
21
+ from zenml.login.pro.constants import ZENML_PRO_SERVER_SUBDOMAIN
22
+ from zenml.login.pro.tenant.models import TenantStatus
23
+
24
+ logger = get_logger(__name__)
25
+
26
+
27
+ def is_zenml_pro_server_url(url: str) -> bool:
28
+ """Check if a given URL is a ZenML Pro server.
29
+
30
+ Args:
31
+ url: URL to check
32
+
33
+ Returns:
34
+ True if the URL is a ZenML Pro tenant, False otherwise
35
+ """
36
+ domain_regex = ZENML_PRO_SERVER_SUBDOMAIN.replace(".", r"\.")
37
+ return bool(
38
+ re.match(
39
+ r"^(https://)?[a-zA-Z0-9-\.]+\.{domain}/?$".format(
40
+ domain=domain_regex
41
+ ),
42
+ url,
43
+ )
44
+ )
45
+
46
+
47
+ def get_troubleshooting_instructions(url: str) -> str:
48
+ """Get troubleshooting instructions for a given ZenML Pro server URL.
49
+
50
+ Args:
51
+ url: ZenML Pro server URL
52
+
53
+ Returns:
54
+ Troubleshooting instructions
55
+ """
56
+ credentials_store = get_credentials_store()
57
+ if credentials_store.has_valid_pro_authentication():
58
+ client = ZenMLProClient()
59
+
60
+ try:
61
+ servers = client.tenant.list(url=url, member_only=False)
62
+ except Exception as e:
63
+ logger.debug(f"Failed to list tenants: {e}")
64
+ else:
65
+ if servers:
66
+ server = servers[0]
67
+ if server.status == TenantStatus.AVAILABLE:
68
+ return (
69
+ f"The '{server.name}' ZenML Pro server that the client "
70
+ "is connected to is currently running but you may not "
71
+ "have the necessary permissions to access it. Please "
72
+ "contact your ZenML Pro administrator for more "
73
+ "information or try to manage the server members "
74
+ "yourself if you have the necessary permissions by "
75
+ f"visiting the ZenML Pro tenant page at {server.dashboard_url}."
76
+ )
77
+ if server.status == TenantStatus.DEACTIVATED:
78
+ return (
79
+ f"The '{server.name}' ZenML Pro server that the client "
80
+ "is connected to has been deactivated. "
81
+ "Please contact your ZenML Pro administrator for more "
82
+ "information or to reactivate the server yourself if "
83
+ "you have the necessary permissions by visiting the "
84
+ f"ZenML Pro Organization page at {server.dashboard_organization_url}."
85
+ )
86
+ if server.status == TenantStatus.PENDING:
87
+ return (
88
+ f"The '{server.name}' ZenML Pro server that the client "
89
+ "is connected to is currently undergoing maintenance "
90
+ "(e.g. being deployed, upgraded or re-activated). "
91
+ "Please try again later or contact your ZenML Pro "
92
+ "administrator for more information. You can also "
93
+ f"visit the ZenML Pro tenant page at {server.dashboard_url}."
94
+ )
95
+ return (
96
+ f"The '{server.name}' ZenML Pro server that the client "
97
+ "is connected to is currently in a failed "
98
+ "state. Please contact your ZenML Pro administrator for "
99
+ "more information or try to re-deploy the server "
100
+ "yourself if you have the necessary permissions by "
101
+ "visiting the ZenML Pro Organization page at "
102
+ f"{server.dashboard_organization_url}."
103
+ )
104
+
105
+ return (
106
+ f"The ZenML Pro server at URL '{url}' that the client is "
107
+ "connected to does not exist or you may not have access to it. "
108
+ "Please check the URL and your permissions and try again or "
109
+ "connect your client to a different server by running `zenml "
110
+ "login` or by using a service account API key."
111
+ )
112
+
113
+ return (
114
+ f"The ZenML Pro server at URL '{url}' that the client is connected to "
115
+ "does not exist, is not running, or you do not have permissions to "
116
+ "connect to it. Please check the URL and your permissions "
117
+ "and try again. The ZenML Pro server might have been deactivated or is "
118
+ "currently pending maintenance. Please contact your ZenML Pro "
119
+ "administrator for more information or try to manage the server "
120
+ "state by visiting the ZenML Pro dashboard."
121
+ )
@@ -1,4 +1,4 @@
1
- # Copyright (c) ZenML GmbH 2023. All Rights Reserved.
1
+ # Copyright (c) ZenML GmbH 2024. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -11,7 +11,7 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12
12
  # or implied. See the License for the specific language governing
13
13
  # permissions and limitations under the License.
14
- """Web login CLI support."""
14
+ """ZenML OAuth2 device authorization grant client support."""
15
15
 
16
16
  import platform
17
17
  import time
@@ -24,19 +24,24 @@ from zenml import __version__
24
24
  from zenml.config.global_config import GlobalConfiguration
25
25
  from zenml.constants import (
26
26
  API,
27
+ AUTH,
27
28
  DEFAULT_HTTP_TIMEOUT,
28
29
  DEVICE_AUTHORIZATION,
29
30
  LOGIN,
30
31
  VERSION_1,
31
- ZENML_PRO_CONNECTION_ISSUES_SUSPENDED_PAUSED_TENANT_HINT,
32
32
  )
33
33
  from zenml.exceptions import AuthorizationException, OAuthError
34
34
  from zenml.logger import get_logger
35
+ from zenml.login.credentials import APIToken
36
+ from zenml.login.pro.constants import ZENML_PRO_API_URL
37
+ from zenml.login.pro.utils import is_zenml_pro_server_url
35
38
 
36
39
  logger = get_logger(__name__)
37
40
 
38
41
 
39
- def web_login(url: str, verify_ssl: Union[str, bool]) -> str:
42
+ def web_login(
43
+ url: Optional[str] = None, verify_ssl: Optional[Union[str, bool]] = None
44
+ ) -> APIToken:
40
45
  """Implements the OAuth2 Device Authorization Grant flow.
41
46
 
42
47
  This function implements the client side of the OAuth2 Device Authorization
@@ -48,19 +53,23 @@ def web_login(url: str, verify_ssl: Union[str, bool]) -> str:
48
53
  * additional information is added to the user agent header to be used by
49
54
  users to identify the ZenML client
50
55
 
56
+ Upon completion of the flow, the access token is saved in the credentials store.
57
+
51
58
  Args:
52
- url: The URL of the OAuth2 server.
59
+ url: The URL of the OAuth2 server. If not provided, the ZenML Pro API
60
+ server is used by default.
53
61
  verify_ssl: Whether to verify the SSL certificate of the OAuth2 server.
54
62
  If a string is passed, it is interpreted as the path to a CA bundle
55
63
  file.
56
64
 
57
65
  Returns:
58
- The access token returned by the OAuth2 server.
66
+ The response returned by the OAuth2 server.
59
67
 
60
68
  Raises:
61
69
  AuthorizationException: If an error occurred during the authorization
62
70
  process.
63
71
  """
72
+ from zenml.login.credentials_store import get_credentials_store
64
73
  from zenml.models import (
65
74
  OAuthDeviceAuthorizationRequest,
66
75
  OAuthDeviceAuthorizationResponse,
@@ -69,9 +78,8 @@ def web_login(url: str, verify_ssl: Union[str, bool]) -> str:
69
78
  OAuthTokenResponse,
70
79
  )
71
80
 
72
- auth_request = OAuthDeviceAuthorizationRequest(
73
- client_id=GlobalConfiguration().user_id
74
- )
81
+ credentials_store = get_credentials_store()
82
+
75
83
  # Make a request to the OAuth2 server to get the device code and user code.
76
84
  # The client ID used for the request is the unique ID of the ZenML client.
77
85
  response: Optional[requests.Response] = None
@@ -91,23 +99,48 @@ def web_login(url: str, verify_ssl: Union[str, bool]) -> str:
91
99
  os=platform.system(),
92
100
  )
93
101
 
94
- # Get rid of any trailing slashes to prevent issues when having double
95
- # slashes in the URL
96
- url = url.rstrip("/")
97
- zenml_pro_extra = ""
98
- if ".zenml.io" in url:
99
- zenml_pro_extra = (
100
- ZENML_PRO_CONNECTION_ISSUES_SUSPENDED_PAUSED_TENANT_HINT
101
- )
102
+ zenml_pro = False
103
+ if not url:
104
+ # If no URL is provided, we use the ZenML Pro API server by default
105
+ zenml_pro = True
106
+ url = base_url = ZENML_PRO_API_URL
107
+ else:
108
+ # Get rid of any trailing slashes to prevent issues when having double
109
+ # slashes in the URL
110
+ url = url.rstrip("/")
111
+ if is_zenml_pro_server_url(url):
112
+ # This is a ZenML Pro server. The device authentication is done
113
+ # through the ZenML Pro API.
114
+ zenml_pro = True
115
+ base_url = ZENML_PRO_API_URL
116
+ else:
117
+ base_url = url
118
+
119
+ auth_request = OAuthDeviceAuthorizationRequest(
120
+ client_id=GlobalConfiguration().user_id
121
+ )
122
+
123
+ # If an existing token is found in the credentials store, we reuse its
124
+ # device ID to avoid creating a new device ID for the same device.
125
+ existing_token = credentials_store.get_token(url)
126
+ if existing_token and existing_token.device_id:
127
+ auth_request.device_id = existing_token.device_id
128
+
129
+ if zenml_pro:
130
+ auth_url = base_url + AUTH + DEVICE_AUTHORIZATION
131
+ login_url = base_url + AUTH + LOGIN
132
+ else:
133
+ auth_url = base_url + API + VERSION_1 + DEVICE_AUTHORIZATION
134
+ login_url = base_url + API + VERSION_1 + LOGIN
135
+
102
136
  try:
103
- auth_url = url + API + VERSION_1 + DEVICE_AUTHORIZATION
104
137
  response = requests.post(
105
138
  auth_url,
106
139
  headers={
107
140
  "Content-Type": "application/x-www-form-urlencoded",
108
141
  "User-Agent": user_agent_header.encode(),
109
142
  },
110
- data=auth_request.model_dump(),
143
+ data=auth_request.model_dump(exclude_none=True),
111
144
  verify=verify_ssl,
112
145
  timeout=DEFAULT_HTTP_TIMEOUT,
113
146
  )
@@ -116,8 +149,7 @@ def web_login(url: str, verify_ssl: Union[str, bool]) -> str:
116
149
  else:
117
150
  logger.info(f"Error: {response.status_code} {response.text}")
118
151
  raise AuthorizationException(
119
- "Could not connect to API server. Please check the URL."
120
- + zenml_pro_extra
152
+ f"Could not connect to {base_url}. Please check the URL."
121
153
  )
122
154
  except (requests.exceptions.JSONDecodeError, ValueError, TypeError):
123
155
  logger.exception("Bad response received from API server.")
@@ -127,8 +159,7 @@ def web_login(url: str, verify_ssl: Union[str, bool]) -> str:
127
159
  except requests.exceptions.RequestException:
128
160
  logger.exception("Could not connect to API server.")
129
161
  raise AuthorizationException(
130
- "Could not connect to API server. Please check the URL."
131
- + zenml_pro_extra
162
+ f"Could not connect to {base_url}. Please check the URL."
132
163
  )
133
164
 
134
165
  # Open the verification URL in the user's browser
@@ -139,7 +170,7 @@ def web_login(url: str, verify_ssl: Union[str, bool]) -> str:
139
170
  if verification_uri.startswith("/"):
140
171
  # If the verification URI is a relative path, we need to add the base
141
172
  # URL to it
142
- verification_uri = url + verification_uri
173
+ verification_uri = base_url + verification_uri
143
174
  webbrowser.open(verification_uri)
144
175
  logger.info(
145
176
  f"If your browser did not open automatically, please open the "
@@ -156,7 +187,6 @@ def web_login(url: str, verify_ssl: Union[str, bool]) -> str:
156
187
  interval = auth_response.interval
157
188
  token_response: OAuthTokenResponse
158
189
  while True:
159
- login_url = url + API + VERSION_1 + LOGIN
160
190
  response = requests.post(
161
191
  login_url,
162
192
  headers={"Content-Type": "application/x-www-form-urlencoded"},
@@ -167,8 +197,11 @@ def web_login(url: str, verify_ssl: Union[str, bool]) -> str:
167
197
  if response.status_code == 200:
168
198
  # The user has authorized the device, so we can extract the access token
169
199
  token_response = OAuthTokenResponse(**response.json())
170
- logger.info("Successfully logged in.")
171
- return token_response.access_token
200
+ if zenml_pro:
201
+ logger.info("Successfully logged in to ZenML Pro.")
202
+ else:
203
+ logger.info(f"Successfully logged in to {url}.")
204
+ break
172
205
  elif response.status_code == 400:
173
206
  try:
174
207
  error_response = OAuthError(**response.json())
@@ -178,7 +211,7 @@ def web_login(url: str, verify_ssl: Union[str, bool]) -> str:
178
211
  TypeError,
179
212
  ):
180
213
  raise AuthorizationException(
181
- f"Error received from API server: {response.text}"
214
+ f"Error received from {base_url}: {response.text}"
182
215
  )
183
216
 
184
217
  if error_response.error == "authorization_pending":
@@ -205,3 +238,6 @@ def web_login(url: str, verify_ssl: Union[str, bool]) -> str:
205
238
  raise AuthorizationException(
206
239
  f"Error: {response.status_code} {response.json()['error']}"
207
240
  )
241
+
242
+ # Save the token in the credentials store
243
+ return credentials_store.set_token(url, token_response)
@@ -31,6 +31,7 @@ from zenml.materializers.structured_string_materializer import (
31
31
  )
32
32
  from zenml.materializers.pydantic_materializer import PydanticMaterializer
33
33
  from zenml.materializers.service_materializer import ServiceMaterializer
34
+ from zenml.materializers.uuid_materializer import UUIDMaterializer
34
35
 
35
36
  __all__ = [
36
37
  "BuiltInContainerMaterializer",
@@ -40,4 +41,5 @@ __all__ = [
40
41
  "StructuredStringMaterializer",
41
42
  "PydanticMaterializer",
42
43
  "ServiceMaterializer",
44
+ "UUIDMaterializer",
43
45
  ]
@@ -229,38 +229,72 @@ class BaseMaterializer(metaclass=BaseMaterializerMeta):
229
229
  # ================
230
230
  # Internal Methods
231
231
  # ================
232
+ def validate_save_type_compatibility(self, data_type: Type[Any]) -> None:
233
+ """Checks whether the materializer can save the given type.
232
234
 
233
- def validate_type_compatibility(self, data_type: Type[Any]) -> None:
234
- """Checks whether the materializer can read/write the given type.
235
+ Args:
236
+ data_type: The type to check.
237
+
238
+ Raises:
239
+ TypeError: If the materializer cannot save the given type.
240
+ """
241
+ if not self.can_save_type(data_type):
242
+ raise TypeError(
243
+ f"Unable to save type {data_type}. {self.__class__.__name__} "
244
+ f"can only save artifacts of the following types: "
245
+ f"{self.ASSOCIATED_TYPES}."
246
+ )
247
+
248
+ def validate_load_type_compatibility(self, data_type: Type[Any]) -> None:
249
+ """Checks whether the materializer can load the given type.
235
250
 
236
251
  Args:
237
252
  data_type: The type to check.
238
253
 
239
254
  Raises:
240
- TypeError: If the materializer cannot read/write the given type.
255
+ TypeError: If the materializer cannot load the given type.
241
256
  """
242
- if not self.can_handle_type(data_type):
257
+ if not self.can_load_type(data_type):
243
258
  raise TypeError(
244
- f"Unable to handle type {data_type}. {self.__class__.__name__} "
245
- f"can only read/write artifacts of the following types: "
259
+ f"Unable to load type {data_type}. {self.__class__.__name__} "
260
+ f"can only load artifacts of the following types: "
246
261
  f"{self.ASSOCIATED_TYPES}."
247
262
  )
248
263
 
249
264
  @classmethod
250
- def can_handle_type(cls, data_type: Type[Any]) -> bool:
251
- """Whether the materializer can read/write a certain type.
265
+ def can_save_type(cls, data_type: Type[Any]) -> bool:
266
+ """Whether the materializer can save a certain type.
252
267
 
253
268
  Args:
254
269
  data_type: The type to check.
255
270
 
256
271
  Returns:
257
- Whether the materializer can read/write the given type.
272
+ Whether the materializer can save the given type.
258
273
  """
259
274
  return any(
260
275
  issubclass(data_type, associated_type)
261
276
  for associated_type in cls.ASSOCIATED_TYPES
262
277
  )
263
278
 
279
+ @classmethod
280
+ def can_load_type(cls, data_type: Type[Any]) -> bool:
281
+ """Whether the materializer can load an artifact as the given type.
282
+
283
+ Args:
284
+ data_type: The type to check.
285
+
286
+ Returns:
287
+ Whether the materializer can load an artifact as the given type.
288
+ """
289
+ return any(
290
+ issubclass(associated_type, data_type)
291
+ # This next condition is not always correct, but better to have a
292
+ # false positive here instead of failing for cases where it would
293
+ # have worked.
294
+ or issubclass(data_type, associated_type)
295
+ for associated_type in cls.ASSOCIATED_TYPES
296
+ )
297
+
264
298
  def extract_full_metadata(self, data: Any) -> Dict[str, "MetadataType"]:
265
299
  """Extract both base and custom metadata from the given data.
266
300