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.
- README.md +18 -12
- RELEASE_NOTES.md +236 -0
- zenml/VERSION +1 -1
- zenml/__init__.py +5 -10
- zenml/analytics/context.py +16 -1
- zenml/analytics/enums.py +0 -13
- zenml/analytics/utils.py +18 -7
- zenml/artifact_stores/base_artifact_store.py +11 -0
- zenml/artifacts/artifact_config.py +19 -65
- zenml/artifacts/external_artifact.py +7 -53
- zenml/artifacts/external_artifact_config.py +21 -40
- zenml/artifacts/load_directory_materializer.py +91 -0
- zenml/artifacts/utils.py +204 -145
- zenml/cli/__init__.py +62 -127
- zenml/cli/base.py +8 -8
- zenml/cli/integration.py +0 -9
- zenml/cli/login.py +951 -0
- zenml/cli/pipeline.py +1 -1
- zenml/cli/served_model.py +8 -1
- zenml/cli/server.py +462 -577
- zenml/cli/service_accounts.py +4 -4
- zenml/cli/stack.py +78 -569
- zenml/cli/stack_components.py +5 -594
- zenml/cli/user_management.py +0 -12
- zenml/cli/utils.py +24 -142
- zenml/client.py +57 -40
- zenml/client_lazy_loader.py +29 -12
- zenml/config/compiler.py +7 -11
- zenml/config/global_config.py +9 -0
- zenml/config/pipeline_configurations.py +2 -1
- zenml/config/pipeline_run_configuration.py +2 -1
- zenml/config/server_config.py +7 -5
- zenml/config/step_configurations.py +2 -0
- zenml/constants.py +6 -42
- zenml/enums.py +1 -4
- zenml/environment.py +1 -315
- zenml/exceptions.py +12 -41
- zenml/hooks/hook_validators.py +1 -8
- zenml/integrations/airflow/orchestrators/airflow_orchestrator.py +2 -3
- zenml/integrations/argilla/__init__.py +1 -1
- zenml/integrations/argilla/annotators/argilla_annotator.py +234 -89
- zenml/integrations/argilla/flavors/argilla_annotator_flavor.py +10 -5
- zenml/integrations/aws/flavors/sagemaker_orchestrator_flavor.py +9 -5
- zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +15 -2
- zenml/integrations/aws/service_connectors/aws_service_connector.py +6 -0
- zenml/integrations/azure/__init__.py +6 -2
- zenml/integrations/azure/flavors/azureml_orchestrator_flavor.py +5 -4
- zenml/integrations/azure/orchestrators/azureml_orchestrator.py +1 -1
- zenml/integrations/bentoml/model_deployers/bentoml_model_deployer.py +85 -19
- zenml/integrations/bentoml/services/__init__.py +15 -4
- zenml/integrations/bentoml/services/bentoml_container_deployment.py +399 -0
- zenml/integrations/bentoml/services/{bentoml_deployment.py → bentoml_local_deployment.py} +81 -40
- zenml/{steps/base_parameters.py → integrations/bentoml/services/deployment_type.py} +8 -5
- zenml/integrations/bentoml/steps/bento_builder.py +1 -0
- zenml/integrations/bentoml/steps/bentoml_deployer.py +93 -41
- zenml/integrations/github/code_repositories/github_code_repository.py +1 -1
- zenml/integrations/gitlab/code_repositories/gitlab_code_repository.py +6 -1
- zenml/integrations/huggingface/__init__.py +1 -6
- zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +3 -3
- zenml/integrations/lightning/orchestrators/lightning_orchestrator.py +3 -3
- zenml/integrations/lightning/orchestrators/lightning_orchestrator_entrypoint.py +2 -2
- zenml/integrations/mlflow/experiment_trackers/mlflow_experiment_tracker.py +6 -3
- zenml/integrations/mlflow/model_registries/mlflow_model_registry.py +6 -0
- zenml/integrations/mlflow/services/mlflow_deployment.py +2 -2
- zenml/integrations/mlflow/steps/mlflow_deployer.py +1 -1
- zenml/integrations/mlflow/steps/mlflow_registry.py +1 -1
- zenml/integrations/neptune/experiment_trackers/run_state.py +2 -2
- zenml/integrations/pytorch/materializers/base_pytorch_materializer.py +8 -2
- zenml/integrations/pytorch/materializers/pytorch_module_materializer.py +4 -1
- zenml/integrations/s3/artifact_stores/s3_artifact_store.py +98 -0
- zenml/integrations/s3/flavors/s3_artifact_store_flavor.py +14 -0
- zenml/integrations/s3/utils.py +40 -0
- zenml/integrations/tensorflow/__init__.py +0 -9
- zenml/logging/step_logging.py +13 -15
- zenml/{new/pipelines → login}/__init__.py +4 -1
- zenml/login/credentials.py +346 -0
- zenml/login/credentials_store.py +603 -0
- zenml/{new → login/pro}/__init__.py +4 -1
- zenml/login/pro/client.py +496 -0
- zenml/login/pro/constants.py +34 -0
- zenml/{lineage_graph/edge.py → login/pro/models.py} +9 -8
- zenml/{zen_server/deploy/terraform/providers → login/pro/organization}/__init__.py +2 -2
- zenml/login/pro/organization/client.py +79 -0
- zenml/{lineage_graph/node/base_node.py → login/pro/organization/models.py} +13 -12
- zenml/{new/steps → login/pro/tenant}/__init__.py +2 -1
- zenml/login/pro/tenant/client.py +92 -0
- zenml/login/pro/tenant/models.py +174 -0
- zenml/login/pro/utils.py +121 -0
- zenml/{cli → login}/web_login.py +64 -28
- zenml/materializers/__init__.py +2 -0
- zenml/materializers/base_materializer.py +43 -9
- zenml/materializers/built_in_materializer.py +1 -1
- zenml/materializers/uuid_materializer.py +79 -0
- zenml/metadata/lazy_load.py +10 -7
- zenml/metadata/metadata_types.py +49 -0
- zenml/model/lazy_load.py +85 -4
- zenml/model/model.py +61 -83
- zenml/model/utils.py +47 -118
- zenml/models/__init__.py +6 -0
- zenml/models/v2/base/base.py +12 -8
- zenml/models/v2/base/filter.py +9 -0
- zenml/models/v2/core/artifact_version.py +53 -25
- zenml/models/v2/core/component.py +54 -19
- zenml/models/v2/core/flavor.py +13 -13
- zenml/models/v2/core/model.py +4 -1
- zenml/models/v2/core/model_version.py +4 -6
- zenml/models/v2/core/model_version_artifact.py +3 -1
- zenml/models/v2/core/model_version_pipeline_run.py +3 -1
- zenml/models/v2/core/pipeline.py +3 -1
- zenml/models/v2/core/pipeline_run.py +24 -3
- zenml/models/v2/core/run_metadata.py +2 -2
- zenml/models/v2/core/run_template.py +3 -1
- zenml/models/v2/core/stack.py +7 -3
- zenml/models/v2/core/step_run.py +58 -14
- zenml/models/v2/misc/auth_models.py +11 -2
- zenml/models/v2/misc/server_models.py +2 -4
- zenml/orchestrators/base_orchestrator.py +41 -4
- zenml/orchestrators/input_utils.py +52 -36
- zenml/orchestrators/step_launcher.py +50 -171
- zenml/orchestrators/step_run_utils.py +574 -0
- zenml/orchestrators/step_runner.py +83 -120
- zenml/orchestrators/utils.py +46 -180
- zenml/pipelines/__init__.py +3 -16
- zenml/{new/pipelines → pipelines}/pipeline_context.py +3 -18
- zenml/pipelines/pipeline_decorator.py +34 -60
- zenml/{new/pipelines/pipeline.py → pipelines/pipeline_definition.py} +210 -207
- zenml/{new/pipelines → pipelines}/run_utils.py +11 -10
- zenml/services/local/local_daemon_entrypoint.py +4 -4
- zenml/services/service.py +2 -2
- zenml/stack/stack.py +3 -108
- zenml/stack/stack_component.py +2 -78
- zenml/stack/utils.py +26 -14
- zenml/stack_deployments/aws_stack_deployment.py +3 -0
- zenml/step_operators/step_operator_entrypoint_configuration.py +1 -1
- zenml/steps/__init__.py +3 -9
- zenml/steps/base_step.py +25 -267
- zenml/steps/entrypoint_function_utils.py +2 -80
- zenml/{new/steps → steps}/step_context.py +12 -66
- zenml/steps/step_decorator.py +42 -89
- zenml/steps/step_invocation.py +16 -60
- zenml/steps/utils.py +4 -23
- zenml/utils/dashboard_utils.py +16 -51
- zenml/utils/materializer_utils.py +1 -1
- zenml/utils/requirements_utils.py +71 -0
- zenml/utils/singleton.py +15 -3
- zenml/utils/source_utils.py +39 -2
- zenml/utils/typing_utils.py +8 -28
- zenml/utils/visualization_utils.py +1 -1
- zenml/zen_server/auth.py +44 -39
- zenml/zen_server/dashboard/assets/{404-Y50hSt65.js → 404-DT4QRUqN.js} +1 -1
- zenml/zen_server/dashboard/assets/@radix-DP6vWzyx.js +85 -0
- zenml/zen_server/dashboard/assets/@react-router-BMhZulnd.js +29 -0
- zenml/zen_server/dashboard/assets/@reactflow-8U9qNlMR.js +17 -0
- zenml/zen_server/dashboard/assets/@tanstack-BUCbhJyH.js +22 -0
- zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-xLR9a1iw.js → AlertDialogDropdownItem-C6N2rGrB.js} +1 -1
- zenml/zen_server/dashboard/assets/{CodeSnippet-IxXNxUDa.js → CodeSnippet-CqybNv0k.js} +1 -1
- zenml/zen_server/dashboard/assets/{CollapsibleCard-BhutZbBL.js → CollapsibleCard-0r_8G2Lj.js} +1 -1
- zenml/zen_server/dashboard/assets/{Commands-Bf-rd1z8.js → Commands-BDjgBQKi.js} +1 -1
- zenml/zen_server/dashboard/assets/ComponentBadge-DUiEYJHu.js +1 -0
- zenml/zen_server/dashboard/assets/ComponentFallbackDialog-BFoH5K4V.js +1 -0
- zenml/zen_server/dashboard/assets/ComponentIcon-CAIoUis2.js +1 -0
- zenml/zen_server/dashboard/assets/{CopyButton-DcFHidFJ.js → CopyButton-C745BrKi.js} +1 -1
- zenml/zen_server/dashboard/assets/{CsvVizualization-QSbjrfxw.js → CsvVizualization-PpAq0CeZ.js} +5 -5
- zenml/zen_server/dashboard/assets/{DialogItem-Cd3HqST4.js → DialogItem-DcVCZEew.js} +1 -1
- zenml/zen_server/dashboard/assets/{DisplayDate-DkCy54Bp.js → DisplayDate-BeXgUG_C.js} +1 -1
- zenml/zen_server/dashboard/assets/{EmptyState-Cs3DEmso.js → EmptyState-DeK7H4pr.js} +1 -1
- zenml/zen_server/dashboard/assets/{Error-BhwdmqK7.js → Error-BMlzibXj.js} +1 -1
- zenml/zen_server/dashboard/assets/{Helpbox-0pBpTwTm.js → Helpbox-BLf40fLV.js} +1 -1
- zenml/zen_server/dashboard/assets/{Infobox-BTK_EUKT.js → Infobox-BwisKifi.js} +1 -1
- zenml/zen_server/dashboard/assets/{InlineAvatar-CA3DFMcM.js → InlineAvatar-jEgodSgX.js} +1 -1
- zenml/zen_server/dashboard/assets/{Lock-CmIn0szs.js → Lock-3lLt1ih0.js} +1 -1
- zenml/zen_server/dashboard/assets/MarkdownVisualization-8O9kTr-2.js +14 -0
- zenml/zen_server/dashboard/assets/{NumberBox-CrN0_kqI.js → NumberBox-T9eELfLZ.js} +1 -1
- zenml/zen_server/dashboard/assets/{Partials-QLOZw624.js → Partials-YPBB3V4q.js} +1 -1
- zenml/zen_server/dashboard/assets/{PasswordChecker-DE71J_3F.js → PasswordChecker-CW0kqY0W.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderIcon-C16CCIN4.js → ProviderIcon-Bb3Xha5A.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderRadio-D3FuCHf3.js → ProviderRadio-BROY1700.js} +1 -1
- zenml/zen_server/dashboard/assets/RunSelector-DCiL3M1c.js +1 -0
- zenml/zen_server/dashboard/assets/SearchField-DfUiGFVd.js +1 -0
- zenml/zen_server/dashboard/assets/{SecretTooltip-BaMwHF-Q.js → SecretTooltip-C_qByGWB.js} +1 -1
- zenml/zen_server/dashboard/assets/{SetPassword-DuIC65H9.js → SetPassword-7pRB00El.js} +1 -1
- zenml/zen_server/dashboard/assets/{Tick-DJTCF0Re.js → Tick-CykQFPj2.js} +1 -1
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-CUm-DMpw.js → UpdatePasswordSchemas-DckMEkFf.js} +1 -1
- zenml/zen_server/dashboard/assets/{UsageReason-CKw0juLF.js → UsageReason-DVceN14P.js} +1 -1
- zenml/zen_server/dashboard/assets/{WizardFooter-Cv9ApYWU.js → WizardFooter-CW0Cvd70.js} +1 -1
- zenml/zen_server/dashboard/assets/{check-circle-DOoS4yhF.js → check-circle-Dwxliy1Z.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-down-Cwb-W_B_.js → chevron-down-8wLBS5pQ.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-right-double-c9H46Kl8.js → chevron-right-double-DoD8iXWM.js} +1 -1
- zenml/zen_server/dashboard/assets/{cloud-only-BB4BVa6E.js → cloud-only-B-s_HMDm.js} +1 -1
- zenml/zen_server/dashboard/assets/{code-browser-BJYErIjr.js → code-browser-CZUQs3Wa.js} +1 -1
- zenml/zen_server/dashboard/assets/{copy-CaGlDsUy.js → copy-CaSMXwiU.js} +1 -1
- zenml/zen_server/dashboard/assets/{create-stack-F29xAUEx.js → create-stack-CEmaPZ4c.js} +1 -1
- zenml/zen_server/dashboard/assets/delete-run-D-LKbGyz.js +1 -0
- zenml/zen_server/dashboard/assets/{docker-BFAFXr2_.js → docker-BFNgg-z3.js} +1 -1
- zenml/zen_server/dashboard/assets/{dots-horizontal-C6K59vUm.js → dots-horizontal-DK5Duzx4.js} +1 -1
- zenml/zen_server/dashboard/assets/{form-schemas-BKXwSDK2.js → form-schemas-1AyOCx90.js} +1 -1
- zenml/zen_server/dashboard/assets/{gcp-Dj6ntk0L.js → gcp-7M2Yf3ZK.js} +1 -1
- zenml/zen_server/dashboard/assets/{help-CwN931fX.js → help-Dam461dC.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-5GJ5ysEZ.js → index-BVJ8n2-j.js} +1 -1
- zenml/zen_server/dashboard/assets/index-Bpmj40BI.js +1 -0
- zenml/zen_server/dashboard/assets/index-CbU4Ln_E.css +1 -0
- zenml/zen_server/dashboard/assets/{index-D-mtoBj3.js → index-DKPhqP2B.js} +1 -1
- zenml/zen_server/dashboard/assets/index-QQb7wQEC.js +55 -0
- zenml/zen_server/dashboard/assets/index.esm-cuVep_NJ.js +1 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-BLGc9T1a.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-ZzOtrSSW.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-D4Vwzodn.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-DH2hs3aW.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-BGBWG807.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-BuzJQFbW.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-BPnxn4xp.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-Dc4VJyIJ.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-BShVwWPj.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-CUiC4oBV.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-Bt9VVOA-.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-CaqZN2hq.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-400-normal-BZzXV7-1.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-400-normal-DxZsaF_h.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-500-normal-CeQXL5ds.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-500-normal-d_eO-yCQ.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-600-normal-CwicyhtI.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-600-normal-Dhlb-90d.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-Bput3-QP.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-DCpCPQOf.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-B6guLgqG.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-M2hEX8vc.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-C9WLioJ8.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-Cnui8OiR.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-400-normal-BOOGhInR.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-400-normal-gitzw0hO.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-500-normal-D2bGa7uu.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-500-normal-deR1Tlfd.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-600-normal-B5cFAncS.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-600-normal-D273HNI0.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-C1t-h-pH.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-hnt3BR84.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-CIS2RHJS.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-UMdmhHu2.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-BnYJhD27.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-CAF0vJDd.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-BUNmGMP1.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-DQPw2Hwd.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-Cm6aH8_k.woff +0 -0
- zenml/zen_server/dashboard/assets/{kubernetes-BjbR6D-1.js → kubernetes--g7r02Zu.js} +1 -1
- zenml/zen_server/dashboard/assets/{layout-Dru15_XR.js → layout-DCSYN7-C.js} +1 -1
- zenml/zen_server/dashboard/assets/{link-external-BT2L8hAQ.js → link-external-CBEk6kEG.js} +1 -1
- zenml/zen_server/dashboard/assets/{login-mutation-ax6iL2Mb.js → login-mutation-DTcAFP1l.js} +1 -1
- zenml/zen_server/dashboard/assets/{logs-GiDJXbLS.js → logs-D5bdJGur.js} +1 -1
- zenml/zen_server/dashboard/assets/not-found-Cc-JkRH2.js +1 -0
- zenml/zen_server/dashboard/assets/{package-DYKZ5jKW.js → package-Cs35Szwh.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-HkVBdZl6.js → page-9yplj5JT.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-uORspyRu.js → page-B-y2XKIc.js} +1 -1
- zenml/zen_server/dashboard/assets/page-BBpOxVcY.js +1 -0
- zenml/zen_server/dashboard/assets/{page-BDg1F-Ug.js → page-BQQKaabe.js} +2 -2
- zenml/zen_server/dashboard/assets/page-BRInM1Lg.js +1 -0
- zenml/zen_server/dashboard/assets/{page-CvKnNK1S.js → page-BjjlMk7s.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BukXK1Aa.js → page-Bvd7YH2A.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DcTjHmYZ.js → page-C0N5q3l7.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CT3Nep8W.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DuqYMYmH.js → page-C_f47pBf.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DRfcRK1w.js → page-ClUVkl-O.js} +1 -1
- zenml/zen_server/dashboard/assets/page-Cmv8C_yM.js +3 -0
- zenml/zen_server/dashboard/assets/{page-p0BhSAWx.js → page-CyN2bdWG.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CzzXH4fs.js +1 -0
- zenml/zen_server/dashboard/assets/{page-6mfzecin.js → page-DH_Z7iW1.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-8kYmrh0B.js → page-DIOXwhiD.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BXarY9K2.js → page-DLixvR-7.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DTlGjgnG.js +1 -0
- zenml/zen_server/dashboard/assets/page-Dbpl86h0.js +1 -0
- zenml/zen_server/dashboard/assets/{page-MAXyfXBq.js → page-Ddgy6kDS.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DtCAfBLy.js +9 -0
- zenml/zen_server/dashboard/assets/{page-CKHNAq7z.js → page-Dx16z7nA.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DMSLXKGT.js → page-DzpVUZ8f.js} +1 -1
- zenml/zen_server/dashboard/assets/page-McUyYbo1.js +1 -0
- zenml/zen_server/dashboard/assets/{page-miU2rhYG.js → page-N4qoPHKb.js} +1 -1
- zenml/zen_server/dashboard/assets/page-T1P3RyAR.js +1 -0
- zenml/zen_server/dashboard/assets/{page-3qPX9WYH.js → page-bKaULTGG.js} +1 -1
- zenml/zen_server/dashboard/assets/page-sbXUJy9t.js +1 -0
- zenml/zen_server/dashboard/assets/{persist-CfJMar_k.js → persist-CP0JmYZ4.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-BxIR2XZs.js → persist-DNb5cdrU.js} +1 -1
- zenml/zen_server/dashboard/assets/{plus-Bc8eLSDM.js → plus-C9IxgN2M.js} +1 -1
- zenml/zen_server/dashboard/assets/{refresh-hfgWPeto.js → refresh-BVu22P_C.js} +1 -1
- zenml/zen_server/dashboard/assets/{rocket-SESCGQXm.js → rocket-CONEmRmB.js} +1 -1
- zenml/zen_server/dashboard/assets/{sharedSchema-vub0rii3.js → sharedSchema-TMLu-nYQ.js} +1 -1
- zenml/zen_server/dashboard/assets/stack-detail-query-xmYxSsUY.js +1 -0
- zenml/zen_server/dashboard/assets/{tick-circle-m-hJG8i9.js → tick-circle-CM1ZScbQ.js} +1 -1
- zenml/zen_server/dashboard/assets/{trash-DUWZWzse.js → trash-DkJHMOg7.js} +1 -1
- zenml/zen_server/dashboard/assets/{update-server-settings-mutation-FGVP7X2U.js → update-server-settings-mutation-DsU8cNVl.js} +1 -1
- zenml/zen_server/dashboard/assets/{url-CbAPzsmT.js → url-D5le3J4q.js} +1 -1
- zenml/zen_server/dashboard/assets/zod-D89GC_vc.js +1 -0
- zenml/zen_server/dashboard/index.html +7 -7
- zenml/zen_server/deploy/__init__.py +7 -16
- zenml/zen_server/deploy/base_provider.py +46 -73
- zenml/zen_server/deploy/{local → daemon}/__init__.py +3 -3
- zenml/zen_server/deploy/{local/local_provider.py → daemon/daemon_provider.py} +44 -63
- zenml/zen_server/deploy/{local/local_zen_server.py → daemon/daemon_zen_server.py} +50 -28
- zenml/zen_server/deploy/deployer.py +90 -171
- zenml/zen_server/deploy/deployment.py +20 -12
- zenml/zen_server/deploy/docker/docker_provider.py +9 -28
- zenml/zen_server/deploy/docker/docker_zen_server.py +19 -9
- zenml/zen_server/deploy/helm/Chart.yaml +1 -1
- zenml/zen_server/deploy/helm/README.md +2 -2
- zenml/zen_server/exceptions.py +11 -0
- zenml/zen_server/feature_gate/zenml_cloud_feature_gate.py +1 -1
- zenml/zen_server/jwt.py +9 -9
- zenml/zen_server/routers/artifact_version_endpoints.py +1 -1
- zenml/zen_server/routers/auth_endpoints.py +30 -8
- zenml/zen_server/routers/runs_endpoints.py +0 -28
- zenml/zen_server/routers/stack_components_endpoints.py +1 -1
- zenml/zen_server/routers/workspaces_endpoints.py +1 -1
- zenml/zen_server/template_execution/runner_entrypoint_configuration.py +7 -4
- zenml/zen_server/template_execution/utils.py +8 -63
- zenml/zen_server/utils.py +67 -69
- zenml/zen_server/zen_server_api.py +107 -17
- zenml/zen_stores/base_zen_store.py +4 -51
- zenml/zen_stores/migrations/versions/0.67.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.68.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.68.1_release.py +23 -0
- zenml/zen_stores/migrations/versions/1d8f30c54477_migrate_to_new_.py +124 -0
- zenml/zen_stores/migrations/versions/c22561cbb3a9_add_artifact_unique_constraints.py +86 -0
- zenml/zen_stores/rest_zen_store.py +325 -147
- zenml/zen_stores/schemas/api_key_schemas.py +9 -4
- zenml/zen_stores/schemas/artifact_schemas.py +21 -2
- zenml/zen_stores/schemas/artifact_visualization_schemas.py +1 -1
- zenml/zen_stores/schemas/component_schemas.py +49 -6
- zenml/zen_stores/schemas/device_schemas.py +9 -4
- zenml/zen_stores/schemas/flavor_schemas.py +1 -1
- zenml/zen_stores/schemas/model_schemas.py +1 -1
- zenml/zen_stores/schemas/pipeline_run_schemas.py +12 -4
- zenml/zen_stores/schemas/service_schemas.py +1 -1
- zenml/zen_stores/schemas/step_run_schemas.py +3 -3
- zenml/zen_stores/schemas/trigger_schemas.py +1 -1
- zenml/zen_stores/sql_zen_store.py +422 -145
- zenml/zen_stores/template_utils.py +3 -1
- {zenml_nightly-0.66.0.dev20240927.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/METADATA +20 -18
- {zenml_nightly-0.66.0.dev20240927.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/RECORD +344 -506
- {zenml_nightly-0.66.0.dev20240927.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/WHEEL +1 -1
- zenml/api.py +0 -60
- zenml/cli/stack_recipes.py +0 -469
- zenml/lineage_graph/__init__.py +0 -34
- zenml/lineage_graph/lineage_graph.py +0 -244
- zenml/lineage_graph/node/__init__.py +0 -32
- zenml/lineage_graph/node/artifact_node.py +0 -51
- zenml/lineage_graph/node/step_node.py +0 -41
- zenml/model/model_version.py +0 -38
- zenml/new/pipelines/code_archive.py +0 -157
- zenml/new/pipelines/pipeline_decorator.py +0 -118
- zenml/new/steps/step_decorator.py +0 -176
- zenml/pipelines/base_pipeline.py +0 -273
- zenml/post_execution/__init__.py +0 -30
- zenml/post_execution/pipeline.py +0 -55
- zenml/post_execution/pipeline_run.py +0 -55
- zenml/services/terraform/__init__.py +0 -14
- zenml/services/terraform/terraform_service.py +0 -441
- zenml/steps/external_artifact.py +0 -26
- zenml/steps/step_environment.py +0 -108
- zenml/steps/step_output.py +0 -36
- zenml/utils/mlstacks_utils.py +0 -635
- zenml/utils/terraform_utils.py +0 -43
- zenml/zen_server/dashboard/assets/@radix-DnFH_oo1.js +0 -85
- zenml/zen_server/dashboard/assets/@react-router-APVeuk-U.js +0 -29
- zenml/zen_server/dashboard/assets/@reactflow-ytavUpwh.js +0 -17
- zenml/zen_server/dashboard/assets/@tanstack-QbMbTrh5.js +0 -22
- zenml/zen_server/dashboard/assets/ComponentBadge-gKR1OIwG.js +0 -1
- zenml/zen_server/dashboard/assets/ExecutionStatus-D6r6aK8J.js +0 -1
- zenml/zen_server/dashboard/assets/MarkdownVisualization-DS05sfBm.js +0 -14
- zenml/zen_server/dashboard/assets/SearchField-BzmfxS0L.js +0 -1
- zenml/zen_server/dashboard/assets/all-pipeline-runs-query-BA3R2Sey.js +0 -1
- zenml/zen_server/dashboard/assets/delete-run-CP0pcJ3U.js +0 -1
- zenml/zen_server/dashboard/assets/index-BhJ6ZJxv.css +0 -1
- zenml/zen_server/dashboard/assets/index-Ci0nJ8EZ.js +0 -55
- zenml/zen_server/dashboard/assets/index.esm-BE1uqCX5.js +0 -1
- zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-Df6ckaLK.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-JrS_4yms.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-BRrLR67x.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-DskEQOpE.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-DDpWG8g5.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-iz1--dBq.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-CzG7Kr3z.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-tyfMZHQw.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-DOnSzjnx.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-Xebo2OyJ.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-DpA2xaRd.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-KAwcVx6H.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-400-normal-DQXyrmoy.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-400-normal-DvIPHDQ7.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-500-normal-BjpBGs91.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-500-normal-CmOavsDc.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-600-normal-B-l8Lzzd.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-600-normal-BLZsI-P3.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-CIdlr5YK.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-_Rr29XE2.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-2pdUafRD.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-Dtavx3qw.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-BmtRFZgT.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-CkBLDEl_.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-400-normal-BT1H-PT_.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-400-normal-Cdi8t5Mu.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-500-normal-D4I8BKCx.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-500-normal-kWhwEdDH.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-600-normal-B2Ssfs8e.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-600-normal-Dbvh0wvx.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-8tIzm-yw.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-D3W-OpO-.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-B9u8Q_zH.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-SuUkSNTU.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-Dg0Bk0Yr.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-ao35dkSb.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-Cnt0N5Vm.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-DIOGfGLL.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-0i6yoQMg.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-5IkPJ6Nk.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-BQ_dbMbg.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-DjnxGF-L.woff2 +0 -0
- zenml/zen_server/dashboard/assets/not-found-DbjllLY_.js +0 -1
- zenml/zen_server/dashboard/assets/page-B1n7_W7z.js +0 -1
- zenml/zen_server/dashboard/assets/page-BZZhLo2u.js +0 -1
- zenml/zen_server/dashboard/assets/page-Bbf_oBjn.js +0 -1
- zenml/zen_server/dashboard/assets/page-BjjuBvZG.js +0 -9
- zenml/zen_server/dashboard/assets/page-CHaQkFK5.js +0 -1
- zenml/zen_server/dashboard/assets/page-CS0SYFK8.js +0 -1
- zenml/zen_server/dashboard/assets/page-DGM1CbYT.js +0 -2
- zenml/zen_server/dashboard/assets/page-DOmIZ2ra.js +0 -1
- zenml/zen_server/dashboard/assets/page-DYVmJ9_w.js +0 -3
- zenml/zen_server/dashboard/assets/page-Dwow2doB.js +0 -1
- zenml/zen_server/dashboard/assets/stack-detail-query-DQcyzG-2.js +0 -1
- zenml/zen_server/dashboard/assets/zod-uFd1wBcd.js +0 -1
- zenml/zen_server/dashboard_legacy/_redirects +0 -1
- zenml/zen_server/dashboard_legacy/asset-manifest.json +0 -131
- zenml/zen_server/dashboard_legacy/favicon.ico +0 -0
- zenml/zen_server/dashboard_legacy/index.html +0 -1
- zenml/zen_server/dashboard_legacy/manifest.json +0 -25
- zenml/zen_server/dashboard_legacy/precache-manifest.6d320abb70db612019dda6c4948e7a90.js +0 -462
- zenml/zen_server/dashboard_legacy/robots.txt +0 -2
- zenml/zen_server/dashboard_legacy/service-worker.js +0 -39
- zenml/zen_server/dashboard_legacy/static/css/2.5b37d44a.chunk.css +0 -16
- zenml/zen_server/dashboard_legacy/static/css/2.5b37d44a.chunk.css.map +0 -1
- zenml/zen_server/dashboard_legacy/static/css/main.e79dff04.chunk.css +0 -2
- zenml/zen_server/dashboard_legacy/static/css/main.e79dff04.chunk.css.map +0 -1
- zenml/zen_server/dashboard_legacy/static/js/2.7934458d.chunk.js +0 -3
- zenml/zen_server/dashboard_legacy/static/js/2.7934458d.chunk.js.LICENSE.txt +0 -95
- zenml/zen_server/dashboard_legacy/static/js/2.7934458d.chunk.js.map +0 -1
- zenml/zen_server/dashboard_legacy/static/js/main.fa9299d5.chunk.js +0 -2
- zenml/zen_server/dashboard_legacy/static/js/main.fa9299d5.chunk.js.map +0 -1
- zenml/zen_server/dashboard_legacy/static/js/runtime-main.bfca2edd.js +0 -2
- zenml/zen_server/dashboard_legacy/static/js/runtime-main.bfca2edd.js.map +0 -1
- zenml/zen_server/dashboard_legacy/static/media/AlertTriangle.28aee535.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/ArrowSquareOut.abfb9bc7.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/Back.86c23a22.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/BookOpen.5cb101ff.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/BoundingBox.1eb98717.svg +0 -10
- zenml/zen_server/dashboard_legacy/static/media/Burger.9b1c67d7.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Cached.2381fb8d.svg +0 -1
- zenml/zen_server/dashboard_legacy/static/media/Calendar.356e11c7.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/ChartBarHorizontal.0247447b.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/ChartLine.0d79e18d.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/ChatDots.2e1c9211.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/Check.dad6beb2.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/CheckCircleFilled.c19566d0.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Checkbox.af50e31e.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/ChevronDown.f860ce32.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/ChevronDownLight.6642d756.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/ChevronLeft.f6edfcdb.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/CircleCheck.f98fd6ca.svg +0 -1
- zenml/zen_server/dashboard_legacy/static/media/Clock.ffc9de95.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Close.74e9efbc.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/CloseWithBorder.6960930a.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/CloseWithoutBorder.cd6f71df.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/CloudArrowUp.0aecb235.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/Code.ef0f33b5.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Config.0be63f8a.svg +0 -1
- zenml/zen_server/dashboard_legacy/static/media/Connector.9fd46ef1.svg +0 -10
- zenml/zen_server/dashboard_legacy/static/media/Copy.36e2112a.svg +0 -1
- zenml/zen_server/dashboard_legacy/static/media/Dashboard.d05787e0.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Data.b1c3b5f8.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Delete.3c361b28.svg +0 -8
- zenml/zen_server/dashboard_legacy/static/media/Docs.7541d478.svg +0 -7
- zenml/zen_server/dashboard_legacy/static/media/Download.fba04d87.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/Edit.490eb294.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/EmptyRightArrow.23749d01.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Example.6396cd37.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/Extension.1394cd4a.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Eye.d9e4ee62.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/Failed.0213c1a0.svg +0 -1
- zenml/zen_server/dashboard_legacy/static/media/FileText.1f15bacd.svg +0 -7
- zenml/zen_server/dashboard_legacy/static/media/Filter.ab6b9c0d.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Folders.12b29887.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/FunnelFill.6df4c143.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/GitCommit.7dd9c2aa.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/GitHub_Logo.cefc2023.png +0 -0
- zenml/zen_server/dashboard_legacy/static/media/Graph.2c63a892.svg +0 -11
- zenml/zen_server/dashboard_legacy/static/media/History.08329240.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Home.0843b0d5.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/ImageBuilder.ea762d9c.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/InProgress.304a0edc.svg +0 -1
- zenml/zen_server/dashboard_legacy/static/media/Info.9fe10c5c.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/KeyboardReturn.491afbe3.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Link.72bbb55d.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/Lock.30f5e1fe.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/Lock2.a769ea52.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/LockKey.92f21621.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/Logs.8bf4d005.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/MinusCircle.4188f418.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/ModelRegistry.f0de050a.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/MultiUser.a2ba7c67.svg +0 -10
- zenml/zen_server/dashboard_legacy/static/media/PaginationFirst.92628634.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/PaginationLast.00d3c732.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/PaginationNext.86158845.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/PaginationPrev.60c18a88.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Pen.f2d831d4.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/PhotoCamera.179d6d4c.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Pipeline.30d298b0.svg +0 -7
- zenml/zen_server/dashboard_legacy/static/media/Plus.5aa1c16b.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/PlusCircle.92d860dd.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/Repositories.71a36b8c.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/RightArrow.f30d3871.svg +0 -29
- zenml/zen_server/dashboard_legacy/static/media/Rocket.63bf7b9d.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/RocketLaunch.1bff2b59.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/Rubik-Medium.c87313aa.ttf +0 -0
- zenml/zen_server/dashboard_legacy/static/media/Rubik-Regular.b3d0902b.ttf +0 -0
- zenml/zen_server/dashboard_legacy/static/media/Run.daec4fb2.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/Search.d1afcce5.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/Settings.59ca73ae.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/Share2.46c3ff66.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/SignOut.6aa718c5.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/SimplePlus.5cf7ec20.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/SingleUser.bef3a095.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/SourceCodePro-Regular.b484b32f.ttf +0 -0
- zenml/zen_server/dashboard_legacy/static/media/Stack.19b604ac.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/StackComponent.b1ba90b5.svg +0 -4
- zenml/zen_server/dashboard_legacy/static/media/Star.f0c25022.svg +0 -9
- zenml/zen_server/dashboard_legacy/static/media/StarOutline.94ca8cd9.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Storefront.4b4796fe.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/Stream.543e3039.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/SupportAgent.510ddf1f.svg +0 -8
- zenml/zen_server/dashboard_legacy/static/media/Table.77033750.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/Tool.d5785486.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/UserPlus.741a99d7.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/Verified.0625b2a0.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/addNew.4fb6c939.svg +0 -8
- zenml/zen_server/dashboard_legacy/static/media/arrowClose.cbd53f3f.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/arrowOpen.6ceef0af.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/check_small.30bc0138.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/circleArrowSideClose.98d6013e.svg +0 -18
- zenml/zen_server/dashboard_legacy/static/media/circleArrowSideOpen.63653df6.svg +0 -18
- zenml/zen_server/dashboard_legacy/static/media/image.104fd14b.png +0 -0
- zenml/zen_server/dashboard_legacy/static/media/imageAddIcon.e83004a9.svg +0 -7
- zenml/zen_server/dashboard_legacy/static/media/logo.93333e5c.svg +0 -1
- zenml/zen_server/dashboard_legacy/static/media/logo_small.4204397d.svg +0 -3
- zenml/zen_server/dashboard_legacy/static/media/logo_white.d4b4414e.svg +0 -20
- zenml/zen_server/dashboard_legacy/static/media/notConnected.5e2c8ea7.svg +0 -8
- zenml/zen_server/dashboard_legacy/static/media/plugin-fallback.72c294e6.svg +0 -6
- zenml/zen_server/dashboard_legacy/static/media/share.bcd998b0.svg +0 -5
- zenml/zen_server/dashboard_legacy/static/media/stars.08a9b19a.svg +0 -8
- zenml/zen_server/deploy/terraform/__init__.py +0 -41
- zenml/zen_server/deploy/terraform/providers/aws_provider.py +0 -61
- zenml/zen_server/deploy/terraform/providers/azure_provider.py +0 -59
- zenml/zen_server/deploy/terraform/providers/gcp_provider.py +0 -59
- zenml/zen_server/deploy/terraform/providers/terraform_provider.py +0 -331
- zenml/zen_server/deploy/terraform/recipes/aws/.gitignore +0 -8
- zenml/zen_server/deploy/terraform/recipes/aws/helm.tf +0 -20
- zenml/zen_server/deploy/terraform/recipes/aws/ingress.tf +0 -30
- zenml/zen_server/deploy/terraform/recipes/aws/outputs.tf +0 -7
- zenml/zen_server/deploy/terraform/recipes/aws/printf.cmd +0 -2
- zenml/zen_server/deploy/terraform/recipes/aws/sql.tf +0 -62
- zenml/zen_server/deploy/terraform/recipes/aws/terraform.tf +0 -44
- zenml/zen_server/deploy/terraform/recipes/aws/variables.tf +0 -167
- zenml/zen_server/deploy/terraform/recipes/aws/vpc.tf +0 -47
- zenml/zen_server/deploy/terraform/recipes/aws/zen_server.tf +0 -103
- zenml/zen_server/deploy/terraform/recipes/azure/.gitignore +0 -8
- zenml/zen_server/deploy/terraform/recipes/azure/helm.tf +0 -20
- zenml/zen_server/deploy/terraform/recipes/azure/ingress.tf +0 -30
- zenml/zen_server/deploy/terraform/recipes/azure/key_vault.tf +0 -73
- zenml/zen_server/deploy/terraform/recipes/azure/outputs.tf +0 -7
- zenml/zen_server/deploy/terraform/recipes/azure/printf.cmd +0 -2
- zenml/zen_server/deploy/terraform/recipes/azure/rg.tf +0 -36
- zenml/zen_server/deploy/terraform/recipes/azure/sql.tf +0 -65
- zenml/zen_server/deploy/terraform/recipes/azure/terraform.tf +0 -52
- zenml/zen_server/deploy/terraform/recipes/azure/variables.tf +0 -176
- zenml/zen_server/deploy/terraform/recipes/azure/zen_server.tf +0 -103
- zenml/zen_server/deploy/terraform/recipes/gcp/.gitignore +0 -8
- zenml/zen_server/deploy/terraform/recipes/gcp/helm.tf +0 -20
- zenml/zen_server/deploy/terraform/recipes/gcp/ingress.tf +0 -30
- zenml/zen_server/deploy/terraform/recipes/gcp/outputs.tf +0 -7
- zenml/zen_server/deploy/terraform/recipes/gcp/printf.cmd +0 -2
- zenml/zen_server/deploy/terraform/recipes/gcp/sql.tf +0 -64
- zenml/zen_server/deploy/terraform/recipes/gcp/terraform.tf +0 -44
- zenml/zen_server/deploy/terraform/recipes/gcp/variables.tf +0 -171
- zenml/zen_server/deploy/terraform/recipes/gcp/zen_server.tf +0 -114
- zenml/zen_server/deploy/terraform/terraform_zen_server.py +0 -246
- /zenml/{new/pipelines → pipelines}/build_utils.py +0 -0
- /zenml/{new/steps → steps}/decorated_step.py +0 -0
- {zenml_nightly-0.66.0.dev20240927.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/LICENSE +0 -0
- {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)}"
|
zenml/login/pro/utils.py
ADDED
@@ -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
|
+
)
|
zenml/{cli → login}/web_login.py
RENAMED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) ZenML GmbH
|
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
|
-
"""
|
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(
|
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
|
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
|
-
|
73
|
-
|
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
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
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
|
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
|
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 =
|
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
|
-
|
171
|
-
|
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
|
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)
|
zenml/materializers/__init__.py
CHANGED
@@ -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
|
-
|
234
|
-
|
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
|
255
|
+
TypeError: If the materializer cannot load the given type.
|
241
256
|
"""
|
242
|
-
if not self.
|
257
|
+
if not self.can_load_type(data_type):
|
243
258
|
raise TypeError(
|
244
|
-
f"Unable to
|
245
|
-
f"can only
|
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
|
251
|
-
"""Whether the materializer can
|
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
|
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
|
|