zenml-nightly 0.61.0.dev20240714__py3-none-any.whl → 0.62.0.dev20240719__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 +1 -1
- RELEASE_NOTES.md +40 -0
- zenml/VERSION +1 -1
- zenml/__init__.py +2 -0
- zenml/cli/stack.py +87 -228
- zenml/cli/stack_components.py +5 -3
- zenml/constants.py +2 -0
- zenml/entrypoints/entrypoint.py +3 -1
- zenml/integrations/__init__.py +1 -0
- zenml/integrations/constants.py +1 -0
- zenml/integrations/databricks/__init__.py +52 -0
- zenml/integrations/databricks/flavors/__init__.py +30 -0
- zenml/integrations/databricks/flavors/databricks_model_deployer_flavor.py +118 -0
- zenml/integrations/databricks/flavors/databricks_orchestrator_flavor.py +147 -0
- zenml/integrations/databricks/model_deployers/__init__.py +20 -0
- zenml/integrations/databricks/model_deployers/databricks_model_deployer.py +249 -0
- zenml/integrations/databricks/orchestrators/__init__.py +20 -0
- zenml/integrations/databricks/orchestrators/databricks_orchestrator.py +498 -0
- zenml/integrations/databricks/orchestrators/databricks_orchestrator_entrypoint_config.py +97 -0
- zenml/integrations/databricks/services/__init__.py +19 -0
- zenml/integrations/databricks/services/databricks_deployment.py +407 -0
- zenml/integrations/databricks/utils/__init__.py +14 -0
- zenml/integrations/databricks/utils/databricks_utils.py +87 -0
- zenml/integrations/great_expectations/data_validators/ge_data_validator.py +12 -8
- zenml/integrations/huggingface/materializers/huggingface_datasets_materializer.py +88 -3
- zenml/integrations/huggingface/steps/accelerate_runner.py +1 -7
- zenml/integrations/kubernetes/orchestrators/manifest_utils.py +7 -0
- zenml/integrations/kubernetes/pod_settings.py +2 -0
- zenml/integrations/lightgbm/__init__.py +1 -0
- zenml/integrations/mlflow/__init__.py +1 -1
- zenml/integrations/mlflow/model_registries/mlflow_model_registry.py +6 -2
- zenml/integrations/mlflow/services/mlflow_deployment.py +1 -1
- zenml/integrations/skypilot_lambda/__init__.py +1 -1
- zenml/materializers/built_in_materializer.py +1 -1
- zenml/materializers/cloudpickle_materializer.py +1 -1
- zenml/model/model.py +1 -1
- zenml/models/v2/core/component.py +29 -0
- zenml/models/v2/misc/full_stack.py +32 -0
- zenml/orchestrators/__init__.py +4 -0
- zenml/orchestrators/wheeled_orchestrator.py +147 -0
- zenml/service_connectors/service_connector_utils.py +349 -0
- zenml/stack_deployments/gcp_stack_deployment.py +2 -4
- zenml/steps/base_step.py +7 -5
- zenml/utils/function_utils.py +1 -1
- zenml/utils/pipeline_docker_image_builder.py +8 -0
- zenml/zen_server/dashboard/assets/{404-DpJaNHKF.js → 404-B_YdvmwS.js} +1 -1
- zenml/zen_server/dashboard/assets/{@reactflow-DJfzkHO1.js → @reactflow-l_1hUr1S.js} +1 -1
- zenml/zen_server/dashboard/assets/{AwarenessChannel-BYDLT2xC.js → AwarenessChannel-CFg5iX4Z.js} +1 -1
- zenml/zen_server/dashboard/assets/{CodeSnippet-BkOuRmyq.js → CodeSnippet-Dvkx_82E.js} +1 -1
- zenml/zen_server/dashboard/assets/CollapsibleCard-opiuBHHc.js +1 -0
- zenml/zen_server/dashboard/assets/{Commands-ZvWR1BRs.js → Commands-DoN1xrEq.js} +1 -1
- zenml/zen_server/dashboard/assets/{CopyButton-DVwLkafa.js → CopyButton-Cr7xYEPb.js} +1 -1
- zenml/zen_server/dashboard/assets/{CsvVizualization-C2IiqX4I.js → CsvVizualization-Ck-nZ43m.js} +3 -3
- zenml/zen_server/dashboard/assets/{Error-CqX0VqW_.js → Error-kLtljEOM.js} +1 -1
- zenml/zen_server/dashboard/assets/{ExecutionStatus-BoLUXR9t.js → ExecutionStatus-DguLLgTK.js} +1 -1
- zenml/zen_server/dashboard/assets/{Helpbox-LFydyVwh.js → Helpbox-BXUMP21n.js} +1 -1
- zenml/zen_server/dashboard/assets/{Infobox-DnENC0sh.js → Infobox-DSt0O-dm.js} +1 -1
- zenml/zen_server/dashboard/assets/{InlineAvatar-CbJtYr0t.js → InlineAvatar-xsrsIGE-.js} +1 -1
- zenml/zen_server/dashboard/assets/Pagination-C6X-mifw.js +1 -0
- zenml/zen_server/dashboard/assets/{SetPassword-BYBdbQDo.js → SetPassword-BXGTWiwj.js} +1 -1
- zenml/zen_server/dashboard/assets/{SuccessStep-Nx743hll.js → SuccessStep-DZC60t0x.js} +1 -1
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-DF9gSzE0.js → UpdatePasswordSchemas-DGvwFWO1.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-right-double-BiEMg7rd.js → chevron-right-double-CZBOf6JM.js} +1 -1
- zenml/zen_server/dashboard/assets/cloud-only-C_yFCAkP.js +1 -0
- zenml/zen_server/dashboard/assets/index-BczVOqUf.js +55 -0
- zenml/zen_server/dashboard/assets/index-EpMIKgrI.css +1 -0
- zenml/zen_server/dashboard/assets/{login-mutation-BUnVASxp.js → login-mutation-CrHrndTI.js} +1 -1
- zenml/zen_server/dashboard/assets/logs-D8k8BVFf.js +1 -0
- zenml/zen_server/dashboard/assets/{not-found-B4VnX8gK.js → not-found-DYa4pC-C.js} +1 -1
- zenml/zen_server/dashboard/assets/{package-CsUhPmou.js → package-B3fWP-Dh.js} +1 -1
- zenml/zen_server/dashboard/assets/page-1h_sD1jz.js +1 -0
- zenml/zen_server/dashboard/assets/{page-Sxn82W-5.js → page-1iL8aMqs.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DMOYZppS.js → page-2grKx_MY.js} +1 -1
- zenml/zen_server/dashboard/assets/page-5NCOHOsy.js +1 -0
- zenml/zen_server/dashboard/assets/{page-JyfeDUfu.js → page-8a4UMKXZ.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Bx6o0ARS.js → page-B6h3iaHJ.js} +1 -1
- zenml/zen_server/dashboard/assets/page-BDns21Iz.js +1 -0
- zenml/zen_server/dashboard/assets/{page-3efNCDeb.js → page-BhgCDInH.js} +2 -2
- zenml/zen_server/dashboard/assets/{page-DKlIdAe5.js → page-Bi-wtWiO.js} +2 -2
- zenml/zen_server/dashboard/assets/{page-7zTHbhhI.js → page-BkeAAYwp.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CRTJ0UuR.js → page-BkuQDIf-.js} +1 -1
- zenml/zen_server/dashboard/assets/page-BnaevhnB.js +1 -0
- zenml/zen_server/dashboard/assets/{page-BEs6jK71.js → page-Bq0YxkLV.js} +1 -1
- zenml/zen_server/dashboard/assets/page-Bs2F4eoD.js +2 -0
- zenml/zen_server/dashboard/assets/{page-CUZIGO-3.js → page-C6-UGEbH.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Xu8JEjSU.js → page-CCNRIt_f.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DvCvroOM.js → page-CHNxpz3n.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BpSqIf4B.js → page-DgorQFqi.js} +1 -1
- zenml/zen_server/dashboard/assets/page-K8ebxVIs.js +1 -0
- zenml/zen_server/dashboard/assets/{page-Cx67M0QT.js → page-MFQyIJd3.js} +1 -1
- zenml/zen_server/dashboard/assets/page-TgCF0P_U.js +1 -0
- zenml/zen_server/dashboard/assets/page-ZnCEe-eK.js +9 -0
- zenml/zen_server/dashboard/assets/{page-Dc_7KMQE.js → page-uA5prJGY.js} +1 -1
- zenml/zen_server/dashboard/assets/persist-D7HJNBWx.js +1 -0
- zenml/zen_server/dashboard/assets/plus-C8WOyCzt.js +1 -0
- zenml/zen_server/dashboard/assets/stack-detail-query-Cficsl6d.js +1 -0
- zenml/zen_server/dashboard/assets/update-server-settings-mutation-7d8xi1tS.js +1 -0
- zenml/zen_server/dashboard/assets/{url-DuQMeqYA.js → url-D7mAQGUM.js} +1 -1
- zenml/zen_server/dashboard/index.html +4 -4
- 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.c8c57fb0d2132b1d3c2119e776b7dfb3.js → precache-manifest.12246c7548e71e2c4438e496360de80c.js} +4 -4
- zenml/zen_server/dashboard_legacy/service-worker.js +1 -1
- zenml/zen_server/dashboard_legacy/static/js/main.3b27024b.chunk.js +2 -0
- zenml/zen_server/dashboard_legacy/static/js/{main.382439a7.chunk.js.map → main.3b27024b.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/routers/service_connectors_endpoints.py +57 -0
- zenml/zen_stores/migrations/versions/0.62.0_release.py +23 -0
- zenml/zen_stores/rest_zen_store.py +4 -0
- zenml/zen_stores/schemas/component_schemas.py +14 -0
- {zenml_nightly-0.61.0.dev20240714.dist-info → zenml_nightly-0.62.0.dev20240719.dist-info}/METADATA +2 -2
- {zenml_nightly-0.61.0.dev20240714.dist-info → zenml_nightly-0.62.0.dev20240719.dist-info}/RECORD +116 -98
- zenml/zen_server/dashboard/assets/Pagination-DEbVUupy.js +0 -1
- zenml/zen_server/dashboard/assets/chevron-down-D_ZlKMqH.js +0 -1
- zenml/zen_server/dashboard/assets/cloud-only-DVbIeckv.js +0 -1
- zenml/zen_server/dashboard/assets/index-C_CrU4vI.js +0 -1
- zenml/zen_server/dashboard/assets/index-DK1ynKjA.js +0 -55
- zenml/zen_server/dashboard/assets/index-inApY3KQ.css +0 -1
- zenml/zen_server/dashboard/assets/page-C43QGHTt.js +0 -9
- zenml/zen_server/dashboard/assets/page-CR0OG7ss.js +0 -1
- zenml/zen_server/dashboard/assets/page-CaopxiU1.js +0 -1
- zenml/zen_server/dashboard/assets/page-D7Z399xy.js +0 -1
- zenml/zen_server/dashboard/assets/page-D93kd7Xj.js +0 -1
- zenml/zen_server/dashboard/assets/page-DMsSn3dv.js +0 -2
- zenml/zen_server/dashboard/assets/page-Hus2pr9T.js +0 -1
- zenml/zen_server/dashboard/assets/page-TKXERe16.js +0 -1
- zenml/zen_server/dashboard/assets/plus-DOeLmm7C.js +0 -1
- zenml/zen_server/dashboard/assets/update-server-settings-mutation-CR8e3Sir.js +0 -1
- zenml/zen_server/dashboard_legacy/static/js/main.382439a7.chunk.js +0 -2
- {zenml_nightly-0.61.0.dev20240714.dist-info → zenml_nightly-0.62.0.dev20240719.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.61.0.dev20240714.dist-info → zenml_nightly-0.62.0.dev20240719.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.61.0.dev20240714.dist-info → zenml_nightly-0.62.0.dev20240719.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,349 @@
|
|
1
|
+
# Copyright (c) ZenML GmbH 2024. 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
|
+
"""Utility methods for Service Connectors."""
|
15
|
+
|
16
|
+
from typing import Dict, List, Union
|
17
|
+
from uuid import UUID
|
18
|
+
|
19
|
+
from zenml.client import Client
|
20
|
+
from zenml.enums import StackComponentType
|
21
|
+
from zenml.models.v2.core.service_connector import ServiceConnectorRequest
|
22
|
+
from zenml.models.v2.misc.full_stack import (
|
23
|
+
ResourcesInfo,
|
24
|
+
ServiceConnectorInfo,
|
25
|
+
ServiceConnectorResourcesInfo,
|
26
|
+
)
|
27
|
+
from zenml.utils.pagination_utils import depaginate
|
28
|
+
|
29
|
+
|
30
|
+
def _prepare_resource_info(
|
31
|
+
connector_details: Union[UUID, ServiceConnectorInfo],
|
32
|
+
resource_ids: List[str],
|
33
|
+
stack_component_type: StackComponentType,
|
34
|
+
flavor: str,
|
35
|
+
required_configuration: Dict[str, str],
|
36
|
+
flavor_display_name: str,
|
37
|
+
use_resource_value_as_fixed_config: bool = False,
|
38
|
+
) -> ResourcesInfo:
|
39
|
+
existing_components = []
|
40
|
+
if isinstance(connector_details, UUID):
|
41
|
+
existing_components = depaginate(
|
42
|
+
Client().list_stack_components,
|
43
|
+
type=stack_component_type.value,
|
44
|
+
connector_id=connector_details,
|
45
|
+
flavor=flavor,
|
46
|
+
)
|
47
|
+
return ResourcesInfo(
|
48
|
+
flavor=flavor,
|
49
|
+
required_configuration=required_configuration,
|
50
|
+
flavor_display_name=flavor_display_name,
|
51
|
+
use_resource_value_as_fixed_config=use_resource_value_as_fixed_config,
|
52
|
+
accessible_by_service_connector=resource_ids,
|
53
|
+
connected_through_service_connector=existing_components,
|
54
|
+
)
|
55
|
+
|
56
|
+
|
57
|
+
def _raise_specific_cloud_exception_if_needed(
|
58
|
+
cloud_provider: str,
|
59
|
+
artifact_stores: List[ResourcesInfo],
|
60
|
+
orchestrators: List[ResourcesInfo],
|
61
|
+
container_registries: List[ResourcesInfo],
|
62
|
+
) -> None:
|
63
|
+
AWS_DOCS = (
|
64
|
+
"https://docs.zenml.io/how-to/auth-management/aws-service-connector"
|
65
|
+
)
|
66
|
+
GCP_DOCS = (
|
67
|
+
"https://docs.zenml.io/how-to/auth-management/gcp-service-connector"
|
68
|
+
)
|
69
|
+
|
70
|
+
if not artifact_stores:
|
71
|
+
error_msg = (
|
72
|
+
"We were unable to find any {obj_name} available "
|
73
|
+
"to configured service connector. Please, verify "
|
74
|
+
"that needed permission are granted for the "
|
75
|
+
"service connector.\nDocumentation for the "
|
76
|
+
"{obj_name} configuration can be found at "
|
77
|
+
"{docs}"
|
78
|
+
)
|
79
|
+
if cloud_provider == "aws":
|
80
|
+
raise ValueError(
|
81
|
+
error_msg.format(
|
82
|
+
obj_name="S3 Bucket", docs=f"{AWS_DOCS}#s3-bucket"
|
83
|
+
)
|
84
|
+
)
|
85
|
+
elif cloud_provider == "gcp":
|
86
|
+
raise ValueError(
|
87
|
+
error_msg.format(
|
88
|
+
obj_name="GCS Bucket", docs=f"{GCP_DOCS}#gcs-bucket"
|
89
|
+
)
|
90
|
+
)
|
91
|
+
elif cloud_provider == "azure":
|
92
|
+
pass
|
93
|
+
if not orchestrators:
|
94
|
+
error_msg = (
|
95
|
+
"We were unable to find any orchestrator engines "
|
96
|
+
"available to the service connector. Please, verify "
|
97
|
+
"that needed permission are granted for the "
|
98
|
+
"service connector.\nDocumentation for the Generic "
|
99
|
+
"{cloud_name} resource configuration can be found at "
|
100
|
+
"{gen_docs}\n Documentation for the {k8s_name} resource "
|
101
|
+
"configuration can be found at {k8s_docs}"
|
102
|
+
)
|
103
|
+
if cloud_provider == "aws":
|
104
|
+
raise ValueError(
|
105
|
+
error_msg.format(
|
106
|
+
cloud_name="AWS",
|
107
|
+
gen_docs=f"{AWS_DOCS}#generic-aws-resource",
|
108
|
+
k8s_name="Kubernetes",
|
109
|
+
k8s_docs=f"{AWS_DOCS}#eks-kubernetes-cluster",
|
110
|
+
)
|
111
|
+
)
|
112
|
+
|
113
|
+
elif cloud_provider == "gcp":
|
114
|
+
raise ValueError(
|
115
|
+
error_msg.format(
|
116
|
+
cloud_name="GCP",
|
117
|
+
gen_docs=f"{GCP_DOCS}#generic-gcp-resource",
|
118
|
+
k8s_name="GKE Kubernetes",
|
119
|
+
k8s_docs=f"{GCP_DOCS}#gke-kubernetes-cluster",
|
120
|
+
)
|
121
|
+
)
|
122
|
+
elif cloud_provider == "azure":
|
123
|
+
pass
|
124
|
+
if not container_registries:
|
125
|
+
error_msg = (
|
126
|
+
"We were unable to find any container registries "
|
127
|
+
"available to the service connector. Please, verify "
|
128
|
+
"that needed permission are granted for the "
|
129
|
+
"service connector.\nDocumentation for the {registry_name} "
|
130
|
+
"container registry resource configuration can "
|
131
|
+
"be found at {docs_link}"
|
132
|
+
)
|
133
|
+
if cloud_provider == "aws":
|
134
|
+
raise ValueError(
|
135
|
+
error_msg.format(
|
136
|
+
registry_name="ECR",
|
137
|
+
docs_link=f"{AWS_DOCS}#ecr-container-registry",
|
138
|
+
)
|
139
|
+
)
|
140
|
+
elif cloud_provider == "gcp":
|
141
|
+
raise ValueError(
|
142
|
+
error_msg.format(
|
143
|
+
registry_name="GCR",
|
144
|
+
docs_link=f"{GCP_DOCS}#gcr-container-registry",
|
145
|
+
)
|
146
|
+
)
|
147
|
+
elif cloud_provider == "azure":
|
148
|
+
pass
|
149
|
+
|
150
|
+
|
151
|
+
def get_resources_options_from_resource_model_for_full_stack(
|
152
|
+
connector_details: Union[UUID, ServiceConnectorInfo],
|
153
|
+
) -> ServiceConnectorResourcesInfo:
|
154
|
+
"""Get the resource options from the resource model for the full stack.
|
155
|
+
|
156
|
+
Args:
|
157
|
+
connector_details: The service connector details (UUID or Info).
|
158
|
+
|
159
|
+
Returns:
|
160
|
+
All available service connector resource options.
|
161
|
+
"""
|
162
|
+
client = Client()
|
163
|
+
zen_store = client.zen_store
|
164
|
+
|
165
|
+
can_generate_long_tokens = False
|
166
|
+
if isinstance(connector_details, UUID):
|
167
|
+
resource_model = zen_store.verify_service_connector(
|
168
|
+
connector_details,
|
169
|
+
list_resources=True,
|
170
|
+
)
|
171
|
+
can_generate_long_tokens = not zen_store.get_service_connector(
|
172
|
+
connector_details
|
173
|
+
).configuration.get("generate_temporary_tokens", True)
|
174
|
+
else:
|
175
|
+
resource_model = zen_store.verify_service_connector_config(
|
176
|
+
service_connector=ServiceConnectorRequest(
|
177
|
+
user=client.active_user.id,
|
178
|
+
workspace=client.active_workspace.id,
|
179
|
+
name="fake",
|
180
|
+
connector_type=connector_details.type,
|
181
|
+
auth_method=connector_details.auth_method,
|
182
|
+
configuration=connector_details.configuration,
|
183
|
+
secrets={},
|
184
|
+
labels={},
|
185
|
+
),
|
186
|
+
list_resources=True,
|
187
|
+
)
|
188
|
+
can_generate_long_tokens = True
|
189
|
+
|
190
|
+
resources = resource_model.resources
|
191
|
+
|
192
|
+
if isinstance(
|
193
|
+
resource_model.connector_type,
|
194
|
+
str,
|
195
|
+
):
|
196
|
+
connector_type = resource_model.connector_type
|
197
|
+
else:
|
198
|
+
connector_type = resource_model.connector_type.connector_type
|
199
|
+
|
200
|
+
artifact_stores: List[ResourcesInfo] = []
|
201
|
+
orchestrators: List[ResourcesInfo] = []
|
202
|
+
container_registries: List[ResourcesInfo] = []
|
203
|
+
|
204
|
+
if connector_type == "aws":
|
205
|
+
for each in resources:
|
206
|
+
if each.resource_ids:
|
207
|
+
if each.resource_type == "s3-bucket":
|
208
|
+
artifact_stores.append(
|
209
|
+
_prepare_resource_info(
|
210
|
+
connector_details=connector_details,
|
211
|
+
resource_ids=each.resource_ids,
|
212
|
+
stack_component_type=StackComponentType.ARTIFACT_STORE,
|
213
|
+
flavor="s3",
|
214
|
+
required_configuration={"path": "Path"},
|
215
|
+
use_resource_value_as_fixed_config=True,
|
216
|
+
flavor_display_name="S3 Bucket",
|
217
|
+
)
|
218
|
+
)
|
219
|
+
if each.resource_type == "aws-generic":
|
220
|
+
orchestrators.append(
|
221
|
+
_prepare_resource_info(
|
222
|
+
connector_details=connector_details,
|
223
|
+
resource_ids=each.resource_ids,
|
224
|
+
stack_component_type=StackComponentType.ORCHESTRATOR,
|
225
|
+
flavor="sagemaker",
|
226
|
+
required_configuration={
|
227
|
+
"execution_role": "execution role ARN"
|
228
|
+
},
|
229
|
+
flavor_display_name="AWS Sagemaker",
|
230
|
+
)
|
231
|
+
)
|
232
|
+
if can_generate_long_tokens:
|
233
|
+
orchestrators.append(
|
234
|
+
_prepare_resource_info(
|
235
|
+
connector_details=connector_details,
|
236
|
+
resource_ids=each.resource_ids,
|
237
|
+
stack_component_type=StackComponentType.ORCHESTRATOR,
|
238
|
+
flavor="vm_aws",
|
239
|
+
required_configuration={"region": "region"},
|
240
|
+
use_resource_value_as_fixed_config=True,
|
241
|
+
flavor_display_name="Skypilot (EC2)",
|
242
|
+
)
|
243
|
+
)
|
244
|
+
|
245
|
+
if each.resource_type == "kubernetes-cluster":
|
246
|
+
orchestrators.append(
|
247
|
+
_prepare_resource_info(
|
248
|
+
connector_details=connector_details,
|
249
|
+
resource_ids=each.resource_ids,
|
250
|
+
stack_component_type=StackComponentType.ORCHESTRATOR,
|
251
|
+
flavor="kubernetes",
|
252
|
+
required_configuration={},
|
253
|
+
flavor_display_name="Kubernetes",
|
254
|
+
)
|
255
|
+
)
|
256
|
+
if each.resource_type == "docker-registry":
|
257
|
+
container_registries.append(
|
258
|
+
_prepare_resource_info(
|
259
|
+
connector_details=connector_details,
|
260
|
+
resource_ids=each.resource_ids,
|
261
|
+
stack_component_type=StackComponentType.CONTAINER_REGISTRY,
|
262
|
+
flavor="aws",
|
263
|
+
required_configuration={"uri": "URI"},
|
264
|
+
use_resource_value_as_fixed_config=True,
|
265
|
+
flavor_display_name="ECR",
|
266
|
+
)
|
267
|
+
)
|
268
|
+
|
269
|
+
elif connector_type == "gcp":
|
270
|
+
for each in resources:
|
271
|
+
if each.resource_ids:
|
272
|
+
if each.resource_type == "gcs-bucket":
|
273
|
+
artifact_stores.append(
|
274
|
+
_prepare_resource_info(
|
275
|
+
connector_details=connector_details,
|
276
|
+
resource_ids=each.resource_ids,
|
277
|
+
stack_component_type=StackComponentType.ARTIFACT_STORE,
|
278
|
+
flavor="gcp",
|
279
|
+
required_configuration={},
|
280
|
+
flavor_display_name="GCS Bucket",
|
281
|
+
)
|
282
|
+
)
|
283
|
+
if each.resource_type == "gcp-generic":
|
284
|
+
orchestrators.append(
|
285
|
+
_prepare_resource_info(
|
286
|
+
connector_details=connector_details,
|
287
|
+
resource_ids=each.resource_ids,
|
288
|
+
stack_component_type=StackComponentType.ORCHESTRATOR,
|
289
|
+
flavor="vertex",
|
290
|
+
required_configuration={"location": "region name"},
|
291
|
+
flavor_display_name="Vertex AI",
|
292
|
+
)
|
293
|
+
)
|
294
|
+
if can_generate_long_tokens:
|
295
|
+
orchestrators.append(
|
296
|
+
_prepare_resource_info(
|
297
|
+
connector_details=connector_details,
|
298
|
+
resource_ids=each.resource_ids,
|
299
|
+
stack_component_type=StackComponentType.ORCHESTRATOR,
|
300
|
+
flavor="vm_gcp",
|
301
|
+
required_configuration={
|
302
|
+
"region": "region name"
|
303
|
+
},
|
304
|
+
flavor_display_name="Skypilot (Compute)",
|
305
|
+
)
|
306
|
+
)
|
307
|
+
|
308
|
+
if each.resource_type == "kubernetes-cluster":
|
309
|
+
orchestrators.append(
|
310
|
+
_prepare_resource_info(
|
311
|
+
connector_details=connector_details,
|
312
|
+
resource_ids=each.resource_ids,
|
313
|
+
stack_component_type=StackComponentType.ORCHESTRATOR,
|
314
|
+
flavor="kubernetes",
|
315
|
+
required_configuration={},
|
316
|
+
flavor_display_name="Kubernetes",
|
317
|
+
)
|
318
|
+
)
|
319
|
+
if each.resource_type == "docker-registry":
|
320
|
+
container_registries.append(
|
321
|
+
_prepare_resource_info(
|
322
|
+
connector_details=connector_details,
|
323
|
+
resource_ids=each.resource_ids,
|
324
|
+
stack_component_type=StackComponentType.CONTAINER_REGISTRY,
|
325
|
+
flavor="gcp",
|
326
|
+
required_configuration={"uri": "URI"},
|
327
|
+
use_resource_value_as_fixed_config=True,
|
328
|
+
flavor_display_name="GCR",
|
329
|
+
)
|
330
|
+
)
|
331
|
+
|
332
|
+
elif connector_type == "azure":
|
333
|
+
pass
|
334
|
+
|
335
|
+
_raise_specific_cloud_exception_if_needed(
|
336
|
+
cloud_provider=connector_type,
|
337
|
+
artifact_stores=artifact_stores,
|
338
|
+
orchestrators=orchestrators,
|
339
|
+
container_registries=container_registries,
|
340
|
+
)
|
341
|
+
|
342
|
+
return ServiceConnectorResourcesInfo(
|
343
|
+
connector_type=connector_type,
|
344
|
+
components_resources_info={
|
345
|
+
StackComponentType.ARTIFACT_STORE: artifact_stores,
|
346
|
+
StackComponentType.ORCHESTRATOR: orchestrators,
|
347
|
+
StackComponentType.CONTAINER_REGISTRY: container_registries,
|
348
|
+
},
|
349
|
+
)
|
@@ -236,8 +236,6 @@ GCP project and to clean up the resources created by the stack by using
|
|
236
236
|
cloudshell_open_in_editor="gcp-gar-gcs-vertex.jinja,gcp-gar-gcs-vertex-deploy.sh",
|
237
237
|
cloudshell_tutorial="gcp-gar-gcs-vertex.md",
|
238
238
|
ephemeral="true",
|
239
|
-
# TODO: remove this before the branch is merged
|
240
|
-
cloudshell_git_branch="feature/prd-482-gcp-stack-deployment",
|
241
239
|
)
|
242
240
|
# Encode the parameters as URL query parameters
|
243
241
|
query_params = "&".join([f"{k}={v}" for k, v in params.items()])
|
@@ -251,8 +249,8 @@ ZENML_STACK_NAME={self.stack_name}
|
|
251
249
|
ZENML_STACK_REGION={self.location or "europe-west3"}
|
252
250
|
ZENML_SERVER_URL={self.zenml_server_url}
|
253
251
|
ZENML_SERVER_API_TOKEN={self.zenml_server_api_token}
|
254
|
-
### END CONFIGURATION ###
|
255
|
-
|
252
|
+
### END CONFIGURATION ###"""
|
253
|
+
|
256
254
|
return StackDeploymentConfig(
|
257
255
|
deployment_url=url,
|
258
256
|
deployment_url_text="GCP Cloud Shell Console",
|
zenml/steps/base_step.py
CHANGED
@@ -479,7 +479,7 @@ class BaseStep(metaclass=BaseStepMeta):
|
|
479
479
|
bound_args = signature.bind_partial(*args, **kwargs)
|
480
480
|
except TypeError as e:
|
481
481
|
raise StepInterfaceError(
|
482
|
-
f"Wrong arguments when calling step
|
482
|
+
f"Wrong arguments when calling step '{self.name}': {e}"
|
483
483
|
) from e
|
484
484
|
|
485
485
|
artifacts = {}
|
@@ -980,7 +980,7 @@ class BaseStep(metaclass=BaseStepMeta):
|
|
980
980
|
)
|
981
981
|
if conflicting_parameters:
|
982
982
|
is_plural = "s" if len(conflicting_parameters) > 1 else ""
|
983
|
-
msg = f"Configured parameter{is_plural} for the step
|
983
|
+
msg = f"Configured parameter{is_plural} for the step '{self.name}' conflict{'' if not is_plural else 's'} with parameter{is_plural} passed in runtime:\n"
|
984
984
|
for key, values in conflicting_parameters.items():
|
985
985
|
msg += (
|
986
986
|
f"`{key}`: config=`{values[0]}` | runtime=`{values[1]}`\n"
|
@@ -1023,7 +1023,7 @@ To avoid this consider setting step parameters only in one place (config or code
|
|
1023
1023
|
if output_name not in allowed_output_names:
|
1024
1024
|
raise StepInterfaceError(
|
1025
1025
|
f"Got unexpected materializers for non-existent "
|
1026
|
-
f"output '{output_name}' in step
|
1026
|
+
f"output '{output_name}' in step '{self.name}'. "
|
1027
1027
|
f"Only materializers for the outputs "
|
1028
1028
|
f"{allowed_output_names} of this step can"
|
1029
1029
|
f" be registered."
|
@@ -1036,7 +1036,7 @@ To avoid this consider setting step parameters only in one place (config or code
|
|
1036
1036
|
):
|
1037
1037
|
raise StepInterfaceError(
|
1038
1038
|
f"Materializer source `{source}` "
|
1039
|
-
f"for output '{output_name}' of step
|
1039
|
+
f"for output '{output_name}' of step '{self.name}' "
|
1040
1040
|
"does not resolve to a `BaseMaterializer` subclass."
|
1041
1041
|
)
|
1042
1042
|
|
@@ -1070,7 +1070,9 @@ To avoid this consider setting step parameters only in one place (config or code
|
|
1070
1070
|
or key in client_lazy_loaders
|
1071
1071
|
):
|
1072
1072
|
continue
|
1073
|
-
raise StepInterfaceError(
|
1073
|
+
raise StepInterfaceError(
|
1074
|
+
f"Missing entrypoint input '{key}' in step '{self.name}'."
|
1075
|
+
)
|
1074
1076
|
|
1075
1077
|
def _finalize_configuration(
|
1076
1078
|
self,
|
zenml/utils/function_utils.py
CHANGED
@@ -107,7 +107,7 @@ def _is_valid_optional_arg(arg_type: Any) -> bool:
|
|
107
107
|
if (
|
108
108
|
args[0] not in _ALLOWED_TYPES
|
109
109
|
and not _is_valid_collection_arg(args[0])
|
110
|
-
) or args[1]
|
110
|
+
) or args[1] is not type(None):
|
111
111
|
return False
|
112
112
|
return True
|
113
113
|
return False
|
@@ -297,6 +297,14 @@ class PipelineDockerImageBuilder:
|
|
297
297
|
if docker_settings.install_stack_requirements:
|
298
298
|
apt_packages += stack.apt_packages
|
299
299
|
|
300
|
+
# include apt packages from all required integrations
|
301
|
+
for integration in docker_settings.required_integrations:
|
302
|
+
# get the integration
|
303
|
+
integration_cls = integration_registry.integrations[
|
304
|
+
integration
|
305
|
+
]
|
306
|
+
apt_packages += integration_cls.APT_PACKAGES
|
307
|
+
|
300
308
|
if apt_packages:
|
301
309
|
logger.info(
|
302
310
|
"Including apt packages: %s",
|
@@ -1 +1 @@
|
|
1
|
-
import{j as e}from"./@radix-CFOkMR_E.js";import{h as s,r as t}from"./index-
|
1
|
+
import{j as e}from"./@radix-CFOkMR_E.js";import{h as s,r as t}from"./index-BczVOqUf.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-l_1hUr1S.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};
|