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.
Files changed (249) hide show
  1. README.md +30 -9
  2. RELEASE_NOTES.md +240 -0
  3. zenml/VERSION +1 -1
  4. zenml/actions/base_action.py +177 -174
  5. zenml/actions/pipeline_run/pipeline_run_action.py +28 -23
  6. zenml/analytics/enums.py +3 -0
  7. zenml/artifact_stores/base_artifact_store.py +7 -1
  8. zenml/artifacts/utils.py +13 -10
  9. zenml/cli/__init__.py +28 -0
  10. zenml/cli/artifact.py +1 -2
  11. zenml/cli/integration.py +9 -8
  12. zenml/cli/server.py +6 -0
  13. zenml/cli/service_connectors.py +1 -0
  14. zenml/cli/stack.py +946 -39
  15. zenml/cli/stack_components.py +7 -0
  16. zenml/cli/text_utils.py +35 -1
  17. zenml/cli/utils.py +127 -10
  18. zenml/client.py +257 -72
  19. zenml/config/compiler.py +10 -9
  20. zenml/config/docker_settings.py +33 -14
  21. zenml/constants.py +11 -2
  22. zenml/container_registries/base_container_registry.py +1 -0
  23. zenml/enums.py +7 -0
  24. zenml/event_hub/base_event_hub.py +5 -5
  25. zenml/event_hub/event_hub.py +20 -14
  26. zenml/event_sources/base_event.py +0 -11
  27. zenml/event_sources/base_event_source.py +7 -0
  28. zenml/event_sources/webhooks/base_webhook_event_source.py +1 -4
  29. zenml/exceptions.py +4 -0
  30. zenml/hooks/hook_validators.py +2 -3
  31. zenml/integrations/aws/__init__.py +1 -0
  32. zenml/integrations/azure/__init__.py +1 -0
  33. zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +3 -3
  34. zenml/integrations/deepchecks/__init__.py +1 -0
  35. zenml/integrations/discord/__init__.py +1 -0
  36. zenml/integrations/evidently/__init__.py +1 -0
  37. zenml/integrations/facets/__init__.py +1 -0
  38. zenml/integrations/feast/__init__.py +1 -0
  39. zenml/integrations/gcp/__init__.py +3 -1
  40. zenml/integrations/gcp/google_credentials_mixin.py +1 -1
  41. zenml/integrations/gcp/service_connectors/gcp_service_connector.py +320 -64
  42. zenml/integrations/huggingface/__init__.py +1 -0
  43. zenml/integrations/integration.py +24 -0
  44. zenml/integrations/kubeflow/__init__.py +3 -0
  45. zenml/integrations/kubeflow/flavors/kubeflow_orchestrator_flavor.py +1 -1
  46. zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py +0 -1
  47. zenml/integrations/kubernetes/__init__.py +3 -1
  48. zenml/integrations/kubernetes/orchestrators/kube_utils.py +4 -1
  49. zenml/integrations/label_studio/annotators/label_studio_annotator.py +1 -0
  50. zenml/integrations/langchain/__init__.py +1 -0
  51. zenml/integrations/mlflow/__init__.py +4 -2
  52. zenml/integrations/neural_prophet/__init__.py +1 -0
  53. zenml/integrations/polars/__init__.py +1 -0
  54. zenml/integrations/prodigy/__init__.py +1 -0
  55. zenml/integrations/pycaret/__init__.py +6 -0
  56. zenml/integrations/registry.py +37 -0
  57. zenml/integrations/s3/artifact_stores/s3_artifact_store.py +93 -9
  58. zenml/integrations/seldon/__init__.py +1 -0
  59. zenml/integrations/seldon/model_deployers/seldon_model_deployer.py +1 -0
  60. zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +2 -2
  61. zenml/integrations/skypilot/orchestrators/skypilot_base_vm_orchestrator.py +1 -1
  62. zenml/integrations/skypilot/orchestrators/skypilot_orchestrator_entrypoint.py +2 -2
  63. zenml/integrations/skypilot_aws/__init__.py +2 -1
  64. zenml/integrations/skypilot_azure/__init__.py +1 -1
  65. zenml/integrations/skypilot_gcp/__init__.py +1 -1
  66. zenml/integrations/skypilot_lambda/__init__.py +1 -1
  67. zenml/integrations/skypilot_lambda/flavors/skypilot_orchestrator_lambda_vm_flavor.py +1 -1
  68. zenml/integrations/slack/__init__.py +1 -0
  69. zenml/integrations/tekton/__init__.py +1 -0
  70. zenml/integrations/tensorboard/__init__.py +0 -1
  71. zenml/integrations/tensorflow/__init__.py +18 -6
  72. zenml/integrations/wandb/__init__.py +1 -0
  73. zenml/logging/step_logging.py +54 -51
  74. zenml/models/__init__.py +28 -0
  75. zenml/models/v2/core/action.py +276 -0
  76. zenml/models/v2/core/component.py +18 -0
  77. zenml/models/v2/core/model.py +1 -2
  78. zenml/models/v2/core/service_connector.py +17 -0
  79. zenml/models/v2/core/stack.py +31 -0
  80. zenml/models/v2/core/trigger.py +182 -141
  81. zenml/models/v2/misc/full_stack.py +97 -0
  82. zenml/models/v2/misc/stack_deployment.py +86 -0
  83. zenml/new/pipelines/pipeline.py +14 -4
  84. zenml/new/pipelines/pipeline_decorator.py +1 -2
  85. zenml/new/pipelines/run_utils.py +1 -12
  86. zenml/new/steps/step_decorator.py +2 -3
  87. zenml/orchestrators/input_utils.py +3 -6
  88. zenml/pipelines/base_pipeline.py +0 -2
  89. zenml/pipelines/pipeline_decorator.py +1 -2
  90. zenml/stack/stack.py +3 -6
  91. zenml/stack/stack_component.py +4 -0
  92. zenml/stack_deployments/__init__.py +14 -0
  93. zenml/stack_deployments/aws_stack_deployment.py +254 -0
  94. zenml/stack_deployments/gcp_stack_deployment.py +260 -0
  95. zenml/stack_deployments/stack_deployment.py +208 -0
  96. zenml/stack_deployments/utils.py +44 -0
  97. zenml/steps/base_step.py +1 -2
  98. zenml/steps/step_decorator.py +1 -2
  99. zenml/types.py +10 -1
  100. zenml/utils/function_utils.py +1 -1
  101. zenml/utils/pagination_utils.py +7 -5
  102. zenml/utils/pipeline_docker_image_builder.py +117 -73
  103. zenml/utils/pydantic_utils.py +6 -5
  104. zenml/zen_server/cloud_utils.py +18 -3
  105. zenml/zen_server/dashboard/assets/{404-CDPQCl4D.js → 404-DpJaNHKF.js} +1 -1
  106. zenml/zen_server/dashboard/assets/@radix-CFOkMR_E.js +85 -0
  107. zenml/zen_server/dashboard/assets/{@react-router-DYovave8.js → @react-router-CO-OsFwI.js} +2 -2
  108. zenml/zen_server/dashboard/assets/{@reactflow-CHBapDaj.js → @reactflow-DJfzkHO1.js} +2 -2
  109. zenml/zen_server/dashboard/assets/@tanstack-DYiOyJUL.js +22 -0
  110. zenml/zen_server/dashboard/assets/AwarenessChannel-BYDLT2xC.js +1 -0
  111. zenml/zen_server/dashboard/assets/{CodeSnippet-BidtnWOi.js → CodeSnippet-BkOuRmyq.js} +2 -2
  112. zenml/zen_server/dashboard/assets/Commands-ZvWR1BRs.js +1 -0
  113. zenml/zen_server/dashboard/assets/CopyButton-DVwLkafa.js +2 -0
  114. zenml/zen_server/dashboard/assets/{CsvVizualization-BOuez-fG.js → CsvVizualization-C2IiqX4I.js} +7 -7
  115. zenml/zen_server/dashboard/assets/DisplayDate-DYgIjlDF.js +1 -0
  116. zenml/zen_server/dashboard/assets/EmptyState-BMLnFVlB.js +1 -0
  117. zenml/zen_server/dashboard/assets/Error-CqX0VqW_.js +1 -0
  118. zenml/zen_server/dashboard/assets/ExecutionStatus-BoLUXR9t.js +1 -0
  119. zenml/zen_server/dashboard/assets/Helpbox-LFydyVwh.js +1 -0
  120. zenml/zen_server/dashboard/assets/Infobox-DnENC0sh.js +1 -0
  121. zenml/zen_server/dashboard/assets/InlineAvatar-CbJtYr0t.js +1 -0
  122. zenml/zen_server/dashboard/assets/{MarkdownVisualization-DsB2QZiK.js → MarkdownVisualization-xp3hhULl.js} +2 -2
  123. zenml/zen_server/dashboard/assets/Pagination-DEbVUupy.js +1 -0
  124. zenml/zen_server/dashboard/assets/PasswordChecker-DUveqlva.js +1 -0
  125. zenml/zen_server/dashboard/assets/SetPassword-BYBdbQDo.js +1 -0
  126. zenml/zen_server/dashboard/assets/SuccessStep-Nx743hll.js +1 -0
  127. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-DnM-c11H.js → UpdatePasswordSchemas-DF9gSzE0.js} +1 -1
  128. zenml/zen_server/dashboard/assets/{aws-t0gKCj_R.js → aws-BgKTfTfx.js} +1 -1
  129. zenml/zen_server/dashboard/assets/{check-circle-BVvhm5dy.js → check-circle-i56092KI.js} +1 -1
  130. zenml/zen_server/dashboard/assets/{chevron-down-zcvCWmyP.js → chevron-down-D_ZlKMqH.js} +1 -1
  131. zenml/zen_server/dashboard/assets/{chevron-right-double-CJ50E9Gr.js → chevron-right-double-BiEMg7rd.js} +1 -1
  132. zenml/zen_server/dashboard/assets/cloud-only-DVbIeckv.js +1 -0
  133. zenml/zen_server/dashboard/assets/{copy-BRhQz3j-.js → copy-BXNk6BjL.js} +1 -1
  134. zenml/zen_server/dashboard/assets/{database-CRRnyFWh.js → database-1xWSgZfO.js} +1 -1
  135. zenml/zen_server/dashboard/assets/{docker-BAonhm6G.js → docker-CQMVm_4d.js} +1 -1
  136. zenml/zen_server/dashboard/assets/{file-text-CbVERUON.js → file-text-CqD_iu6l.js} +1 -1
  137. zenml/zen_server/dashboard/assets/{help-B8rqCvqn.js → help-bu_DgLKI.js} +1 -1
  138. zenml/zen_server/dashboard/assets/index-C_CrU4vI.js +1 -0
  139. zenml/zen_server/dashboard/assets/index-DK1ynKjA.js +55 -0
  140. zenml/zen_server/dashboard/assets/index-inApY3KQ.css +1 -0
  141. zenml/zen_server/dashboard/assets/index-rK_Wuy2W.js +1 -0
  142. zenml/zen_server/dashboard/assets/index.esm-Corw4lXQ.js +1 -0
  143. zenml/zen_server/dashboard/assets/{login-mutation-wzzl23C6.js → login-mutation-BUnVASxp.js} +1 -1
  144. zenml/zen_server/dashboard/assets/not-found-B4VnX8gK.js +1 -0
  145. zenml/zen_server/dashboard/assets/package-CsUhPmou.js +1 -0
  146. zenml/zen_server/dashboard/assets/{page-BmkSiYeQ.js → page-3efNCDeb.js} +2 -2
  147. zenml/zen_server/dashboard/assets/page-7zTHbhhI.js +1 -0
  148. zenml/zen_server/dashboard/assets/page-BEs6jK71.js +1 -0
  149. zenml/zen_server/dashboard/assets/page-BpSqIf4B.js +1 -0
  150. zenml/zen_server/dashboard/assets/{page-AQKopn_4.js → page-Bx6o0ARS.js} +1 -1
  151. zenml/zen_server/dashboard/assets/page-C43QGHTt.js +9 -0
  152. zenml/zen_server/dashboard/assets/page-CR0OG7ss.js +1 -0
  153. zenml/zen_server/dashboard/assets/page-CRTJ0UuR.js +1 -0
  154. zenml/zen_server/dashboard/assets/page-CUZIGO-3.js +1 -0
  155. zenml/zen_server/dashboard/assets/page-CaopxiU1.js +1 -0
  156. zenml/zen_server/dashboard/assets/{page-CuT1SUik.js → page-Cx67M0QT.js} +1 -1
  157. zenml/zen_server/dashboard/assets/page-D7Z399xy.js +1 -0
  158. zenml/zen_server/dashboard/assets/page-D93kd7Xj.js +1 -0
  159. zenml/zen_server/dashboard/assets/{page-BzVZGExK.js → page-DKlIdAe5.js} +1 -1
  160. zenml/zen_server/dashboard/assets/{page-Bi5AI0S7.js → page-DMOYZppS.js} +1 -1
  161. zenml/zen_server/dashboard/assets/page-DMsSn3dv.js +2 -0
  162. zenml/zen_server/dashboard/assets/{page-BW6Ket3a.js → page-Dc_7KMQE.js} +1 -1
  163. zenml/zen_server/dashboard/assets/page-DvCvroOM.js +1 -0
  164. zenml/zen_server/dashboard/assets/page-Hus2pr9T.js +1 -0
  165. zenml/zen_server/dashboard/assets/page-JyfeDUfu.js +1 -0
  166. zenml/zen_server/dashboard/assets/{page-yN4rZ-ZS.js → page-Sxn82W-5.js} +1 -1
  167. zenml/zen_server/dashboard/assets/page-TKXERe16.js +1 -0
  168. zenml/zen_server/dashboard/assets/page-Xu8JEjSU.js +1 -0
  169. zenml/zen_server/dashboard/assets/{play-circle-DK5QMJyp.js → play-circle-CNtZKDnW.js} +1 -1
  170. zenml/zen_server/dashboard/assets/plus-DOeLmm7C.js +1 -0
  171. zenml/zen_server/dashboard/assets/{terminal-B2ovgWuz.js → terminal-By9cErXc.js} +1 -1
  172. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-0Wgz8pUE.js → update-server-settings-mutation-CR8e3Sir.js} +1 -1
  173. zenml/zen_server/dashboard/assets/{url-6_xv0WJS.js → url-DuQMeqYA.js} +1 -1
  174. zenml/zen_server/dashboard/assets/{zod-DrZvVLjd.js → zod-BhoGpZ63.js} +1 -1
  175. zenml/zen_server/dashboard/index.html +7 -7
  176. zenml/zen_server/dashboard_legacy/asset-manifest.json +4 -4
  177. zenml/zen_server/dashboard_legacy/index.html +1 -1
  178. zenml/zen_server/dashboard_legacy/{precache-manifest.f4abc5b7cfa7d90c1caf5521918e29a8.js → precache-manifest.c8c57fb0d2132b1d3c2119e776b7dfb3.js} +4 -4
  179. zenml/zen_server/dashboard_legacy/service-worker.js +1 -1
  180. zenml/zen_server/dashboard_legacy/static/js/{main.ac2f17d0.chunk.js → main.382439a7.chunk.js} +2 -2
  181. zenml/zen_server/dashboard_legacy/static/js/{main.ac2f17d0.chunk.js.map → main.382439a7.chunk.js.map} +1 -1
  182. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  183. zenml/zen_server/deploy/helm/README.md +2 -2
  184. zenml/zen_server/feature_gate/zenml_cloud_feature_gate.py +11 -5
  185. zenml/zen_server/pipeline_deployment/utils.py +57 -44
  186. zenml/zen_server/rbac/models.py +1 -0
  187. zenml/zen_server/rbac/utils.py +22 -1
  188. zenml/zen_server/rbac/zenml_cloud_rbac.py +11 -5
  189. zenml/zen_server/routers/actions_endpoints.py +324 -0
  190. zenml/zen_server/routers/stack_deployment_endpoints.py +158 -0
  191. zenml/zen_server/routers/triggers_endpoints.py +30 -158
  192. zenml/zen_server/routers/workspaces_endpoints.py +64 -0
  193. zenml/zen_server/zen_server_api.py +4 -0
  194. zenml/zen_stores/migrations/utils.py +1 -1
  195. zenml/zen_stores/migrations/versions/0.60.0_release.py +23 -0
  196. zenml/zen_stores/migrations/versions/0.61.0_release.py +23 -0
  197. zenml/zen_stores/migrations/versions/0d707865f404_adding_labels_to_stacks.py +30 -0
  198. zenml/zen_stores/migrations/versions/25155145c545_separate_actions_and_triggers.py +228 -0
  199. zenml/zen_stores/rest_zen_store.py +248 -8
  200. zenml/zen_stores/schemas/__init__.py +2 -0
  201. zenml/zen_stores/schemas/action_schemas.py +192 -0
  202. zenml/zen_stores/schemas/stack_schemas.py +10 -0
  203. zenml/zen_stores/schemas/step_run_schemas.py +27 -11
  204. zenml/zen_stores/schemas/trigger_schemas.py +43 -50
  205. zenml/zen_stores/schemas/user_schemas.py +10 -2
  206. zenml/zen_stores/schemas/workspace_schemas.py +5 -0
  207. zenml/zen_stores/sql_zen_store.py +540 -36
  208. zenml/zen_stores/zen_store_interface.py +165 -0
  209. {zenml_nightly-0.58.2.dev20240623.dist-info → zenml_nightly-0.61.0.dev20240712.dist-info}/METADATA +33 -11
  210. {zenml_nightly-0.58.2.dev20240623.dist-info → zenml_nightly-0.61.0.dev20240712.dist-info}/RECORD +213 -193
  211. zenml/zen_server/dashboard/assets/@radix-C9DBgJhe.js +0 -77
  212. zenml/zen_server/dashboard/assets/@tanstack-CEbkxrhX.js +0 -30
  213. zenml/zen_server/dashboard/assets/AwarenessChannel-nXGpmj_f.js +0 -1
  214. zenml/zen_server/dashboard/assets/Cards-nwsvQLVS.js +0 -1
  215. zenml/zen_server/dashboard/assets/Commands-DuIWKg_Q.js +0 -1
  216. zenml/zen_server/dashboard/assets/CopyButton-B_YSm-Ds.js +0 -2
  217. zenml/zen_server/dashboard/assets/DisplayDate-BdguISQF.js +0 -1
  218. zenml/zen_server/dashboard/assets/EmptyState-BkooiGtL.js +0 -1
  219. zenml/zen_server/dashboard/assets/Error-B6M0dPph.js +0 -1
  220. zenml/zen_server/dashboard/assets/Helpbox-BQoqCm04.js +0 -1
  221. zenml/zen_server/dashboard/assets/Infobox-Ce9mefqU.js +0 -1
  222. zenml/zen_server/dashboard/assets/InlineAvatar-DGf3dVhV.js +0 -1
  223. zenml/zen_server/dashboard/assets/PageHeader-DGaemzjc.js +0 -1
  224. zenml/zen_server/dashboard/assets/Pagination-DVYfBCCc.js +0 -1
  225. zenml/zen_server/dashboard/assets/PasswordChecker-DSLBp7Vl.js +0 -1
  226. zenml/zen_server/dashboard/assets/SetPassword-B5s7DJug.js +0 -1
  227. zenml/zen_server/dashboard/assets/SuccessStep-ZzczaM7g.js +0 -1
  228. zenml/zen_server/dashboard/assets/cloud-only-Ba_ShBR5.js +0 -1
  229. zenml/zen_server/dashboard/assets/index-CWJ3xbIf.css +0 -1
  230. zenml/zen_server/dashboard/assets/index-QORVVTMN.js +0 -55
  231. zenml/zen_server/dashboard/assets/index.esm-F7nqy9zY.js +0 -1
  232. zenml/zen_server/dashboard/assets/not-found-Dh2la7kh.js +0 -1
  233. zenml/zen_server/dashboard/assets/page-B-5jAKoO.js +0 -1
  234. zenml/zen_server/dashboard/assets/page-B-vWk8a6.js +0 -1
  235. zenml/zen_server/dashboard/assets/page-B0BrqfS8.js +0 -1
  236. zenml/zen_server/dashboard/assets/page-BQxVFlUl.js +0 -1
  237. zenml/zen_server/dashboard/assets/page-ByrHy6Ss.js +0 -1
  238. zenml/zen_server/dashboard/assets/page-CPtY4Kv_.js +0 -1
  239. zenml/zen_server/dashboard/assets/page-CmmukLsl.js +0 -1
  240. zenml/zen_server/dashboard/assets/page-D2D-7qyr.js +0 -9
  241. zenml/zen_server/dashboard/assets/page-DAQQyLxT.js +0 -1
  242. zenml/zen_server/dashboard/assets/page-DHkUMl_E.js +0 -1
  243. zenml/zen_server/dashboard/assets/page-DZCbwOEs.js +0 -2
  244. zenml/zen_server/dashboard/assets/page-DdaIt20-.js +0 -1
  245. zenml/zen_server/dashboard/assets/page-LqLs24Ot.js +0 -1
  246. zenml/zen_server/dashboard/assets/page-lebv0c7C.js +0 -1
  247. {zenml_nightly-0.58.2.dev20240623.dist-info → zenml_nightly-0.61.0.dev20240712.dist-info}/LICENSE +0 -0
  248. {zenml_nightly-0.58.2.dev20240623.dist-info → zenml_nightly-0.61.0.dev20240712.dist-info}/WHEEL +0 -0
  249. {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
- user_image_name = (
201
- f"{docker_settings.target_repository}:"
202
- f"{tag}-intermediate-build"
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=docker_settings.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=docker_settings.dockerignore,
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 = {"pull": pull_parent_image, "rm": False}
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
- target_image_name = f"{docker_settings.target_repository}:{tag}"
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
@@ -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 = True,
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 dictionary
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(exclude_unset=True)
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__(**values)
79
+ return original.__class__.model_validate(values)
79
80
 
80
81
 
81
82
  class TemplateGenerator:
@@ -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 ZenMLCloudSession:
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 _get(
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 _post(
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"./@tanstack-CEbkxrhX.js";import{h as s,r as t}from"./index-QORVVTMN.js";import{E as r}from"./EmptyState-BkooiGtL.js";import{H as a}from"./help-B8rqCvqn.js";import{L as o}from"./@react-router-DYovave8.js";import"./@radix-C9DBgJhe.js";import"./@reactflow-CHBapDaj.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};
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};