zenml-nightly 0.80.1.dev20250408__py3-none-any.whl → 0.80.2.dev20250410__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.
- zenml/VERSION +1 -1
- zenml/cli/integration.py +36 -0
- zenml/client.py +6 -0
- zenml/config/step_configurations.py +3 -2
- zenml/constants.py +2 -1
- zenml/entrypoints/step_entrypoint_configuration.py +2 -0
- zenml/integrations/airflow/orchestrators/airflow_orchestrator.py +7 -2
- zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +2 -0
- zenml/integrations/azure/orchestrators/azureml_orchestrator.py +2 -0
- zenml/integrations/databricks/orchestrators/databricks_orchestrator.py +3 -1
- zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +2 -0
- zenml/integrations/hyperai/orchestrators/hyperai_orchestrator.py +3 -1
- zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py +3 -1
- zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +12 -0
- zenml/integrations/kubernetes/orchestrators/kube_utils.py +3 -0
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +4 -1
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +164 -19
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint_configuration.py +8 -1
- zenml/integrations/lightning/orchestrators/lightning_orchestrator.py +3 -1
- zenml/integrations/mlflow/__init__.py +0 -27
- zenml/integrations/mlflow/services/mlflow_deployment.py +25 -7
- zenml/integrations/seldon/services/seldon_deployment.py +1 -1
- zenml/integrations/skypilot/orchestrators/skypilot_base_vm_orchestrator.py +3 -1
- zenml/integrations/tekton/orchestrators/tekton_orchestrator.py +3 -1
- zenml/integrations/vllm/services/vllm_deployment.py +1 -1
- zenml/logging/step_logging.py +1 -1
- zenml/materializers/__init__.py +4 -3
- zenml/materializers/built_in_materializer.py +24 -0
- zenml/materializers/path_materializer.py +119 -0
- zenml/model/model.py +3 -1
- zenml/models/__init__.py +5 -0
- zenml/models/v2/core/run_template.py +32 -1
- zenml/orchestrators/base_orchestrator.py +3 -0
- zenml/orchestrators/dag_runner.py +48 -15
- zenml/orchestrators/local/local_orchestrator.py +3 -1
- zenml/orchestrators/local_docker/local_docker_orchestrator.py +3 -1
- zenml/orchestrators/step_launcher.py +2 -2
- zenml/utils/secret_utils.py +2 -2
- zenml/zen_server/dashboard/assets/{404-2I8egBQu.js → 404-CYPi9d8E.js} +1 -1
- zenml/zen_server/dashboard/assets/@radix-C7hRs6Kx.js +95 -0
- zenml/zen_server/dashboard/assets/{@react-router-BUo5vhN4.js → @react-router-BGgzhn5D.js} +5 -5
- zenml/zen_server/dashboard/assets/@reactflow-CQi1Z1Wq.js +17 -0
- zenml/zen_server/dashboard/assets/@tanstack-CSxjHCME.js +22 -0
- zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-D7KZcPFw.js → AlertDialogDropdownItem-Dn8bgaXG.js} +1 -1
- zenml/zen_server/dashboard/assets/{CodeSnippet-DUkCnBpQ.js → CodeSnippet-CSINAl3I.js} +1 -1
- zenml/zen_server/dashboard/assets/{CollapsibleCard-B5-5Plnd.js → CollapsibleCard-CQOb53t9.js} +1 -1
- zenml/zen_server/dashboard/assets/{Commands-CbOMmarC.js → Commands-CPleXvse.js} +1 -1
- zenml/zen_server/dashboard/assets/{ComponentBadge-FrujKBC6.js → ComponentBadge-CIFj0W7T.js} +1 -1
- zenml/zen_server/dashboard/assets/{ComponentIcon-Dx5fBrDX.js → ComponentIcon-D3JHFhJU.js} +1 -1
- zenml/zen_server/dashboard/assets/{CsvVizualization-B8E3p9we.js → CsvVizualization-Cklc1Vb5.js} +6 -6
- zenml/zen_server/dashboard/assets/{DeleteAlertDialog-BgTZbbAt.js → DeleteAlertDialog-Bzq-uSd7.js} +1 -1
- zenml/zen_server/dashboard/assets/{DialogItem-CNWLiJcc.js → DialogItem-zjMgCmCl.js} +1 -1
- zenml/zen_server/dashboard/assets/{DisplayDate-C5Aw-Yca.js → DisplayDate-CYVBBSgr.js} +1 -1
- zenml/zen_server/dashboard/assets/{EmptyState-DpbfQBDE.js → EmptyState-M1jafpg6.js} +1 -1
- zenml/zen_server/dashboard/assets/{Error-BkUP4Luv.js → Error-kdeNHm_o.js} +1 -1
- zenml/zen_server/dashboard/assets/{ExecutionStatus-CD8Vj7sp.js → ExecutionStatus-UE6Rbmtk.js} +1 -1
- zenml/zen_server/dashboard/assets/{Helpbox-DIx6mDOH.js → Helpbox-CeM-FPQl.js} +1 -1
- zenml/zen_server/dashboard/assets/{Infobox-BHEdNmME.js → Infobox-CD0fDbYF.js} +1 -1
- zenml/zen_server/dashboard/assets/{InlineAvatar-Bin9UPKJ.js → InlineAvatar-CrHWwlf4.js} +1 -1
- zenml/zen_server/dashboard/assets/{Lock-tO9Z41I9.js → Lock-DW-0_M0o.js} +1 -1
- zenml/zen_server/dashboard/assets/{MarkdownVisualization-C3JLiPCY.js → MarkdownVisualization-URCyUPcZ.js} +2 -2
- zenml/zen_server/dashboard/assets/{NestedCollapsible-Da-k0Mff.js → NestedCollapsible-DfTTGG8u.js} +1 -1
- zenml/zen_server/dashboard/assets/{NumberBox-BvBJYxCu.js → NumberBox-D2A7ENHb.js} +1 -1
- zenml/zen_server/dashboard/assets/Partials-DggkUpWp.js +1 -0
- zenml/zen_server/dashboard/assets/{PasswordChecker-B4Uw6BJZ.js → PasswordChecker-lYTOtNom.js} +1 -1
- zenml/zen_server/dashboard/assets/ProBadge-BCdprj69.js +1 -0
- zenml/zen_server/dashboard/assets/{ProCta-7_FtpX3I.js → ProCta-szzPO0Y7.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderIcon-CxeziA5a.js → ProviderIcon-MdqWDO6-.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderRadio-DPmZHff_.js → ProviderRadio-B4CB4vzP.js} +1 -1
- zenml/zen_server/dashboard/assets/{RunSelector-BVKB4Z8F.js → RunSelector-Bhb83FyB.js} +1 -1
- zenml/zen_server/dashboard/assets/{RunsBody-Cj4sIqQB.js → RunsBody-Csn2VEOE.js} +1 -1
- zenml/zen_server/dashboard/assets/{SearchField-DjAOZic5.js → SearchField-Cce00eQL.js} +1 -1
- zenml/zen_server/dashboard/assets/{SecretTooltip-mMAAP4dM.js → SecretTooltip-DaDLBVj-.js} +1 -1
- zenml/zen_server/dashboard/assets/{SetPassword-B0o5kSJU.js → SetPassword-tX6fom1Y.js} +1 -1
- zenml/zen_server/dashboard/assets/{StackList-5UB8LoEq.js → StackList-CQt1xGRh.js} +1 -1
- zenml/zen_server/dashboard/assets/{Tabs-AuhCyzle.js → Tabs-CCQyIqRb.js} +1 -1
- zenml/zen_server/dashboard/assets/{Tick-CHW0jc8Y.js → Tick-D63_jhf1.js} +1 -1
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Bauivjf-.js → UpdatePasswordSchemas-CbbvoGYV.js} +1 -1
- zenml/zen_server/dashboard/assets/{UsageReason-Dr5ca5M4.js → UsageReason-C2cNrUeS.js} +1 -1
- zenml/zen_server/dashboard/assets/{Wizard-XEp9rGmf.js → Wizard-BVkN2a2x.js} +1 -1
- zenml/zen_server/dashboard/assets/WizardFooter-Bk7gIKiS.js +1 -0
- zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-COvsm3bC.js → all-pipeline-runs-query-BLclwQSi.js} +1 -1
- zenml/zen_server/dashboard/assets/{arrow-left-B2hyhFky.js → arrow-left-CwgF2MEM.js} +1 -1
- zenml/zen_server/dashboard/assets/{check-DZ0KAh3W.js → check-DK77doTf.js} +1 -1
- zenml/zen_server/dashboard/assets/{check-circle-DyCCYTA0.js → check-circle-mvyzYvIW.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-down-A3PXOshS.js → chevron-down-A-rmltmI.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-right-double-zKz7rAaU.js → chevron-right-double-uNWbJT-C.js} +1 -1
- zenml/zen_server/dashboard/assets/{clock-k5T5tYrt.js → clock-CPA5cYxq.js} +1 -1
- zenml/zen_server/dashboard/assets/{code-browser-DvB0W2Ix.js → code-browser-j2EpcxIA.js} +1 -1
- zenml/zen_server/dashboard/assets/{configuration-form-BJUCr0wl.js → configuration-form-CjrAp0GS.js} +1 -1
- zenml/zen_server/dashboard/assets/{create-stack-B2c98UlP.js → create-stack-Bd2JdQer.js} +1 -1
- zenml/zen_server/dashboard/assets/delete-run-Cwpxu1-d.js +1 -0
- zenml/zen_server/dashboard/assets/{docker-B3Sqzd8J.js → docker-BuDBFEDL.js} +1 -1
- zenml/zen_server/dashboard/assets/{file-text-CgxVzNph.js → file-text-BdxZdjP_.js} +1 -1
- zenml/zen_server/dashboard/assets/{flavor-select-D8CranSY.js → flavor-select-c0w-6o9w.js} +1 -1
- zenml/zen_server/dashboard/assets/{form-schemas-Bm-dTV3L.js → form-schemas-B5Ax1SZf.js} +1 -1
- zenml/zen_server/dashboard/assets/{gcp-0u4le6mC.js → gcp-CHNvgEss.js} +1 -1
- zenml/zen_server/dashboard/assets/{help-CfT0tY2I.js → help-DyMolRxD.js} +1 -1
- zenml/zen_server/dashboard/assets/index-BW-KaQ2p.js +1 -0
- zenml/zen_server/dashboard/assets/{index-DPjvk73v.js → index-Be2jLIYM.js} +8 -8
- zenml/zen_server/dashboard/assets/{index-D-n6tspq.js → index-CjdtNrfJ.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-BVVKxTWC.js → index-DR30v9MZ.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-CzhJC6pc.js → index-d_40qKeY.js} +1 -1
- zenml/zen_server/dashboard/assets/index.esm-D7jFlf5N.js +1 -0
- zenml/zen_server/dashboard/assets/{key-icon-CjwWwoOU.js → key-icon-DO4DPJHZ.js} +1 -1
- zenml/zen_server/dashboard/assets/{kubernetes-eA-Y6gE7.js → kubernetes-D6OUjwSK.js} +1 -1
- zenml/zen_server/dashboard/assets/{layout-3_rgDUxf.js → layout-h3cbx8WZ.js} +1 -1
- zenml/zen_server/dashboard/assets/{link-external-BYm_zH_8.js → link-external-DUhCSKNm.js} +1 -1
- zenml/zen_server/dashboard/assets/{login-mutation-D6uiKsKk.js → login-mutation-DOajKct8.js} +1 -1
- zenml/zen_server/dashboard/assets/{logs-D6_diV2k.js → logs-B5n0U7tB.js} +1 -1
- zenml/zen_server/dashboard/assets/{not-found-DFrksY0r.js → not-found-DolTp0dr.js} +1 -1
- zenml/zen_server/dashboard/assets/{package-BOms6B-A.js → package-D1Mhqeh8.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DBNBYSwq.js → page-48DMcIQw.js} +2 -2
- zenml/zen_server/dashboard/assets/{page-DOzFoJuo.js → page-B32kCGPe.js} +1 -1
- zenml/zen_server/dashboard/assets/page-BAjhc2bs.js +1 -0
- zenml/zen_server/dashboard/assets/{page-D5GZlpKq.js → page-BBNrvxC1.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DF9q7ySu.js → page-BEAx6ZvH.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DDvwWgKP.js → page-BRfeowe0.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BJ15SGwt.js → page-BbRtQC2E.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D2F0Rvak.js → page-BgUR_5z3.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D0Zt2-7X.js → page-BiAjLLww.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-B80TE04v.js → page-BkPPfNfG.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DkJfgcDi.js → page-BmTf1Lf1.js} +2 -2
- zenml/zen_server/dashboard/assets/{page-CAKBSE9f.js → page-BuZC8z6N.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BwAFqFCf.js → page-C4zMMcaH.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BnUwQBeg.js → page-CKVbEdX2.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BXh1mF-D.js → page-CPRymOIS.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BMZaECzB.js → page-CaTJVICi.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-NIWnUdVg.js → page-CmzmFF4S.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BIseZTJt.js → page-CwAbTnvK.js} +2 -2
- zenml/zen_server/dashboard/assets/{page-BeFiRx31.js → page-D-MjLTXS.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-B1Un9vAU.js → page-D3m9-YWJ.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DhNnHHmX.js → page-DCpZju6a.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DEUeF3mO.js +1 -0
- zenml/zen_server/dashboard/assets/{page-B150LbzG.js → page-DWOAh8Pp.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-EhqRFAZc.js → page-DezabeEO.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BTvnIFGR.js → page-DivlNKt9.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BqQ6y8Hb.js → page-DmOcZO8U.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DnY59jOg.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DaHH2ZEF.js → page-Dv3qtvm8.js} +1 -1
- zenml/zen_server/dashboard/assets/page-P81CcE2L.js +1 -0
- zenml/zen_server/dashboard/assets/{page-Dd-0y3SU.js → page-a1c6o4vv.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BJrZsPSh.js → page-bS5tHLDW.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-C11vPVkH.js → page-gRfUvR0E.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BZUxCBoD.js → page-hNHJPQtK.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-kYlFrH53.js → page-ir7Scz2Y.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-ygCPGHAV.js → page-mtwS5oci.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-DHGuHP2H.js → persist-BUqILw7G.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-C5RlwSq6.js → persist-BbdfLc0W.js} +1 -1
- zenml/zen_server/dashboard/assets/{plus-CoKtHiA9.js → plus-COjQg3AG.js} +1 -1
- zenml/zen_server/dashboard/assets/{react-error-boundary.esm-BkGIR1Du.js → react-error-boundary.esm-fyoUBS25.js} +1 -1
- zenml/zen_server/dashboard/assets/{refresh-CupyU1Vs.js → refresh-CM5T3QeU.js} +1 -1
- zenml/zen_server/dashboard/assets/{rocket-k68ONPDS.js → rocket-Cf-B-XOR.js} +1 -1
- zenml/zen_server/dashboard/assets/{service-Do7yitqe.js → service-CV2zjc-p.js} +1 -1
- zenml/zen_server/dashboard/assets/{sharedSchema-i_9Y4WcA.js → sharedSchema-DpGc9kQg.js} +1 -1
- zenml/zen_server/dashboard/assets/stack-detail-query-BpzLZjvw.js +1 -0
- zenml/zen_server/dashboard/assets/{terminal-square-URAPn9DB.js → terminal-square-DMtel8mb.js} +1 -1
- zenml/zen_server/dashboard/assets/{tick-circle-AaVBszPn.js → tick-circle-m94Aa6Zt.js} +1 -1
- zenml/zen_server/dashboard/assets/{trash-B_JgTgqd.js → trash-BWSZ7NRK.js} +1 -1
- zenml/zen_server/dashboard/assets/update-server-settings-mutation-Dv6qHtK9.js +1 -0
- zenml/zen_server/dashboard/assets/{zod-CRNUMWWg.js → zod-C0xYeTvL.js} +1 -1
- zenml/zen_server/dashboard/index.html +6 -6
- zenml/zen_server/template_execution/utils.py +53 -33
- zenml/zen_stores/migrations/versions/0.80.2_release.py +23 -0
- zenml/zen_stores/migrations/versions/6611d4bcc95b_add_hidden_option_for_templates.py +47 -0
- zenml/zen_stores/schemas/run_template_schemas.py +7 -0
- {zenml_nightly-0.80.1.dev20250408.dist-info → zenml_nightly-0.80.2.dev20250410.dist-info}/METADATA +3 -3
- {zenml_nightly-0.80.1.dev20250408.dist-info → zenml_nightly-0.80.2.dev20250410.dist-info}/RECORD +171 -168
- zenml/zen_server/dashboard/assets/@radix-AvWw-1nd.js +0 -95
- zenml/zen_server/dashboard/assets/@reactflow-BHoFKFSZ.js +0 -17
- zenml/zen_server/dashboard/assets/@tanstack-CcI3lvwB.js +0 -22
- zenml/zen_server/dashboard/assets/Partials-TNaYjHsV.js +0 -1
- zenml/zen_server/dashboard/assets/ProBadge-BfPp-B97.js +0 -1
- zenml/zen_server/dashboard/assets/WizardFooter-BtL1Gi1k.js +0 -1
- zenml/zen_server/dashboard/assets/delete-run-Do3XyF4W.js +0 -1
- zenml/zen_server/dashboard/assets/index-eIIP-0dQ.js +0 -1
- zenml/zen_server/dashboard/assets/index.esm-cf-8NBxV.js +0 -1
- zenml/zen_server/dashboard/assets/page-B-uHUFcm.js +0 -1
- zenml/zen_server/dashboard/assets/page-B0Llmzo_.js +0 -1
- zenml/zen_server/dashboard/assets/page-BzlVs5tC.js +0 -1
- zenml/zen_server/dashboard/assets/page-CPe9nQSo.js +0 -1
- zenml/zen_server/dashboard/assets/stack-detail-query-omCumL7U.js +0 -1
- zenml/zen_server/dashboard/assets/update-server-settings-mutation-B4eE33z-.js +0 -1
- {zenml_nightly-0.80.1.dev20250408.dist-info → zenml_nightly-0.80.2.dev20250410.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.80.1.dev20250408.dist-info → zenml_nightly-0.80.2.dev20250410.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.80.1.dev20250408.dist-info → zenml_nightly-0.80.2.dev20250410.dist-info}/entry_points.txt +0 -0
zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint_configuration.py
CHANGED
@@ -13,7 +13,7 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Entrypoint configuration for the Kubernetes master/orchestrator pod."""
|
15
15
|
|
16
|
-
from typing import TYPE_CHECKING, List, Set
|
16
|
+
from typing import TYPE_CHECKING, List, Optional, Set
|
17
17
|
|
18
18
|
if TYPE_CHECKING:
|
19
19
|
from uuid import UUID
|
@@ -21,6 +21,7 @@ if TYPE_CHECKING:
|
|
21
21
|
RUN_NAME_OPTION = "run_name"
|
22
22
|
DEPLOYMENT_ID_OPTION = "deployment_id"
|
23
23
|
NAMESPACE_OPTION = "kubernetes_namespace"
|
24
|
+
RUN_ID_OPTION = "run_id"
|
24
25
|
|
25
26
|
|
26
27
|
class KubernetesOrchestratorEntrypointConfiguration:
|
@@ -60,6 +61,7 @@ class KubernetesOrchestratorEntrypointConfiguration:
|
|
60
61
|
run_name: str,
|
61
62
|
deployment_id: "UUID",
|
62
63
|
kubernetes_namespace: str,
|
64
|
+
run_id: Optional["UUID"] = None,
|
63
65
|
) -> List[str]:
|
64
66
|
"""Gets all arguments that the entrypoint command should be called with.
|
65
67
|
|
@@ -67,6 +69,7 @@ class KubernetesOrchestratorEntrypointConfiguration:
|
|
67
69
|
run_name: Name of the ZenML run.
|
68
70
|
deployment_id: ID of the deployment.
|
69
71
|
kubernetes_namespace: Name of the Kubernetes namespace.
|
72
|
+
run_id: Optional ID of the pipeline run. Not set for scheduled runs.
|
70
73
|
|
71
74
|
Returns:
|
72
75
|
List of entrypoint arguments.
|
@@ -80,4 +83,8 @@ class KubernetesOrchestratorEntrypointConfiguration:
|
|
80
83
|
kubernetes_namespace,
|
81
84
|
]
|
82
85
|
|
86
|
+
if run_id:
|
87
|
+
args.append(f"--{RUN_ID_OPTION}")
|
88
|
+
args.append(str(run_id))
|
89
|
+
|
83
90
|
return args
|
@@ -46,7 +46,7 @@ from zenml.stack import StackValidator
|
|
46
46
|
from zenml.utils import code_utils, io_utils, source_utils
|
47
47
|
|
48
48
|
if TYPE_CHECKING:
|
49
|
-
from zenml.models import PipelineDeploymentResponse
|
49
|
+
from zenml.models import PipelineDeploymentResponse, PipelineRunResponse
|
50
50
|
from zenml.stack import Stack
|
51
51
|
|
52
52
|
|
@@ -199,6 +199,7 @@ class LightningOrchestrator(WheeledOrchestrator):
|
|
199
199
|
deployment: "PipelineDeploymentResponse",
|
200
200
|
stack: "Stack",
|
201
201
|
environment: Dict[str, str],
|
202
|
+
placeholder_run: Optional["PipelineRunResponse"] = None,
|
202
203
|
) -> Any:
|
203
204
|
"""Creates a wheel and uploads the pipeline to Lightning.
|
204
205
|
|
@@ -223,6 +224,7 @@ class LightningOrchestrator(WheeledOrchestrator):
|
|
223
224
|
stack: The stack the pipeline will run on.
|
224
225
|
environment: Environment variables to set in the orchestration
|
225
226
|
environment.
|
227
|
+
placeholder_run: An optional placeholder run for the deployment.
|
226
228
|
|
227
229
|
Raises:
|
228
230
|
ValueError: If the schedule is not set or if the cron expression
|
@@ -61,39 +61,12 @@ class MlflowIntegration(Integration):
|
|
61
61
|
from zenml.integrations.numpy import NumpyIntegration
|
62
62
|
from zenml.integrations.pandas import PandasIntegration
|
63
63
|
|
64
|
-
|
65
64
|
reqs = [
|
66
65
|
"mlflow>=2.1.1,<3",
|
67
66
|
# TODO: remove this requirement once rapidjson is fixed
|
68
67
|
"python-rapidjson<1.15",
|
69
|
-
# When you do:
|
70
|
-
# pip install zenml
|
71
|
-
# You get all our required dependencies. However, if you follow it
|
72
|
-
# with:
|
73
|
-
# zenml integration install mlflow
|
74
|
-
# This downgrades pydantic to v1 even though mlflow does not have
|
75
|
-
# any issues with v2. This is why we have to pin it here so a
|
76
|
-
# downgrade will not happen.
|
77
|
-
"pydantic>=2.8.0,<2.9.0",
|
78
68
|
]
|
79
69
|
|
80
|
-
if python_version:
|
81
|
-
version_minor = version.parse(python_version).minor
|
82
|
-
else:
|
83
|
-
version_minor = sys.version_info.minor
|
84
|
-
|
85
|
-
if version_minor >= 12:
|
86
|
-
logger.debug(
|
87
|
-
"The MLflow integration on Python 3.12 and above is not yet "
|
88
|
-
"fully supported: The extra dependencies 'mlserver' and "
|
89
|
-
"'mlserver-mlflow' will be skipped."
|
90
|
-
)
|
91
|
-
else:
|
92
|
-
reqs.extend([
|
93
|
-
"mlserver>=1.3.3",
|
94
|
-
"mlserver-mlflow>=1.3.3",
|
95
|
-
])
|
96
|
-
|
97
70
|
reqs.extend(NumpyIntegration.get_requirements(target_os=target_os, python_version=python_version))
|
98
71
|
reqs.extend(PandasIntegration.get_requirements(target_os=target_os, python_version=python_version))
|
99
72
|
return reqs
|
@@ -13,6 +13,7 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Implementation of the MLflow deployment functionality."""
|
15
15
|
|
16
|
+
import importlib
|
16
17
|
import os
|
17
18
|
import sys
|
18
19
|
from typing import TYPE_CHECKING, Any, Dict, Optional, Union
|
@@ -126,14 +127,31 @@ class MLFlowDeploymentConfig(LocalDaemonServiceConfig):
|
|
126
127
|
the validated value
|
127
128
|
|
128
129
|
Raises:
|
129
|
-
ValueError: if mlserver
|
130
|
-
yet supported.
|
130
|
+
ValueError: if mlserver packages are not installed
|
131
131
|
"""
|
132
|
-
if mlserver is True
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
132
|
+
if mlserver is True:
|
133
|
+
# For the mlserver deployment, the mlserver and
|
134
|
+
# mlserver-mlflow packages need to be installed separately
|
135
|
+
# because they rely on an older version of Pydantic.
|
136
|
+
|
137
|
+
# Check if the mlserver and mlserver-mlflow packages are installed
|
138
|
+
try:
|
139
|
+
importlib.import_module("mlserver")
|
140
|
+
importlib.import_module("mlserver_mlflow")
|
141
|
+
except ModuleNotFoundError:
|
142
|
+
if sys.version_info.minor >= 12:
|
143
|
+
raise ValueError(
|
144
|
+
"The mlserver deployment is not yet supported on "
|
145
|
+
"Python 3.12 or above."
|
146
|
+
)
|
147
|
+
|
148
|
+
raise ValueError(
|
149
|
+
"The MLflow MLServer backend requires the `mlserver` and "
|
150
|
+
"`mlserver-mlflow` packages to be installed. These "
|
151
|
+
"packages are not included in the ZenML MLflow integration "
|
152
|
+
"requirements. Please install them manually."
|
153
|
+
)
|
154
|
+
|
137
155
|
return mlserver
|
138
156
|
|
139
157
|
|
@@ -72,7 +72,7 @@ class SeldonDeploymentConfig(ServiceConfig):
|
|
72
72
|
model_metadata: Dict[str, Any] = Field(default_factory=dict)
|
73
73
|
extra_args: Dict[str, Any] = Field(default_factory=dict)
|
74
74
|
is_custom_deployment: Optional[bool] = False
|
75
|
-
spec: Optional[Dict[Any, Any]] = Field(default_factory=dict)
|
75
|
+
spec: Optional[Dict[Any, Any]] = Field(default_factory=dict) # type: ignore[arg-type]
|
76
76
|
serviceAccountName: Optional[str] = None
|
77
77
|
|
78
78
|
def get_seldon_deployment_labels(self) -> Dict[str, str]:
|
@@ -39,7 +39,7 @@ from zenml.orchestrators.utils import get_orchestrator_run_name
|
|
39
39
|
from zenml.stack import StackValidator
|
40
40
|
|
41
41
|
if TYPE_CHECKING:
|
42
|
-
from zenml.models import PipelineDeploymentResponse
|
42
|
+
from zenml.models import PipelineDeploymentResponse, PipelineRunResponse
|
43
43
|
from zenml.stack import Stack
|
44
44
|
|
45
45
|
|
@@ -149,6 +149,7 @@ class SkypilotBaseOrchestrator(ContainerizedOrchestrator):
|
|
149
149
|
deployment: "PipelineDeploymentResponse",
|
150
150
|
stack: "Stack",
|
151
151
|
environment: Dict[str, str],
|
152
|
+
placeholder_run: Optional["PipelineRunResponse"] = None,
|
152
153
|
) -> Any:
|
153
154
|
"""Runs each pipeline step in a separate Skypilot container.
|
154
155
|
|
@@ -157,6 +158,7 @@ class SkypilotBaseOrchestrator(ContainerizedOrchestrator):
|
|
157
158
|
stack: The stack the pipeline will run on.
|
158
159
|
environment: Environment variables to set in the orchestration
|
159
160
|
environment.
|
161
|
+
placeholder_run: An optional placeholder run for the deployment.
|
160
162
|
|
161
163
|
Raises:
|
162
164
|
Exception: If the pipeline run fails.
|
@@ -53,7 +53,7 @@ from zenml.utils import io_utils, yaml_utils
|
|
53
53
|
|
54
54
|
if TYPE_CHECKING:
|
55
55
|
from zenml.config.base_settings import BaseSettings
|
56
|
-
from zenml.models import PipelineDeploymentResponse
|
56
|
+
from zenml.models import PipelineDeploymentResponse, PipelineRunResponse
|
57
57
|
from zenml.stack import Stack
|
58
58
|
|
59
59
|
|
@@ -460,6 +460,7 @@ class TektonOrchestrator(ContainerizedOrchestrator):
|
|
460
460
|
deployment: "PipelineDeploymentResponse",
|
461
461
|
stack: "Stack",
|
462
462
|
environment: Dict[str, str],
|
463
|
+
placeholder_run: Optional["PipelineRunResponse"] = None,
|
463
464
|
) -> Any:
|
464
465
|
"""Runs the pipeline on Tekton.
|
465
466
|
|
@@ -471,6 +472,7 @@ class TektonOrchestrator(ContainerizedOrchestrator):
|
|
471
472
|
stack: The stack the pipeline will run on.
|
472
473
|
environment: Environment variables to set in the orchestration
|
473
474
|
environment.
|
475
|
+
placeholder_run: An optional placeholder run for the deployment.
|
474
476
|
|
475
477
|
Raises:
|
476
478
|
RuntimeError: If you try to run the pipelines in a notebook
|
@@ -150,7 +150,7 @@ class VLLMDeploymentService(LocalDaemonService, BaseDeploymentService):
|
|
150
150
|
|
151
151
|
try:
|
152
152
|
parser: argparse.ArgumentParser = make_arg_parser(
|
153
|
-
FlexibleArgumentParser()
|
153
|
+
FlexibleArgumentParser() # type: ignore[no-untyped-call]
|
154
154
|
)
|
155
155
|
# pass in empty list to get default args
|
156
156
|
# otherwise it will try to get the args from sys.argv
|
zenml/logging/step_logging.py
CHANGED
zenml/materializers/__init__.py
CHANGED
@@ -26,14 +26,14 @@ from zenml.materializers.built_in_materializer import (
|
|
26
26
|
from zenml.materializers.cloudpickle_materializer import (
|
27
27
|
CloudpickleMaterializer,
|
28
28
|
)
|
29
|
+
from zenml.materializers.path_materializer import PathMaterializer
|
30
|
+
from zenml.materializers.pydantic_materializer import PydanticMaterializer
|
31
|
+
from zenml.materializers.service_materializer import ServiceMaterializer
|
29
32
|
from zenml.materializers.structured_string_materializer import (
|
30
33
|
StructuredStringMaterializer,
|
31
34
|
)
|
32
|
-
from zenml.materializers.pydantic_materializer import PydanticMaterializer
|
33
|
-
from zenml.materializers.service_materializer import ServiceMaterializer
|
34
35
|
from zenml.materializers.uuid_materializer import UUIDMaterializer
|
35
36
|
|
36
|
-
|
37
37
|
__all__ = [
|
38
38
|
"BuiltInContainerMaterializer",
|
39
39
|
"BuiltInMaterializer",
|
@@ -43,4 +43,5 @@ __all__ = [
|
|
43
43
|
"PydanticMaterializer",
|
44
44
|
"ServiceMaterializer",
|
45
45
|
"UUIDMaterializer",
|
46
|
+
"PathMaterializer",
|
46
47
|
]
|
@@ -107,6 +107,19 @@ class BuiltInMaterializer(BaseMaterializer):
|
|
107
107
|
ensure_ascii=not ZENML_MATERIALIZER_ALLOW_NON_ASCII_JSON_DUMPS,
|
108
108
|
)
|
109
109
|
|
110
|
+
def save_visualizations(
|
111
|
+
self, data: Union[bool, float, int, str]
|
112
|
+
) -> Dict[str, VisualizationType]:
|
113
|
+
"""Save visualizations for the given basic type.
|
114
|
+
|
115
|
+
Args:
|
116
|
+
data: The data to save visualizations for.
|
117
|
+
|
118
|
+
Returns:
|
119
|
+
A dictionary of visualization URIs and their types.
|
120
|
+
"""
|
121
|
+
return {self.data_path.replace("\\", "/"): VisualizationType.JSON}
|
122
|
+
|
110
123
|
def extract_metadata(
|
111
124
|
self, data: Union[bool, float, int, str]
|
112
125
|
) -> Dict[str, "MetadataType"]:
|
@@ -165,6 +178,17 @@ class BytesMaterializer(BaseMaterializer):
|
|
165
178
|
with self.artifact_store.open(self.data_path, "wb") as file_:
|
166
179
|
file_.write(data)
|
167
180
|
|
181
|
+
def save_visualizations(self, data: bytes) -> Dict[str, VisualizationType]:
|
182
|
+
"""Save visualizations for the given bytes data.
|
183
|
+
|
184
|
+
Args:
|
185
|
+
data: The bytes data to save visualizations for.
|
186
|
+
|
187
|
+
Returns:
|
188
|
+
A dictionary of visualization URIs and their types.
|
189
|
+
"""
|
190
|
+
return {self.data_path.replace("\\", "/"): VisualizationType.MARKDOWN}
|
191
|
+
|
168
192
|
|
169
193
|
def _all_serializable(iterable: Iterable[Any]) -> bool:
|
170
194
|
"""For an iterable, check whether all of its elements are JSON-serializable.
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# Copyright (c) ZenML GmbH 2025. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at:
|
6
|
+
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
12
|
+
# or implied. See the License for the specific language governing
|
13
|
+
# permissions and limitations under the License.
|
14
|
+
"""Implementation of the materializer for Path objects."""
|
15
|
+
|
16
|
+
import os
|
17
|
+
import shutil
|
18
|
+
import tarfile
|
19
|
+
from pathlib import Path
|
20
|
+
from typing import Any, ClassVar, Tuple, Type
|
21
|
+
|
22
|
+
from zenml.constants import (
|
23
|
+
ENV_ZENML_DISABLE_PATH_MATERIALIZER,
|
24
|
+
handle_bool_env_var,
|
25
|
+
)
|
26
|
+
from zenml.enums import ArtifactType
|
27
|
+
from zenml.io import fileio
|
28
|
+
from zenml.materializers.base_materializer import BaseMaterializer
|
29
|
+
|
30
|
+
|
31
|
+
class PathMaterializer(BaseMaterializer):
|
32
|
+
"""Materializer for Path objects.
|
33
|
+
|
34
|
+
This materializer handles `pathlib.Path` objects by storing their contents
|
35
|
+
in a compressed tar archive within the artifact store if it's a directory,
|
36
|
+
or directly copying the file if it's a single file.
|
37
|
+
"""
|
38
|
+
|
39
|
+
ASSOCIATED_TYPES: ClassVar[Tuple[Type[Any], ...]] = (Path,)
|
40
|
+
ASSOCIATED_ARTIFACT_TYPE: ClassVar[ArtifactType] = ArtifactType.DATA
|
41
|
+
ARCHIVE_NAME: ClassVar[str] = "data.tar.gz"
|
42
|
+
FILE_NAME: ClassVar[str] = "file_data"
|
43
|
+
|
44
|
+
# Skip registration if the environment variable is set
|
45
|
+
SKIP_REGISTRATION: ClassVar[bool] = handle_bool_env_var(
|
46
|
+
ENV_ZENML_DISABLE_PATH_MATERIALIZER, default=False
|
47
|
+
)
|
48
|
+
|
49
|
+
def load(self, data_type: Type[Any]) -> Any:
|
50
|
+
"""Copy the artifact files to a local temp directory or file.
|
51
|
+
|
52
|
+
Args:
|
53
|
+
data_type: Unused.
|
54
|
+
|
55
|
+
Returns:
|
56
|
+
Path to the local directory or file that contains the artifact.
|
57
|
+
|
58
|
+
Raises:
|
59
|
+
FileNotFoundError: If the artifact is not found in the artifact store.
|
60
|
+
"""
|
61
|
+
# Create a temporary directory that will persist until step execution ends
|
62
|
+
with self.get_temporary_directory(delete_at_exit=False) as directory:
|
63
|
+
# Check if we're loading a file or directory by looking for the archive
|
64
|
+
archive_path_remote = os.path.join(self.uri, self.ARCHIVE_NAME)
|
65
|
+
file_path_remote = os.path.join(self.uri, self.FILE_NAME)
|
66
|
+
|
67
|
+
if fileio.exists(archive_path_remote):
|
68
|
+
# This is a directory artifact
|
69
|
+
archive_path_local = os.path.join(directory, self.ARCHIVE_NAME)
|
70
|
+
fileio.copy(archive_path_remote, archive_path_local)
|
71
|
+
|
72
|
+
# Extract the archive to the temporary directory
|
73
|
+
with tarfile.open(archive_path_local, "r:gz") as tar:
|
74
|
+
tar.extractall(path=directory)
|
75
|
+
|
76
|
+
# Clean up the archive file
|
77
|
+
os.remove(archive_path_local)
|
78
|
+
return Path(directory)
|
79
|
+
elif fileio.exists(file_path_remote):
|
80
|
+
# This is a single file artifact
|
81
|
+
file_path_local = os.path.join(
|
82
|
+
directory, os.path.basename(file_path_remote)
|
83
|
+
)
|
84
|
+
fileio.copy(file_path_remote, file_path_local)
|
85
|
+
return Path(file_path_local)
|
86
|
+
else:
|
87
|
+
raise FileNotFoundError(
|
88
|
+
f"Could not find artifact at {archive_path_remote} or {file_path_remote}"
|
89
|
+
)
|
90
|
+
|
91
|
+
def save(self, data: Any) -> None:
|
92
|
+
"""Store the directory or file in the artifact store.
|
93
|
+
|
94
|
+
Args:
|
95
|
+
data: Path to a local directory or file to store. Must be a Path object.
|
96
|
+
"""
|
97
|
+
assert isinstance(data, Path)
|
98
|
+
|
99
|
+
if data.is_dir():
|
100
|
+
# Handle directory artifact
|
101
|
+
with self.get_temporary_directory(
|
102
|
+
delete_at_exit=True
|
103
|
+
) as directory:
|
104
|
+
archive_base = os.path.join(directory, "data")
|
105
|
+
|
106
|
+
# Create tar.gz archive - automatically uses relative paths
|
107
|
+
shutil.make_archive(
|
108
|
+
base_name=archive_base, format="gztar", root_dir=str(data)
|
109
|
+
)
|
110
|
+
|
111
|
+
# Copy the archive to the artifact store
|
112
|
+
fileio.copy(
|
113
|
+
f"{archive_base}.tar.gz",
|
114
|
+
os.path.join(self.uri, self.ARCHIVE_NAME),
|
115
|
+
)
|
116
|
+
else:
|
117
|
+
# Handle single file artifact
|
118
|
+
file_path_remote = os.path.join(self.uri, self.FILE_NAME)
|
119
|
+
fileio.copy(str(data), file_path_remote)
|
zenml/model/model.py
CHANGED
@@ -81,7 +81,7 @@ class Model(BaseModel):
|
|
81
81
|
# technical attributes
|
82
82
|
model_version_id: Optional[UUID] = None
|
83
83
|
suppress_class_validation_warnings: bool = False
|
84
|
-
_model_id: UUID = PrivateAttr(None)
|
84
|
+
_model_id: Optional[UUID] = PrivateAttr(None)
|
85
85
|
_number: Optional[int] = PrivateAttr(None)
|
86
86
|
_created_model_version: bool = PrivateAttr(False)
|
87
87
|
|
@@ -130,6 +130,8 @@ class Model(BaseModel):
|
|
130
130
|
"""
|
131
131
|
if self._model_id is None:
|
132
132
|
self._get_or_create_model()
|
133
|
+
|
134
|
+
assert self._model_id is not None
|
133
135
|
return self._model_id
|
134
136
|
|
135
137
|
@property
|
zenml/models/__init__.py
CHANGED
@@ -418,7 +418,11 @@ from zenml.models.v2.misc.info_models import (
|
|
418
418
|
|
419
419
|
# V2
|
420
420
|
ActionResponseResources.model_rebuild()
|
421
|
+
ActionResponseMetadata.model_rebuild()
|
421
422
|
APIKeyResponseBody.model_rebuild()
|
423
|
+
ArtifactResponse.model_rebuild()
|
424
|
+
ArtifactResponseBody.model_rebuild()
|
425
|
+
ArtifactResponseMetadata.model_rebuild()
|
422
426
|
ArtifactVersionRequest.model_rebuild()
|
423
427
|
ArtifactVersionResponseBody.model_rebuild()
|
424
428
|
ArtifactVersionResponseMetadata.model_rebuild()
|
@@ -477,6 +481,7 @@ StepRunRequest.model_rebuild()
|
|
477
481
|
StepRunResponseBody.model_rebuild()
|
478
482
|
StepRunResponseMetadata.model_rebuild()
|
479
483
|
StepRunResponseResources.model_rebuild()
|
484
|
+
TagResponseBody.model_rebuild()
|
480
485
|
TriggerExecutionResponseResources.model_rebuild()
|
481
486
|
TriggerResponseBody.model_rebuild()
|
482
487
|
TriggerResponseMetadata.model_rebuild()
|
@@ -79,6 +79,10 @@ class RunTemplateRequest(ProjectScopedRequest):
|
|
79
79
|
source_deployment_id: UUID = Field(
|
80
80
|
title="The deployment that should be the base of the created template."
|
81
81
|
)
|
82
|
+
hidden: bool = Field(
|
83
|
+
default=False,
|
84
|
+
title="Whether the run template is hidden.",
|
85
|
+
)
|
82
86
|
tags: Optional[List[str]] = Field(
|
83
87
|
default=None,
|
84
88
|
title="Tags of the run template.",
|
@@ -101,6 +105,10 @@ class RunTemplateUpdate(BaseUpdate):
|
|
101
105
|
title="The description of the run template.",
|
102
106
|
max_length=TEXT_FIELD_MAX_LENGTH,
|
103
107
|
)
|
108
|
+
hidden: Optional[bool] = Field(
|
109
|
+
default=None,
|
110
|
+
title="Whether the run template is hidden.",
|
111
|
+
)
|
104
112
|
add_tags: Optional[List[str]] = Field(
|
105
113
|
default=None, title="New tags to add to the run template."
|
106
114
|
)
|
@@ -118,6 +126,10 @@ class RunTemplateResponseBody(ProjectScopedResponseBody):
|
|
118
126
|
runnable: bool = Field(
|
119
127
|
title="If a run can be started from the template.",
|
120
128
|
)
|
129
|
+
hidden: bool = Field(
|
130
|
+
default=False,
|
131
|
+
title="Whether the run template is hidden.",
|
132
|
+
)
|
121
133
|
latest_run_id: Optional[UUID] = Field(
|
122
134
|
default=None,
|
123
135
|
title="The ID of the latest run of the run template.",
|
@@ -205,6 +217,15 @@ class RunTemplateResponse(
|
|
205
217
|
"""
|
206
218
|
return self.get_body().runnable
|
207
219
|
|
220
|
+
@property
|
221
|
+
def hidden(self) -> bool:
|
222
|
+
"""The `hidden` property.
|
223
|
+
|
224
|
+
Returns:
|
225
|
+
the value of the property.
|
226
|
+
"""
|
227
|
+
return self.get_body().hidden
|
228
|
+
|
208
229
|
@property
|
209
230
|
def latest_run_id(self) -> Optional[UUID]:
|
210
231
|
"""The `latest_run_id` property.
|
@@ -320,6 +341,7 @@ class RunTemplateFilter(ProjectScopedFilter, TaggableFilter):
|
|
320
341
|
"pipeline_id",
|
321
342
|
"pipeline",
|
322
343
|
"stack",
|
344
|
+
"hidden",
|
323
345
|
]
|
324
346
|
CUSTOM_SORTING_OPTIONS = [
|
325
347
|
*ProjectScopedFilter.CUSTOM_SORTING_OPTIONS,
|
@@ -334,6 +356,10 @@ class RunTemplateFilter(ProjectScopedFilter, TaggableFilter):
|
|
334
356
|
default=None,
|
335
357
|
description="Name of the run template.",
|
336
358
|
)
|
359
|
+
hidden: Optional[bool] = Field(
|
360
|
+
default=None,
|
361
|
+
description="Whether the run template is hidden.",
|
362
|
+
)
|
337
363
|
pipeline_id: Optional[Union[UUID, str]] = Field(
|
338
364
|
default=None,
|
339
365
|
description="Pipeline associated with the template.",
|
@@ -376,7 +402,7 @@ class RunTemplateFilter(ProjectScopedFilter, TaggableFilter):
|
|
376
402
|
"""
|
377
403
|
custom_filters = super().get_custom_filters(table)
|
378
404
|
|
379
|
-
from sqlmodel import and_
|
405
|
+
from sqlmodel import and_, col
|
380
406
|
|
381
407
|
from zenml.zen_stores.schemas import (
|
382
408
|
CodeReferenceSchema,
|
@@ -386,6 +412,11 @@ class RunTemplateFilter(ProjectScopedFilter, TaggableFilter):
|
|
386
412
|
StackSchema,
|
387
413
|
)
|
388
414
|
|
415
|
+
if self.hidden is not None:
|
416
|
+
custom_filters.append(
|
417
|
+
col(RunTemplateSchema.hidden).is_(self.hidden)
|
418
|
+
)
|
419
|
+
|
389
420
|
if self.code_repository_id:
|
390
421
|
code_repo_filter = and_(
|
391
422
|
RunTemplateSchema.source_deployment_id
|
@@ -140,6 +140,7 @@ class BaseOrchestrator(StackComponent, ABC):
|
|
140
140
|
deployment: "PipelineDeploymentResponse",
|
141
141
|
stack: "Stack",
|
142
142
|
environment: Dict[str, str],
|
143
|
+
placeholder_run: Optional["PipelineRunResponse"] = None,
|
143
144
|
) -> Optional[Iterator[Dict[str, MetadataType]]]:
|
144
145
|
"""The method needs to be implemented by the respective orchestrator.
|
145
146
|
|
@@ -175,6 +176,7 @@ class BaseOrchestrator(StackComponent, ABC):
|
|
175
176
|
stack: The stack the pipeline will run on.
|
176
177
|
environment: Environment variables to set in the orchestration
|
177
178
|
environment. These don't need to be set if running locally.
|
179
|
+
placeholder_run: An optional placeholder run for the deployment.
|
178
180
|
|
179
181
|
Yields:
|
180
182
|
Metadata for the pipeline run.
|
@@ -250,6 +252,7 @@ class BaseOrchestrator(StackComponent, ABC):
|
|
250
252
|
deployment=deployment,
|
251
253
|
stack=stack,
|
252
254
|
environment=environment,
|
255
|
+
placeholder_run=placeholder_run,
|
253
256
|
):
|
254
257
|
for metadata_dict in metadata_iterator:
|
255
258
|
try:
|