zenml-nightly 0.58.2.dev20240623__py3-none-any.whl → 0.61.0.dev20240712__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 +30 -9
- RELEASE_NOTES.md +240 -0
- zenml/VERSION +1 -1
- zenml/actions/base_action.py +177 -174
- zenml/actions/pipeline_run/pipeline_run_action.py +28 -23
- zenml/analytics/enums.py +3 -0
- zenml/artifact_stores/base_artifact_store.py +7 -1
- zenml/artifacts/utils.py +13 -10
- zenml/cli/__init__.py +28 -0
- zenml/cli/artifact.py +1 -2
- zenml/cli/integration.py +9 -8
- zenml/cli/server.py +6 -0
- zenml/cli/service_connectors.py +1 -0
- zenml/cli/stack.py +946 -39
- zenml/cli/stack_components.py +7 -0
- zenml/cli/text_utils.py +35 -1
- zenml/cli/utils.py +127 -10
- zenml/client.py +257 -72
- zenml/config/compiler.py +10 -9
- zenml/config/docker_settings.py +33 -14
- zenml/constants.py +11 -2
- zenml/container_registries/base_container_registry.py +1 -0
- zenml/enums.py +7 -0
- zenml/event_hub/base_event_hub.py +5 -5
- zenml/event_hub/event_hub.py +20 -14
- zenml/event_sources/base_event.py +0 -11
- zenml/event_sources/base_event_source.py +7 -0
- zenml/event_sources/webhooks/base_webhook_event_source.py +1 -4
- zenml/exceptions.py +4 -0
- zenml/hooks/hook_validators.py +2 -3
- zenml/integrations/aws/__init__.py +1 -0
- zenml/integrations/azure/__init__.py +1 -0
- zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +3 -3
- zenml/integrations/deepchecks/__init__.py +1 -0
- zenml/integrations/discord/__init__.py +1 -0
- zenml/integrations/evidently/__init__.py +1 -0
- zenml/integrations/facets/__init__.py +1 -0
- zenml/integrations/feast/__init__.py +1 -0
- zenml/integrations/gcp/__init__.py +3 -1
- zenml/integrations/gcp/google_credentials_mixin.py +1 -1
- zenml/integrations/gcp/service_connectors/gcp_service_connector.py +320 -64
- zenml/integrations/huggingface/__init__.py +1 -0
- zenml/integrations/integration.py +24 -0
- zenml/integrations/kubeflow/__init__.py +3 -0
- zenml/integrations/kubeflow/flavors/kubeflow_orchestrator_flavor.py +1 -1
- zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py +0 -1
- zenml/integrations/kubernetes/__init__.py +3 -1
- zenml/integrations/kubernetes/orchestrators/kube_utils.py +4 -1
- zenml/integrations/label_studio/annotators/label_studio_annotator.py +1 -0
- zenml/integrations/langchain/__init__.py +1 -0
- zenml/integrations/mlflow/__init__.py +4 -2
- zenml/integrations/neural_prophet/__init__.py +1 -0
- zenml/integrations/polars/__init__.py +1 -0
- zenml/integrations/prodigy/__init__.py +1 -0
- zenml/integrations/pycaret/__init__.py +6 -0
- zenml/integrations/registry.py +37 -0
- zenml/integrations/s3/artifact_stores/s3_artifact_store.py +93 -9
- zenml/integrations/seldon/__init__.py +1 -0
- zenml/integrations/seldon/model_deployers/seldon_model_deployer.py +1 -0
- zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +2 -2
- zenml/integrations/skypilot/orchestrators/skypilot_base_vm_orchestrator.py +1 -1
- zenml/integrations/skypilot/orchestrators/skypilot_orchestrator_entrypoint.py +2 -2
- zenml/integrations/skypilot_aws/__init__.py +2 -1
- zenml/integrations/skypilot_azure/__init__.py +1 -1
- zenml/integrations/skypilot_gcp/__init__.py +1 -1
- zenml/integrations/skypilot_lambda/__init__.py +1 -1
- zenml/integrations/skypilot_lambda/flavors/skypilot_orchestrator_lambda_vm_flavor.py +1 -1
- zenml/integrations/slack/__init__.py +1 -0
- zenml/integrations/tekton/__init__.py +1 -0
- zenml/integrations/tensorboard/__init__.py +0 -1
- zenml/integrations/tensorflow/__init__.py +18 -6
- zenml/integrations/wandb/__init__.py +1 -0
- zenml/logging/step_logging.py +54 -51
- zenml/models/__init__.py +28 -0
- zenml/models/v2/core/action.py +276 -0
- zenml/models/v2/core/component.py +18 -0
- zenml/models/v2/core/model.py +1 -2
- zenml/models/v2/core/service_connector.py +17 -0
- zenml/models/v2/core/stack.py +31 -0
- zenml/models/v2/core/trigger.py +182 -141
- zenml/models/v2/misc/full_stack.py +97 -0
- zenml/models/v2/misc/stack_deployment.py +86 -0
- zenml/new/pipelines/pipeline.py +14 -4
- zenml/new/pipelines/pipeline_decorator.py +1 -2
- zenml/new/pipelines/run_utils.py +1 -12
- zenml/new/steps/step_decorator.py +2 -3
- zenml/orchestrators/input_utils.py +3 -6
- zenml/pipelines/base_pipeline.py +0 -2
- zenml/pipelines/pipeline_decorator.py +1 -2
- zenml/stack/stack.py +3 -6
- zenml/stack/stack_component.py +4 -0
- zenml/stack_deployments/__init__.py +14 -0
- zenml/stack_deployments/aws_stack_deployment.py +254 -0
- zenml/stack_deployments/gcp_stack_deployment.py +260 -0
- zenml/stack_deployments/stack_deployment.py +208 -0
- zenml/stack_deployments/utils.py +44 -0
- zenml/steps/base_step.py +1 -2
- zenml/steps/step_decorator.py +1 -2
- zenml/types.py +10 -1
- zenml/utils/function_utils.py +1 -1
- zenml/utils/pagination_utils.py +7 -5
- zenml/utils/pipeline_docker_image_builder.py +117 -73
- zenml/utils/pydantic_utils.py +6 -5
- zenml/zen_server/cloud_utils.py +18 -3
- zenml/zen_server/dashboard/assets/{404-CDPQCl4D.js → 404-DpJaNHKF.js} +1 -1
- zenml/zen_server/dashboard/assets/@radix-CFOkMR_E.js +85 -0
- zenml/zen_server/dashboard/assets/{@react-router-DYovave8.js → @react-router-CO-OsFwI.js} +2 -2
- zenml/zen_server/dashboard/assets/{@reactflow-CHBapDaj.js → @reactflow-DJfzkHO1.js} +2 -2
- zenml/zen_server/dashboard/assets/@tanstack-DYiOyJUL.js +22 -0
- zenml/zen_server/dashboard/assets/AwarenessChannel-BYDLT2xC.js +1 -0
- zenml/zen_server/dashboard/assets/{CodeSnippet-BidtnWOi.js → CodeSnippet-BkOuRmyq.js} +2 -2
- zenml/zen_server/dashboard/assets/Commands-ZvWR1BRs.js +1 -0
- zenml/zen_server/dashboard/assets/CopyButton-DVwLkafa.js +2 -0
- zenml/zen_server/dashboard/assets/{CsvVizualization-BOuez-fG.js → CsvVizualization-C2IiqX4I.js} +7 -7
- zenml/zen_server/dashboard/assets/DisplayDate-DYgIjlDF.js +1 -0
- zenml/zen_server/dashboard/assets/EmptyState-BMLnFVlB.js +1 -0
- zenml/zen_server/dashboard/assets/Error-CqX0VqW_.js +1 -0
- zenml/zen_server/dashboard/assets/ExecutionStatus-BoLUXR9t.js +1 -0
- zenml/zen_server/dashboard/assets/Helpbox-LFydyVwh.js +1 -0
- zenml/zen_server/dashboard/assets/Infobox-DnENC0sh.js +1 -0
- zenml/zen_server/dashboard/assets/InlineAvatar-CbJtYr0t.js +1 -0
- zenml/zen_server/dashboard/assets/{MarkdownVisualization-DsB2QZiK.js → MarkdownVisualization-xp3hhULl.js} +2 -2
- zenml/zen_server/dashboard/assets/Pagination-DEbVUupy.js +1 -0
- zenml/zen_server/dashboard/assets/PasswordChecker-DUveqlva.js +1 -0
- zenml/zen_server/dashboard/assets/SetPassword-BYBdbQDo.js +1 -0
- zenml/zen_server/dashboard/assets/SuccessStep-Nx743hll.js +1 -0
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-DnM-c11H.js → UpdatePasswordSchemas-DF9gSzE0.js} +1 -1
- zenml/zen_server/dashboard/assets/{aws-t0gKCj_R.js → aws-BgKTfTfx.js} +1 -1
- zenml/zen_server/dashboard/assets/{check-circle-BVvhm5dy.js → check-circle-i56092KI.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-down-zcvCWmyP.js → chevron-down-D_ZlKMqH.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-right-double-CJ50E9Gr.js → chevron-right-double-BiEMg7rd.js} +1 -1
- zenml/zen_server/dashboard/assets/cloud-only-DVbIeckv.js +1 -0
- zenml/zen_server/dashboard/assets/{copy-BRhQz3j-.js → copy-BXNk6BjL.js} +1 -1
- zenml/zen_server/dashboard/assets/{database-CRRnyFWh.js → database-1xWSgZfO.js} +1 -1
- zenml/zen_server/dashboard/assets/{docker-BAonhm6G.js → docker-CQMVm_4d.js} +1 -1
- zenml/zen_server/dashboard/assets/{file-text-CbVERUON.js → file-text-CqD_iu6l.js} +1 -1
- zenml/zen_server/dashboard/assets/{help-B8rqCvqn.js → help-bu_DgLKI.js} +1 -1
- zenml/zen_server/dashboard/assets/index-C_CrU4vI.js +1 -0
- zenml/zen_server/dashboard/assets/index-DK1ynKjA.js +55 -0
- zenml/zen_server/dashboard/assets/index-inApY3KQ.css +1 -0
- zenml/zen_server/dashboard/assets/index-rK_Wuy2W.js +1 -0
- zenml/zen_server/dashboard/assets/index.esm-Corw4lXQ.js +1 -0
- zenml/zen_server/dashboard/assets/{login-mutation-wzzl23C6.js → login-mutation-BUnVASxp.js} +1 -1
- zenml/zen_server/dashboard/assets/not-found-B4VnX8gK.js +1 -0
- zenml/zen_server/dashboard/assets/package-CsUhPmou.js +1 -0
- zenml/zen_server/dashboard/assets/{page-BmkSiYeQ.js → page-3efNCDeb.js} +2 -2
- zenml/zen_server/dashboard/assets/page-7zTHbhhI.js +1 -0
- zenml/zen_server/dashboard/assets/page-BEs6jK71.js +1 -0
- zenml/zen_server/dashboard/assets/page-BpSqIf4B.js +1 -0
- zenml/zen_server/dashboard/assets/{page-AQKopn_4.js → page-Bx6o0ARS.js} +1 -1
- zenml/zen_server/dashboard/assets/page-C43QGHTt.js +9 -0
- zenml/zen_server/dashboard/assets/page-CR0OG7ss.js +1 -0
- zenml/zen_server/dashboard/assets/page-CRTJ0UuR.js +1 -0
- zenml/zen_server/dashboard/assets/page-CUZIGO-3.js +1 -0
- zenml/zen_server/dashboard/assets/page-CaopxiU1.js +1 -0
- zenml/zen_server/dashboard/assets/{page-CuT1SUik.js → page-Cx67M0QT.js} +1 -1
- zenml/zen_server/dashboard/assets/page-D7Z399xy.js +1 -0
- zenml/zen_server/dashboard/assets/page-D93kd7Xj.js +1 -0
- zenml/zen_server/dashboard/assets/{page-BzVZGExK.js → page-DKlIdAe5.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Bi5AI0S7.js → page-DMOYZppS.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DMsSn3dv.js +2 -0
- zenml/zen_server/dashboard/assets/{page-BW6Ket3a.js → page-Dc_7KMQE.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DvCvroOM.js +1 -0
- zenml/zen_server/dashboard/assets/page-Hus2pr9T.js +1 -0
- zenml/zen_server/dashboard/assets/page-JyfeDUfu.js +1 -0
- zenml/zen_server/dashboard/assets/{page-yN4rZ-ZS.js → page-Sxn82W-5.js} +1 -1
- zenml/zen_server/dashboard/assets/page-TKXERe16.js +1 -0
- zenml/zen_server/dashboard/assets/page-Xu8JEjSU.js +1 -0
- zenml/zen_server/dashboard/assets/{play-circle-DK5QMJyp.js → play-circle-CNtZKDnW.js} +1 -1
- zenml/zen_server/dashboard/assets/plus-DOeLmm7C.js +1 -0
- zenml/zen_server/dashboard/assets/{terminal-B2ovgWuz.js → terminal-By9cErXc.js} +1 -1
- zenml/zen_server/dashboard/assets/{update-server-settings-mutation-0Wgz8pUE.js → update-server-settings-mutation-CR8e3Sir.js} +1 -1
- zenml/zen_server/dashboard/assets/{url-6_xv0WJS.js → url-DuQMeqYA.js} +1 -1
- zenml/zen_server/dashboard/assets/{zod-DrZvVLjd.js → zod-BhoGpZ63.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.f4abc5b7cfa7d90c1caf5521918e29a8.js → precache-manifest.c8c57fb0d2132b1d3c2119e776b7dfb3.js} +4 -4
- zenml/zen_server/dashboard_legacy/service-worker.js +1 -1
- zenml/zen_server/dashboard_legacy/static/js/{main.ac2f17d0.chunk.js → main.382439a7.chunk.js} +2 -2
- zenml/zen_server/dashboard_legacy/static/js/{main.ac2f17d0.chunk.js.map → main.382439a7.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/feature_gate/zenml_cloud_feature_gate.py +11 -5
- zenml/zen_server/pipeline_deployment/utils.py +57 -44
- zenml/zen_server/rbac/models.py +1 -0
- zenml/zen_server/rbac/utils.py +22 -1
- zenml/zen_server/rbac/zenml_cloud_rbac.py +11 -5
- zenml/zen_server/routers/actions_endpoints.py +324 -0
- zenml/zen_server/routers/stack_deployment_endpoints.py +158 -0
- zenml/zen_server/routers/triggers_endpoints.py +30 -158
- zenml/zen_server/routers/workspaces_endpoints.py +64 -0
- zenml/zen_server/zen_server_api.py +4 -0
- zenml/zen_stores/migrations/utils.py +1 -1
- zenml/zen_stores/migrations/versions/0.60.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.61.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0d707865f404_adding_labels_to_stacks.py +30 -0
- zenml/zen_stores/migrations/versions/25155145c545_separate_actions_and_triggers.py +228 -0
- zenml/zen_stores/rest_zen_store.py +248 -8
- zenml/zen_stores/schemas/__init__.py +2 -0
- zenml/zen_stores/schemas/action_schemas.py +192 -0
- zenml/zen_stores/schemas/stack_schemas.py +10 -0
- zenml/zen_stores/schemas/step_run_schemas.py +27 -11
- zenml/zen_stores/schemas/trigger_schemas.py +43 -50
- zenml/zen_stores/schemas/user_schemas.py +10 -2
- zenml/zen_stores/schemas/workspace_schemas.py +5 -0
- zenml/zen_stores/sql_zen_store.py +540 -36
- zenml/zen_stores/zen_store_interface.py +165 -0
- {zenml_nightly-0.58.2.dev20240623.dist-info → zenml_nightly-0.61.0.dev20240712.dist-info}/METADATA +33 -11
- {zenml_nightly-0.58.2.dev20240623.dist-info → zenml_nightly-0.61.0.dev20240712.dist-info}/RECORD +213 -193
- zenml/zen_server/dashboard/assets/@radix-C9DBgJhe.js +0 -77
- zenml/zen_server/dashboard/assets/@tanstack-CEbkxrhX.js +0 -30
- zenml/zen_server/dashboard/assets/AwarenessChannel-nXGpmj_f.js +0 -1
- zenml/zen_server/dashboard/assets/Cards-nwsvQLVS.js +0 -1
- zenml/zen_server/dashboard/assets/Commands-DuIWKg_Q.js +0 -1
- zenml/zen_server/dashboard/assets/CopyButton-B_YSm-Ds.js +0 -2
- zenml/zen_server/dashboard/assets/DisplayDate-BdguISQF.js +0 -1
- zenml/zen_server/dashboard/assets/EmptyState-BkooiGtL.js +0 -1
- zenml/zen_server/dashboard/assets/Error-B6M0dPph.js +0 -1
- zenml/zen_server/dashboard/assets/Helpbox-BQoqCm04.js +0 -1
- zenml/zen_server/dashboard/assets/Infobox-Ce9mefqU.js +0 -1
- zenml/zen_server/dashboard/assets/InlineAvatar-DGf3dVhV.js +0 -1
- zenml/zen_server/dashboard/assets/PageHeader-DGaemzjc.js +0 -1
- zenml/zen_server/dashboard/assets/Pagination-DVYfBCCc.js +0 -1
- zenml/zen_server/dashboard/assets/PasswordChecker-DSLBp7Vl.js +0 -1
- zenml/zen_server/dashboard/assets/SetPassword-B5s7DJug.js +0 -1
- zenml/zen_server/dashboard/assets/SuccessStep-ZzczaM7g.js +0 -1
- zenml/zen_server/dashboard/assets/cloud-only-Ba_ShBR5.js +0 -1
- zenml/zen_server/dashboard/assets/index-CWJ3xbIf.css +0 -1
- zenml/zen_server/dashboard/assets/index-QORVVTMN.js +0 -55
- zenml/zen_server/dashboard/assets/index.esm-F7nqy9zY.js +0 -1
- zenml/zen_server/dashboard/assets/not-found-Dh2la7kh.js +0 -1
- zenml/zen_server/dashboard/assets/page-B-5jAKoO.js +0 -1
- zenml/zen_server/dashboard/assets/page-B-vWk8a6.js +0 -1
- zenml/zen_server/dashboard/assets/page-B0BrqfS8.js +0 -1
- zenml/zen_server/dashboard/assets/page-BQxVFlUl.js +0 -1
- zenml/zen_server/dashboard/assets/page-ByrHy6Ss.js +0 -1
- zenml/zen_server/dashboard/assets/page-CPtY4Kv_.js +0 -1
- zenml/zen_server/dashboard/assets/page-CmmukLsl.js +0 -1
- zenml/zen_server/dashboard/assets/page-D2D-7qyr.js +0 -9
- zenml/zen_server/dashboard/assets/page-DAQQyLxT.js +0 -1
- zenml/zen_server/dashboard/assets/page-DHkUMl_E.js +0 -1
- zenml/zen_server/dashboard/assets/page-DZCbwOEs.js +0 -2
- zenml/zen_server/dashboard/assets/page-DdaIt20-.js +0 -1
- zenml/zen_server/dashboard/assets/page-LqLs24Ot.js +0 -1
- zenml/zen_server/dashboard/assets/page-lebv0c7C.js +0 -1
- {zenml_nightly-0.58.2.dev20240623.dist-info → zenml_nightly-0.61.0.dev20240712.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.58.2.dev20240623.dist-info → zenml_nightly-0.61.0.dev20240712.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.58.2.dev20240623.dist-info → zenml_nightly-0.61.0.dev20240712.dist-info}/entry_points.txt +0 -0
@@ -32,6 +32,7 @@ from typing import (
|
|
32
32
|
import zenml
|
33
33
|
from zenml.config import DockerSettings
|
34
34
|
from zenml.config.docker_settings import (
|
35
|
+
DockerBuildConfig,
|
35
36
|
PythonEnvironmentExportMethod,
|
36
37
|
PythonPackageInstaller,
|
37
38
|
)
|
@@ -65,6 +66,7 @@ DEFAULT_DOCKER_PARENT_IMAGE = (
|
|
65
66
|
f"zenmldocker/zenml:{zenml.__version__}-"
|
66
67
|
f"py{sys.version_info.major}.{sys.version_info.minor}"
|
67
68
|
)
|
69
|
+
DEFAULT_ZENML_DOCKER_REPOSITORY = "zenml"
|
68
70
|
|
69
71
|
PIP_DEFAULT_ARGS = {
|
70
72
|
"no-cache-dir": None,
|
@@ -197,10 +199,15 @@ class PipelineDockerImageBuilder:
|
|
197
199
|
# We will build an additional image on top of this one later
|
198
200
|
# to include user files and/or install requirements. The image
|
199
201
|
# we build now will be used as the parent for the next build.
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
202
|
+
repository = docker_settings.target_repository
|
203
|
+
if not repository:
|
204
|
+
if container_registry:
|
205
|
+
repository = (
|
206
|
+
container_registry.config.default_repository
|
207
|
+
)
|
208
|
+
|
209
|
+
repository = repository or DEFAULT_ZENML_DOCKER_REPOSITORY
|
210
|
+
user_image_name = f"{repository}:" f"{tag}-intermediate-build"
|
204
211
|
if push and container_registry:
|
205
212
|
user_image_name = (
|
206
213
|
f"{container_registry.config.uri}/{user_image_name}"
|
@@ -212,8 +219,13 @@ class PipelineDockerImageBuilder:
|
|
212
219
|
# used directly, so we tag it with the requested target name.
|
213
220
|
user_image_name = target_image_name
|
214
221
|
|
222
|
+
build_config = (
|
223
|
+
docker_settings.parent_image_build_config
|
224
|
+
or DockerBuildConfig()
|
225
|
+
)
|
215
226
|
build_context = build_context_class(
|
216
|
-
root=docker_settings.build_context_root
|
227
|
+
root=docker_settings.build_context_root,
|
228
|
+
dockerignore_file=build_config.dockerignore,
|
217
229
|
)
|
218
230
|
build_context.add_file(
|
219
231
|
source=docker_settings.dockerfile, destination="Dockerfile"
|
@@ -222,7 +234,8 @@ class PipelineDockerImageBuilder:
|
|
222
234
|
image_name_or_digest = image_builder.build(
|
223
235
|
image_name=user_image_name,
|
224
236
|
build_context=build_context,
|
225
|
-
docker_build_options=
|
237
|
+
docker_build_options=build_config.build_options
|
238
|
+
or docker_settings.build_options,
|
226
239
|
container_registry=container_registry if push else None,
|
227
240
|
)
|
228
241
|
|
@@ -247,13 +260,18 @@ class PipelineDockerImageBuilder:
|
|
247
260
|
|
248
261
|
if requires_zenml_build:
|
249
262
|
logger.info("Building Docker image `%s`.", target_image_name)
|
263
|
+
build_config = docker_settings.build_config or DockerBuildConfig()
|
264
|
+
|
250
265
|
# Leave the build context empty if we don't want to include any files
|
251
266
|
build_context_root = (
|
252
267
|
source_utils.get_source_root() if include_files else None
|
253
268
|
)
|
269
|
+
dockerignore = (
|
270
|
+
build_config.dockerignore or docker_settings.dockerignore
|
271
|
+
)
|
254
272
|
build_context = build_context_class(
|
255
273
|
root=build_context_root,
|
256
|
-
dockerignore_file=
|
274
|
+
dockerignore_file=dockerignore,
|
257
275
|
)
|
258
276
|
|
259
277
|
requirements_files = self.gather_requirements_files(
|
@@ -304,8 +322,11 @@ class PipelineDockerImageBuilder:
|
|
304
322
|
parent_image
|
305
323
|
)
|
306
324
|
|
307
|
-
build_options = {
|
308
|
-
|
325
|
+
build_options = {
|
326
|
+
"pull": pull_parent_image,
|
327
|
+
"rm": False,
|
328
|
+
**build_config.build_options,
|
329
|
+
}
|
309
330
|
dockerfile = self._generate_zenml_pipeline_dockerfile(
|
310
331
|
parent_image=parent_image,
|
311
332
|
docker_settings=docker_settings,
|
@@ -351,7 +372,14 @@ class PipelineDockerImageBuilder:
|
|
351
372
|
Returns:
|
352
373
|
The docker image name.
|
353
374
|
"""
|
354
|
-
|
375
|
+
repository = docker_settings.target_repository
|
376
|
+
if not repository:
|
377
|
+
if container_registry:
|
378
|
+
repository = container_registry.config.default_repository
|
379
|
+
|
380
|
+
repository = repository or DEFAULT_ZENML_DOCKER_REPOSITORY
|
381
|
+
|
382
|
+
target_image_name = f"{repository}:{tag}"
|
355
383
|
if container_registry:
|
356
384
|
target_image_name = (
|
357
385
|
f"{container_registry.config.uri}/{target_image_name}"
|
@@ -445,69 +473,6 @@ class PipelineDockerImageBuilder:
|
|
445
473
|
"- Including python packages from local environment"
|
446
474
|
)
|
447
475
|
|
448
|
-
# Generate/Read requirements file for user-defined requirements
|
449
|
-
if isinstance(docker_settings.requirements, str):
|
450
|
-
path = os.path.abspath(docker_settings.requirements)
|
451
|
-
try:
|
452
|
-
user_requirements = io_utils.read_file_contents_as_string(path)
|
453
|
-
except FileNotFoundError as e:
|
454
|
-
raise FileNotFoundError(
|
455
|
-
f"Requirements file {path} does not exist."
|
456
|
-
) from e
|
457
|
-
if log:
|
458
|
-
logger.info(
|
459
|
-
"- Including user-defined requirements from file `%s`",
|
460
|
-
path,
|
461
|
-
)
|
462
|
-
elif isinstance(docker_settings.requirements, List):
|
463
|
-
user_requirements = "\n".join(docker_settings.requirements)
|
464
|
-
if log:
|
465
|
-
logger.info(
|
466
|
-
"- Including user-defined requirements: %s",
|
467
|
-
", ".join(f"`{r}`" for r in docker_settings.requirements),
|
468
|
-
)
|
469
|
-
else:
|
470
|
-
user_requirements = None
|
471
|
-
|
472
|
-
if user_requirements:
|
473
|
-
requirements_files.append(
|
474
|
-
(".zenml_user_requirements", user_requirements, [])
|
475
|
-
)
|
476
|
-
|
477
|
-
# Generate requirements file for all required integrations
|
478
|
-
integration_requirements = set(
|
479
|
-
itertools.chain.from_iterable(
|
480
|
-
integration_registry.select_integration_requirements(
|
481
|
-
integration_name=integration,
|
482
|
-
target_os=OperatingSystemType.LINUX,
|
483
|
-
)
|
484
|
-
for integration in docker_settings.required_integrations
|
485
|
-
)
|
486
|
-
)
|
487
|
-
|
488
|
-
if docker_settings.install_stack_requirements:
|
489
|
-
integration_requirements.update(stack.requirements())
|
490
|
-
if code_repository:
|
491
|
-
integration_requirements.update(code_repository.requirements)
|
492
|
-
|
493
|
-
if integration_requirements:
|
494
|
-
integration_requirements_list = sorted(integration_requirements)
|
495
|
-
integration_requirements_file = "\n".join(
|
496
|
-
integration_requirements_list
|
497
|
-
)
|
498
|
-
requirements_files.append(
|
499
|
-
(
|
500
|
-
".zenml_integration_requirements",
|
501
|
-
integration_requirements_file,
|
502
|
-
[],
|
503
|
-
)
|
504
|
-
)
|
505
|
-
if log:
|
506
|
-
logger.info(
|
507
|
-
"- Including integration requirements: %s",
|
508
|
-
", ".join(f"`{r}`" for r in integration_requirements_list),
|
509
|
-
)
|
510
|
-
|
511
476
|
# Generate requirements files for all ZenML Hub plugins
|
512
477
|
if docker_settings.required_hub_plugins:
|
513
478
|
(
|
@@ -545,6 +510,85 @@ class PipelineDockerImageBuilder:
|
|
545
510
|
", ".join(f"`{r}`" for r in hub_pypi_requirements),
|
546
511
|
)
|
547
512
|
|
513
|
+
if docker_settings.install_stack_requirements:
|
514
|
+
stack_requirements = stack.requirements()
|
515
|
+
if code_repository:
|
516
|
+
stack_requirements.update(code_repository.requirements)
|
517
|
+
|
518
|
+
if stack_requirements:
|
519
|
+
stack_requirements_list = sorted(stack_requirements)
|
520
|
+
stack_requirements_file = "\n".join(stack_requirements_list)
|
521
|
+
requirements_files.append(
|
522
|
+
(
|
523
|
+
".zenml_stack_integration_requirements",
|
524
|
+
stack_requirements_file,
|
525
|
+
[],
|
526
|
+
)
|
527
|
+
)
|
528
|
+
if log:
|
529
|
+
logger.info(
|
530
|
+
"- Including stack requirements: %s",
|
531
|
+
", ".join(f"`{r}`" for r in stack_requirements_list),
|
532
|
+
)
|
533
|
+
|
534
|
+
# Generate requirements file for all required integrations
|
535
|
+
integration_requirements = set(
|
536
|
+
itertools.chain.from_iterable(
|
537
|
+
integration_registry.select_integration_requirements(
|
538
|
+
integration_name=integration,
|
539
|
+
target_os=OperatingSystemType.LINUX,
|
540
|
+
)
|
541
|
+
for integration in docker_settings.required_integrations
|
542
|
+
)
|
543
|
+
)
|
544
|
+
|
545
|
+
if integration_requirements:
|
546
|
+
integration_requirements_list = sorted(integration_requirements)
|
547
|
+
integration_requirements_file = "\n".join(
|
548
|
+
integration_requirements_list
|
549
|
+
)
|
550
|
+
requirements_files.append(
|
551
|
+
(
|
552
|
+
".zenml_integration_requirements",
|
553
|
+
integration_requirements_file,
|
554
|
+
[],
|
555
|
+
)
|
556
|
+
)
|
557
|
+
if log:
|
558
|
+
logger.info(
|
559
|
+
"- Including integration requirements: %s",
|
560
|
+
", ".join(f"`{r}`" for r in integration_requirements_list),
|
561
|
+
)
|
562
|
+
|
563
|
+
# Generate/Read requirements file for user-defined requirements
|
564
|
+
if isinstance(docker_settings.requirements, str):
|
565
|
+
path = os.path.abspath(docker_settings.requirements)
|
566
|
+
try:
|
567
|
+
user_requirements = io_utils.read_file_contents_as_string(path)
|
568
|
+
except FileNotFoundError as e:
|
569
|
+
raise FileNotFoundError(
|
570
|
+
f"Requirements file {path} does not exist."
|
571
|
+
) from e
|
572
|
+
if log:
|
573
|
+
logger.info(
|
574
|
+
"- Including user-defined requirements from file `%s`",
|
575
|
+
path,
|
576
|
+
)
|
577
|
+
elif isinstance(docker_settings.requirements, List):
|
578
|
+
user_requirements = "\n".join(docker_settings.requirements)
|
579
|
+
if log:
|
580
|
+
logger.info(
|
581
|
+
"- Including user-defined requirements: %s",
|
582
|
+
", ".join(f"`{r}`" for r in docker_settings.requirements),
|
583
|
+
)
|
584
|
+
else:
|
585
|
+
user_requirements = None
|
586
|
+
|
587
|
+
if user_requirements:
|
588
|
+
requirements_files.append(
|
589
|
+
(".zenml_user_requirements", user_requirements, [])
|
590
|
+
)
|
591
|
+
|
548
592
|
return requirements_files
|
549
593
|
|
550
594
|
@staticmethod
|
zenml/utils/pydantic_utils.py
CHANGED
@@ -45,7 +45,7 @@ def update_model(
|
|
45
45
|
original: M,
|
46
46
|
update: Union["BaseModel", Dict[str, Any]],
|
47
47
|
recursive: bool = True,
|
48
|
-
exclude_none: bool =
|
48
|
+
exclude_none: bool = False,
|
49
49
|
) -> M:
|
50
50
|
"""Updates a pydantic model.
|
51
51
|
|
@@ -53,8 +53,7 @@ def update_model(
|
|
53
53
|
original: The model to update.
|
54
54
|
update: The update values.
|
55
55
|
recursive: If `True`, dictionary values will be updated recursively.
|
56
|
-
exclude_none: If `True`, `None` values in the update
|
57
|
-
will be removed.
|
56
|
+
exclude_none: If `True`, `None` values in the update will be removed.
|
58
57
|
|
59
58
|
Returns:
|
60
59
|
The updated model.
|
@@ -67,7 +66,9 @@ def update_model(
|
|
67
66
|
else:
|
68
67
|
update_dict = update
|
69
68
|
else:
|
70
|
-
update_dict = update.model_dump(
|
69
|
+
update_dict = update.model_dump(
|
70
|
+
exclude_unset=True, exclude_none=exclude_none
|
71
|
+
)
|
71
72
|
|
72
73
|
original_dict = original.model_dump(exclude_unset=True)
|
73
74
|
if recursive:
|
@@ -75,7 +76,7 @@ def update_model(
|
|
75
76
|
else:
|
76
77
|
values = {**original_dict, **update_dict}
|
77
78
|
|
78
|
-
return original.__class__(
|
79
|
+
return original.__class__.model_validate(values)
|
79
80
|
|
80
81
|
|
81
82
|
class TemplateGenerator:
|
zenml/zen_server/cloud_utils.py
CHANGED
@@ -12,6 +12,8 @@ from zenml.zen_server.utils import server_config
|
|
12
12
|
|
13
13
|
ZENML_CLOUD_RBAC_ENV_PREFIX = "ZENML_CLOUD_"
|
14
14
|
|
15
|
+
_cloud_connection: Optional["ZenMLCloudConnection"] = None
|
16
|
+
|
15
17
|
|
16
18
|
class ZenMLCloudConfiguration(BaseModel):
|
17
19
|
"""ZenML Pro RBAC configuration."""
|
@@ -59,7 +61,7 @@ class ZenMLCloudConfiguration(BaseModel):
|
|
59
61
|
)
|
60
62
|
|
61
63
|
|
62
|
-
class
|
64
|
+
class ZenMLCloudConnection:
|
63
65
|
"""Class to use for communication between server and control plane."""
|
64
66
|
|
65
67
|
def __init__(self) -> None:
|
@@ -67,7 +69,7 @@ class ZenMLCloudSession:
|
|
67
69
|
self._config = ZenMLCloudConfiguration.from_environment()
|
68
70
|
self._session: Optional[requests.Session] = None
|
69
71
|
|
70
|
-
def
|
72
|
+
def get(
|
71
73
|
self, endpoint: str, params: Optional[Dict[str, Any]]
|
72
74
|
) -> requests.Response:
|
73
75
|
"""Send a GET request using the active session.
|
@@ -105,7 +107,7 @@ class ZenMLCloudSession:
|
|
105
107
|
|
106
108
|
return response
|
107
109
|
|
108
|
-
def
|
110
|
+
def post(
|
109
111
|
self,
|
110
112
|
endpoint: str,
|
111
113
|
params: Optional[Dict[str, Any]] = None,
|
@@ -217,3 +219,16 @@ class ZenMLCloudSession:
|
|
217
219
|
raise RuntimeError("Could not fetch auth token from auth0.")
|
218
220
|
|
219
221
|
return str(access_token)
|
222
|
+
|
223
|
+
|
224
|
+
def cloud_connection() -> ZenMLCloudConnection:
|
225
|
+
"""Return the initialized cloud connection.
|
226
|
+
|
227
|
+
Returns:
|
228
|
+
The cloud connection.
|
229
|
+
"""
|
230
|
+
global _cloud_connection
|
231
|
+
if _cloud_connection is None:
|
232
|
+
_cloud_connection = ZenMLCloudConnection()
|
233
|
+
|
234
|
+
return _cloud_connection
|
@@ -1 +1 @@
|
|
1
|
-
import{j as e}from"./@
|
1
|
+
import{j as e}from"./@radix-CFOkMR_E.js";import{h as s,r as t}from"./index-DK1ynKjA.js";import{E as r}from"./EmptyState-BMLnFVlB.js";import{H as a}from"./help-bu_DgLKI.js";import{L as o}from"./@react-router-CO-OsFwI.js";import"./@tanstack-DYiOyJUL.js";import"./@reactflow-DJfzkHO1.js";function d(){return e.jsx("div",{className:"flex min-h-screen w-full flex-col",children:e.jsx(r,{icon:e.jsx(a,{className:"h-[120px] w-[120px] fill-neutral-300"}),children:e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"mb-2 text-display-xs font-semibold",children:"We can't find the page you are looking for"}),e.jsx("p",{className:"text-lg text-theme-text-secondary",children:"You can try typing a different URL or we can bring you back to your Homepage."}),e.jsx("div",{className:"mt-5 flex justify-center",children:e.jsx(s,{size:"md",asChild:!0,children:e.jsx(o,{className:"w-min self-center whitespace-nowrap",to:t.home,children:e.jsx("span",{className:"px-0.5",children:"Go to Home"})})})})]})})})}export{d as default};
|