zenml-nightly 0.58.2.dev20240626__py3-none-any.whl → 0.62.0.dev20240726__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 +31 -10
- RELEASE_NOTES.md +280 -0
- zenml/VERSION +1 -1
- zenml/__init__.py +2 -0
- zenml/analytics/enums.py +3 -0
- zenml/cli/__init__.py +28 -0
- zenml/cli/artifact.py +1 -2
- zenml/cli/integration.py +9 -8
- zenml/cli/server.py +6 -0
- zenml/cli/stack.py +812 -39
- zenml/cli/stack_components.py +9 -0
- zenml/cli/text_utils.py +35 -1
- zenml/cli/utils.py +127 -10
- zenml/client.py +23 -14
- zenml/config/docker_settings.py +8 -5
- zenml/constants.py +13 -1
- zenml/container_registries/base_container_registry.py +1 -0
- zenml/enums.py +23 -0
- zenml/event_hub/event_hub.py +5 -8
- zenml/integrations/__init__.py +1 -0
- zenml/integrations/aws/__init__.py +1 -0
- zenml/integrations/azure/__init__.py +3 -2
- 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 +497 -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/deepchecks/__init__.py +1 -0
- zenml/integrations/discord/__init__.py +1 -0
- zenml/integrations/evidently/__init__.py +1 -0
- zenml/integrations/facets/__init__.py +1 -0
- zenml/integrations/feast/__init__.py +1 -0
- zenml/integrations/gcp/__init__.py +3 -1
- zenml/integrations/gcp/google_credentials_mixin.py +1 -1
- zenml/integrations/gcp/service_connectors/gcp_service_connector.py +320 -64
- zenml/integrations/great_expectations/data_validators/ge_data_validator.py +12 -8
- zenml/integrations/huggingface/__init__.py +1 -0
- zenml/integrations/huggingface/materializers/huggingface_datasets_materializer.py +88 -3
- zenml/integrations/huggingface/steps/accelerate_runner.py +1 -7
- zenml/integrations/integration.py +24 -0
- zenml/integrations/kubeflow/__init__.py +3 -0
- zenml/integrations/kubeflow/flavors/kubeflow_orchestrator_flavor.py +1 -1
- zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py +0 -1
- zenml/integrations/kubernetes/__init__.py +3 -1
- zenml/integrations/kubernetes/orchestrators/kube_utils.py +4 -1
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +1 -13
- zenml/integrations/kubernetes/orchestrators/manifest_utils.py +22 -4
- zenml/integrations/kubernetes/pod_settings.py +4 -0
- zenml/integrations/label_studio/annotators/label_studio_annotator.py +1 -0
- zenml/integrations/langchain/__init__.py +1 -0
- zenml/integrations/lightgbm/__init__.py +1 -0
- zenml/integrations/mlflow/__init__.py +4 -2
- zenml/integrations/mlflow/model_registries/mlflow_model_registry.py +6 -2
- zenml/integrations/mlflow/services/mlflow_deployment.py +1 -1
- zenml/integrations/neural_prophet/__init__.py +1 -0
- zenml/integrations/polars/__init__.py +1 -0
- zenml/integrations/prodigy/__init__.py +1 -0
- zenml/integrations/pycaret/__init__.py +6 -0
- zenml/integrations/registry.py +37 -0
- zenml/integrations/s3/artifact_stores/s3_artifact_store.py +17 -6
- zenml/integrations/seldon/__init__.py +1 -0
- zenml/integrations/seldon/model_deployers/seldon_model_deployer.py +1 -0
- zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +2 -2
- zenml/integrations/skypilot/orchestrators/skypilot_base_vm_orchestrator.py +1 -1
- zenml/integrations/skypilot/orchestrators/skypilot_orchestrator_entrypoint.py +2 -2
- zenml/integrations/skypilot_aws/__init__.py +2 -1
- zenml/integrations/skypilot_azure/__init__.py +1 -3
- zenml/integrations/skypilot_gcp/__init__.py +1 -1
- zenml/integrations/skypilot_lambda/__init__.py +1 -1
- zenml/integrations/skypilot_lambda/flavors/skypilot_orchestrator_lambda_vm_flavor.py +1 -1
- zenml/integrations/slack/__init__.py +1 -0
- zenml/integrations/tekton/__init__.py +1 -0
- zenml/integrations/tensorboard/__init__.py +0 -1
- zenml/integrations/tensorflow/__init__.py +18 -6
- zenml/integrations/wandb/__init__.py +1 -0
- zenml/logging/step_logging.py +34 -35
- zenml/materializers/built_in_materializer.py +1 -1
- zenml/materializers/cloudpickle_materializer.py +1 -1
- zenml/model/model.py +1 -1
- zenml/models/__init__.py +11 -0
- zenml/models/v2/core/component.py +47 -0
- zenml/models/v2/core/model.py +1 -2
- zenml/models/v2/core/server_settings.py +0 -20
- zenml/models/v2/core/service_connector.py +17 -0
- zenml/models/v2/core/stack.py +31 -0
- zenml/models/v2/misc/full_stack.py +129 -0
- zenml/models/v2/misc/stack_deployment.py +91 -0
- zenml/new/pipelines/pipeline.py +1 -1
- zenml/new/pipelines/run_utils.py +1 -1
- zenml/orchestrators/__init__.py +4 -0
- zenml/orchestrators/input_utils.py +3 -6
- zenml/orchestrators/step_launcher.py +1 -0
- zenml/orchestrators/wheeled_orchestrator.py +147 -0
- zenml/service_connectors/service_connector_utils.py +408 -0
- zenml/stack/stack.py +3 -6
- zenml/stack_deployments/__init__.py +14 -0
- zenml/stack_deployments/aws_stack_deployment.py +254 -0
- zenml/stack_deployments/azure_stack_deployment.py +179 -0
- zenml/stack_deployments/gcp_stack_deployment.py +269 -0
- zenml/stack_deployments/stack_deployment.py +218 -0
- zenml/stack_deployments/utils.py +48 -0
- zenml/steps/base_step.py +7 -5
- zenml/utils/function_utils.py +2 -2
- zenml/utils/pagination_utils.py +7 -5
- zenml/utils/pipeline_docker_image_builder.py +105 -68
- zenml/utils/pydantic_utils.py +6 -5
- zenml/utils/source_utils.py +4 -1
- zenml/zen_server/cloud_utils.py +18 -3
- zenml/zen_server/dashboard/assets/{404-CDPQCl4D.js → 404-B_YdvmwS.js} +1 -1
- zenml/zen_server/dashboard/assets/@radix-CFOkMR_E.js +85 -0
- zenml/zen_server/dashboard/assets/{@react-router-DYovave8.js → @react-router-CO-OsFwI.js} +2 -2
- zenml/zen_server/dashboard/assets/{@reactflow-CHBapDaj.js → @reactflow-l_1hUr1S.js} +2 -2
- zenml/zen_server/dashboard/assets/@tanstack-DYiOyJUL.js +22 -0
- zenml/zen_server/dashboard/assets/AwarenessChannel-CFg5iX4Z.js +1 -0
- zenml/zen_server/dashboard/assets/{CodeSnippet-BidtnWOi.js → CodeSnippet-Dvkx_82E.js} +2 -2
- zenml/zen_server/dashboard/assets/CollapsibleCard-opiuBHHc.js +1 -0
- zenml/zen_server/dashboard/assets/Commands-DoN1xrEq.js +1 -0
- zenml/zen_server/dashboard/assets/CopyButton-Cr7xYEPb.js +2 -0
- zenml/zen_server/dashboard/assets/{CsvVizualization-BOuez-fG.js → CsvVizualization-Ck-nZ43m.js} +7 -7
- zenml/zen_server/dashboard/assets/DisplayDate-DYgIjlDF.js +1 -0
- zenml/zen_server/dashboard/assets/EmptyState-BMLnFVlB.js +1 -0
- zenml/zen_server/dashboard/assets/Error-kLtljEOM.js +1 -0
- zenml/zen_server/dashboard/assets/ExecutionStatus-DguLLgTK.js +1 -0
- zenml/zen_server/dashboard/assets/Helpbox-BXUMP21n.js +1 -0
- zenml/zen_server/dashboard/assets/Infobox-DSt0O-dm.js +1 -0
- zenml/zen_server/dashboard/assets/InlineAvatar-xsrsIGE-.js +1 -0
- zenml/zen_server/dashboard/assets/{MarkdownVisualization-DsB2QZiK.js → MarkdownVisualization-xp3hhULl.js} +2 -2
- zenml/zen_server/dashboard/assets/Pagination-C6X-mifw.js +1 -0
- zenml/zen_server/dashboard/assets/PasswordChecker-DUveqlva.js +1 -0
- zenml/zen_server/dashboard/assets/SetPassword-BXGTWiwj.js +1 -0
- zenml/zen_server/dashboard/assets/SuccessStep-DZC60t0x.js +1 -0
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-DnM-c11H.js → UpdatePasswordSchemas-DGvwFWO1.js} +1 -1
- zenml/zen_server/dashboard/assets/{aws-t0gKCj_R.js → aws-BgKTfTfx.js} +1 -1
- zenml/zen_server/dashboard/assets/{check-circle-BVvhm5dy.js → check-circle-i56092KI.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-right-double-CJ50E9Gr.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/{copy-BRhQz3j-.js → copy-BXNk6BjL.js} +1 -1
- zenml/zen_server/dashboard/assets/{database-CRRnyFWh.js → database-1xWSgZfO.js} +1 -1
- zenml/zen_server/dashboard/assets/{docker-BAonhm6G.js → docker-CQMVm_4d.js} +1 -1
- zenml/zen_server/dashboard/assets/{file-text-CbVERUON.js → file-text-CqD_iu6l.js} +1 -1
- zenml/zen_server/dashboard/assets/{help-B8rqCvqn.js → help-bu_DgLKI.js} +1 -1
- zenml/zen_server/dashboard/assets/index-BczVOqUf.js +55 -0
- zenml/zen_server/dashboard/assets/index-EpMIKgrI.css +1 -0
- zenml/zen_server/dashboard/assets/index-rK_Wuy2W.js +1 -0
- zenml/zen_server/dashboard/assets/index.esm-Corw4lXQ.js +1 -0
- zenml/zen_server/dashboard/assets/{login-mutation-wzzl23C6.js → login-mutation-CrHrndTI.js} +1 -1
- zenml/zen_server/dashboard/assets/logs-D8k8BVFf.js +1 -0
- zenml/zen_server/dashboard/assets/not-found-DYa4pC-C.js +1 -0
- zenml/zen_server/dashboard/assets/package-B3fWP-Dh.js +1 -0
- zenml/zen_server/dashboard/assets/page-1h_sD1jz.js +1 -0
- zenml/zen_server/dashboard/assets/{page-yN4rZ-ZS.js → page-1iL8aMqs.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Bi5AI0S7.js → page-2grKx_MY.js} +1 -1
- zenml/zen_server/dashboard/assets/page-5NCOHOsy.js +1 -0
- zenml/zen_server/dashboard/assets/page-8a4UMKXZ.js +1 -0
- zenml/zen_server/dashboard/assets/{page-AQKopn_4.js → page-B6h3iaHJ.js} +1 -1
- zenml/zen_server/dashboard/assets/page-BDns21Iz.js +1 -0
- zenml/zen_server/dashboard/assets/{page-BmkSiYeQ.js → page-BhgCDInH.js} +2 -2
- zenml/zen_server/dashboard/assets/{page-BzVZGExK.js → page-Bi-wtWiO.js} +2 -2
- zenml/zen_server/dashboard/assets/page-BkeAAYwp.js +1 -0
- zenml/zen_server/dashboard/assets/page-BkuQDIf-.js +1 -0
- zenml/zen_server/dashboard/assets/page-BnaevhnB.js +1 -0
- zenml/zen_server/dashboard/assets/page-Bq0YxkLV.js +1 -0
- zenml/zen_server/dashboard/assets/page-Bs2F4eoD.js +2 -0
- zenml/zen_server/dashboard/assets/page-C6-UGEbH.js +1 -0
- zenml/zen_server/dashboard/assets/page-CCNRIt_f.js +1 -0
- zenml/zen_server/dashboard/assets/page-CHNxpz3n.js +1 -0
- zenml/zen_server/dashboard/assets/page-DgorQFqi.js +1 -0
- zenml/zen_server/dashboard/assets/page-K8ebxVIs.js +1 -0
- zenml/zen_server/dashboard/assets/{page-CuT1SUik.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-BW6Ket3a.js → page-uA5prJGY.js} +1 -1
- zenml/zen_server/dashboard/assets/persist-D7HJNBWx.js +1 -0
- zenml/zen_server/dashboard/assets/{play-circle-DK5QMJyp.js → play-circle-CNtZKDnW.js} +1 -1
- 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/{terminal-B2ovgWuz.js → terminal-By9cErXc.js} +1 -1
- zenml/zen_server/dashboard/assets/update-server-settings-mutation-7d8xi1tS.js +1 -0
- zenml/zen_server/dashboard/assets/{url-6_xv0WJS.js → url-D7mAQGUM.js} +1 -1
- zenml/zen_server/dashboard/assets/{zod-DrZvVLjd.js → zod-BhoGpZ63.js} +1 -1
- zenml/zen_server/dashboard/index.html +7 -7
- zenml/zen_server/dashboard_legacy/asset-manifest.json +4 -4
- zenml/zen_server/dashboard_legacy/index.html +1 -1
- zenml/zen_server/dashboard_legacy/{precache-manifest.f4abc5b7cfa7d90c1caf5521918e29a8.js → precache-manifest.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.ac2f17d0.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/feature_gate/zenml_cloud_feature_gate.py +11 -5
- zenml/zen_server/pipeline_deployment/utils.py +57 -44
- zenml/zen_server/rbac/utils.py +10 -2
- zenml/zen_server/rbac/zenml_cloud_rbac.py +11 -5
- zenml/zen_server/routers/devices_endpoints.py +4 -1
- zenml/zen_server/routers/server_endpoints.py +29 -2
- zenml/zen_server/routers/service_connectors_endpoints.py +57 -0
- zenml/zen_server/routers/stack_deployment_endpoints.py +158 -0
- zenml/zen_server/routers/steps_endpoints.py +2 -1
- zenml/zen_server/routers/workspaces_endpoints.py +64 -0
- zenml/zen_server/zen_server_api.py +2 -0
- zenml/zen_stores/migrations/utils.py +1 -1
- zenml/zen_stores/migrations/versions/0.60.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.61.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.62.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0d707865f404_adding_labels_to_stacks.py +30 -0
- zenml/zen_stores/migrations/versions/b4fca5241eea_migrate_onboarding_state.py +167 -0
- zenml/zen_stores/rest_zen_store.py +149 -4
- zenml/zen_stores/schemas/component_schemas.py +14 -0
- zenml/zen_stores/schemas/server_settings_schemas.py +23 -11
- zenml/zen_stores/schemas/stack_schemas.py +10 -0
- zenml/zen_stores/schemas/step_run_schemas.py +27 -11
- zenml/zen_stores/sql_zen_store.py +450 -6
- zenml/zen_stores/zen_store_interface.py +80 -0
- {zenml_nightly-0.58.2.dev20240626.dist-info → zenml_nightly-0.62.0.dev20240726.dist-info}/METADATA +35 -13
- {zenml_nightly-0.58.2.dev20240626.dist-info → zenml_nightly-0.62.0.dev20240726.dist-info}/RECORD +227 -191
- zenml/zen_server/dashboard/assets/@radix-C9DBgJhe.js +0 -77
- zenml/zen_server/dashboard/assets/@tanstack-CEbkxrhX.js +0 -30
- zenml/zen_server/dashboard/assets/AwarenessChannel-nXGpmj_f.js +0 -1
- zenml/zen_server/dashboard/assets/Cards-nwsvQLVS.js +0 -1
- zenml/zen_server/dashboard/assets/Commands-DuIWKg_Q.js +0 -1
- zenml/zen_server/dashboard/assets/CopyButton-B_YSm-Ds.js +0 -2
- zenml/zen_server/dashboard/assets/DisplayDate-BdguISQF.js +0 -1
- zenml/zen_server/dashboard/assets/EmptyState-BkooiGtL.js +0 -1
- zenml/zen_server/dashboard/assets/Error-B6M0dPph.js +0 -1
- zenml/zen_server/dashboard/assets/Helpbox-BQoqCm04.js +0 -1
- zenml/zen_server/dashboard/assets/Infobox-Ce9mefqU.js +0 -1
- zenml/zen_server/dashboard/assets/InlineAvatar-DGf3dVhV.js +0 -1
- zenml/zen_server/dashboard/assets/PageHeader-DGaemzjc.js +0 -1
- zenml/zen_server/dashboard/assets/Pagination-DVYfBCCc.js +0 -1
- zenml/zen_server/dashboard/assets/PasswordChecker-DSLBp7Vl.js +0 -1
- zenml/zen_server/dashboard/assets/SetPassword-B5s7DJug.js +0 -1
- zenml/zen_server/dashboard/assets/SuccessStep-ZzczaM7g.js +0 -1
- zenml/zen_server/dashboard/assets/chevron-down-zcvCWmyP.js +0 -1
- zenml/zen_server/dashboard/assets/cloud-only-Ba_ShBR5.js +0 -1
- zenml/zen_server/dashboard/assets/index-CWJ3xbIf.css +0 -1
- zenml/zen_server/dashboard/assets/index-QORVVTMN.js +0 -55
- zenml/zen_server/dashboard/assets/index.esm-F7nqy9zY.js +0 -1
- zenml/zen_server/dashboard/assets/not-found-Dh2la7kh.js +0 -1
- zenml/zen_server/dashboard/assets/page-B-5jAKoO.js +0 -1
- zenml/zen_server/dashboard/assets/page-B-vWk8a6.js +0 -1
- zenml/zen_server/dashboard/assets/page-B0BrqfS8.js +0 -1
- zenml/zen_server/dashboard/assets/page-BQxVFlUl.js +0 -1
- zenml/zen_server/dashboard/assets/page-ByrHy6Ss.js +0 -1
- zenml/zen_server/dashboard/assets/page-CPtY4Kv_.js +0 -1
- zenml/zen_server/dashboard/assets/page-CmmukLsl.js +0 -1
- zenml/zen_server/dashboard/assets/page-D2D-7qyr.js +0 -9
- zenml/zen_server/dashboard/assets/page-DAQQyLxT.js +0 -1
- zenml/zen_server/dashboard/assets/page-DHkUMl_E.js +0 -1
- zenml/zen_server/dashboard/assets/page-DZCbwOEs.js +0 -2
- zenml/zen_server/dashboard/assets/page-DdaIt20-.js +0 -1
- zenml/zen_server/dashboard/assets/page-LqLs24Ot.js +0 -1
- zenml/zen_server/dashboard/assets/page-lebv0c7C.js +0 -1
- zenml/zen_server/dashboard/assets/update-server-settings-mutation-0Wgz8pUE.js +0 -1
- zenml/zen_server/dashboard_legacy/static/js/main.ac2f17d0.chunk.js +0 -2
- {zenml_nightly-0.58.2.dev20240626.dist-info → zenml_nightly-0.62.0.dev20240726.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.58.2.dev20240626.dist-info → zenml_nightly-0.62.0.dev20240726.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.58.2.dev20240626.dist-info → zenml_nightly-0.62.0.dev20240726.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,408 @@
|
|
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
|
+
AZURE_DOCS = (
|
70
|
+
"https://docs.zenml.io/how-to/auth-management/azure-service-connector"
|
71
|
+
)
|
72
|
+
|
73
|
+
if not artifact_stores:
|
74
|
+
error_msg = (
|
75
|
+
"We were unable to find any {obj_name} available "
|
76
|
+
"to configured service connector. Please, verify "
|
77
|
+
"that needed permission are granted for the "
|
78
|
+
"service connector.\nDocumentation for the "
|
79
|
+
"{obj_name} configuration can be found at "
|
80
|
+
"{docs}"
|
81
|
+
)
|
82
|
+
if cloud_provider == "aws":
|
83
|
+
raise ValueError(
|
84
|
+
error_msg.format(
|
85
|
+
obj_name="S3 Bucket", docs=f"{AWS_DOCS}#s3-bucket"
|
86
|
+
)
|
87
|
+
)
|
88
|
+
elif cloud_provider == "gcp":
|
89
|
+
raise ValueError(
|
90
|
+
error_msg.format(
|
91
|
+
obj_name="GCS Bucket", docs=f"{GCP_DOCS}#gcs-bucket"
|
92
|
+
)
|
93
|
+
)
|
94
|
+
elif cloud_provider == "azure":
|
95
|
+
raise ValueError(
|
96
|
+
error_msg.format(
|
97
|
+
obj_name="Blob Container",
|
98
|
+
docs=f"{AZURE_DOCS}#azure-blob-storage-container",
|
99
|
+
)
|
100
|
+
)
|
101
|
+
if not orchestrators:
|
102
|
+
error_msg = (
|
103
|
+
"We were unable to find any orchestrator engines "
|
104
|
+
"available to the service connector. Please, verify "
|
105
|
+
"that needed permission are granted for the "
|
106
|
+
"service connector.\nDocumentation for the Generic "
|
107
|
+
"{cloud_name} resource configuration can be found at "
|
108
|
+
"{gen_docs}\n Documentation for the {k8s_name} resource "
|
109
|
+
"configuration can be found at {k8s_docs}"
|
110
|
+
)
|
111
|
+
if cloud_provider == "aws":
|
112
|
+
raise ValueError(
|
113
|
+
error_msg.format(
|
114
|
+
cloud_name="AWS",
|
115
|
+
gen_docs=f"{AWS_DOCS}#generic-aws-resource",
|
116
|
+
k8s_name="EKS",
|
117
|
+
k8s_docs=f"{AWS_DOCS}#eks-kubernetes-cluster",
|
118
|
+
)
|
119
|
+
)
|
120
|
+
|
121
|
+
elif cloud_provider == "gcp":
|
122
|
+
raise ValueError(
|
123
|
+
error_msg.format(
|
124
|
+
cloud_name="GCP",
|
125
|
+
gen_docs=f"{GCP_DOCS}#generic-gcp-resource",
|
126
|
+
k8s_name="GKE",
|
127
|
+
k8s_docs=f"{GCP_DOCS}#gke-kubernetes-cluster",
|
128
|
+
)
|
129
|
+
)
|
130
|
+
elif cloud_provider == "azure":
|
131
|
+
raise ValueError(
|
132
|
+
error_msg.format(
|
133
|
+
cloud_name="Azure",
|
134
|
+
gen_docs=f"{AZURE_DOCS}#generic-azure-resource",
|
135
|
+
k8s_name="AKS",
|
136
|
+
k8s_docs=f"{AZURE_DOCS}#aks-kubernetes-cluster",
|
137
|
+
)
|
138
|
+
)
|
139
|
+
if not container_registries:
|
140
|
+
error_msg = (
|
141
|
+
"We were unable to find any container registries "
|
142
|
+
"available to the service connector. Please, verify "
|
143
|
+
"that needed permission are granted for the "
|
144
|
+
"service connector.\nDocumentation for the {registry_name} "
|
145
|
+
"container registry resource configuration can "
|
146
|
+
"be found at {docs_link}"
|
147
|
+
)
|
148
|
+
if cloud_provider == "aws":
|
149
|
+
raise ValueError(
|
150
|
+
error_msg.format(
|
151
|
+
registry_name="ECR",
|
152
|
+
docs_link=f"{AWS_DOCS}#ecr-container-registry",
|
153
|
+
)
|
154
|
+
)
|
155
|
+
elif cloud_provider == "gcp":
|
156
|
+
raise ValueError(
|
157
|
+
error_msg.format(
|
158
|
+
registry_name="GCR",
|
159
|
+
docs_link=f"{GCP_DOCS}#gcr-container-registry",
|
160
|
+
)
|
161
|
+
)
|
162
|
+
elif cloud_provider == "azure":
|
163
|
+
raise ValueError(
|
164
|
+
error_msg.format(
|
165
|
+
registry_name="ACR",
|
166
|
+
docs_link=f"{AZURE_DOCS}#acr-container-registry",
|
167
|
+
)
|
168
|
+
)
|
169
|
+
|
170
|
+
|
171
|
+
def get_resources_options_from_resource_model_for_full_stack(
|
172
|
+
connector_details: Union[UUID, ServiceConnectorInfo],
|
173
|
+
) -> ServiceConnectorResourcesInfo:
|
174
|
+
"""Get the resource options from the resource model for the full stack.
|
175
|
+
|
176
|
+
Args:
|
177
|
+
connector_details: The service connector details (UUID or Info).
|
178
|
+
|
179
|
+
Returns:
|
180
|
+
All available service connector resource options.
|
181
|
+
"""
|
182
|
+
client = Client()
|
183
|
+
zen_store = client.zen_store
|
184
|
+
|
185
|
+
if isinstance(connector_details, UUID):
|
186
|
+
resource_model = zen_store.verify_service_connector(
|
187
|
+
connector_details,
|
188
|
+
list_resources=True,
|
189
|
+
)
|
190
|
+
else:
|
191
|
+
resource_model = zen_store.verify_service_connector_config(
|
192
|
+
service_connector=ServiceConnectorRequest(
|
193
|
+
user=client.active_user.id,
|
194
|
+
workspace=client.active_workspace.id,
|
195
|
+
name="fake",
|
196
|
+
connector_type=connector_details.type,
|
197
|
+
auth_method=connector_details.auth_method,
|
198
|
+
configuration=connector_details.configuration,
|
199
|
+
secrets={},
|
200
|
+
labels={},
|
201
|
+
),
|
202
|
+
list_resources=True,
|
203
|
+
)
|
204
|
+
|
205
|
+
resources = resource_model.resources
|
206
|
+
|
207
|
+
if isinstance(
|
208
|
+
resource_model.connector_type,
|
209
|
+
str,
|
210
|
+
):
|
211
|
+
connector_type = resource_model.connector_type
|
212
|
+
else:
|
213
|
+
connector_type = resource_model.connector_type.connector_type
|
214
|
+
|
215
|
+
artifact_stores: List[ResourcesInfo] = []
|
216
|
+
orchestrators: List[ResourcesInfo] = []
|
217
|
+
container_registries: List[ResourcesInfo] = []
|
218
|
+
|
219
|
+
if connector_type == "aws":
|
220
|
+
for each in resources:
|
221
|
+
if each.resource_ids:
|
222
|
+
if each.resource_type == "s3-bucket":
|
223
|
+
artifact_stores.append(
|
224
|
+
_prepare_resource_info(
|
225
|
+
connector_details=connector_details,
|
226
|
+
resource_ids=each.resource_ids,
|
227
|
+
stack_component_type=StackComponentType.ARTIFACT_STORE,
|
228
|
+
flavor="s3",
|
229
|
+
required_configuration={"path": "Path"},
|
230
|
+
use_resource_value_as_fixed_config=True,
|
231
|
+
flavor_display_name="S3 Bucket",
|
232
|
+
)
|
233
|
+
)
|
234
|
+
if each.resource_type == "aws-generic":
|
235
|
+
orchestrators.append(
|
236
|
+
_prepare_resource_info(
|
237
|
+
connector_details=connector_details,
|
238
|
+
resource_ids=each.resource_ids,
|
239
|
+
stack_component_type=StackComponentType.ORCHESTRATOR,
|
240
|
+
flavor="sagemaker",
|
241
|
+
required_configuration={
|
242
|
+
"execution_role": "execution role ARN"
|
243
|
+
},
|
244
|
+
flavor_display_name="AWS Sagemaker",
|
245
|
+
)
|
246
|
+
)
|
247
|
+
orchestrators.append(
|
248
|
+
_prepare_resource_info(
|
249
|
+
connector_details=connector_details,
|
250
|
+
resource_ids=each.resource_ids,
|
251
|
+
stack_component_type=StackComponentType.ORCHESTRATOR,
|
252
|
+
flavor="vm_aws",
|
253
|
+
required_configuration={"region": "region"},
|
254
|
+
use_resource_value_as_fixed_config=True,
|
255
|
+
flavor_display_name="Skypilot (EC2)",
|
256
|
+
)
|
257
|
+
)
|
258
|
+
|
259
|
+
if each.resource_type == "kubernetes-cluster":
|
260
|
+
orchestrators.append(
|
261
|
+
_prepare_resource_info(
|
262
|
+
connector_details=connector_details,
|
263
|
+
resource_ids=each.resource_ids,
|
264
|
+
stack_component_type=StackComponentType.ORCHESTRATOR,
|
265
|
+
flavor="kubernetes",
|
266
|
+
required_configuration={},
|
267
|
+
flavor_display_name="Kubernetes",
|
268
|
+
)
|
269
|
+
)
|
270
|
+
if each.resource_type == "docker-registry":
|
271
|
+
container_registries.append(
|
272
|
+
_prepare_resource_info(
|
273
|
+
connector_details=connector_details,
|
274
|
+
resource_ids=each.resource_ids,
|
275
|
+
stack_component_type=StackComponentType.CONTAINER_REGISTRY,
|
276
|
+
flavor="aws",
|
277
|
+
required_configuration={"uri": "URI"},
|
278
|
+
use_resource_value_as_fixed_config=True,
|
279
|
+
flavor_display_name="ECR",
|
280
|
+
)
|
281
|
+
)
|
282
|
+
|
283
|
+
elif connector_type == "gcp":
|
284
|
+
for each in resources:
|
285
|
+
if each.resource_ids:
|
286
|
+
if each.resource_type == "gcs-bucket":
|
287
|
+
artifact_stores.append(
|
288
|
+
_prepare_resource_info(
|
289
|
+
connector_details=connector_details,
|
290
|
+
resource_ids=each.resource_ids,
|
291
|
+
stack_component_type=StackComponentType.ARTIFACT_STORE,
|
292
|
+
flavor="gcp",
|
293
|
+
required_configuration={},
|
294
|
+
flavor_display_name="GCS Bucket",
|
295
|
+
)
|
296
|
+
)
|
297
|
+
if each.resource_type == "gcp-generic":
|
298
|
+
orchestrators.append(
|
299
|
+
_prepare_resource_info(
|
300
|
+
connector_details=connector_details,
|
301
|
+
resource_ids=each.resource_ids,
|
302
|
+
stack_component_type=StackComponentType.ORCHESTRATOR,
|
303
|
+
flavor="vertex",
|
304
|
+
required_configuration={"location": "region name"},
|
305
|
+
flavor_display_name="Vertex AI",
|
306
|
+
)
|
307
|
+
)
|
308
|
+
orchestrators.append(
|
309
|
+
_prepare_resource_info(
|
310
|
+
connector_details=connector_details,
|
311
|
+
resource_ids=each.resource_ids,
|
312
|
+
stack_component_type=StackComponentType.ORCHESTRATOR,
|
313
|
+
flavor="vm_gcp",
|
314
|
+
required_configuration={"region": "region name"},
|
315
|
+
flavor_display_name="Skypilot (Compute)",
|
316
|
+
)
|
317
|
+
)
|
318
|
+
|
319
|
+
if each.resource_type == "kubernetes-cluster":
|
320
|
+
orchestrators.append(
|
321
|
+
_prepare_resource_info(
|
322
|
+
connector_details=connector_details,
|
323
|
+
resource_ids=each.resource_ids,
|
324
|
+
stack_component_type=StackComponentType.ORCHESTRATOR,
|
325
|
+
flavor="kubernetes",
|
326
|
+
required_configuration={},
|
327
|
+
flavor_display_name="Kubernetes",
|
328
|
+
)
|
329
|
+
)
|
330
|
+
if each.resource_type == "docker-registry":
|
331
|
+
container_registries.append(
|
332
|
+
_prepare_resource_info(
|
333
|
+
connector_details=connector_details,
|
334
|
+
resource_ids=each.resource_ids,
|
335
|
+
stack_component_type=StackComponentType.CONTAINER_REGISTRY,
|
336
|
+
flavor="gcp",
|
337
|
+
required_configuration={"uri": "URI"},
|
338
|
+
use_resource_value_as_fixed_config=True,
|
339
|
+
flavor_display_name="GCR",
|
340
|
+
)
|
341
|
+
)
|
342
|
+
|
343
|
+
elif connector_type == "azure":
|
344
|
+
for each in resources:
|
345
|
+
if each.resource_ids:
|
346
|
+
if each.resource_type == "blob-container":
|
347
|
+
artifact_stores.append(
|
348
|
+
_prepare_resource_info(
|
349
|
+
connector_details=connector_details,
|
350
|
+
resource_ids=each.resource_ids,
|
351
|
+
stack_component_type=StackComponentType.ARTIFACT_STORE,
|
352
|
+
flavor="azure",
|
353
|
+
required_configuration={},
|
354
|
+
flavor_display_name="Blob container",
|
355
|
+
)
|
356
|
+
)
|
357
|
+
if each.resource_type == "azure-generic":
|
358
|
+
# No native orchestrator ATM
|
359
|
+
orchestrators.append(
|
360
|
+
_prepare_resource_info(
|
361
|
+
connector_details=connector_details,
|
362
|
+
resource_ids=each.resource_ids,
|
363
|
+
stack_component_type=StackComponentType.ORCHESTRATOR,
|
364
|
+
flavor="vm_azure",
|
365
|
+
required_configuration={"region": "region name"},
|
366
|
+
flavor_display_name="Skypilot (VM)",
|
367
|
+
)
|
368
|
+
)
|
369
|
+
|
370
|
+
if each.resource_type == "kubernetes-cluster":
|
371
|
+
orchestrators.append(
|
372
|
+
_prepare_resource_info(
|
373
|
+
connector_details=connector_details,
|
374
|
+
resource_ids=each.resource_ids,
|
375
|
+
stack_component_type=StackComponentType.ORCHESTRATOR,
|
376
|
+
flavor="kubernetes",
|
377
|
+
required_configuration={},
|
378
|
+
flavor_display_name="Kubernetes",
|
379
|
+
)
|
380
|
+
)
|
381
|
+
if each.resource_type == "docker-registry":
|
382
|
+
container_registries.append(
|
383
|
+
_prepare_resource_info(
|
384
|
+
connector_details=connector_details,
|
385
|
+
resource_ids=each.resource_ids,
|
386
|
+
stack_component_type=StackComponentType.CONTAINER_REGISTRY,
|
387
|
+
flavor="azure",
|
388
|
+
required_configuration={"uri": "URI"},
|
389
|
+
use_resource_value_as_fixed_config=True,
|
390
|
+
flavor_display_name="ACR",
|
391
|
+
)
|
392
|
+
)
|
393
|
+
|
394
|
+
_raise_specific_cloud_exception_if_needed(
|
395
|
+
cloud_provider=connector_type,
|
396
|
+
artifact_stores=artifact_stores,
|
397
|
+
orchestrators=orchestrators,
|
398
|
+
container_registries=container_registries,
|
399
|
+
)
|
400
|
+
|
401
|
+
return ServiceConnectorResourcesInfo(
|
402
|
+
connector_type=connector_type,
|
403
|
+
components_resources_info={
|
404
|
+
StackComponentType.ARTIFACT_STORE: artifact_stores,
|
405
|
+
StackComponentType.ORCHESTRATOR: orchestrators,
|
406
|
+
StackComponentType.CONTAINER_REGISTRY: container_registries,
|
407
|
+
},
|
408
|
+
)
|
zenml/stack/stack.py
CHANGED
@@ -13,7 +13,6 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Implementation of the ZenML Stack class."""
|
15
15
|
|
16
|
-
import functools
|
17
16
|
import itertools
|
18
17
|
import json
|
19
18
|
import os
|
@@ -155,11 +154,9 @@ class Stack:
|
|
155
154
|
|
156
155
|
# Run a hydrated list call once to avoid one request per component
|
157
156
|
component_models = pagination_utils.depaginate(
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
hydrate=True,
|
162
|
-
)
|
157
|
+
Client().list_stack_components,
|
158
|
+
stack_id=stack_model.id,
|
159
|
+
hydrate=True,
|
163
160
|
)
|
164
161
|
|
165
162
|
stack_components = {
|
@@ -0,0 +1,14 @@
|
|
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
|
+
"""ZenML Stack Deployments."""
|