zenml-nightly 0.66.0.dev20240928__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/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.dev20240928.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/METADATA +20 -18
- {zenml_nightly-0.66.0.dev20240928.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/RECORD +343 -505
- {zenml_nightly-0.66.0.dev20240928.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.dev20240928.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.66.0.dev20240928.dist-info → zenml_nightly-0.68.1.dev20241102.dist-info}/entry_points.txt +0 -0
@@ -37,6 +37,7 @@ from pydantic import (
|
|
37
37
|
BaseModel,
|
38
38
|
ConfigDict,
|
39
39
|
Field,
|
40
|
+
ValidationError,
|
40
41
|
field_validator,
|
41
42
|
model_validator,
|
42
43
|
)
|
@@ -112,9 +113,19 @@ from zenml.enums import (
|
|
112
113
|
StackDeploymentProvider,
|
113
114
|
StoreType,
|
114
115
|
)
|
115
|
-
from zenml.exceptions import
|
116
|
+
from zenml.exceptions import (
|
117
|
+
AuthorizationException,
|
118
|
+
CredentialsNotValid,
|
119
|
+
MethodNotAllowedError,
|
120
|
+
)
|
116
121
|
from zenml.io import fileio
|
117
122
|
from zenml.logger import get_logger
|
123
|
+
from zenml.login.credentials import APIToken
|
124
|
+
from zenml.login.credentials_store import get_credentials_store
|
125
|
+
from zenml.login.pro.utils import (
|
126
|
+
get_troubleshooting_instructions,
|
127
|
+
is_zenml_pro_server_url,
|
128
|
+
)
|
118
129
|
from zenml.models import (
|
119
130
|
ActionFilter,
|
120
131
|
ActionRequest,
|
@@ -173,6 +184,7 @@ from zenml.models import (
|
|
173
184
|
OAuthDeviceFilter,
|
174
185
|
OAuthDeviceResponse,
|
175
186
|
OAuthDeviceUpdate,
|
187
|
+
OAuthTokenResponse,
|
176
188
|
Page,
|
177
189
|
PipelineBuildFilter,
|
178
190
|
PipelineBuildRequest,
|
@@ -256,6 +268,7 @@ from zenml.service_connectors.service_connector_registry import (
|
|
256
268
|
from zenml.utils.networking_utils import (
|
257
269
|
replace_localhost_with_internal_hostname,
|
258
270
|
)
|
271
|
+
from zenml.utils.pydantic_utils import before_validator_handler
|
259
272
|
from zenml.zen_server.exceptions import exception_from_response
|
260
273
|
from zenml.zen_stores.base_zen_store import BaseZenStore
|
261
274
|
|
@@ -281,10 +294,10 @@ class RestZenStoreConfiguration(StoreConfiguration):
|
|
281
294
|
username: The username to use to connect to the Zen server.
|
282
295
|
password: The password to use to connect to the Zen server.
|
283
296
|
api_key: The service account API key to use to connect to the Zen
|
284
|
-
server.
|
285
|
-
|
286
|
-
|
287
|
-
|
297
|
+
server. This is only set if the API key is configured explicitly via
|
298
|
+
environment variables or the ZenML global configuration file. API
|
299
|
+
keys configured via the CLI are stored in the credentials store
|
300
|
+
instead.
|
288
301
|
verify_ssl: Either a boolean, in which case it controls whether we
|
289
302
|
verify the server's TLS certificate, or a string, in which case it
|
290
303
|
must be a path to a CA bundle to use or the CA bundle value itself.
|
@@ -294,32 +307,11 @@ class RestZenStoreConfiguration(StoreConfiguration):
|
|
294
307
|
|
295
308
|
type: StoreType = StoreType.REST
|
296
309
|
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
api_token: Optional[str] = None
|
301
|
-
verify_ssl: Union[bool, str] = Field(True, union_mode="left_to_right")
|
310
|
+
verify_ssl: Union[bool, str] = Field(
|
311
|
+
default=True, union_mode="left_to_right"
|
312
|
+
)
|
302
313
|
http_timeout: int = DEFAULT_HTTP_TIMEOUT
|
303
314
|
|
304
|
-
@model_validator(mode="after")
|
305
|
-
def validate_credentials(self) -> "RestZenStoreConfiguration":
|
306
|
-
"""Validates the credentials provided in the values dictionary.
|
307
|
-
|
308
|
-
Raises:
|
309
|
-
ValueError: If neither api_token nor username nor api_key is set.
|
310
|
-
|
311
|
-
Returns:
|
312
|
-
The values dictionary.
|
313
|
-
"""
|
314
|
-
# Check if the values dictionary contains either an API token, an API
|
315
|
-
# key or a username as non-empty strings.
|
316
|
-
if self.api_token or self.username or self.api_key:
|
317
|
-
return self
|
318
|
-
raise ValueError(
|
319
|
-
"Neither api_token nor username nor api_key is set in the "
|
320
|
-
"store config."
|
321
|
-
)
|
322
|
-
|
323
315
|
@field_validator("url")
|
324
316
|
@classmethod
|
325
317
|
def validate_url(cls, url: str) -> str:
|
@@ -406,13 +398,47 @@ class RestZenStoreConfiguration(StoreConfiguration):
|
|
406
398
|
with open(self.verify_ssl, "r") as f:
|
407
399
|
self.verify_ssl = f.read()
|
408
400
|
|
401
|
+
@model_validator(mode="before")
|
402
|
+
@classmethod
|
403
|
+
@before_validator_handler
|
404
|
+
def _move_credentials(cls, data: Dict[str, Any]) -> Dict[str, Any]:
|
405
|
+
"""Moves credentials (API keys, API tokens, passwords) from the config to the credentials store.
|
406
|
+
|
407
|
+
Args:
|
408
|
+
data: The values dict used to instantiate the model.
|
409
|
+
|
410
|
+
Returns:
|
411
|
+
The values dict without credentials.
|
412
|
+
"""
|
413
|
+
url = data.get("url")
|
414
|
+
if not url:
|
415
|
+
return data
|
416
|
+
|
417
|
+
url = replace_localhost_with_internal_hostname(url)
|
418
|
+
|
419
|
+
if api_token := data.pop("api_token", None):
|
420
|
+
credentials_store = get_credentials_store()
|
421
|
+
credentials_store.set_bare_token(url, api_token)
|
422
|
+
|
423
|
+
username = data.pop("username", None)
|
424
|
+
password = data.pop("password", None)
|
425
|
+
if username is not None and password is not None:
|
426
|
+
credentials_store = get_credentials_store()
|
427
|
+
credentials_store.set_password(url, username, password)
|
428
|
+
|
429
|
+
if api_key := data.pop("api_key", None):
|
430
|
+
credentials_store = get_credentials_store()
|
431
|
+
credentials_store.set_api_key(url, api_key)
|
432
|
+
|
433
|
+
return data
|
434
|
+
|
409
435
|
model_config = ConfigDict(
|
410
436
|
# Don't validate attributes when assigning them. This is necessary
|
411
437
|
# because the `verify_ssl` attribute can be expanded to the contents
|
412
438
|
# of the certificate file.
|
413
439
|
validate_assignment=False,
|
414
|
-
#
|
415
|
-
extra="
|
440
|
+
# Ignore extra attributes set in the class.
|
441
|
+
extra="ignore",
|
416
442
|
)
|
417
443
|
|
418
444
|
|
@@ -422,7 +448,7 @@ class RestZenStore(BaseZenStore):
|
|
422
448
|
config: RestZenStoreConfiguration
|
423
449
|
TYPE: ClassVar[StoreType] = StoreType.REST
|
424
450
|
CONFIG_TYPE: ClassVar[Type[StoreConfiguration]] = RestZenStoreConfiguration
|
425
|
-
_api_token: Optional[
|
451
|
+
_api_token: Optional[APIToken] = None
|
426
452
|
_session: Optional[requests.Session] = None
|
427
453
|
|
428
454
|
# ====================================
|
@@ -434,9 +460,54 @@ class RestZenStore(BaseZenStore):
|
|
434
460
|
# --------------------------------
|
435
461
|
|
436
462
|
def _initialize(self) -> None:
|
437
|
-
"""Initialize the REST store.
|
438
|
-
|
439
|
-
|
463
|
+
"""Initialize the REST store.
|
464
|
+
|
465
|
+
Raises:
|
466
|
+
RuntimeError: If the store cannot be initialized.
|
467
|
+
AuthorizationException: If the store cannot be initialized due to
|
468
|
+
authentication errors.
|
469
|
+
"""
|
470
|
+
try:
|
471
|
+
client_version = zenml.__version__
|
472
|
+
server_version = self.get_store_info().version
|
473
|
+
|
474
|
+
# Handle cases where the ZenML server is not available
|
475
|
+
except ConnectionError as e:
|
476
|
+
error_message = (
|
477
|
+
f"Cannot connect to the ZenML server at {self.url}."
|
478
|
+
)
|
479
|
+
if urlparse(self.url).hostname in [
|
480
|
+
"localhost",
|
481
|
+
"127.0.0.1",
|
482
|
+
"host.docker.internal",
|
483
|
+
]:
|
484
|
+
recommendation = (
|
485
|
+
"Please run `zenml login --local --restart` to restart the "
|
486
|
+
"server."
|
487
|
+
)
|
488
|
+
else:
|
489
|
+
recommendation = (
|
490
|
+
f"Please run `zenml login {self.url}` to reconnect to the "
|
491
|
+
"server."
|
492
|
+
)
|
493
|
+
raise RuntimeError(f"{error_message}\n{recommendation}") from e
|
494
|
+
|
495
|
+
except AuthorizationException as e:
|
496
|
+
raise AuthorizationException(
|
497
|
+
f"Authorization failed for store at '{self.url}'. Please check "
|
498
|
+
f"your credentials: {str(e)}"
|
499
|
+
)
|
500
|
+
|
501
|
+
except Exception as e:
|
502
|
+
zenml_pro_extra = ""
|
503
|
+
if is_zenml_pro_server_url(self.url):
|
504
|
+
zenml_pro_extra = (
|
505
|
+
"\nHINT: " + get_troubleshooting_instructions(self.url)
|
506
|
+
)
|
507
|
+
raise RuntimeError(
|
508
|
+
f"Error connecting to URL "
|
509
|
+
f"'{self.url}': {str(e)}" + zenml_pro_extra
|
510
|
+
) from e
|
440
511
|
|
441
512
|
if not DISABLE_CLIENT_SERVER_MISMATCH_WARNING and (
|
442
513
|
server_version != client_version
|
@@ -639,20 +710,6 @@ class RestZenStore(BaseZenStore):
|
|
639
710
|
params={"hydrate": hydrate},
|
640
711
|
)
|
641
712
|
|
642
|
-
def set_api_key(self, api_key: str) -> None:
|
643
|
-
"""Set the API key to use for authentication.
|
644
|
-
|
645
|
-
Args:
|
646
|
-
api_key: The API key to use for authentication.
|
647
|
-
"""
|
648
|
-
self.config.api_key = api_key
|
649
|
-
self.clear_session()
|
650
|
-
# TODO: find a way to persist the API key in the configuration file
|
651
|
-
# without calling _write_config() here.
|
652
|
-
# This is the only place where we need to explicitly call
|
653
|
-
# _write_config() to persist the global configuration.
|
654
|
-
GlobalConfiguration()._write_config()
|
655
|
-
|
656
713
|
def list_api_keys(
|
657
714
|
self,
|
658
715
|
service_account_id: UUID,
|
@@ -3979,76 +4036,166 @@ class RestZenStore(BaseZenStore):
|
|
3979
4036
|
# Internal helper methods
|
3980
4037
|
# =======================
|
3981
4038
|
|
3982
|
-
def
|
3983
|
-
"""Get
|
4039
|
+
def get_or_generate_api_token(self) -> str:
|
4040
|
+
"""Get or generate an API token.
|
3984
4041
|
|
3985
4042
|
Returns:
|
3986
|
-
The
|
4043
|
+
The API token.
|
3987
4044
|
|
3988
4045
|
Raises:
|
3989
|
-
|
3990
|
-
|
3991
|
-
"""
|
3992
|
-
if self._api_token is None:
|
3993
|
-
# Check if
|
3994
|
-
|
3995
|
-
|
3996
|
-
|
3997
|
-
|
3998
|
-
self.
|
3999
|
-
|
4000
|
-
|
4001
|
-
|
4002
|
-
|
4003
|
-
|
4004
|
-
|
4005
|
-
|
4006
|
-
"
|
4007
|
-
|
4008
|
-
|
4009
|
-
|
4010
|
-
|
4011
|
-
|
4012
|
-
|
4013
|
-
|
4014
|
-
|
4015
|
-
|
4016
|
-
|
4017
|
-
|
4018
|
-
|
4019
|
-
|
4020
|
-
|
4021
|
-
data=data,
|
4022
|
-
verify=self.config.verify_ssl,
|
4023
|
-
timeout=self.config.http_timeout,
|
4024
|
-
)
|
4046
|
+
CredentialsNotValid: if an API token cannot be fetched or
|
4047
|
+
generated because the client credentials are not valid.
|
4048
|
+
"""
|
4049
|
+
if self._api_token is None or self._api_token.expired:
|
4050
|
+
# Check if a valid API token is already in the cache
|
4051
|
+
credentials_store = get_credentials_store()
|
4052
|
+
credentials = credentials_store.get_credentials(self.url)
|
4053
|
+
token = credentials.api_token if credentials else None
|
4054
|
+
if credentials and token and not token.expired:
|
4055
|
+
self._api_token = token
|
4056
|
+
|
4057
|
+
# Populate the server info in the credentials store if it is
|
4058
|
+
# not already present
|
4059
|
+
if not credentials.server_id:
|
4060
|
+
try:
|
4061
|
+
server_info = self.get_store_info()
|
4062
|
+
except Exception as e:
|
4063
|
+
logger.warning(f"Failed to get server info: {e}.")
|
4064
|
+
else:
|
4065
|
+
credentials_store.update_server_info(
|
4066
|
+
self.url, server_info
|
4067
|
+
)
|
4068
|
+
|
4069
|
+
return self._api_token.access_token
|
4070
|
+
|
4071
|
+
# Token is expired or not found in the cache. Time to get a new one.
|
4072
|
+
|
4073
|
+
if not token:
|
4074
|
+
logger.debug(f"Authenticating to {self.url}")
|
4075
|
+
else:
|
4076
|
+
logger.debug(
|
4077
|
+
f"Authentication token for {self.url} expired; refreshing..."
|
4025
4078
|
)
|
4026
|
-
|
4027
|
-
|
4028
|
-
|
4029
|
-
|
4030
|
-
|
4031
|
-
|
4032
|
-
|
4079
|
+
|
4080
|
+
data: Optional[Dict[str, str]] = None
|
4081
|
+
headers: Dict[str, str] = {}
|
4082
|
+
|
4083
|
+
# Check if an API key is configured
|
4084
|
+
api_key = credentials_store.get_api_key(self.url)
|
4085
|
+
|
4086
|
+
# Check if username and password are configured
|
4087
|
+
username, password = credentials_store.get_password(self.url)
|
4088
|
+
|
4089
|
+
api_key_hint = (
|
4090
|
+
"\nHint: If you're getting this error in an automated, "
|
4091
|
+
"non-interactive workload like a pipeline run or a CI/CD job, "
|
4092
|
+
"you should use a service account API key to authenticate to "
|
4093
|
+
"the server instead of temporary CLI login credentials. For "
|
4094
|
+
"more information, see "
|
4095
|
+
"https://docs.zenml.io/how-to/connecting-to-zenml/connect-with-a-service-account"
|
4096
|
+
)
|
4097
|
+
|
4098
|
+
if api_key is not None:
|
4099
|
+
# An API key is configured. Use it as a password to
|
4100
|
+
# authenticate.
|
4101
|
+
data = {
|
4102
|
+
"grant_type": OAuthGrantTypes.ZENML_API_KEY.value,
|
4103
|
+
"password": api_key,
|
4104
|
+
}
|
4105
|
+
elif username is not None and password is not None:
|
4106
|
+
# Username and password are configured. Use them to authenticate.
|
4107
|
+
data = {
|
4108
|
+
"grant_type": OAuthGrantTypes.OAUTH_PASSWORD.value,
|
4109
|
+
"username": username,
|
4110
|
+
"password": password,
|
4111
|
+
}
|
4112
|
+
elif is_zenml_pro_server_url(self.url):
|
4113
|
+
# ZenML Pro tenants use a proprietary authorization grant
|
4114
|
+
# where the ZenML Pro API session token is exchanged for a
|
4115
|
+
# regular ZenML server access token.
|
4116
|
+
|
4117
|
+
# Get the ZenML Pro API session token, if cached and valid
|
4118
|
+
pro_token = credentials_store.get_pro_token(allow_expired=True)
|
4119
|
+
if not pro_token:
|
4120
|
+
raise CredentialsNotValid(
|
4121
|
+
"You need to be logged in to ZenML Pro in order to "
|
4122
|
+
f"access the ZenML Pro server '{self.url}'. Please run "
|
4123
|
+
"'zenml login' to log in or choose a different server."
|
4124
|
+
+ api_key_hint
|
4125
|
+
)
|
4126
|
+
|
4127
|
+
elif pro_token.expired:
|
4128
|
+
raise CredentialsNotValid(
|
4129
|
+
"Your ZenML Pro login session has expired. "
|
4130
|
+
"Please log in again using 'zenml login'."
|
4131
|
+
+ api_key_hint
|
4033
4132
|
)
|
4034
|
-
|
4035
|
-
|
4133
|
+
|
4134
|
+
data = {
|
4135
|
+
"grant_type": OAuthGrantTypes.ZENML_EXTERNAL.value,
|
4136
|
+
}
|
4137
|
+
headers.update(
|
4138
|
+
{"Authorization": "Bearer " + pro_token.access_token}
|
4139
|
+
)
|
4036
4140
|
else:
|
4037
|
-
|
4038
|
-
|
4039
|
-
|
4040
|
-
|
4141
|
+
if not token:
|
4142
|
+
raise CredentialsNotValid(
|
4143
|
+
"No valid credentials found. Please run 'zenml login "
|
4144
|
+
f"--url {self.url}' to connect to the current server."
|
4145
|
+
+ api_key_hint
|
4146
|
+
)
|
4147
|
+
elif token.expired:
|
4148
|
+
raise CredentialsNotValid(
|
4149
|
+
"Your authentication to the current server has expired. "
|
4150
|
+
"Please log in again using 'zenml login --url "
|
4151
|
+
f"{self.url}'." + api_key_hint
|
4152
|
+
)
|
4153
|
+
|
4154
|
+
response = self._handle_response(
|
4155
|
+
requests.post(
|
4156
|
+
self.url + API + VERSION_1 + LOGIN,
|
4157
|
+
data=data,
|
4158
|
+
verify=self.config.verify_ssl,
|
4159
|
+
timeout=self.config.http_timeout,
|
4160
|
+
headers=headers,
|
4041
4161
|
)
|
4042
|
-
|
4162
|
+
)
|
4163
|
+
try:
|
4164
|
+
token_response = OAuthTokenResponse.model_validate(response)
|
4165
|
+
except ValidationError as e:
|
4166
|
+
raise CredentialsNotValid(
|
4167
|
+
"Unexpected response received while authenticating to "
|
4168
|
+
f"the server {e}"
|
4169
|
+
) from e
|
4170
|
+
|
4171
|
+
# Cache the token
|
4172
|
+
self._api_token = credentials_store.set_token(
|
4173
|
+
self.url, token_response
|
4174
|
+
)
|
4175
|
+
|
4176
|
+
# Update the server info in the credentials store with the latest
|
4177
|
+
# information from the server.
|
4178
|
+
# NOTE: this is the best place to do this because we know that
|
4179
|
+
# the token is valid and the server is reachable.
|
4180
|
+
try:
|
4181
|
+
server_info = self.get_store_info()
|
4182
|
+
except Exception as e:
|
4183
|
+
logger.warning(f"Failed to get server info: {e}.")
|
4184
|
+
else:
|
4185
|
+
credentials_store.update_server_info(self.url, server_info)
|
4186
|
+
|
4187
|
+
return self._api_token.access_token
|
4043
4188
|
|
4044
4189
|
@property
|
4045
4190
|
def session(self) -> requests.Session:
|
4046
|
-
"""
|
4191
|
+
"""Initialize and return a requests session.
|
4047
4192
|
|
4048
4193
|
Returns:
|
4049
|
-
A requests session
|
4194
|
+
A requests session.
|
4050
4195
|
"""
|
4051
4196
|
if self._session is None:
|
4197
|
+
# We only need to initialize the session once over the lifetime
|
4198
|
+
# of the client. We can swap the token out when it expires.
|
4052
4199
|
if self.config.verify_ssl is False:
|
4053
4200
|
urllib3.disable_warnings(
|
4054
4201
|
urllib3.exceptions.InsecureRequestWarning
|
@@ -4059,40 +4206,65 @@ class RestZenStore(BaseZenStore):
|
|
4059
4206
|
self._session.mount("https://", HTTPAdapter(max_retries=retries))
|
4060
4207
|
self._session.mount("http://", HTTPAdapter(max_retries=retries))
|
4061
4208
|
self._session.verify = self.config.verify_ssl
|
4062
|
-
|
4063
|
-
|
4064
|
-
|
4209
|
+
|
4210
|
+
# Note that we return an unauthenticated session here. An API token
|
4211
|
+
# is only fetched and set in the authorization header when and if it is
|
4212
|
+
# needed.
|
4065
4213
|
return self._session
|
4066
4214
|
|
4067
|
-
def
|
4068
|
-
"""
|
4215
|
+
def authenticate(self, force: bool = False) -> None:
|
4216
|
+
"""Authenticate or re-authenticate to the ZenML server.
|
4217
|
+
|
4218
|
+
Args:
|
4219
|
+
force: If True, force a re-authentication even if a valid API token
|
4220
|
+
is currently cached. This is useful when the current API token
|
4221
|
+
is known to be invalid or expired.
|
4222
|
+
"""
|
4223
|
+
# This is called to trigger an authentication flow, either because
|
4224
|
+
# the current API token is expired or no longer valid, or because
|
4225
|
+
# a configuration change has happened or merely because an
|
4226
|
+
# authentication was never attempted before.
|
4227
|
+
#
|
4228
|
+
# 1. Drop the API token currently being used, if any.
|
4229
|
+
# 2. If force=True, clear the current API token from the credentials
|
4230
|
+
# store, if any, otherwise it will just be re-used on the next call.
|
4231
|
+
# 3. Get a new API token
|
4232
|
+
|
4233
|
+
# The authentication token could have expired or invalidated through
|
4234
|
+
# other means; refresh it and try again. This will clear any cached
|
4235
|
+
# token and trigger a new authentication flow.
|
4236
|
+
if self._api_token and not force:
|
4237
|
+
if self._api_token.expired:
|
4238
|
+
logger.info(
|
4239
|
+
"Authentication session expired; attempting to "
|
4240
|
+
"re-authenticate."
|
4241
|
+
)
|
4242
|
+
else:
|
4243
|
+
logger.info(
|
4244
|
+
"Authentication session was invalidated by the server; "
|
4245
|
+
"This can happen for example if the user's permissions "
|
4246
|
+
"have been revoked or if the server has been restarted "
|
4247
|
+
"and lost its session state. Attempting to "
|
4248
|
+
"re-authenticate."
|
4249
|
+
)
|
4250
|
+
else:
|
4251
|
+
if force:
|
4252
|
+
# Clear the current API token from the credentials store, if
|
4253
|
+
# any, to force a new authentication flow.
|
4254
|
+
get_credentials_store().clear_token(self.url)
|
4255
|
+
# Never authenticated since the client was created or the API token
|
4256
|
+
# was explicitly cleared.
|
4257
|
+
logger.debug(f"Authenticating to {self.url}...")
|
4069
4258
|
|
4070
|
-
Raises:
|
4071
|
-
AuthorizationException: If the API token can't be reset because
|
4072
|
-
the store configuration does not contain username and password
|
4073
|
-
or an API key to fetch a new token.
|
4074
|
-
"""
|
4075
|
-
self._session = None
|
4076
4259
|
self._api_token = None
|
4077
|
-
|
4078
|
-
|
4079
|
-
|
4080
|
-
|
4081
|
-
|
4082
|
-
|
4083
|
-
|
4084
|
-
)
|
4085
|
-
self.config.api_token = None
|
4086
|
-
elif self.config.api_token:
|
4087
|
-
raise AuthorizationException(
|
4088
|
-
"Unable to refresh invalid API token. This is probably "
|
4089
|
-
"because you're connected to your ZenML server with device "
|
4090
|
-
"authentication. Rerunning `zenml connect --url "
|
4091
|
-
f"{self.config.url}` should solve this issue. "
|
4092
|
-
"If you're seeing this error from an automated workload, "
|
4093
|
-
"you should probably use a service account to start that "
|
4094
|
-
"workload to prevent this error"
|
4095
|
-
)
|
4260
|
+
|
4261
|
+
new_api_token = self.get_or_generate_api_token()
|
4262
|
+
|
4263
|
+
# Set or refresh the authentication token
|
4264
|
+
self.session.headers.update(
|
4265
|
+
{"Authorization": "Bearer " + new_api_token}
|
4266
|
+
)
|
4267
|
+
logger.debug(f"Authenticated to {self.url}")
|
4096
4268
|
|
4097
4269
|
@staticmethod
|
4098
4270
|
def _handle_response(response: requests.Response) -> Json:
|
@@ -4156,8 +4328,8 @@ class RestZenStore(BaseZenStore):
|
|
4156
4328
|
The parsed response.
|
4157
4329
|
|
4158
4330
|
Raises:
|
4159
|
-
|
4160
|
-
|
4331
|
+
CredentialsNotValid: if the request fails due to invalid
|
4332
|
+
client credentials.
|
4161
4333
|
"""
|
4162
4334
|
params = {k: str(v) for k, v in params.items()} if params else {}
|
4163
4335
|
|
@@ -4176,12 +4348,18 @@ class RestZenStore(BaseZenStore):
|
|
4176
4348
|
**kwargs,
|
4177
4349
|
)
|
4178
4350
|
)
|
4179
|
-
except
|
4180
|
-
#
|
4181
|
-
#
|
4182
|
-
#
|
4183
|
-
|
4184
|
-
|
4351
|
+
except CredentialsNotValid:
|
4352
|
+
# NOTE: CredentialsNotValid is raised only when the server
|
4353
|
+
# explicitly indicates that the credentials are not valid and they
|
4354
|
+
# can be thrown away.
|
4355
|
+
|
4356
|
+
# We authenticate or re-authenticate here and then try the request
|
4357
|
+
# again, this time with a valid API token in the header.
|
4358
|
+
self.authenticate(
|
4359
|
+
# If the last request was authenticated with an API token,
|
4360
|
+
# we force a re-authentication to get a fresh token.
|
4361
|
+
force=self._api_token is not None
|
4362
|
+
)
|
4185
4363
|
|
4186
4364
|
try:
|
4187
4365
|
return self._handle_response(
|
@@ -4194,11 +4372,11 @@ class RestZenStore(BaseZenStore):
|
|
4194
4372
|
**kwargs,
|
4195
4373
|
)
|
4196
4374
|
)
|
4197
|
-
except
|
4198
|
-
|
4199
|
-
"
|
4200
|
-
|
4201
|
-
|
4375
|
+
except CredentialsNotValid as e:
|
4376
|
+
raise CredentialsNotValid(
|
4377
|
+
"The current credentials are no longer valid. Please log in "
|
4378
|
+
"again using 'zenml login'."
|
4379
|
+
) from e
|
4202
4380
|
|
4203
4381
|
def get(
|
4204
4382
|
self,
|
@@ -155,20 +155,25 @@ class APIKeySchema(NamedSchema, table=True):
|
|
155
155
|
)
|
156
156
|
|
157
157
|
def to_internal_model(
|
158
|
-
self,
|
158
|
+
self,
|
159
|
+
include_metadata: bool = False,
|
160
|
+
include_resources: bool = False,
|
159
161
|
) -> APIKeyInternalResponse:
|
160
162
|
"""Convert a `APIKeySchema` to an `APIKeyInternalResponse`.
|
161
163
|
|
162
164
|
The internal response model includes the hashed key values.
|
163
165
|
|
164
166
|
Args:
|
165
|
-
|
166
|
-
|
167
|
+
include_metadata: Whether the metadata will be filled.
|
168
|
+
include_resources: Whether the resources will be filled.
|
167
169
|
|
168
170
|
Returns:
|
169
171
|
The created APIKeyInternalResponse.
|
170
172
|
"""
|
171
|
-
model = self.to_model(
|
173
|
+
model = self.to_model(
|
174
|
+
include_metadata=include_metadata,
|
175
|
+
include_resources=include_resources,
|
176
|
+
)
|
172
177
|
model.get_body().key = self.key
|
173
178
|
|
174
179
|
return APIKeyInternalResponse(
|