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