zenml-nightly 0.55.0.dev20240124__py3-none-any.whl → 0.72.0.dev20250116__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/__init__.py +9 -12
- zenml/actions/__init__.py +14 -0
- zenml/actions/base_action.py +682 -0
- zenml/actions/pipeline_run/__init__.py +0 -0
- zenml/actions/pipeline_run/pipeline_run_action.py +223 -0
- zenml/analytics/context.py +70 -15
- zenml/analytics/enums.py +21 -17
- zenml/analytics/models.py +1 -0
- zenml/analytics/utils.py +19 -7
- zenml/annotators/base_annotator.py +4 -3
- zenml/artifact_stores/base_artifact_store.py +155 -72
- zenml/artifact_stores/local_artifact_store.py +3 -2
- zenml/artifacts/artifact_config.py +67 -58
- zenml/artifacts/external_artifact.py +24 -39
- zenml/artifacts/external_artifact_config.py +27 -37
- zenml/artifacts/preexisting_data_materializer.py +90 -0
- zenml/artifacts/unmaterialized_artifact.py +2 -12
- zenml/artifacts/utils.py +521 -220
- zenml/cli/__init__.py +1511 -456
- zenml/cli/annotator.py +48 -14
- zenml/cli/artifact.py +22 -4
- zenml/cli/authorized_device.py +1 -0
- zenml/cli/base.py +185 -22
- zenml/cli/code_repository.py +1 -0
- zenml/cli/formatter.py +1 -1
- zenml/cli/integration.py +119 -24
- zenml/cli/login.py +1053 -0
- zenml/cli/model.py +42 -15
- zenml/cli/model_registry.py +1 -2
- zenml/cli/pipeline.py +168 -82
- zenml/cli/secret.py +1 -2
- zenml/cli/served_model.py +56 -26
- zenml/cli/server.py +486 -619
- zenml/cli/service_accounts.py +55 -14
- zenml/cli/service_connectors.py +97 -6
- zenml/cli/stack.py +821 -531
- zenml/cli/stack_components.py +15 -598
- zenml/cli/tag.py +1 -0
- zenml/cli/text_utils.py +36 -2
- zenml/cli/user_management.py +204 -6
- zenml/cli/utils.py +411 -290
- zenml/client.py +1742 -298
- zenml/client_lazy_loader.py +224 -0
- zenml/code_repositories/base_code_repository.py +5 -4
- zenml/code_repositories/git/local_git_repository_context.py +1 -0
- zenml/code_repositories/local_repository_context.py +1 -0
- zenml/config/__init__.py +2 -0
- zenml/config/base_settings.py +6 -6
- zenml/config/build_configuration.py +43 -17
- zenml/config/compiler.py +82 -49
- zenml/config/docker_settings.py +139 -83
- zenml/config/global_config.py +260 -234
- zenml/config/pipeline_configurations.py +32 -11
- zenml/config/pipeline_run_configuration.py +15 -3
- zenml/config/pipeline_spec.py +6 -6
- zenml/config/resource_settings.py +8 -9
- zenml/config/retry_config.py +27 -0
- zenml/config/schedule.py +27 -18
- zenml/config/secret_reference_mixin.py +8 -4
- zenml/config/secrets_store_config.py +16 -24
- zenml/config/server_config.py +434 -51
- zenml/config/settings_resolver.py +2 -1
- zenml/config/source.py +97 -31
- zenml/config/step_configurations.py +83 -39
- zenml/config/step_run_info.py +3 -0
- zenml/config/store_config.py +20 -54
- zenml/config/strict_base_model.py +2 -6
- zenml/console.py +0 -1
- zenml/constants.py +232 -74
- zenml/container_registries/azure_container_registry.py +1 -0
- zenml/container_registries/base_container_registry.py +7 -3
- zenml/container_registries/default_container_registry.py +4 -3
- zenml/container_registries/dockerhub_container_registry.py +1 -0
- zenml/container_registries/gcp_container_registry.py +1 -0
- zenml/container_registries/github_container_registry.py +2 -10
- zenml/data_validators/base_data_validator.py +2 -2
- zenml/entrypoints/base_entrypoint_configuration.py +76 -17
- zenml/entrypoints/pipeline_entrypoint_configuration.py +1 -0
- zenml/entrypoints/step_entrypoint_configuration.py +21 -2
- zenml/enums.py +91 -9
- zenml/environment.py +52 -319
- zenml/{steps/base_parameters.py → event_hub/__init__.py} +5 -7
- zenml/event_hub/base_event_hub.py +196 -0
- zenml/event_hub/event_hub.py +181 -0
- zenml/event_sources/__init__.py +14 -0
- zenml/{lineage_graph/edge.py → event_sources/base_event.py} +5 -7
- zenml/event_sources/base_event_source.py +695 -0
- zenml/event_sources/webhooks/__init__.py +14 -0
- zenml/event_sources/webhooks/base_webhook_event_source.py +231 -0
- zenml/exceptions.py +40 -41
- zenml/feature_stores/base_feature_store.py +4 -6
- zenml/hooks/hook_validators.py +3 -11
- zenml/image_builders/base_image_builder.py +5 -2
- zenml/image_builders/build_context.py +24 -80
- zenml/image_builders/local_image_builder.py +14 -6
- zenml/integrations/__init__.py +16 -4
- zenml/integrations/airflow/__init__.py +3 -5
- zenml/integrations/airflow/flavors/airflow_orchestrator_flavor.py +15 -7
- zenml/integrations/airflow/orchestrators/airflow_orchestrator.py +15 -252
- zenml/integrations/airflow/orchestrators/dag_generator.py +5 -3
- zenml/integrations/argilla/__init__.py +46 -0
- zenml/integrations/argilla/annotators/__init__.py +20 -0
- zenml/integrations/argilla/annotators/argilla_annotator.py +443 -0
- zenml/{post_execution → integrations/argilla/flavors}/__init__.py +9 -13
- zenml/integrations/argilla/flavors/argilla_annotator_flavor.py +150 -0
- zenml/integrations/aws/__init__.py +7 -3
- zenml/integrations/aws/container_registries/aws_container_registry.py +44 -8
- zenml/integrations/aws/flavors/__init__.py +6 -0
- zenml/integrations/aws/flavors/aws_container_registry_flavor.py +3 -2
- zenml/integrations/aws/flavors/aws_image_builder_flavor.py +146 -0
- zenml/integrations/aws/flavors/sagemaker_orchestrator_flavor.py +104 -16
- zenml/integrations/aws/flavors/sagemaker_step_operator_flavor.py +6 -2
- zenml/integrations/aws/image_builders/__init__.py +20 -0
- zenml/integrations/aws/image_builders/aws_image_builder.py +307 -0
- zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +421 -133
- zenml/integrations/aws/service_connectors/aws_service_connector.py +175 -48
- zenml/integrations/aws/step_operators/sagemaker_step_operator.py +1 -1
- zenml/integrations/azure/__init__.py +14 -5
- zenml/integrations/azure/azureml_utils.py +201 -0
- zenml/integrations/azure/flavors/__init__.py +11 -0
- zenml/integrations/azure/flavors/azureml.py +139 -0
- zenml/integrations/azure/flavors/azureml_orchestrator_flavor.py +166 -0
- zenml/integrations/azure/flavors/azureml_step_operator_flavor.py +71 -18
- zenml/integrations/azure/orchestrators/__init__.py +19 -0
- zenml/integrations/azure/orchestrators/azureml_orchestrator.py +583 -0
- zenml/integrations/azure/orchestrators/azureml_orchestrator_entrypoint_config.py +82 -0
- zenml/integrations/azure/service_connectors/azure_service_connector.py +15 -6
- zenml/integrations/azure/step_operators/azureml_step_operator.py +78 -173
- zenml/integrations/bentoml/__init__.py +1 -1
- zenml/integrations/bentoml/constants.py +1 -1
- zenml/integrations/bentoml/materializers/bentoml_bento_materializer.py +19 -31
- zenml/integrations/bentoml/model_deployers/bentoml_model_deployer.py +128 -239
- zenml/integrations/bentoml/services/__init__.py +15 -4
- zenml/integrations/bentoml/services/bentoml_container_deployment.py +399 -0
- zenml/integrations/bentoml/services/{bentoml_deployment.py → bentoml_local_deployment.py} +85 -43
- zenml/integrations/bentoml/services/deployment_type.py +23 -0
- zenml/integrations/bentoml/steps/bento_builder.py +2 -0
- zenml/integrations/bentoml/steps/bentoml_deployer.py +97 -47
- zenml/integrations/bitbucket/__init__.py +42 -0
- zenml/integrations/bitbucket/plugins/__init__.py +20 -0
- zenml/integrations/bitbucket/plugins/bitbucket_webhook_event_source_flavor.py +43 -0
- zenml/integrations/bitbucket/plugins/event_sources/__init__.py +0 -0
- zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +486 -0
- zenml/integrations/comet/__init__.py +49 -0
- zenml/integrations/{kserve/services → comet/experiment_trackers}/__init__.py +5 -6
- zenml/integrations/comet/experiment_trackers/comet_experiment_tracker.py +175 -0
- zenml/integrations/comet/flavors/__init__.py +24 -0
- zenml/integrations/comet/flavors/comet_experiment_tracker_flavor.py +129 -0
- zenml/integrations/constants.py +14 -2
- zenml/integrations/databricks/__init__.py +70 -0
- zenml/{lineage_graph → integrations/databricks/flavors}/__init__.py +14 -18
- zenml/integrations/databricks/flavors/databricks_model_deployer_flavor.py +118 -0
- zenml/integrations/databricks/flavors/databricks_orchestrator_flavor.py +174 -0
- zenml/integrations/{kserve → databricks}/model_deployers/__init__.py +5 -5
- 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 +501 -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/{gcp/orchestrators/vertex_scheduler → databricks/utils}/__init__.py +2 -2
- zenml/integrations/databricks/utils/databricks_utils.py +87 -0
- zenml/integrations/deepchecks/__init__.py +30 -10
- zenml/integrations/deepchecks/data_validators/deepchecks_data_validator.py +59 -18
- zenml/integrations/deepchecks/materializers/deepchecks_dataset_materializer.py +3 -1
- zenml/integrations/deepchecks/materializers/deepchecks_results_materializer.py +3 -3
- zenml/integrations/deepchecks/validation_checks.py +62 -35
- zenml/integrations/discord/__init__.py +1 -0
- zenml/integrations/discord/steps/discord_alerter_ask_step.py +1 -0
- zenml/integrations/discord/steps/discord_alerter_post_step.py +1 -0
- zenml/integrations/evidently/__init__.py +22 -4
- zenml/integrations/evidently/column_mapping.py +11 -3
- zenml/integrations/evidently/data_validators/evidently_data_validator.py +24 -6
- zenml/integrations/evidently/metrics.py +7 -8
- zenml/integrations/evidently/tests.py +7 -8
- zenml/integrations/facets/__init__.py +22 -5
- zenml/integrations/facets/models.py +2 -7
- zenml/integrations/feast/__init__.py +19 -3
- zenml/integrations/feast/feature_stores/feast_feature_store.py +13 -32
- zenml/integrations/gcp/__init__.py +6 -6
- zenml/integrations/gcp/artifact_stores/gcp_artifact_store.py +6 -0
- zenml/integrations/gcp/flavors/gcp_artifact_store_flavor.py +1 -0
- zenml/integrations/gcp/flavors/vertex_orchestrator_flavor.py +24 -2
- zenml/integrations/gcp/flavors/vertex_step_operator_flavor.py +14 -1
- zenml/integrations/gcp/google_credentials_mixin.py +1 -1
- zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +519 -296
- zenml/integrations/gcp/service_connectors/gcp_service_connector.py +788 -113
- zenml/integrations/gcp/step_operators/vertex_step_operator.py +9 -1
- zenml/integrations/github/__init__.py +15 -0
- zenml/integrations/github/code_repositories/github_code_repository.py +3 -2
- zenml/integrations/github/plugins/__init__.py +19 -0
- zenml/integrations/github/plugins/event_sources/__init__.py +0 -0
- zenml/integrations/github/plugins/event_sources/github_webhook_event_source.py +510 -0
- zenml/integrations/github/plugins/github_webhook_event_source_flavor.py +43 -0
- zenml/integrations/gitlab/code_repositories/gitlab_code_repository.py +7 -1
- zenml/integrations/great_expectations/__init__.py +22 -10
- zenml/integrations/great_expectations/data_validators/ge_data_validator.py +61 -57
- zenml/integrations/great_expectations/flavors/great_expectations_data_validator_flavor.py +35 -2
- zenml/integrations/great_expectations/ge_store_backend.py +24 -11
- zenml/integrations/great_expectations/materializers/ge_materializer.py +9 -9
- zenml/integrations/great_expectations/utils.py +5 -5
- zenml/integrations/huggingface/__init__.py +52 -1
- zenml/integrations/huggingface/flavors/__init__.py +26 -0
- zenml/integrations/huggingface/flavors/huggingface_model_deployer_flavor.py +130 -0
- zenml/integrations/huggingface/materializers/__init__.py +3 -0
- zenml/integrations/huggingface/materializers/huggingface_datasets_materializer.py +102 -19
- zenml/integrations/huggingface/materializers/huggingface_pt_model_materializer.py +18 -19
- zenml/integrations/huggingface/materializers/huggingface_t5_materializer.py +104 -0
- zenml/integrations/huggingface/materializers/huggingface_tf_model_materializer.py +18 -19
- zenml/integrations/huggingface/materializers/huggingface_tokenizer_materializer.py +13 -15
- zenml/integrations/huggingface/model_deployers/__init__.py +20 -0
- zenml/integrations/huggingface/model_deployers/huggingface_model_deployer.py +247 -0
- zenml/integrations/huggingface/services/__init__.py +19 -0
- zenml/integrations/huggingface/services/huggingface_deployment.py +292 -0
- zenml/integrations/huggingface/steps/__init__.py +21 -0
- zenml/integrations/huggingface/steps/accelerate_runner.py +166 -0
- zenml/integrations/huggingface/steps/huggingface_deployer.py +110 -0
- zenml/integrations/hyperai/__init__.py +53 -0
- zenml/integrations/hyperai/flavors/__init__.py +20 -0
- zenml/integrations/hyperai/flavors/hyperai_orchestrator_flavor.py +170 -0
- zenml/integrations/hyperai/orchestrators/__init__.py +21 -0
- zenml/integrations/hyperai/orchestrators/hyperai_orchestrator.py +510 -0
- zenml/integrations/hyperai/service_connectors/__init__.py +20 -0
- zenml/integrations/hyperai/service_connectors/hyperai_service_connector.py +375 -0
- zenml/integrations/integration.py +101 -47
- zenml/integrations/kaniko/flavors/kaniko_image_builder_flavor.py +6 -44
- zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +9 -6
- zenml/integrations/kubeflow/__init__.py +4 -1
- zenml/integrations/kubeflow/flavors/kubeflow_orchestrator_flavor.py +67 -82
- zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py +306 -248
- zenml/integrations/kubernetes/__init__.py +6 -3
- zenml/integrations/kubernetes/flavors/__init__.py +8 -0
- zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +43 -2
- zenml/integrations/kubernetes/flavors/kubernetes_step_operator_flavor.py +166 -0
- zenml/integrations/kubernetes/orchestrators/kube_utils.py +67 -12
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +89 -21
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +39 -7
- zenml/integrations/kubernetes/orchestrators/manifest_utils.py +42 -19
- zenml/integrations/kubernetes/pod_settings.py +21 -31
- zenml/integrations/kubernetes/serialization_utils.py +3 -3
- zenml/integrations/kubernetes/service_connectors/kubernetes_service_connector.py +14 -11
- zenml/integrations/kubernetes/step_operators/__init__.py +22 -0
- zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py +236 -0
- zenml/integrations/label_studio/__init__.py +1 -3
- zenml/integrations/label_studio/annotators/label_studio_annotator.py +46 -14
- zenml/integrations/label_studio/flavors/__init__.py +2 -0
- zenml/integrations/label_studio/flavors/label_studio_annotator_flavor.py +20 -5
- zenml/integrations/langchain/__init__.py +7 -1
- zenml/integrations/langchain/materializers/document_materializer.py +44 -8
- zenml/integrations/langchain/materializers/openai_embedding_materializer.py +28 -2
- zenml/integrations/lightgbm/__init__.py +1 -0
- zenml/integrations/lightgbm/materializers/lightgbm_booster_materializer.py +8 -15
- zenml/integrations/lightgbm/materializers/lightgbm_dataset_materializer.py +11 -16
- zenml/integrations/lightning/__init__.py +48 -0
- zenml/integrations/lightning/flavors/__init__.py +23 -0
- zenml/integrations/lightning/flavors/lightning_orchestrator_flavor.py +168 -0
- zenml/integrations/lightning/orchestrators/__init__.py +23 -0
- zenml/integrations/lightning/orchestrators/lightning_orchestrator.py +617 -0
- zenml/integrations/lightning/orchestrators/lightning_orchestrator_entrypoint.py +303 -0
- zenml/integrations/lightning/orchestrators/lightning_orchestrator_entrypoint_configuration.py +77 -0
- zenml/integrations/lightning/orchestrators/utils.py +67 -0
- zenml/integrations/mlflow/__init__.py +55 -8
- zenml/integrations/mlflow/experiment_trackers/mlflow_experiment_tracker.py +31 -13
- zenml/integrations/mlflow/flavors/mlflow_experiment_tracker_flavor.py +32 -37
- zenml/integrations/mlflow/model_deployers/mlflow_model_deployer.py +42 -233
- zenml/integrations/mlflow/model_registries/mlflow_model_registry.py +42 -49
- zenml/integrations/mlflow/services/mlflow_deployment.py +30 -5
- zenml/integrations/mlflow/steps/mlflow_deployer.py +25 -27
- zenml/integrations/mlflow/steps/mlflow_registry.py +3 -1
- zenml/integrations/modal/__init__.py +46 -0
- zenml/integrations/modal/flavors/__init__.py +26 -0
- zenml/integrations/modal/flavors/modal_step_operator_flavor.py +125 -0
- zenml/integrations/modal/step_operators/__init__.py +22 -0
- zenml/integrations/modal/step_operators/modal_step_operator.py +242 -0
- zenml/integrations/neptune/experiment_trackers/neptune_experiment_tracker.py +7 -5
- zenml/integrations/neptune/experiment_trackers/run_state.py +71 -55
- zenml/integrations/neptune/flavors/neptune_experiment_tracker_flavor.py +1 -1
- zenml/integrations/neural_prophet/__init__.py +6 -1
- zenml/integrations/numpy/__init__.py +32 -0
- zenml/integrations/{kserve/constants.py → numpy/materializers/__init__.py} +5 -4
- zenml/integrations/numpy/materializers/numpy_materializer.py +246 -0
- zenml/integrations/openai/__init__.py +1 -1
- zenml/integrations/openai/hooks/open_ai_failure_hook.py +39 -14
- zenml/{steps/external_artifact.py → integrations/pandas/__init__.py} +17 -11
- zenml/integrations/{kserve/custom_deployer → pandas/materializers}/__init__.py +5 -5
- zenml/integrations/pandas/materializers/pandas_materializer.py +192 -0
- zenml/integrations/pigeon/__init__.py +44 -0
- zenml/integrations/pigeon/annotators/__init__.py +20 -0
- zenml/integrations/pigeon/annotators/pigeon_annotator.py +330 -0
- zenml/integrations/{kserve → pigeon}/flavors/__init__.py +7 -7
- zenml/integrations/pigeon/flavors/pigeon_annotator_flavor.py +104 -0
- zenml/integrations/pillow/materializers/pillow_image_materializer.py +17 -20
- zenml/integrations/polars/__init__.py +1 -0
- zenml/integrations/polars/materializers/dataframe_materializer.py +26 -39
- zenml/integrations/prodigy/__init__.py +48 -0
- zenml/integrations/prodigy/annotators/__init__.py +20 -0
- zenml/integrations/prodigy/annotators/prodigy_annotator.py +275 -0
- zenml/integrations/prodigy/flavors/__init__.py +24 -0
- zenml/integrations/prodigy/flavors/prodigy_annotator_flavor.py +101 -0
- zenml/integrations/pycaret/__init__.py +6 -0
- zenml/integrations/pycaret/materializers/model_materializer.py +7 -22
- zenml/integrations/pytorch/materializers/base_pytorch_materializer.py +8 -2
- zenml/integrations/pytorch/materializers/pytorch_module_materializer.py +4 -1
- zenml/integrations/registry.py +38 -1
- zenml/integrations/s3/__init__.py +2 -3
- zenml/integrations/s3/artifact_stores/s3_artifact_store.py +191 -9
- zenml/integrations/s3/flavors/s3_artifact_store_flavor.py +22 -45
- zenml/integrations/s3/utils.py +39 -0
- zenml/integrations/seldon/__init__.py +18 -2
- zenml/integrations/seldon/model_deployers/seldon_model_deployer.py +19 -141
- zenml/integrations/seldon/secret_schemas/secret_schemas.py +2 -2
- zenml/integrations/seldon/seldon_client.py +55 -70
- zenml/integrations/seldon/services/seldon_deployment.py +4 -5
- zenml/integrations/seldon/steps/seldon_deployer.py +21 -20
- zenml/integrations/sklearn/__init__.py +1 -1
- zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +29 -7
- zenml/integrations/skypilot/orchestrators/skypilot_base_vm_orchestrator.py +47 -28
- zenml/integrations/skypilot/orchestrators/skypilot_orchestrator_entrypoint.py +2 -2
- zenml/integrations/skypilot_aws/__init__.py +3 -2
- zenml/integrations/skypilot_aws/flavors/skypilot_orchestrator_aws_vm_flavor.py +1 -1
- zenml/integrations/skypilot_azure/__init__.py +2 -4
- zenml/integrations/skypilot_azure/flavors/skypilot_orchestrator_azure_vm_flavor.py +1 -1
- zenml/integrations/skypilot_gcp/__init__.py +3 -2
- zenml/integrations/skypilot_gcp/flavors/skypilot_orchestrator_gcp_vm_flavor.py +1 -1
- zenml/integrations/skypilot_kubernetes/__init__.py +52 -0
- zenml/integrations/skypilot_kubernetes/flavors/__init__.py +26 -0
- zenml/integrations/skypilot_kubernetes/flavors/skypilot_orchestrator_kubernetes_vm_flavor.py +125 -0
- zenml/integrations/skypilot_kubernetes/orchestrators/__init__.py +25 -0
- zenml/integrations/skypilot_kubernetes/orchestrators/skypilot_kubernetes_vm_orchestrator.py +74 -0
- zenml/integrations/skypilot_lambda/__init__.py +50 -0
- zenml/integrations/{kserve/secret_schemas → skypilot_lambda/flavors}/__init__.py +9 -12
- zenml/integrations/skypilot_lambda/flavors/skypilot_orchestrator_lambda_vm_flavor.py +130 -0
- zenml/{lineage_graph/node → integrations/skypilot_lambda/orchestrators}/__init__.py +8 -15
- zenml/integrations/skypilot_lambda/orchestrators/skypilot_lambda_vm_orchestrator.py +92 -0
- zenml/integrations/slack/__init__.py +1 -0
- zenml/integrations/slack/alerters/slack_alerter.py +22 -2
- zenml/integrations/slack/flavors/__init__.py +2 -0
- zenml/integrations/slack/flavors/slack_alerter_flavor.py +13 -4
- zenml/integrations/slack/steps/slack_alerter_ask_step.py +1 -0
- zenml/integrations/slack/steps/slack_alerter_post_step.py +1 -0
- zenml/integrations/spark/flavors/spark_step_operator_flavor.py +2 -39
- zenml/integrations/spark/step_operators/kubernetes_step_operator.py +1 -0
- zenml/integrations/spark/step_operators/spark_entrypoint_configuration.py +1 -0
- zenml/integrations/spark/step_operators/spark_step_operator.py +2 -0
- zenml/integrations/tekton/__init__.py +2 -1
- zenml/integrations/tekton/flavors/tekton_orchestrator_flavor.py +66 -23
- zenml/integrations/tekton/orchestrators/tekton_orchestrator.py +549 -235
- zenml/integrations/tensorboard/__init__.py +1 -13
- zenml/integrations/tensorboard/services/tensorboard_service.py +3 -4
- zenml/integrations/tensorboard/visualizers/tensorboard_visualizer.py +66 -59
- zenml/integrations/tensorflow/__init__.py +10 -15
- zenml/integrations/tensorflow/materializers/keras_materializer.py +24 -27
- zenml/integrations/tensorflow/materializers/tf_dataset_materializer.py +9 -16
- zenml/integrations/vllm/__init__.py +50 -0
- zenml/integrations/vllm/flavors/__init__.py +21 -0
- zenml/integrations/vllm/flavors/vllm_model_deployer_flavor.py +91 -0
- zenml/integrations/vllm/model_deployers/__init__.py +19 -0
- zenml/integrations/vllm/model_deployers/vllm_model_deployer.py +263 -0
- zenml/integrations/vllm/services/__init__.py +19 -0
- zenml/integrations/vllm/services/vllm_deployment.py +206 -0
- zenml/integrations/wandb/__init__.py +1 -0
- zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +21 -18
- zenml/integrations/whylogs/__init__.py +18 -2
- zenml/integrations/whylogs/data_validators/whylogs_data_validator.py +3 -3
- zenml/integrations/whylogs/flavors/whylogs_data_validator_flavor.py +1 -1
- zenml/integrations/whylogs/materializers/whylogs_materializer.py +14 -21
- zenml/integrations/xgboost/materializers/xgboost_booster_materializer.py +11 -22
- zenml/integrations/xgboost/materializers/xgboost_dmatrix_materializer.py +10 -19
- zenml/io/fileio.py +1 -0
- zenml/io/filesystem.py +2 -2
- zenml/io/local_filesystem.py +3 -3
- zenml/logger.py +41 -17
- zenml/logging/__init__.py +5 -0
- zenml/logging/step_logging.py +280 -32
- zenml/{new/steps → login}/__init__.py +4 -1
- zenml/login/credentials.py +370 -0
- zenml/login/credentials_store.py +638 -0
- zenml/{new/pipelines → login/pro}/__init__.py +4 -1
- zenml/login/pro/client.py +492 -0
- zenml/login/pro/constants.py +28 -0
- zenml/{zen_stores/schemas/identity_schemas.py → login/pro/models.py} +9 -11
- zenml/login/pro/organization/__init__.py +14 -0
- zenml/login/pro/organization/client.py +79 -0
- zenml/{lineage_graph/node/base_node.py → login/pro/organization/models.py} +13 -12
- zenml/{_hub → login/pro/tenant}/__init__.py +2 -2
- zenml/login/pro/tenant/client.py +92 -0
- zenml/login/pro/tenant/models.py +176 -0
- zenml/login/pro/utils.py +107 -0
- zenml/login/server_info.py +52 -0
- zenml/{cli → login}/web_login.py +71 -21
- zenml/materializers/__init__.py +2 -4
- zenml/materializers/base_materializer.py +180 -51
- zenml/materializers/built_in_materializer.py +50 -23
- zenml/materializers/cloudpickle_materializer.py +4 -5
- zenml/materializers/numpy_materializer.py +23 -233
- zenml/materializers/pandas_materializer.py +22 -174
- zenml/materializers/pydantic_materializer.py +2 -2
- zenml/materializers/service_materializer.py +12 -10
- zenml/materializers/structured_string_materializer.py +12 -6
- zenml/materializers/uuid_materializer.py +79 -0
- zenml/metadata/lazy_load.py +33 -17
- zenml/metadata/metadata_types.py +112 -3
- zenml/model/lazy_load.py +85 -4
- zenml/model/model.py +236 -226
- zenml/model/utils.py +99 -141
- zenml/model_deployers/base_model_deployer.py +319 -47
- zenml/model_registries/base_model_registry.py +17 -15
- zenml/models/__init__.py +254 -175
- zenml/models/v2/base/base.py +254 -112
- zenml/models/v2/base/base_plugin_flavor.py +76 -0
- zenml/models/v2/base/filter.py +530 -199
- zenml/models/v2/base/page.py +2 -12
- zenml/models/v2/base/scoped.py +292 -22
- zenml/models/v2/core/action.py +276 -0
- zenml/models/v2/core/action_flavor.py +57 -0
- zenml/models/v2/core/api_key.py +35 -12
- zenml/models/v2/core/artifact.py +126 -6
- zenml/models/v2/core/artifact_version.py +289 -65
- zenml/models/v2/core/artifact_visualization.py +10 -4
- zenml/models/v2/core/code_reference.py +13 -4
- zenml/models/v2/core/code_repository.py +39 -16
- zenml/models/v2/core/component.py +113 -61
- zenml/models/v2/core/device.py +25 -5
- zenml/models/v2/core/event_source.py +244 -0
- zenml/models/v2/core/event_source_flavor.py +67 -0
- zenml/models/v2/core/flavor.py +90 -27
- zenml/models/v2/core/logs.py +81 -12
- zenml/models/v2/core/model.py +91 -42
- zenml/models/v2/core/model_version.py +100 -55
- zenml/models/v2/core/model_version_artifact.py +96 -89
- zenml/models/v2/core/model_version_pipeline_run.py +86 -53
- zenml/models/v2/core/pipeline.py +205 -80
- zenml/models/v2/core/pipeline_build.py +110 -21
- zenml/models/v2/core/pipeline_deployment.py +101 -36
- zenml/models/v2/core/pipeline_run.py +545 -33
- zenml/models/v2/core/run_metadata.py +23 -181
- zenml/models/v2/core/run_template.py +439 -0
- zenml/models/v2/core/schedule.py +66 -29
- zenml/models/v2/core/secret.py +33 -21
- zenml/models/v2/core/server_settings.py +224 -0
- zenml/models/v2/core/service.py +500 -0
- zenml/models/v2/core/service_account.py +40 -15
- zenml/models/v2/core/service_connector.py +247 -49
- zenml/models/v2/core/stack.py +163 -70
- zenml/models/v2/core/step_run.py +210 -48
- zenml/models/v2/core/tag.py +21 -8
- zenml/models/v2/core/tag_resource.py +13 -4
- zenml/models/v2/core/trigger.py +422 -0
- zenml/models/v2/core/trigger_execution.py +119 -0
- zenml/models/v2/core/user.py +136 -69
- zenml/models/v2/core/workspace.py +26 -7
- zenml/models/v2/misc/auth_models.py +11 -2
- zenml/models/v2/misc/build_item.py +3 -3
- zenml/models/v2/misc/external_user.py +3 -6
- zenml/models/v2/misc/info_models.py +78 -0
- zenml/models/v2/misc/loaded_visualization.py +2 -2
- zenml/models/v2/misc/run_metadata.py +38 -0
- zenml/models/v2/misc/server_models.py +100 -0
- zenml/models/v2/misc/service_connector_type.py +9 -17
- zenml/models/v2/misc/stack_deployment.py +96 -0
- zenml/models/v2/misc/user_auth.py +7 -9
- zenml/orchestrators/__init__.py +4 -0
- zenml/orchestrators/base_orchestrator.py +136 -25
- zenml/orchestrators/containerized_orchestrator.py +1 -0
- zenml/orchestrators/dag_runner.py +18 -3
- zenml/orchestrators/input_utils.py +109 -48
- zenml/orchestrators/local/local_orchestrator.py +10 -0
- zenml/orchestrators/local_docker/local_docker_orchestrator.py +14 -42
- zenml/orchestrators/output_utils.py +16 -6
- zenml/orchestrators/publish_utils.py +12 -5
- zenml/orchestrators/step_launcher.py +142 -194
- zenml/orchestrators/step_run_utils.py +386 -0
- zenml/orchestrators/step_runner.py +181 -270
- zenml/orchestrators/utils.py +219 -84
- zenml/orchestrators/wheeled_orchestrator.py +147 -0
- zenml/pipelines/__init__.py +3 -16
- zenml/{new/pipelines → pipelines}/build_utils.py +287 -47
- zenml/{new/pipelines → pipelines}/pipeline_context.py +6 -2
- zenml/pipelines/pipeline_decorator.py +40 -64
- zenml/{new/pipelines/pipeline.py → pipelines/pipeline_definition.py} +376 -440
- zenml/pipelines/run_utils.py +358 -0
- zenml/plugins/__init__.py +0 -0
- zenml/plugins/base_plugin_flavor.py +88 -0
- zenml/plugins/plugin_flavor_registry.py +342 -0
- zenml/secret/base_secret.py +7 -8
- zenml/secret/schemas/basic_auth_secret_schema.py +0 -1
- zenml/service_connectors/docker_service_connector.py +19 -4
- zenml/service_connectors/service_connector.py +12 -14
- zenml/service_connectors/service_connector_registry.py +71 -55
- zenml/service_connectors/service_connector_utils.py +418 -0
- zenml/services/__init__.py +0 -2
- zenml/services/container/container_service.py +9 -6
- zenml/services/container/container_service_endpoint.py +1 -1
- zenml/services/container/entrypoint.py +3 -2
- zenml/services/local/local_daemon_entrypoint.py +9 -6
- zenml/services/local/local_service.py +1 -1
- zenml/services/local/local_service_endpoint.py +1 -1
- zenml/services/service.py +222 -130
- zenml/services/service_status.py +2 -1
- zenml/services/service_type.py +6 -5
- zenml/stack/flavor.py +25 -18
- zenml/stack/flavor_registry.py +4 -4
- zenml/stack/stack.py +20 -131
- zenml/stack/stack_component.py +136 -110
- zenml/stack/utils.py +36 -15
- zenml/stack_deployments/__init__.py +14 -0
- zenml/stack_deployments/aws_stack_deployment.py +320 -0
- zenml/stack_deployments/azure_stack_deployment.py +315 -0
- zenml/stack_deployments/gcp_stack_deployment.py +315 -0
- zenml/stack_deployments/stack_deployment.py +232 -0
- zenml/stack_deployments/utils.py +48 -0
- zenml/step_operators/step_operator_entrypoint_configuration.py +2 -1
- zenml/steps/__init__.py +3 -9
- zenml/steps/base_step.py +172 -315
- zenml/{new/steps → steps}/decorated_step.py +1 -0
- zenml/steps/entrypoint_function_utils.py +33 -93
- zenml/{new/steps → steps}/step_context.py +70 -50
- zenml/steps/step_decorator.py +47 -93
- zenml/steps/step_invocation.py +22 -60
- zenml/steps/utils.py +161 -48
- zenml/types.py +14 -1
- zenml/utils/archivable.py +178 -0
- zenml/utils/callback_registry.py +71 -0
- zenml/utils/code_repository_utils.py +1 -0
- zenml/utils/code_utils.py +346 -0
- zenml/utils/cuda_utils.py +50 -0
- zenml/utils/dashboard_utils.py +67 -21
- zenml/utils/deprecation_utils.py +22 -24
- zenml/utils/dict_utils.py +22 -0
- zenml/utils/docker_utils.py +34 -5
- zenml/utils/downloaded_repository_context.py +1 -0
- zenml/utils/env_utils.py +55 -1
- zenml/utils/filesync_model.py +65 -28
- zenml/utils/function_utils.py +260 -0
- zenml/utils/integration_utils.py +1 -0
- zenml/utils/json_utils.py +131 -0
- zenml/utils/materializer_utils.py +1 -1
- zenml/utils/metadata_utils.py +368 -0
- zenml/utils/notebook_utils.py +136 -0
- zenml/utils/package_utils.py +89 -0
- zenml/utils/pagination_utils.py +9 -7
- zenml/utils/pipeline_docker_image_builder.py +152 -149
- zenml/utils/pydantic_utils.py +276 -66
- zenml/utils/requirements_utils.py +71 -0
- zenml/utils/secret_utils.py +66 -12
- zenml/utils/settings_utils.py +2 -1
- zenml/utils/singleton.py +15 -3
- zenml/utils/source_code_utils.py +1 -0
- zenml/utils/source_utils.py +236 -14
- zenml/utils/string_utils.py +140 -0
- zenml/utils/typed_model.py +5 -3
- zenml/utils/typing_utils.py +223 -0
- zenml/utils/visualization_utils.py +5 -3
- zenml/utils/yaml_utils.py +1 -1
- zenml/zen_server/auth.py +387 -55
- zenml/zen_server/cache.py +208 -0
- zenml/zen_server/cloud_utils.py +253 -0
- zenml/zen_server/csrf.py +91 -0
- zenml/zen_server/dashboard/assets/404-Dfq64Boz.js +1 -0
- zenml/zen_server/dashboard/assets/@radix-DeK6qiuw.js +85 -0
- zenml/zen_server/dashboard/assets/@react-router-B3Z5rLr2.js +29 -0
- zenml/zen_server/dashboard/assets/@reactflow-BUNIMFeC.js +17 -0
- zenml/zen_server/dashboard/assets/@reactflow-C26Olbza.css +1 -0
- zenml/zen_server/dashboard/assets/@tanstack-DT5WLu9C.js +22 -0
- zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-B73Vs10T.js +1 -0
- zenml/zen_server/dashboard/assets/CodeSnippet-Bbx6fIb6.css +1 -0
- zenml/zen_server/dashboard/assets/CodeSnippet-DIJRT2NT.js +9 -0
- zenml/zen_server/dashboard/assets/CollapsibleCard-BzUHGZOU.js +1 -0
- zenml/zen_server/dashboard/assets/Commands-BEGyld4c.js +1 -0
- zenml/zen_server/dashboard/assets/ComponentBadge-xyKiek1s.js +1 -0
- zenml/zen_server/dashboard/assets/CopyButton-DhW-mapu.js +2 -0
- zenml/zen_server/dashboard/assets/CsvVizualization-D8oazBiE.js +15 -0
- zenml/zen_server/dashboard/assets/DeleteAlertDialog-WkSIIgfy.js +1 -0
- zenml/zen_server/dashboard/assets/DialogItem-Bgroeg29.js +1 -0
- zenml/zen_server/dashboard/assets/DisplayDate-CDMUcQHS.js +1 -0
- zenml/zen_server/dashboard/assets/EmptyState-BzdlCwp3.js +1 -0
- zenml/zen_server/dashboard/assets/Error-CY5tlu17.js +1 -0
- zenml/zen_server/dashboard/assets/ExecutionStatus-G8mjIaeA.js +1 -0
- zenml/zen_server/dashboard/assets/Helpbox-Bb1ed--O.js +1 -0
- zenml/zen_server/dashboard/assets/Infobox-Da6-76M2.js +1 -0
- zenml/zen_server/dashboard/assets/InlineAvatar-DqnZaBNq.js +1 -0
- zenml/zen_server/dashboard/assets/Lock-CYYy18Mm.js +1 -0
- zenml/zen_server/dashboard/assets/MarkdownVisualization-ylXaAxev.js +14 -0
- zenml/zen_server/dashboard/assets/NestedCollapsible-aK5ojKoF.js +1 -0
- zenml/zen_server/dashboard/assets/NumberBox-Dtp3J6g5.js +1 -0
- zenml/zen_server/dashboard/assets/Partials-CqZp5NMX.js +1 -0
- zenml/zen_server/dashboard/assets/PasswordChecker-B0nadgh6.js +1 -0
- zenml/zen_server/dashboard/assets/ProBadge-B4tRUYve.js +1 -0
- zenml/zen_server/dashboard/assets/ProCta-CZuP29Qz.js +1 -0
- zenml/zen_server/dashboard/assets/ProviderIcon-Bd7GUQ1_.js +1 -0
- zenml/zen_server/dashboard/assets/ProviderRadio-mstdqzsS.js +1 -0
- zenml/zen_server/dashboard/assets/RunSelector-CsruSB4i.js +1 -0
- zenml/zen_server/dashboard/assets/RunsBody-DxxtWVYz.js +1 -0
- zenml/zen_server/dashboard/assets/SearchField-D6tPxyqw.js +1 -0
- zenml/zen_server/dashboard/assets/SecretTooltip-CLzJIYW_.js +1 -0
- zenml/zen_server/dashboard/assets/SetPassword-Yn50ooBC.js +1 -0
- zenml/zen_server/dashboard/assets/StackList-U537qoYd.js +1 -0
- zenml/zen_server/dashboard/assets/Tabs-CNv-eTYM.js +1 -0
- zenml/zen_server/dashboard/assets/Tick-jEIevzVf.js +1 -0
- zenml/zen_server/dashboard/assets/UpdatePasswordSchemas-C16GW-kX.js +1 -0
- zenml/zen_server/dashboard/assets/UsageReason-Bf2tzhv1.js +1 -0
- zenml/zen_server/dashboard/assets/WizardFooter-D6i-AP1K.js +1 -0
- zenml/zen_server/dashboard/assets/acp-DOsXjFc7.webp +0 -0
- zenml/zen_server/dashboard/assets/adam-e-y0WnB_.webp +0 -0
- zenml/zen_server/dashboard/assets/alex-DcCuDHPg.webp +0 -0
- zenml/zen_server/dashboard/assets/all-pipeline-runs-query-DUti43aF.js +1 -0
- zenml/zen_server/dashboard/assets/baris-C0ZrZ10g.webp +0 -0
- zenml/zen_server/dashboard/assets/check-DloQpStc.js +1 -0
- zenml/zen_server/dashboard/assets/check-circle-jNbX5-sR.js +1 -0
- zenml/zen_server/dashboard/assets/chevron-down-6JyMkfjR.js +1 -0
- zenml/zen_server/dashboard/assets/chevron-right-double-D7ojK9Co.js +1 -0
- zenml/zen_server/dashboard/assets/cloud-squares-DeRLMopf.svg +43 -0
- zenml/zen_server/dashboard/assets/code-browser-CUFUIHfp.js +1 -0
- zenml/zen_server/dashboard/assets/code-snippets-CqONne41.js +13 -0
- zenml/zen_server/dashboard/assets/components-Br2ezRib.js +1 -0
- zenml/zen_server/dashboard/assets/connectors-video-C9qY4syJ.svg +21 -0
- zenml/zen_server/dashboard/assets/copy-C8XQA2Ug.js +1 -0
- zenml/zen_server/dashboard/assets/create-stack-Ch2WPs9U.js +1 -0
- zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +1 -0
- zenml/zen_server/dashboard/assets/delete-run-Byf9hTjA.js +1 -0
- zenml/zen_server/dashboard/assets/docker-BdA9vrnW.js +1 -0
- zenml/zen_server/dashboard/assets/dots-horizontal-otGBOSDJ.js +1 -0
- zenml/zen_server/dashboard/assets/flyte-Cj-xy_8I.svg +10 -0
- zenml/zen_server/dashboard/assets/form-schemas-BZqKBPBF.js +1 -0
- zenml/zen_server/dashboard/assets/gcp-CFtm4BA7.js +1 -0
- zenml/zen_server/dashboard/assets/hamza-NKKOZz1I.webp +0 -0
- zenml/zen_server/dashboard/assets/help-Cc9bBIJH.js +1 -0
- zenml/zen_server/dashboard/assets/index-CE0aQlv8.js +55 -0
- zenml/zen_server/dashboard/assets/index-CtdYkjUi.js +1 -0
- zenml/zen_server/dashboard/assets/index-CyBKZcpO.js +1 -0
- zenml/zen_server/dashboard/assets/index-DXvT1_Um.css +1 -0
- zenml/zen_server/dashboard/assets/index-Uu49AX48.js +1 -0
- zenml/zen_server/dashboard/assets/index-v6gQjDEo.js +1 -0
- zenml/zen_server/dashboard/assets/index.esm-Dy6Z9Ung.js +1 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-BLGc9T1a.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-ZzOtrSSW.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-D4Vwzodn.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-DH2hs3aW.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-BGBWG807.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-BuzJQFbW.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-BPnxn4xp.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-Dc4VJyIJ.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-BShVwWPj.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-CUiC4oBV.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-Bt9VVOA-.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-CaqZN2hq.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-400-normal-BZzXV7-1.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-400-normal-DxZsaF_h.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-500-normal-CeQXL5ds.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-500-normal-d_eO-yCQ.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-600-normal-CwicyhtI.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-600-normal-Dhlb-90d.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-Bput3-QP.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-DCpCPQOf.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-B6guLgqG.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-M2hEX8vc.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-C9WLioJ8.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-Cnui8OiR.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-400-normal-BOOGhInR.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-400-normal-gitzw0hO.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-500-normal-D2bGa7uu.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-500-normal-deR1Tlfd.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-600-normal-B5cFAncS.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-600-normal-D273HNI0.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-C1t-h-pH.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-hnt3BR84.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-CIS2RHJS.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-UMdmhHu2.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-BnYJhD27.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-CAF0vJDd.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-BUNmGMP1.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-DQPw2Hwd.woff +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
- zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-Cm6aH8_k.woff +0 -0
- zenml/zen_server/dashboard/assets/key-icon-aH-QIa5R.js +1 -0
- zenml/zen_server/dashboard/assets/kubernetes-B2wmAJ1d.js +1 -0
- zenml/zen_server/dashboard/assets/layout-BtHBmE4w.js +1 -0
- zenml/zen_server/dashboard/assets/link-external-b9AXw_sW.js +1 -0
- zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +1 -0
- zenml/zen_server/dashboard/assets/login-mutation-DNDVp_2H.js +1 -0
- zenml/zen_server/dashboard/assets/logs-WMSM52RF.js +1 -0
- zenml/zen_server/dashboard/assets/mcp-Cb1aMeoq.webp +0 -0
- zenml/zen_server/dashboard/assets/metaflow-weOkWNyT.svg +10 -0
- zenml/zen_server/dashboard/assets/not-found-Bmup4ctE.js +1 -0
- zenml/zen_server/dashboard/assets/package-C6uypY4h.js +1 -0
- zenml/zen_server/dashboard/assets/page--XLMzHrn.js +1 -0
- zenml/zen_server/dashboard/assets/page-ANYGfEUL.js +1 -0
- zenml/zen_server/dashboard/assets/page-B5Sr8pib.js +1 -0
- zenml/zen_server/dashboard/assets/page-BC27C_OI.js +2 -0
- zenml/zen_server/dashboard/assets/page-BNxYrN0q.js +1 -0
- zenml/zen_server/dashboard/assets/page-BYJfqgLN.js +1 -0
- zenml/zen_server/dashboard/assets/page-B_0XkV48.js +1 -0
- zenml/zen_server/dashboard/assets/page-BrmJp1Wt.js +1 -0
- zenml/zen_server/dashboard/assets/page-C2nU3Gxn.js +1 -0
- zenml/zen_server/dashboard/assets/page-C70wZtV2.js +1 -0
- zenml/zen_server/dashboard/assets/page-CHRn1fQm.js +1 -0
- zenml/zen_server/dashboard/assets/page-CWr96ZKN.js +1 -0
- zenml/zen_server/dashboard/assets/page-CXAbSyp9.js +1 -0
- zenml/zen_server/dashboard/assets/page-CaeI9ptC.js +1 -0
- zenml/zen_server/dashboard/assets/page-Cc8ZEuj4.js +1 -0
- zenml/zen_server/dashboard/assets/page-CltCNL0T.js +1 -0
- zenml/zen_server/dashboard/assets/page-CmlYj7Nl.js +1 -0
- zenml/zen_server/dashboard/assets/page-D6Ev5P8V.js +1 -0
- zenml/zen_server/dashboard/assets/page-D9Oh05fl.js +1 -0
- zenml/zen_server/dashboard/assets/page-DGlm1RVc.js +1 -0
- zenml/zen_server/dashboard/assets/page-DN4BVIOL.js +1 -0
- zenml/zen_server/dashboard/assets/page-Dif8CWyZ.js +1 -0
- zenml/zen_server/dashboard/assets/page-DlIi5ThM.js +1 -0
- zenml/zen_server/dashboard/assets/page-DoW7YxTu.js +1 -0
- zenml/zen_server/dashboard/assets/page-Dth9X1Ih.js +1 -0
- zenml/zen_server/dashboard/assets/page-DweqqCkF.js +1 -0
- zenml/zen_server/dashboard/assets/page-DyOJ_pq3.js +1 -0
- zenml/zen_server/dashboard/assets/page-Hn8q9iJZ.js +1 -0
- zenml/zen_server/dashboard/assets/page-IhckKFnD.js +6 -0
- zenml/zen_server/dashboard/assets/page-LyZ_l8vR.js +1 -0
- zenml/zen_server/dashboard/assets/page-PamGpk0j.js +1 -0
- zenml/zen_server/dashboard/assets/page-PxOWfKgF.js +2 -0
- zenml/zen_server/dashboard/assets/persist-DeXRG61d.js +1 -0
- zenml/zen_server/dashboard/assets/persist-vP0-Xl4f.js +1 -0
- zenml/zen_server/dashboard/assets/plus-tf1V2hTJ.js +1 -0
- zenml/zen_server/dashboard/assets/refresh-BjOeWlEq.js +1 -0
- zenml/zen_server/dashboard/assets/repos-video-D8kpu60k.svg +9 -0
- zenml/zen_server/dashboard/assets/rocket-DjT2cDvG.js +1 -0
- zenml/zen_server/dashboard/assets/service-DH_oUqQj.js +2 -0
- zenml/zen_server/dashboard/assets/settings_preview-0JLrRgHP.webp +0 -0
- zenml/zen_server/dashboard/assets/sharedSchema-Bw1_Wa7l.js +14 -0
- zenml/zen_server/dashboard/assets/stack-detail-query-B_0R_fd6.js +1 -0
- zenml/zen_server/dashboard/assets/stefan-B08Ftbba.webp +0 -0
- zenml/zen_server/dashboard/assets/templates-1S_8WeSK.webp +0 -0
- zenml/zen_server/dashboard/assets/tick-circle-BEX_Tp4v.js +1 -0
- zenml/zen_server/dashboard/assets/tour-cover-BYfeen6M.webp +0 -0
- zenml/zen_server/dashboard/assets/trash-arLUMWMS.js +1 -0
- zenml/zen_server/dashboard/assets/update-server-settings-mutation-D9qYhfaN.js +1 -0
- zenml/zen_server/dashboard/assets/upgrade-form-CwRHBuXB.webp +0 -0
- zenml/zen_server/dashboard/assets/url-Dh93fvh0.js +1 -0
- zenml/zen_server/dashboard/assets/zod-BwEbpOxH.js +1 -0
- zenml/zen_server/dashboard/index.html +19 -1
- zenml/zen_server/deploy/__init__.py +7 -16
- zenml/zen_server/deploy/base_provider.py +49 -78
- zenml/zen_server/deploy/{local → daemon}/__init__.py +3 -3
- zenml/zen_server/deploy/{local/local_provider.py → daemon/daemon_provider.py} +48 -66
- zenml/zen_server/deploy/{local/local_zen_server.py → daemon/daemon_zen_server.py} +78 -62
- zenml/zen_server/deploy/deployer.py +94 -175
- zenml/zen_server/deploy/deployment.py +23 -17
- zenml/zen_server/deploy/docker/docker_provider.py +15 -31
- zenml/zen_server/deploy/docker/docker_zen_server.py +30 -35
- zenml/zen_server/deploy/helm/Chart.yaml +1 -1
- zenml/zen_server/deploy/helm/README.md +3 -13
- zenml/zen_server/deploy/helm/templates/NOTES.txt +23 -7
- zenml/zen_server/deploy/helm/templates/_environment.tpl +175 -23
- zenml/zen_server/deploy/helm/templates/server-db-job.yaml +45 -18
- zenml/zen_server/deploy/helm/templates/server-db-pvc.yaml +25 -0
- zenml/zen_server/deploy/helm/templates/server-deployment.yaml +22 -6
- zenml/zen_server/deploy/helm/templates/server-secret.yaml +11 -10
- zenml/zen_server/deploy/helm/values.yaml +210 -28
- zenml/zen_server/exceptions.py +20 -1
- zenml/zen_server/feature_gate/__init__.py +13 -0
- zenml/zen_server/feature_gate/endpoint_utils.py +61 -0
- zenml/zen_server/feature_gate/feature_gate_interface.py +49 -0
- zenml/zen_server/feature_gate/zenml_cloud_feature_gate.py +125 -0
- zenml/zen_server/jwt.py +64 -32
- zenml/zen_server/rate_limit.py +200 -0
- zenml/zen_server/rbac/endpoint_utils.py +92 -9
- zenml/zen_server/rbac/models.py +21 -17
- zenml/zen_server/rbac/rbac_sql_zen_store.py +175 -0
- zenml/zen_server/rbac/utils.py +71 -30
- zenml/zen_server/rbac/zenml_cloud_rbac.py +13 -188
- zenml/zen_server/routers/actions_endpoints.py +324 -0
- zenml/zen_server/routers/artifact_version_endpoints.py +28 -2
- zenml/zen_server/routers/auth_endpoints.py +249 -131
- zenml/zen_server/routers/code_repositories_endpoints.py +1 -0
- zenml/zen_server/routers/devices_endpoints.py +56 -49
- zenml/zen_server/routers/event_source_endpoints.py +327 -0
- zenml/zen_server/routers/logs_endpoints.py +66 -0
- zenml/zen_server/routers/model_versions_endpoints.py +59 -0
- zenml/zen_server/routers/models_endpoints.py +7 -1
- zenml/zen_server/routers/pipeline_builds_endpoints.py +6 -1
- zenml/zen_server/routers/pipeline_deployments_endpoints.py +35 -0
- zenml/zen_server/routers/pipelines_endpoints.py +19 -32
- zenml/zen_server/routers/plugin_endpoints.py +107 -0
- zenml/zen_server/routers/run_templates_endpoints.py +212 -0
- zenml/zen_server/routers/runs_endpoints.py +91 -32
- zenml/zen_server/routers/schedule_endpoints.py +1 -0
- zenml/zen_server/routers/secrets_endpoints.py +4 -2
- zenml/zen_server/routers/server_endpoints.py +186 -4
- zenml/zen_server/routers/service_connectors_endpoints.py +56 -0
- zenml/zen_server/routers/service_endpoints.py +180 -0
- zenml/zen_server/routers/stack_components_endpoints.py +2 -1
- zenml/zen_server/routers/stack_deployment_endpoints.py +164 -0
- zenml/zen_server/routers/steps_endpoints.py +21 -12
- zenml/zen_server/routers/triggers_endpoints.py +336 -0
- zenml/zen_server/routers/users_endpoints.py +280 -45
- zenml/zen_server/routers/webhook_endpoints.py +127 -0
- zenml/zen_server/routers/workspaces_endpoints.py +220 -185
- zenml/zen_server/secure_headers.py +120 -0
- zenml/{new → zen_server/template_execution}/__init__.py +1 -1
- zenml/zen_server/template_execution/runner_entrypoint_configuration.py +42 -0
- zenml/zen_server/template_execution/utils.py +474 -0
- zenml/zen_server/template_execution/workload_manager_interface.py +92 -0
- zenml/zen_server/utils.py +374 -74
- zenml/zen_server/zen_server_api.py +299 -52
- zenml/zen_stores/base_zen_store.py +90 -58
- zenml/zen_stores/migrations/alembic.py +22 -9
- zenml/zen_stores/migrations/env.py +2 -2
- zenml/zen_stores/migrations/utils.py +731 -0
- zenml/zen_stores/migrations/versions/0.21.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.21.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.22.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.23.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.30.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.31.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.31.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.32.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.32.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.33.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.34.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.35.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.35.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.36.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.36.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.37.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.38.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.39.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.39.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.40.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.40.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.40.2_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.40.3_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.41.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.42.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.42.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.43.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.44.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.44.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.44.2_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.44.3_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.45.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.45.1_release_0_45_1.py +0 -1
- zenml/zen_stores/migrations/versions/0.45.2_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.45.3_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.45.4_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.45.5_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.45.6_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.46.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.46.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.47.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.50.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.51.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.52.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.53.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.53.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.54.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.54.1_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.55.0_release.py +0 -1
- zenml/zen_stores/migrations/versions/0.55.1_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.55.2_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.55.3_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.55.4_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.55.5_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.56.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.56.1_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.56.2_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.56.3_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.56.4_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.57.0.rc1_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.57.0.rc2_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.57.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.57.1_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.58.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.58.1_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.58.2_release.py +23 -0
- 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/0.63.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.64.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.65.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.66.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.67.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.68.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.68.1_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.70.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.71.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/0.72.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/026d4577b6a0_add_code_path.py +39 -0
- zenml/zen_stores/migrations/versions/03742aa7fdd7_add_secrets.py +1 -0
- zenml/zen_stores/migrations/versions/0701da9951a0_added_service_table.py +94 -0
- zenml/zen_stores/migrations/versions/0b06faa59c93_add_service_connectors.py +1 -0
- zenml/zen_stores/migrations/versions/0d707865f404_adding_labels_to_stacks.py +30 -0
- zenml/zen_stores/migrations/versions/0e4735b23577_increase_pipeline_spec_field_length.py +1 -0
- zenml/zen_stores/migrations/versions/1041bc644e0d_remove_secrets_manager.py +6 -3
- zenml/zen_stores/migrations/versions/10a907dad202_delete_mlmd_tables.py +2 -1
- zenml/zen_stores/migrations/versions/14d687c8fa1c_rename_model_config_to_model_version.py +1 -0
- zenml/zen_stores/migrations/versions/19f27d5b234e_add_build_and_deployment_tables.py +1 -0
- zenml/zen_stores/migrations/versions/1a9a9d2a836d_admin_users.py +56 -0
- zenml/zen_stores/migrations/versions/1ac1b9c04da1_make_secrets_values_optional.py +1 -0
- zenml/zen_stores/migrations/versions/1cb6477f72d6_move_artifact_save_type.py +99 -0
- zenml/zen_stores/migrations/versions/1d74e596abb8_add_run_once_start_time_to_schedule.py +36 -0
- zenml/zen_stores/migrations/versions/1d8f30c54477_migrate_to_new_.py +124 -0
- zenml/zen_stores/migrations/versions/248dfd320b68_update_size_of_flavor_config_schema.py +1 -0
- zenml/zen_stores/migrations/versions/25155145c545_separate_actions_and_triggers.py +228 -0
- zenml/zen_stores/migrations/versions/26351d482b9e_add_step_run_unique_constraint.py +37 -0
- zenml/zen_stores/migrations/versions/26b776ad583e_redesign_artifacts.py +9 -10
- zenml/zen_stores/migrations/versions/2d201872e23c_remove_db_dependency_loop.py +29 -0
- zenml/zen_stores/migrations/versions/37835ce041d2_optimizing_database.py +4 -3
- zenml/zen_stores/migrations/versions/389046140cad_data_versioning.py +1 -0
- zenml/zen_stores/migrations/versions/3944116bbd56_rename_project_to_workspace.py +1 -0
- zenml/zen_stores/migrations/versions/3b68abe58f44_add_model_watchtower_entities.py +1 -0
- zenml/zen_stores/migrations/versions/3c5a367730c2_add_environment_info_to_runs.py +1 -0
- zenml/zen_stores/migrations/versions/3dcc5d20e82f_add_last_user_activity.py +51 -0
- zenml/zen_stores/migrations/versions/43a86093b60e_add_labels_for_stack_components.py +1 -0
- zenml/zen_stores/migrations/versions/46506f72f0ed_add_server_settings.py +123 -0
- zenml/zen_stores/migrations/versions/479103df60b6_add_triggers.py +162 -0
- zenml/zen_stores/migrations/versions/4a3087070f4e_add_step_source_code.py +1 -0
- zenml/zen_stores/migrations/versions/4c41c0ca42db_add_code_repository_table.py +1 -0
- zenml/zen_stores/migrations/versions/4d688d8f7aff_rename_model_version_to_model.py +1 -0
- zenml/zen_stores/migrations/versions/4e1972485075_endpoint_artifact_deployment_artifact.py +1 -0
- zenml/zen_stores/migrations/versions/4f66af55fbb9_rename_model_config_model_to_model_.py +1 -0
- zenml/zen_stores/migrations/versions/5330ba58bf20_rename_tables_and_foreign_keys.py +8 -9
- zenml/zen_stores/migrations/versions/5994f9ad0489_introduce_role_permissions.py +4 -2
- zenml/zen_stores/migrations/versions/5cc3f41cf048_add_save_models_to_registry.py +1 -0
- zenml/zen_stores/migrations/versions/6119cd9b93c2_tags_table.py +1 -0
- zenml/zen_stores/migrations/versions/623a234c11f5_add_sdk_docs_url_to_flavors.py +1 -0
- zenml/zen_stores/migrations/versions/6917bce75069_add_pipeline_run_unique_constraint.py +5 -4
- zenml/zen_stores/migrations/versions/6a28c4fd0ef2_add_caching_info.py +1 -0
- zenml/zen_stores/migrations/versions/6f707b385dc1_fix_model_artifacts.py +1 -0
- zenml/zen_stores/migrations/versions/722392c91006_make_is_service_account_mandatory.py +1 -0
- zenml/zen_stores/migrations/versions/72675226b2de_unique_users.py +31 -0
- zenml/zen_stores/migrations/versions/72722dee4686_track_server_version.py +1 -0
- zenml/zen_stores/migrations/versions/7280c14811d6_use_text_type.py +1 -0
- zenml/zen_stores/migrations/versions/728c6369cfaa_add_name_column_to_input_artifact_pk.py +4 -2
- zenml/zen_stores/migrations/versions/729263e47b55_fix_external_input_artifacts.py +1 -0
- zenml/zen_stores/migrations/versions/743ec82b1b3c_update_size_of_build_images.py +3 -2
- zenml/zen_stores/migrations/versions/7500f434b71c_remove_shared_columns.py +4 -2
- zenml/zen_stores/migrations/versions/76a7b9451ccd_add_build_template_deployment_id.py +52 -0
- zenml/zen_stores/migrations/versions/7834208cc3f6_artifact_project_scoping.py +9 -7
- zenml/zen_stores/migrations/versions/7b651bf6822e_track_secrets_in_db.py +7 -7
- zenml/zen_stores/migrations/versions/7d1919bb1ef0_add_run_templates.py +100 -0
- zenml/zen_stores/migrations/versions/7e4a481d17f7_add_identity_table.py +3 -2
- zenml/zen_stores/migrations/versions/7f603e583dd7_fixed_migration.py +2 -1
- zenml/zen_stores/migrations/versions/86fa52918b54_remove_teams_and_roles.py +1 -0
- zenml/zen_stores/migrations/versions/8a64fbfecda0_add_num_outputs_to_run_step.py +1 -0
- zenml/zen_stores/migrations/versions/8ed03137cacc_polymorthic_run_metadata.py +1 -0
- zenml/zen_stores/migrations/versions/904464ea4041_add_pipeline_model_run_unique_constraints.py +192 -0
- zenml/zen_stores/migrations/versions/909550c7c4da_remove_user_hub_token.py +36 -0
- zenml/zen_stores/migrations/versions/93cbda80a732_add_service_accounts.py +1 -0
- zenml/zen_stores/migrations/versions/979eff8fc4b1_add_code_repo_description_and_logo_url.py +1 -0
- zenml/zen_stores/migrations/versions/9971237fa937_artifact_visualizations.py +1 -0
- zenml/zen_stores/migrations/versions/9d8020441014_increase_step_configuration_length.py +1 -0
- zenml/zen_stores/migrations/versions/a1237ba94fd8_add_model_version_producer_run_unique_.py +68 -0
- zenml/zen_stores/migrations/versions/a39c4184c8ce_remove_secrets_manager_flavors.py +3 -2
- zenml/zen_stores/migrations/versions/a91762e6be36_artifact_version_table.py +5 -4
- zenml/zen_stores/migrations/versions/ade72effebaf_added_logs_table.py +1 -0
- zenml/zen_stores/migrations/versions/alembic_start.py +2 -1
- zenml/zen_stores/migrations/versions/b4eccf34dfa3_add_hub_token_to_user_model.py +1 -0
- zenml/zen_stores/migrations/versions/b4fca5241eea_migrate_onboarding_state.py +167 -0
- zenml/zen_stores/migrations/versions/b557b2871693_update_step_run_input_types.py +33 -0
- zenml/zen_stores/migrations/versions/b59aa68fdb1f_simplify_pipelines.py +139 -0
- zenml/zen_stores/migrations/versions/b73bc71f1106_remove_component_spec_path.py +36 -0
- zenml/zen_stores/migrations/versions/bf2120261b5a_add_configured_model_version_id.py +74 -0
- zenml/zen_stores/migrations/versions/c1b18cec3a48_increase_length_on_flavor_config_schema.py +1 -0
- zenml/zen_stores/migrations/versions/c22561cbb3a9_add_artifact_unique_constraints.py +86 -0
- zenml/zen_stores/migrations/versions/cc269488e5a9_separate_run_metadata.py +135 -0
- zenml/zen_stores/migrations/versions/cc9894cb58aa_add_user_metadata.py +41 -0
- zenml/zen_stores/migrations/versions/ccd68b7825ae_add_status_to_pipeline_and_step_run.py +1 -0
- zenml/zen_stores/migrations/versions/d02b3d3464cf_add_orchestrator_run_id_column.py +1 -0
- zenml/zen_stores/migrations/versions/d26471b6fe8f_update_build_filtering.py +1 -0
- zenml/zen_stores/migrations/versions/d7b3acf9aa46_create_schedule_table.py +1 -0
- zenml/zen_stores/migrations/versions/e1d66d91a099_add_stack_and_component_spec_paths_to_.py +1 -0
- zenml/zen_stores/migrations/versions/e5225281b4d3_add_connector_skew_tolerance.py +1 -0
- zenml/zen_stores/migrations/versions/e65aa6708ff7_pipeline_versioning.py +1 -0
- zenml/zen_stores/migrations/versions/ec0d785ca296_create_run_metadata_table.py +1 -0
- zenml/zen_stores/migrations/versions/ec6307720f92_simplify_model_version_links.py +119 -0
- zenml/zen_stores/migrations/versions/f3b3964e3a0f_add_oauth_devices.py +1 -0
- zenml/zen_stores/migrations/versions/f49904a80aa7_increase_length_of_artifact_table_sources.py +1 -0
- zenml/zen_stores/migrations/versions/fbd7f18ced1e_increase_step_run_field_lengths.py +5 -4
- zenml/zen_stores/rest_zen_store.py +1326 -305
- zenml/zen_stores/schemas/__init__.py +22 -3
- zenml/zen_stores/schemas/action_schemas.py +192 -0
- zenml/zen_stores/schemas/api_key_schemas.py +23 -10
- zenml/zen_stores/schemas/artifact_schemas.py +112 -49
- zenml/zen_stores/schemas/artifact_visualization_schemas.py +17 -8
- zenml/zen_stores/schemas/base_schemas.py +27 -0
- zenml/zen_stores/schemas/code_repository_schemas.py +25 -10
- zenml/zen_stores/schemas/component_schemas.py +74 -11
- zenml/zen_stores/schemas/constants.py +16 -0
- zenml/zen_stores/schemas/device_schemas.py +29 -15
- zenml/zen_stores/schemas/event_source_schemas.py +188 -0
- zenml/zen_stores/schemas/flavor_schemas.py +19 -9
- zenml/zen_stores/schemas/logs_schemas.py +12 -6
- zenml/zen_stores/schemas/model_schemas.py +192 -139
- zenml/zen_stores/schemas/pipeline_build_schemas.py +16 -16
- zenml/zen_stores/schemas/pipeline_deployment_schemas.py +58 -17
- zenml/zen_stores/schemas/pipeline_run_schemas.py +170 -35
- zenml/zen_stores/schemas/pipeline_schemas.py +51 -33
- zenml/zen_stores/schemas/run_metadata_schemas.py +28 -78
- zenml/zen_stores/schemas/run_template_schemas.py +267 -0
- zenml/zen_stores/schemas/schedule_schema.py +15 -5
- zenml/zen_stores/schemas/secret_schemas.py +18 -10
- zenml/zen_stores/schemas/server_settings_schemas.py +129 -0
- zenml/zen_stores/schemas/service_connector_schemas.py +13 -6
- zenml/zen_stores/schemas/service_schemas.py +258 -0
- zenml/zen_stores/schemas/stack_schemas.py +23 -6
- zenml/zen_stores/schemas/step_run_schemas.py +132 -41
- zenml/zen_stores/schemas/tag_schemas.py +31 -50
- zenml/zen_stores/schemas/trigger_schemas.py +316 -0
- zenml/zen_stores/schemas/user_schemas.py +66 -23
- zenml/zen_stores/schemas/utils.py +112 -0
- zenml/zen_stores/schemas/workspace_schemas.py +36 -19
- zenml/zen_stores/secrets_stores/aws_secrets_store.py +41 -32
- zenml/zen_stores/secrets_stores/azure_secrets_store.py +20 -23
- zenml/zen_stores/secrets_stores/base_secrets_store.py +80 -12
- zenml/zen_stores/secrets_stores/gcp_secrets_store.py +42 -33
- zenml/zen_stores/secrets_stores/hashicorp_secrets_store.py +7 -11
- zenml/zen_stores/secrets_stores/secrets_store_interface.py +1 -0
- zenml/zen_stores/secrets_stores/service_connector_secrets_store.py +15 -8
- zenml/zen_stores/secrets_stores/sql_secrets_store.py +8 -9
- zenml/zen_stores/sql_zen_store.py +4062 -799
- zenml/zen_stores/template_utils.py +263 -0
- zenml/zen_stores/zen_store_interface.py +614 -44
- zenml_nightly-0.72.0.dev20250116.dist-info/METADATA +486 -0
- zenml_nightly-0.72.0.dev20250116.dist-info/RECORD +1294 -0
- {zenml_nightly-0.55.0.dev20240124.dist-info → zenml_nightly-0.72.0.dev20250116.dist-info}/WHEEL +1 -1
- CLA.md +0 -110
- CODE-OF-CONDUCT.md +0 -132
- CONTRIBUTING.md +0 -260
- README.md +0 -304
- RELEASE_NOTES.md +0 -3919
- ROADMAP.md +0 -5
- SECURITY.md +0 -15
- zenml/_hub/client.py +0 -285
- zenml/_hub/constants.py +0 -21
- zenml/_hub/utils.py +0 -80
- zenml/api.py +0 -61
- zenml/cli/hub.py +0 -1115
- zenml/cli/stack_recipes.py +0 -469
- zenml/integrations/gcp/google_cloud_function.py +0 -187
- zenml/integrations/gcp/google_cloud_scheduler.py +0 -83
- zenml/integrations/gcp/orchestrators/vertex_scheduler/main.py +0 -91
- zenml/integrations/gcp/orchestrators/vertex_scheduler/requirements.txt +0 -2
- zenml/integrations/kserve/__init__.py +0 -57
- zenml/integrations/kserve/custom_deployer/zenml_custom_model.py +0 -175
- zenml/integrations/kserve/flavors/kserve_model_deployer_flavor.py +0 -137
- zenml/integrations/kserve/model_deployers/kserve_model_deployer.py +0 -1003
- zenml/integrations/kserve/secret_schemas/secret_schemas.py +0 -65
- zenml/integrations/kserve/services/kserve_deployment.py +0 -596
- zenml/integrations/kserve/steps/__init__.py +0 -22
- zenml/integrations/kserve/steps/kserve_deployer.py +0 -472
- zenml/integrations/kserve/steps/kserve_step_utils.py +0 -293
- zenml/integrations/kubeflow/utils.py +0 -96
- zenml/lineage_graph/lineage_graph.py +0 -244
- zenml/lineage_graph/node/artifact_node.py +0 -52
- zenml/lineage_graph/node/step_node.py +0 -41
- zenml/models/v2/base/internal.py +0 -37
- zenml/models/v2/base/update.py +0 -40
- zenml/models/v2/misc/hub_plugin_models.py +0 -79
- zenml/new/pipelines/deserialization_utils.py +0 -291
- zenml/new/pipelines/model_utils.py +0 -72
- zenml/new/pipelines/pipeline_decorator.py +0 -109
- zenml/new/steps/step_decorator.py +0 -160
- zenml/pipelines/base_pipeline.py +0 -274
- zenml/post_execution/pipeline.py +0 -58
- zenml/post_execution/pipeline_run.py +0 -55
- zenml/services/service_registry.py +0 -214
- zenml/services/terraform/__init__.py +0 -14
- zenml/services/terraform/terraform_service.py +0 -441
- zenml/steps/step_environment.py +0 -108
- zenml/steps/step_output.py +0 -36
- zenml/utils/mlstacks_utils.py +0 -635
- zenml/utils/terraform_utils.py +0 -42
- zenml/zen_server/dashboard/_redirects +0 -1
- zenml/zen_server/dashboard/asset-manifest.json +0 -131
- zenml/zen_server/dashboard/manifest.json +0 -25
- zenml/zen_server/dashboard/precache-manifest.c139638dcc4d9d3425353266447a2fad.js +0 -462
- zenml/zen_server/dashboard/robots.txt +0 -2
- zenml/zen_server/dashboard/service-worker.js +0 -39
- zenml/zen_server/dashboard/static/css/2.5b37d44a.chunk.css +0 -16
- zenml/zen_server/dashboard/static/css/2.5b37d44a.chunk.css.map +0 -1
- zenml/zen_server/dashboard/static/css/main.77e46c35.chunk.css +0 -2
- zenml/zen_server/dashboard/static/css/main.77e46c35.chunk.css.map +0 -1
- zenml/zen_server/dashboard/static/js/2.bb4cef22.chunk.js +0 -3
- zenml/zen_server/dashboard/static/js/2.bb4cef22.chunk.js.LICENSE.txt +0 -95
- zenml/zen_server/dashboard/static/js/2.bb4cef22.chunk.js.map +0 -1
- zenml/zen_server/dashboard/static/js/main.270838b4.chunk.js +0 -2
- zenml/zen_server/dashboard/static/js/main.270838b4.chunk.js.map +0 -1
- zenml/zen_server/dashboard/static/js/runtime-main.bfca2edd.js +0 -2
- zenml/zen_server/dashboard/static/js/runtime-main.bfca2edd.js.map +0 -1
- zenml/zen_server/dashboard/static/media/AlertTriangle.28aee535.svg +0 -5
- zenml/zen_server/dashboard/static/media/ArrowSquareOut.abfb9bc7.svg +0 -5
- zenml/zen_server/dashboard/static/media/Back.86c23a22.svg +0 -4
- zenml/zen_server/dashboard/static/media/BookOpen.5cb101ff.svg +0 -4
- zenml/zen_server/dashboard/static/media/BoundingBox.1eb98717.svg +0 -10
- zenml/zen_server/dashboard/static/media/Burger.9b1c67d7.svg +0 -3
- zenml/zen_server/dashboard/static/media/Cached.2381fb8d.svg +0 -1
- zenml/zen_server/dashboard/static/media/Calendar.356e11c7.svg +0 -3
- zenml/zen_server/dashboard/static/media/ChartBarHorizontal.0247447b.svg +0 -6
- zenml/zen_server/dashboard/static/media/ChartLine.0d79e18d.svg +0 -4
- zenml/zen_server/dashboard/static/media/ChatDots.2e1c9211.svg +0 -6
- zenml/zen_server/dashboard/static/media/Check.dad6beb2.svg +0 -3
- zenml/zen_server/dashboard/static/media/CheckCircleFilled.c19566d0.svg +0 -3
- zenml/zen_server/dashboard/static/media/Checkbox.af50e31e.svg +0 -3
- zenml/zen_server/dashboard/static/media/ChevronDown.f860ce32.svg +0 -3
- zenml/zen_server/dashboard/static/media/ChevronDownLight.6642d756.svg +0 -3
- zenml/zen_server/dashboard/static/media/ChevronLeft.f6edfcdb.svg +0 -3
- zenml/zen_server/dashboard/static/media/CircleCheck.f98fd6ca.svg +0 -1
- zenml/zen_server/dashboard/static/media/Clock.ffc9de95.svg +0 -3
- zenml/zen_server/dashboard/static/media/Close.74e9efbc.svg +0 -5
- zenml/zen_server/dashboard/static/media/CloseWithBorder.6960930a.svg +0 -3
- zenml/zen_server/dashboard/static/media/CloseWithoutBorder.cd6f71df.svg +0 -3
- zenml/zen_server/dashboard/static/media/CloudArrowUp.0aecb235.svg +0 -6
- zenml/zen_server/dashboard/static/media/Code.ef0f33b5.svg +0 -3
- zenml/zen_server/dashboard/static/media/Config.0be63f8a.svg +0 -1
- zenml/zen_server/dashboard/static/media/Connector.9fd46ef1.svg +0 -10
- zenml/zen_server/dashboard/static/media/Copy.36e2112a.svg +0 -1
- zenml/zen_server/dashboard/static/media/Dashboard.d05787e0.svg +0 -3
- zenml/zen_server/dashboard/static/media/Data.b1c3b5f8.svg +0 -3
- zenml/zen_server/dashboard/static/media/Delete.3c361b28.svg +0 -8
- zenml/zen_server/dashboard/static/media/Docs.7541d478.svg +0 -7
- zenml/zen_server/dashboard/static/media/Download.fba04d87.svg +0 -5
- zenml/zen_server/dashboard/static/media/Edit.490eb294.svg +0 -6
- zenml/zen_server/dashboard/static/media/EmptyRightArrow.23749d01.svg +0 -3
- zenml/zen_server/dashboard/static/media/Example.6396cd37.svg +0 -5
- zenml/zen_server/dashboard/static/media/Extension.1394cd4a.svg +0 -3
- zenml/zen_server/dashboard/static/media/Eye.d9e4ee62.svg +0 -4
- zenml/zen_server/dashboard/static/media/Failed.0213c1a0.svg +0 -1
- zenml/zen_server/dashboard/static/media/FileText.1f15bacd.svg +0 -7
- zenml/zen_server/dashboard/static/media/Filter.ab6b9c0d.svg +0 -3
- zenml/zen_server/dashboard/static/media/Folders.12b29887.svg +0 -5
- zenml/zen_server/dashboard/static/media/FunnelFill.6df4c143.svg +0 -3
- zenml/zen_server/dashboard/static/media/GitCommit.7dd9c2aa.svg +0 -5
- zenml/zen_server/dashboard/static/media/GitHub_Logo.cefc2023.png +0 -0
- zenml/zen_server/dashboard/static/media/Graph.2c63a892.svg +0 -11
- zenml/zen_server/dashboard/static/media/History.08329240.svg +0 -3
- zenml/zen_server/dashboard/static/media/Home.0843b0d5.svg +0 -3
- zenml/zen_server/dashboard/static/media/ImageBuilder.ea762d9c.svg +0 -6
- zenml/zen_server/dashboard/static/media/InProgress.304a0edc.svg +0 -1
- zenml/zen_server/dashboard/static/media/Info.9fe10c5c.svg +0 -3
- zenml/zen_server/dashboard/static/media/KeyboardReturn.491afbe3.svg +0 -3
- zenml/zen_server/dashboard/static/media/Link.72bbb55d.svg +0 -4
- zenml/zen_server/dashboard/static/media/Lock.30f5e1fe.svg +0 -5
- zenml/zen_server/dashboard/static/media/Lock2.a769ea52.svg +0 -3
- zenml/zen_server/dashboard/static/media/LockKey.92f21621.svg +0 -6
- zenml/zen_server/dashboard/static/media/Logs.8bf4d005.svg +0 -5
- zenml/zen_server/dashboard/static/media/MinusCircle.4188f418.svg +0 -4
- zenml/zen_server/dashboard/static/media/ModelRegistry.f0de050a.svg +0 -6
- zenml/zen_server/dashboard/static/media/MultiUser.a2ba7c67.svg +0 -10
- zenml/zen_server/dashboard/static/media/PaginationFirst.92628634.svg +0 -4
- zenml/zen_server/dashboard/static/media/PaginationLast.00d3c732.svg +0 -4
- zenml/zen_server/dashboard/static/media/PaginationNext.86158845.svg +0 -3
- zenml/zen_server/dashboard/static/media/PaginationPrev.60c18a88.svg +0 -3
- zenml/zen_server/dashboard/static/media/Pen.f2d831d4.svg +0 -6
- zenml/zen_server/dashboard/static/media/PhotoCamera.179d6d4c.svg +0 -3
- zenml/zen_server/dashboard/static/media/Pipeline.30d298b0.svg +0 -7
- zenml/zen_server/dashboard/static/media/Plus.5aa1c16b.svg +0 -3
- zenml/zen_server/dashboard/static/media/PlusCircle.92d860dd.svg +0 -5
- zenml/zen_server/dashboard/static/media/Repositories.71a36b8c.svg +0 -3
- zenml/zen_server/dashboard/static/media/RightArrow.f30d3871.svg +0 -29
- zenml/zen_server/dashboard/static/media/Rocket.63bf7b9d.svg +0 -3
- zenml/zen_server/dashboard/static/media/RocketLaunch.1bff2b59.svg +0 -6
- zenml/zen_server/dashboard/static/media/Rubik-Medium.c87313aa.ttf +0 -0
- zenml/zen_server/dashboard/static/media/Rubik-Regular.b3d0902b.ttf +0 -0
- zenml/zen_server/dashboard/static/media/Run.daec4fb2.svg +0 -6
- zenml/zen_server/dashboard/static/media/Search.d1afcce5.svg +0 -4
- zenml/zen_server/dashboard/static/media/Settings.59ca73ae.svg +0 -4
- zenml/zen_server/dashboard/static/media/Share2.46c3ff66.svg +0 -3
- zenml/zen_server/dashboard/static/media/SignOut.6aa718c5.svg +0 -3
- zenml/zen_server/dashboard/static/media/SimplePlus.5cf7ec20.svg +0 -3
- zenml/zen_server/dashboard/static/media/SingleUser.bef3a095.svg +0 -4
- zenml/zen_server/dashboard/static/media/SourceCodePro-Regular.b484b32f.ttf +0 -0
- zenml/zen_server/dashboard/static/media/Stack.19b604ac.svg +0 -5
- zenml/zen_server/dashboard/static/media/StackComponent.b1ba90b5.svg +0 -4
- zenml/zen_server/dashboard/static/media/Star.f0c25022.svg +0 -9
- zenml/zen_server/dashboard/static/media/StarOutline.94ca8cd9.svg +0 -3
- zenml/zen_server/dashboard/static/media/Storefront.4b4796fe.svg +0 -3
- zenml/zen_server/dashboard/static/media/Stream.543e3039.svg +0 -3
- zenml/zen_server/dashboard/static/media/SupportAgent.510ddf1f.svg +0 -8
- zenml/zen_server/dashboard/static/media/Table.77033750.svg +0 -6
- zenml/zen_server/dashboard/static/media/Tool.d5785486.svg +0 -3
- zenml/zen_server/dashboard/static/media/UserPlus.741a99d7.svg +0 -6
- zenml/zen_server/dashboard/static/media/Verified.0625b2a0.svg +0 -3
- zenml/zen_server/dashboard/static/media/addNew.4fb6c939.svg +0 -8
- zenml/zen_server/dashboard/static/media/arrowClose.cbd53f3f.svg +0 -3
- zenml/zen_server/dashboard/static/media/arrowOpen.6ceef0af.svg +0 -3
- zenml/zen_server/dashboard/static/media/check_small.30bc0138.svg +0 -3
- zenml/zen_server/dashboard/static/media/circleArrowSideClose.98d6013e.svg +0 -18
- zenml/zen_server/dashboard/static/media/circleArrowSideOpen.63653df6.svg +0 -18
- zenml/zen_server/dashboard/static/media/image.104fd14b.png +0 -0
- zenml/zen_server/dashboard/static/media/imageAddIcon.e83004a9.svg +0 -7
- zenml/zen_server/dashboard/static/media/logo.93333e5c.svg +0 -1
- zenml/zen_server/dashboard/static/media/logo_small.4204397d.svg +0 -3
- zenml/zen_server/dashboard/static/media/logo_white.d4b4414e.svg +0 -20
- zenml/zen_server/dashboard/static/media/notConnected.5e2c8ea7.svg +0 -8
- zenml/zen_server/dashboard/static/media/plugin-fallback.72c294e6.svg +0 -6
- zenml/zen_server/dashboard/static/media/share.bcd998b0.svg +0 -5
- zenml/zen_server/dashboard/static/media/stars.08a9b19a.svg +0 -8
- zenml/zen_server/deploy/terraform/__init__.py +0 -41
- zenml/zen_server/deploy/terraform/providers/__init__.py +0 -14
- zenml/zen_server/deploy/terraform/providers/aws_provider.py +0 -61
- zenml/zen_server/deploy/terraform/providers/azure_provider.py +0 -59
- zenml/zen_server/deploy/terraform/providers/gcp_provider.py +0 -59
- zenml/zen_server/deploy/terraform/providers/terraform_provider.py +0 -332
- zenml/zen_server/deploy/terraform/recipes/aws/.gitignore +0 -8
- zenml/zen_server/deploy/terraform/recipes/aws/helm.tf +0 -20
- zenml/zen_server/deploy/terraform/recipes/aws/ingress.tf +0 -30
- zenml/zen_server/deploy/terraform/recipes/aws/outputs.tf +0 -14
- zenml/zen_server/deploy/terraform/recipes/aws/printf.cmd +0 -2
- zenml/zen_server/deploy/terraform/recipes/aws/sql.tf +0 -62
- zenml/zen_server/deploy/terraform/recipes/aws/terraform.tf +0 -44
- zenml/zen_server/deploy/terraform/recipes/aws/variables.tf +0 -179
- zenml/zen_server/deploy/terraform/recipes/aws/vpc.tf +0 -47
- zenml/zen_server/deploy/terraform/recipes/aws/zen_server.tf +0 -111
- zenml/zen_server/deploy/terraform/recipes/azure/.gitignore +0 -8
- zenml/zen_server/deploy/terraform/recipes/azure/helm.tf +0 -20
- zenml/zen_server/deploy/terraform/recipes/azure/ingress.tf +0 -30
- zenml/zen_server/deploy/terraform/recipes/azure/key_vault.tf +0 -73
- zenml/zen_server/deploy/terraform/recipes/azure/outputs.tf +0 -14
- zenml/zen_server/deploy/terraform/recipes/azure/printf.cmd +0 -2
- zenml/zen_server/deploy/terraform/recipes/azure/rg.tf +0 -36
- zenml/zen_server/deploy/terraform/recipes/azure/sql.tf +0 -65
- zenml/zen_server/deploy/terraform/recipes/azure/terraform.tf +0 -52
- zenml/zen_server/deploy/terraform/recipes/azure/variables.tf +0 -188
- zenml/zen_server/deploy/terraform/recipes/azure/zen_server.tf +0 -111
- zenml/zen_server/deploy/terraform/recipes/gcp/.gitignore +0 -8
- zenml/zen_server/deploy/terraform/recipes/gcp/helm.tf +0 -20
- zenml/zen_server/deploy/terraform/recipes/gcp/ingress.tf +0 -30
- zenml/zen_server/deploy/terraform/recipes/gcp/outputs.tf +0 -14
- zenml/zen_server/deploy/terraform/recipes/gcp/printf.cmd +0 -2
- zenml/zen_server/deploy/terraform/recipes/gcp/sql.tf +0 -64
- zenml/zen_server/deploy/terraform/recipes/gcp/terraform.tf +0 -44
- zenml/zen_server/deploy/terraform/recipes/gcp/variables.tf +0 -183
- zenml/zen_server/deploy/terraform/recipes/gcp/zen_server.tf +0 -122
- zenml/zen_server/deploy/terraform/terraform_zen_server.py +0 -255
- zenml/zen_server/routers/run_metadata_endpoints.py +0 -97
- zenml_nightly-0.55.0.dev20240124.dist-info/METADATA +0 -438
- zenml_nightly-0.55.0.dev20240124.dist-info/RECORD +0 -1072
- {zenml_nightly-0.55.0.dev20240124.dist-info → zenml_nightly-0.72.0.dev20250116.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.55.0.dev20240124.dist-info → zenml_nightly-0.72.0.dev20250116.dist-info}/entry_points.txt +0 -0
@@ -1,1003 +0,0 @@
|
|
1
|
-
# Copyright (c) ZenML GmbH 2022. 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 KServe Model Deployer."""
|
15
|
-
import base64
|
16
|
-
import json
|
17
|
-
import re
|
18
|
-
from typing import (
|
19
|
-
TYPE_CHECKING,
|
20
|
-
Any,
|
21
|
-
ClassVar,
|
22
|
-
Dict,
|
23
|
-
List,
|
24
|
-
Optional,
|
25
|
-
Type,
|
26
|
-
cast,
|
27
|
-
)
|
28
|
-
from uuid import UUID, uuid4
|
29
|
-
|
30
|
-
from kserve import KServeClient, V1beta1InferenceService, constants, utils
|
31
|
-
from kubernetes import client as k8s_client
|
32
|
-
|
33
|
-
from zenml.analytics.enums import AnalyticsEvent
|
34
|
-
from zenml.analytics.utils import track_handler
|
35
|
-
from zenml.client import Client
|
36
|
-
from zenml.config.build_configuration import BuildConfiguration
|
37
|
-
from zenml.enums import StackComponentType
|
38
|
-
from zenml.integrations.kserve.constants import (
|
39
|
-
KSERVE_CUSTOM_DEPLOYMENT,
|
40
|
-
KSERVE_DOCKER_IMAGE_KEY,
|
41
|
-
)
|
42
|
-
from zenml.integrations.kserve.flavors.kserve_model_deployer_flavor import (
|
43
|
-
KServeModelDeployerConfig,
|
44
|
-
KServeModelDeployerFlavor,
|
45
|
-
)
|
46
|
-
from zenml.integrations.kserve.secret_schemas.secret_schemas import (
|
47
|
-
KServeAzureSecretSchema,
|
48
|
-
KServeGSSecretSchema,
|
49
|
-
KServeS3SecretSchema,
|
50
|
-
)
|
51
|
-
from zenml.integrations.kserve.services.kserve_deployment import (
|
52
|
-
KServeDeploymentConfig,
|
53
|
-
KServeDeploymentService,
|
54
|
-
)
|
55
|
-
from zenml.logger import get_logger
|
56
|
-
from zenml.model_deployers import BaseModelDeployer, BaseModelDeployerFlavor
|
57
|
-
from zenml.secret.base_secret import BaseSecretSchema
|
58
|
-
from zenml.services.service import BaseService, ServiceConfig
|
59
|
-
from zenml.stack import StackValidator
|
60
|
-
|
61
|
-
if TYPE_CHECKING:
|
62
|
-
from zenml.models import PipelineDeploymentBase
|
63
|
-
|
64
|
-
logger = get_logger(__name__)
|
65
|
-
|
66
|
-
DEFAULT_KSERVE_DEPLOYMENT_START_STOP_TIMEOUT = 300
|
67
|
-
|
68
|
-
|
69
|
-
class KubeClientKServeClient(KServeClient): # type: ignore[misc]
|
70
|
-
"""KServe client initialized from a Kubernetes client.
|
71
|
-
|
72
|
-
This is a workaround for the fact that the native KServe client does not
|
73
|
-
support initialization from an existing Kubernetes client.
|
74
|
-
"""
|
75
|
-
|
76
|
-
def __init__(
|
77
|
-
self, kube_client: k8s_client.ApiClient, *args: Any, **kwargs: Any
|
78
|
-
) -> None:
|
79
|
-
"""Initializes the KServe client from a Kubernetes client.
|
80
|
-
|
81
|
-
Args:
|
82
|
-
kube_client: pre-configured Kubernetes client.
|
83
|
-
*args: standard KServe client positional arguments.
|
84
|
-
**kwargs: standard KServe client keyword arguments.
|
85
|
-
"""
|
86
|
-
from kubernetes import client
|
87
|
-
|
88
|
-
self.core_api = client.CoreV1Api(kube_client)
|
89
|
-
self.app_api = client.AppsV1Api(kube_client)
|
90
|
-
self.api_instance = client.CustomObjectsApi(kube_client)
|
91
|
-
|
92
|
-
|
93
|
-
class KServeModelDeployer(BaseModelDeployer):
|
94
|
-
"""KServe model deployer stack component implementation."""
|
95
|
-
|
96
|
-
NAME: ClassVar[str] = "KServe"
|
97
|
-
FLAVOR: ClassVar[Type[BaseModelDeployerFlavor]] = KServeModelDeployerFlavor
|
98
|
-
|
99
|
-
_client: Optional[KServeClient] = None
|
100
|
-
|
101
|
-
@property
|
102
|
-
def config(self) -> KServeModelDeployerConfig:
|
103
|
-
"""Returns the `KServeModelDeployerConfig` config.
|
104
|
-
|
105
|
-
Returns:
|
106
|
-
The configuration.
|
107
|
-
"""
|
108
|
-
return cast(KServeModelDeployerConfig, self._config)
|
109
|
-
|
110
|
-
@property
|
111
|
-
def validator(self) -> Optional[StackValidator]:
|
112
|
-
"""Ensures there is a container registry and image builder in the stack.
|
113
|
-
|
114
|
-
Returns:
|
115
|
-
A `StackValidator` instance.
|
116
|
-
"""
|
117
|
-
# Log deprecation warning
|
118
|
-
logger.warning(
|
119
|
-
"The KServe model deployer is deprecated and is no longer "
|
120
|
-
"being maintained by the ZenML core team. If you are looking for a "
|
121
|
-
"scalable Kubernetes-based model deployment solution, consider "
|
122
|
-
"using Seldon instead: "
|
123
|
-
"https://docs.zenml.io/stacks-and-components/component-guide/model-deployers/seldon",
|
124
|
-
)
|
125
|
-
return StackValidator(
|
126
|
-
required_components={
|
127
|
-
StackComponentType.IMAGE_BUILDER,
|
128
|
-
}
|
129
|
-
)
|
130
|
-
|
131
|
-
@staticmethod
|
132
|
-
def get_model_server_info( # type: ignore[override]
|
133
|
-
service_instance: "KServeDeploymentService",
|
134
|
-
) -> Dict[str, Optional[str]]:
|
135
|
-
"""Return implementation specific information on the model server.
|
136
|
-
|
137
|
-
Args:
|
138
|
-
service_instance: KServe deployment service object
|
139
|
-
|
140
|
-
Returns:
|
141
|
-
A dictionary containing the model server information.
|
142
|
-
"""
|
143
|
-
return {
|
144
|
-
"PREDICTION_URL": service_instance.prediction_url,
|
145
|
-
"PREDICTION_HOSTNAME": service_instance.prediction_hostname,
|
146
|
-
"MODEL_URI": service_instance.config.model_uri,
|
147
|
-
"MODEL_NAME": service_instance.config.model_name,
|
148
|
-
"KSERVE_INFERENCE_SERVICE": service_instance.crd_name,
|
149
|
-
}
|
150
|
-
|
151
|
-
@property
|
152
|
-
def kserve_client(self) -> KServeClient:
|
153
|
-
"""Get the KServe client associated with this model deployer.
|
154
|
-
|
155
|
-
Returns:
|
156
|
-
The KServeclient.
|
157
|
-
|
158
|
-
Raises:
|
159
|
-
RuntimeError: If the Kubernetes namespace is not configured in the
|
160
|
-
stack component when using a service connector to deploy models
|
161
|
-
with KServe.
|
162
|
-
"""
|
163
|
-
# Refresh the client also if the connector has expired
|
164
|
-
if self._client and not self.connector_has_expired():
|
165
|
-
return self._client
|
166
|
-
|
167
|
-
connector = self.get_connector()
|
168
|
-
if connector:
|
169
|
-
if not self.config.kubernetes_namespace:
|
170
|
-
raise RuntimeError(
|
171
|
-
"The Kubernetes namespace must be explicitly configured in "
|
172
|
-
"the stack component when using a service connector to "
|
173
|
-
"deploy models with KServe."
|
174
|
-
)
|
175
|
-
client = connector.connect()
|
176
|
-
if not isinstance(client, k8s_client.ApiClient):
|
177
|
-
raise RuntimeError(
|
178
|
-
f"Expected a k8s_client.ApiClient while trying to use the "
|
179
|
-
f"linked connector, but got {type(client)}."
|
180
|
-
)
|
181
|
-
self._client = KubeClientKServeClient(
|
182
|
-
kube_client=client,
|
183
|
-
)
|
184
|
-
else:
|
185
|
-
self._client = KServeClient(
|
186
|
-
context=self.config.kubernetes_context,
|
187
|
-
)
|
188
|
-
return self._client
|
189
|
-
|
190
|
-
def get_docker_builds(
|
191
|
-
self, deployment: "PipelineDeploymentBase"
|
192
|
-
) -> List["BuildConfiguration"]:
|
193
|
-
"""Gets the Docker builds required for the component.
|
194
|
-
|
195
|
-
Args:
|
196
|
-
deployment: The pipeline deployment for which to get the builds.
|
197
|
-
|
198
|
-
Returns:
|
199
|
-
The required Docker builds.
|
200
|
-
"""
|
201
|
-
builds = []
|
202
|
-
for step_name, step in deployment.step_configurations.items():
|
203
|
-
if step.config.extra.get(KSERVE_CUSTOM_DEPLOYMENT, False) is True:
|
204
|
-
build = BuildConfiguration(
|
205
|
-
key=KSERVE_DOCKER_IMAGE_KEY,
|
206
|
-
settings=step.config.docker_settings,
|
207
|
-
step_name=step_name,
|
208
|
-
)
|
209
|
-
builds.append(build)
|
210
|
-
|
211
|
-
return builds
|
212
|
-
|
213
|
-
def deploy_model(
|
214
|
-
self,
|
215
|
-
config: ServiceConfig,
|
216
|
-
replace: bool = False,
|
217
|
-
timeout: int = DEFAULT_KSERVE_DEPLOYMENT_START_STOP_TIMEOUT,
|
218
|
-
) -> BaseService:
|
219
|
-
"""Create a new KServe deployment or update an existing one.
|
220
|
-
|
221
|
-
This method has two modes of operation, depending on the `replace`
|
222
|
-
argument value:
|
223
|
-
|
224
|
-
* if `replace` is False, calling this method will create a new KServe
|
225
|
-
deployment server to reflect the model and other configuration
|
226
|
-
parameters specified in the supplied KServe deployment `config`.
|
227
|
-
|
228
|
-
* if `replace` is True, this method will first attempt to find an
|
229
|
-
existing KServe deployment that is *equivalent* to the supplied
|
230
|
-
configuration parameters. Two or more KServe deployments are
|
231
|
-
considered equivalent if they have the same `pipeline_name`,
|
232
|
-
`pipeline_step_name` and `model_name` configuration parameters. To
|
233
|
-
put it differently, two KServe deployments are equivalent if
|
234
|
-
they serve versions of the same model deployed by the same pipeline
|
235
|
-
step. If an equivalent KServe deployment is found, it will be
|
236
|
-
updated in place to reflect the new configuration parameters. This
|
237
|
-
allows an existing KServe deployment to retain its prediction
|
238
|
-
URL while performing a rolling update to serve a new model version.
|
239
|
-
|
240
|
-
Callers should set `replace` to True if they want a continuous model
|
241
|
-
deployment workflow that doesn't spin up a new KServe deployment
|
242
|
-
server for each new model version. If multiple equivalent KServe
|
243
|
-
deployments are found, the most recently created deployment is selected
|
244
|
-
to be updated and the others are deleted.
|
245
|
-
|
246
|
-
Args:
|
247
|
-
config: the configuration of the model to be deployed with KServe.
|
248
|
-
replace: set this flag to True to find and update an equivalent
|
249
|
-
KServeDeployment server with the new model instead of
|
250
|
-
starting a new deployment server.
|
251
|
-
timeout: the timeout in seconds to wait for the KServe server
|
252
|
-
to be provisioned and successfully started or updated. If set
|
253
|
-
to 0, the method will return immediately after the KServe
|
254
|
-
server is provisioned, without waiting for it to fully start.
|
255
|
-
|
256
|
-
Returns:
|
257
|
-
The ZenML KServe deployment service object that can be used to
|
258
|
-
interact with the remote KServe server.
|
259
|
-
|
260
|
-
Raises:
|
261
|
-
RuntimeError: if the KServe deployment server could not be stopped.
|
262
|
-
"""
|
263
|
-
with track_handler(AnalyticsEvent.MODEL_DEPLOYED) as analytics_handler:
|
264
|
-
config = cast(KServeDeploymentConfig, config)
|
265
|
-
service = None
|
266
|
-
|
267
|
-
# if replace is True, find equivalent KServe deployments
|
268
|
-
if replace is True:
|
269
|
-
equivalent_services = self.find_model_server(
|
270
|
-
running=False,
|
271
|
-
pipeline_name=config.pipeline_name,
|
272
|
-
pipeline_step_name=config.pipeline_step_name,
|
273
|
-
model_name=config.model_name,
|
274
|
-
)
|
275
|
-
|
276
|
-
for equivalent_service in equivalent_services:
|
277
|
-
if service is None:
|
278
|
-
# keep the most recently created service
|
279
|
-
service = equivalent_service
|
280
|
-
else:
|
281
|
-
try:
|
282
|
-
# delete the older services and don't wait for
|
283
|
-
# them to be deprovisioned
|
284
|
-
service.stop()
|
285
|
-
except RuntimeError as e:
|
286
|
-
raise RuntimeError(
|
287
|
-
"Failed to stop the KServe deployment "
|
288
|
-
"server:\n",
|
289
|
-
f"{e}\n",
|
290
|
-
"Please stop it manually and try again.",
|
291
|
-
)
|
292
|
-
|
293
|
-
if service:
|
294
|
-
# Reuse the service account and secret from the existing
|
295
|
-
# service.
|
296
|
-
assert isinstance(service, KServeDeploymentService)
|
297
|
-
config.k8s_service_account = service.config.k8s_service_account
|
298
|
-
config.k8s_secret = service.config.k8s_secret
|
299
|
-
|
300
|
-
# configure the credentials for the KServe model server
|
301
|
-
self._create_or_update_kserve_credentials(config)
|
302
|
-
if service:
|
303
|
-
# update an equivalent service in place
|
304
|
-
service.update(config)
|
305
|
-
logger.info(
|
306
|
-
f"Updating an existing KServe deployment service: {service}"
|
307
|
-
)
|
308
|
-
else:
|
309
|
-
# create a new service
|
310
|
-
service = KServeDeploymentService(config=config)
|
311
|
-
logger.info(
|
312
|
-
f"Creating a new KServe deployment service: {service}"
|
313
|
-
)
|
314
|
-
|
315
|
-
# start the service which in turn provisions the KServe
|
316
|
-
# deployment server and waits for it to reach a ready state
|
317
|
-
service.start(timeout=timeout)
|
318
|
-
|
319
|
-
# Add telemetry with metadata that gets the stack metadata and
|
320
|
-
# differentiates between pure model and custom code deployments
|
321
|
-
stack = Client().active_stack
|
322
|
-
stack_metadata = {
|
323
|
-
component_type.value: component.flavor
|
324
|
-
for component_type, component in stack.components.items()
|
325
|
-
}
|
326
|
-
analytics_handler.metadata = {
|
327
|
-
"store_type": Client().zen_store.type.value,
|
328
|
-
**stack_metadata,
|
329
|
-
"is_custom_code_deployment": config.container is not None,
|
330
|
-
}
|
331
|
-
return service
|
332
|
-
|
333
|
-
def get_kserve_deployments(
|
334
|
-
self, labels: Dict[str, str]
|
335
|
-
) -> List[V1beta1InferenceService]:
|
336
|
-
"""Get a list of KServe deployments that match the supplied labels.
|
337
|
-
|
338
|
-
Args:
|
339
|
-
labels: a dictionary of labels to match against KServe deployments.
|
340
|
-
|
341
|
-
Returns:
|
342
|
-
A list of KServe deployments that match the supplied labels.
|
343
|
-
|
344
|
-
Raises:
|
345
|
-
RuntimeError: if an operational failure is encountered while
|
346
|
-
"""
|
347
|
-
label_selector = (
|
348
|
-
",".join(f"{k}={v}" for k, v in labels.items()) if labels else None
|
349
|
-
)
|
350
|
-
|
351
|
-
namespace = (
|
352
|
-
self.config.kubernetes_namespace
|
353
|
-
or utils.get_default_target_namespace()
|
354
|
-
)
|
355
|
-
|
356
|
-
try:
|
357
|
-
response = (
|
358
|
-
self.kserve_client.api_instance.list_namespaced_custom_object(
|
359
|
-
constants.KSERVE_GROUP,
|
360
|
-
constants.KSERVE_V1BETA1_VERSION,
|
361
|
-
namespace,
|
362
|
-
constants.KSERVE_PLURAL,
|
363
|
-
label_selector=label_selector,
|
364
|
-
)
|
365
|
-
)
|
366
|
-
except k8s_client.rest.ApiException as e:
|
367
|
-
raise RuntimeError(
|
368
|
-
"Exception when retrieving KServe inference services\
|
369
|
-
%s\n"
|
370
|
-
% e
|
371
|
-
)
|
372
|
-
|
373
|
-
# TODO[CRITICAL]: de-serialize each item into a complete
|
374
|
-
# V1beta1InferenceService object recursively using the OpenApi
|
375
|
-
# schema (this doesn't work right now)
|
376
|
-
inference_services: List[V1beta1InferenceService] = []
|
377
|
-
for item in response.get("items", []):
|
378
|
-
snake_case_item = self._camel_to_snake(item)
|
379
|
-
inference_service = V1beta1InferenceService(**snake_case_item)
|
380
|
-
inference_services.append(inference_service)
|
381
|
-
return inference_services
|
382
|
-
|
383
|
-
def _camel_to_snake(self, obj: Dict[str, Any]) -> Dict[str, Any]:
|
384
|
-
"""Convert a camelCase dictionary to snake_case.
|
385
|
-
|
386
|
-
Args:
|
387
|
-
obj: a dictionary with camelCase keys
|
388
|
-
|
389
|
-
Returns:
|
390
|
-
a dictionary with snake_case keys
|
391
|
-
"""
|
392
|
-
if isinstance(obj, (str, int, float)):
|
393
|
-
return obj
|
394
|
-
if isinstance(obj, dict):
|
395
|
-
assert obj is not None
|
396
|
-
new = obj.__class__()
|
397
|
-
for k, v in obj.items():
|
398
|
-
new[self._convert_to_snake(k)] = self._camel_to_snake(v)
|
399
|
-
elif isinstance(obj, (list, set, tuple)):
|
400
|
-
assert obj is not None
|
401
|
-
new = obj.__class__(self._camel_to_snake(v) for v in obj)
|
402
|
-
else:
|
403
|
-
return obj
|
404
|
-
return new
|
405
|
-
|
406
|
-
def _convert_to_snake(self, k: str) -> str:
|
407
|
-
return re.sub(r"(?<!^)(?=[A-Z])", "_", k).lower()
|
408
|
-
|
409
|
-
def find_model_server(
|
410
|
-
self,
|
411
|
-
running: bool = False,
|
412
|
-
service_uuid: Optional[UUID] = None,
|
413
|
-
pipeline_name: Optional[str] = None,
|
414
|
-
run_name: Optional[str] = None,
|
415
|
-
pipeline_step_name: Optional[str] = None,
|
416
|
-
model_name: Optional[str] = None,
|
417
|
-
model_uri: Optional[str] = None,
|
418
|
-
predictor: Optional[str] = None,
|
419
|
-
) -> List[BaseService]:
|
420
|
-
"""Find one or more KServe model services that match the given criteria.
|
421
|
-
|
422
|
-
Args:
|
423
|
-
running: If true, only running services will be returned.
|
424
|
-
service_uuid: The UUID of the service that was originally used
|
425
|
-
to deploy the model.
|
426
|
-
pipeline_name: name of the pipeline that the deployed model was part
|
427
|
-
of.
|
428
|
-
run_name: name of the pipeline run which the deployed model was
|
429
|
-
part of.
|
430
|
-
pipeline_step_name: the name of the pipeline model deployment step
|
431
|
-
that deployed the model.
|
432
|
-
model_name: the name of the deployed model.
|
433
|
-
model_uri: URI of the deployed model.
|
434
|
-
predictor: the name of the predictor that was used to deploy the model.
|
435
|
-
|
436
|
-
Returns:
|
437
|
-
One or more Service objects representing model servers that match
|
438
|
-
the input search criteria.
|
439
|
-
"""
|
440
|
-
config = KServeDeploymentConfig(
|
441
|
-
pipeline_name=pipeline_name or "",
|
442
|
-
run_name=run_name or "",
|
443
|
-
pipeline_run_id=run_name or "",
|
444
|
-
pipeline_step_name=pipeline_step_name or "",
|
445
|
-
model_uri=model_uri or "",
|
446
|
-
model_name=model_name or "",
|
447
|
-
predictor=predictor or "",
|
448
|
-
resources={},
|
449
|
-
)
|
450
|
-
labels = config.get_kubernetes_labels()
|
451
|
-
|
452
|
-
if service_uuid:
|
453
|
-
labels["zenml.service_uuid"] = str(service_uuid)
|
454
|
-
|
455
|
-
deployments = self.get_kserve_deployments(labels=labels)
|
456
|
-
|
457
|
-
services: List[BaseService] = []
|
458
|
-
for deployment in deployments:
|
459
|
-
# recreate the KServe deployment service object from the KServe
|
460
|
-
# deployment resource
|
461
|
-
service = KServeDeploymentService.create_from_deployment(
|
462
|
-
deployment=deployment
|
463
|
-
)
|
464
|
-
if running and not service.is_running:
|
465
|
-
# skip non-running services
|
466
|
-
continue
|
467
|
-
services.append(service)
|
468
|
-
|
469
|
-
return services
|
470
|
-
|
471
|
-
def stop_model_server(
|
472
|
-
self,
|
473
|
-
uuid: UUID,
|
474
|
-
timeout: int = DEFAULT_KSERVE_DEPLOYMENT_START_STOP_TIMEOUT,
|
475
|
-
force: bool = False,
|
476
|
-
) -> None:
|
477
|
-
"""Stop a KServe model server.
|
478
|
-
|
479
|
-
Args:
|
480
|
-
uuid: UUID of the model server to stop.
|
481
|
-
timeout: timeout in seconds to wait for the service to stop.
|
482
|
-
force: if True, force the service to stop.
|
483
|
-
|
484
|
-
Raises:
|
485
|
-
NotImplementedError: stopping on KServe model servers is not
|
486
|
-
supported.
|
487
|
-
"""
|
488
|
-
raise NotImplementedError(
|
489
|
-
"Stopping KServe model servers is not implemented. Try "
|
490
|
-
"deleting the KServe model server instead."
|
491
|
-
)
|
492
|
-
|
493
|
-
def start_model_server(
|
494
|
-
self,
|
495
|
-
uuid: UUID,
|
496
|
-
timeout: int = DEFAULT_KSERVE_DEPLOYMENT_START_STOP_TIMEOUT,
|
497
|
-
) -> None:
|
498
|
-
"""Start a KServe model deployment server.
|
499
|
-
|
500
|
-
Args:
|
501
|
-
uuid: UUID of the model server to start.
|
502
|
-
timeout: timeout in seconds to wait for the service to become
|
503
|
-
active. . If set to 0, the method will return immediately after
|
504
|
-
provisioning the service, without waiting for it to become
|
505
|
-
active.
|
506
|
-
|
507
|
-
Raises:
|
508
|
-
NotImplementedError: since we don't support starting KServe
|
509
|
-
model servers
|
510
|
-
"""
|
511
|
-
raise NotImplementedError(
|
512
|
-
"Starting KServe model servers is not implemented"
|
513
|
-
)
|
514
|
-
|
515
|
-
def delete_model_server(
|
516
|
-
self,
|
517
|
-
uuid: UUID,
|
518
|
-
timeout: int = DEFAULT_KSERVE_DEPLOYMENT_START_STOP_TIMEOUT,
|
519
|
-
force: bool = False,
|
520
|
-
) -> None:
|
521
|
-
"""Delete a KServe model deployment server.
|
522
|
-
|
523
|
-
Args:
|
524
|
-
uuid: UUID of the model server to delete.
|
525
|
-
timeout: timeout in seconds to wait for the service to stop. If
|
526
|
-
set to 0, the method will return immediately after
|
527
|
-
deprovisioning the service, without waiting for it to stop.
|
528
|
-
force: if True, force the service to stop.
|
529
|
-
"""
|
530
|
-
services = self.find_model_server(service_uuid=uuid)
|
531
|
-
if len(services) == 0:
|
532
|
-
return
|
533
|
-
service = services[0]
|
534
|
-
service.stop(timeout=timeout, force=force)
|
535
|
-
assert isinstance(service, KServeDeploymentService)
|
536
|
-
if service.config.k8s_service_account:
|
537
|
-
self.delete_k8s_service_account(service.config.k8s_service_account)
|
538
|
-
if service.config.k8s_secret:
|
539
|
-
self.delete_k8s_secret(service.config.k8s_secret)
|
540
|
-
|
541
|
-
def _create_or_update_kserve_credentials(
|
542
|
-
self, config: KServeDeploymentConfig
|
543
|
-
) -> None:
|
544
|
-
"""Create or update the KServe credentials used to access the artifact store.
|
545
|
-
|
546
|
-
The way KServe allows configured credentials to be passed to the
|
547
|
-
model servers is a bit convoluted:
|
548
|
-
|
549
|
-
* we need to create a Kubernetes secret object with credentials
|
550
|
-
in the correct format supported by KServe (only AWS, GCP, Azure are
|
551
|
-
supported)
|
552
|
-
* we need to create a Kubernetes service account object that
|
553
|
-
references the secret object
|
554
|
-
* we need to use the service account object in the KServe
|
555
|
-
deployment configuration
|
556
|
-
|
557
|
-
This method will use a random name for every model server. This ensures
|
558
|
-
that we can create multiple KServe deployments with different
|
559
|
-
credentials without running into naming conflicts.
|
560
|
-
|
561
|
-
If a ZenML secret is not explicitly configured for the model deployment
|
562
|
-
or the model deployer, this method attempts to fetch credentials from
|
563
|
-
the active artifact store and convert them into the appropriate secret
|
564
|
-
format expected by KServe.
|
565
|
-
|
566
|
-
Args:
|
567
|
-
config: KServe deployment configuration.
|
568
|
-
|
569
|
-
Raises:
|
570
|
-
RuntimeError: if the configured secret object is not found.
|
571
|
-
"""
|
572
|
-
secret_name = config.secret_name or self.config.secret
|
573
|
-
|
574
|
-
if secret_name:
|
575
|
-
if config.secret_name:
|
576
|
-
secret_source = "model deployment"
|
577
|
-
else:
|
578
|
-
secret_source = "Model Deployer"
|
579
|
-
|
580
|
-
logger.warning(
|
581
|
-
f"Your KServe {secret_source} is configured to use a "
|
582
|
-
f"ZenML secret `{secret_name}` that holds credentials needed "
|
583
|
-
"to access the artifact store. The recommended authentication "
|
584
|
-
"method is to configure credentials for the artifact store "
|
585
|
-
"stack component instead. The KServe model deployer will use "
|
586
|
-
"those credentials to authenticate to the artifact store "
|
587
|
-
"automatically."
|
588
|
-
)
|
589
|
-
|
590
|
-
try:
|
591
|
-
zenml_secret = Client().get_secret_by_name_and_scope(
|
592
|
-
secret_name
|
593
|
-
)
|
594
|
-
except KeyError as e:
|
595
|
-
raise RuntimeError(
|
596
|
-
f"The ZenML secret '{secret_name}' specified in the "
|
597
|
-
f"KServe {secret_source} configuration was not found "
|
598
|
-
f"in the secrets store: {e}."
|
599
|
-
)
|
600
|
-
|
601
|
-
credentials = zenml_secret.secret_values
|
602
|
-
|
603
|
-
else:
|
604
|
-
# if no secret is configured, try to fetch credentials from the
|
605
|
-
# active artifact store and convert them into the appropriate format
|
606
|
-
# expected by KServe
|
607
|
-
converted_secret = self._convert_artifact_store_secret()
|
608
|
-
|
609
|
-
if not converted_secret:
|
610
|
-
# If a secret and service account were previously configured, we
|
611
|
-
# need to delete them before we can proceed
|
612
|
-
if config.k8s_service_account:
|
613
|
-
self.delete_k8s_service_account(config.k8s_service_account)
|
614
|
-
config.k8s_service_account = None
|
615
|
-
if config.k8s_secret:
|
616
|
-
self.delete_k8s_secret(config.k8s_secret)
|
617
|
-
config.k8s_secret = None
|
618
|
-
return
|
619
|
-
|
620
|
-
credentials = converted_secret.get_values()
|
621
|
-
|
622
|
-
# S3 credentials are special because part of them need to be passed
|
623
|
-
# as annotations
|
624
|
-
annotations: Dict[str, str] = {}
|
625
|
-
if "aws_access_key_id" in credentials:
|
626
|
-
if credentials.get("s3_region"):
|
627
|
-
annotations[
|
628
|
-
"serving.kubeflow.org/s3-region"
|
629
|
-
] = credentials.pop("s3_region")
|
630
|
-
if credentials.get("s3_endpoint"):
|
631
|
-
annotations[
|
632
|
-
"serving.kubeflow.org/s3-endpoint"
|
633
|
-
] = credentials.pop("s3_endpoint")
|
634
|
-
if credentials.get("s3_use_https"):
|
635
|
-
annotations[
|
636
|
-
"serving.kubeflow.org/s3-usehttps"
|
637
|
-
] = credentials.pop("s3_use_https")
|
638
|
-
if credentials.get("s3_verify_ssl"):
|
639
|
-
annotations[
|
640
|
-
"serving.kubeflow.org/s3-verifyssl"
|
641
|
-
] = credentials.pop("s3_verify_ssl")
|
642
|
-
|
643
|
-
# Convert all keys to uppercase
|
644
|
-
credentials = {k.upper(): v for k, v in credentials.items()}
|
645
|
-
|
646
|
-
# The GCP credentials need to use a specific key name
|
647
|
-
if "GOOGLE_APPLICATION_CREDENTIALS" in credentials:
|
648
|
-
credentials[
|
649
|
-
"gcloud-application-credentials.json"
|
650
|
-
] = credentials.pop("GOOGLE_APPLICATION_CREDENTIALS")
|
651
|
-
|
652
|
-
# Create or update the Kubernetes secret object
|
653
|
-
config.k8s_secret = self.create_or_update_k8s_secret(
|
654
|
-
name=config.k8s_secret,
|
655
|
-
annotations=annotations,
|
656
|
-
secret_values=credentials,
|
657
|
-
)
|
658
|
-
|
659
|
-
# Create or update the Kubernetes service account object
|
660
|
-
config.k8s_service_account = self.create_or_update_k8s_service_account(
|
661
|
-
name=config.k8s_service_account,
|
662
|
-
secret_name=config.k8s_secret,
|
663
|
-
)
|
664
|
-
|
665
|
-
def _convert_artifact_store_secret(self) -> Optional[BaseSecretSchema]:
|
666
|
-
"""Convert the credentials configured for the artifact store into a ZenML secret.
|
667
|
-
|
668
|
-
Returns:
|
669
|
-
The KServe credentials in the format expected by KServe or None if
|
670
|
-
no credentials are configured for the artifact store or if they
|
671
|
-
cannot be converted into the KServe format.
|
672
|
-
"""
|
673
|
-
artifact_store = Client().active_stack.artifact_store
|
674
|
-
|
675
|
-
zenml_secret: BaseSecretSchema
|
676
|
-
|
677
|
-
if artifact_store.flavor == "s3":
|
678
|
-
from zenml.integrations.s3.artifact_stores import S3ArtifactStore
|
679
|
-
|
680
|
-
assert isinstance(artifact_store, S3ArtifactStore)
|
681
|
-
|
682
|
-
(
|
683
|
-
aws_access_key_id,
|
684
|
-
aws_secret_access_key,
|
685
|
-
_,
|
686
|
-
) = artifact_store.get_credentials()
|
687
|
-
|
688
|
-
if aws_access_key_id and aws_secret_access_key:
|
689
|
-
# Convert the credentials into the format expected by KServe
|
690
|
-
zenml_secret = KServeS3SecretSchema(
|
691
|
-
aws_access_key_id=aws_access_key_id,
|
692
|
-
aws_secret_access_key=aws_secret_access_key,
|
693
|
-
)
|
694
|
-
if artifact_store.config.client_kwargs:
|
695
|
-
if "endpoint_url" in artifact_store.config.client_kwargs:
|
696
|
-
zenml_secret.s3_endpoint = str(
|
697
|
-
artifact_store.config.client_kwargs["endpoint_url"]
|
698
|
-
)
|
699
|
-
if "region_name" in artifact_store.config.client_kwargs:
|
700
|
-
zenml_secret.s3_region = str(
|
701
|
-
artifact_store.config.client_kwargs["region_name"]
|
702
|
-
)
|
703
|
-
if "use_ssl" in artifact_store.config.client_kwargs:
|
704
|
-
zenml_secret.s3_use_https = str(
|
705
|
-
artifact_store.config.client_kwargs["use_ssl"]
|
706
|
-
)
|
707
|
-
|
708
|
-
return zenml_secret
|
709
|
-
|
710
|
-
logger.warning(
|
711
|
-
"No credentials are configured for the active S3 artifact "
|
712
|
-
"store. The KServe model deployer will assume an "
|
713
|
-
"implicit form of authentication is available in the "
|
714
|
-
"target Kubernetes cluster, but the served model may not "
|
715
|
-
"be able to access the model artifacts."
|
716
|
-
)
|
717
|
-
|
718
|
-
# Assume implicit in-cluster IAM authentication
|
719
|
-
return None
|
720
|
-
|
721
|
-
elif artifact_store.flavor == "gcp":
|
722
|
-
from zenml.integrations.gcp.artifact_stores import GCPArtifactStore
|
723
|
-
|
724
|
-
assert isinstance(artifact_store, GCPArtifactStore)
|
725
|
-
|
726
|
-
gcp_credentials = artifact_store.get_credentials()
|
727
|
-
|
728
|
-
if gcp_credentials:
|
729
|
-
# Convert the credentials into the format expected by KServe
|
730
|
-
return KServeGSSecretSchema(
|
731
|
-
google_application_credentials=json.dumps(gcp_credentials),
|
732
|
-
)
|
733
|
-
|
734
|
-
logger.warning(
|
735
|
-
"No credentials are configured for the active GCS artifact "
|
736
|
-
"store. The KServe model deployer will assume an "
|
737
|
-
"implicit form of authentication is available in the "
|
738
|
-
"target Kubernetes cluster, but the served model may not "
|
739
|
-
"be able to access the model artifacts."
|
740
|
-
)
|
741
|
-
return None
|
742
|
-
|
743
|
-
elif artifact_store.flavor == "azure":
|
744
|
-
from zenml.integrations.azure.artifact_stores import (
|
745
|
-
AzureArtifactStore,
|
746
|
-
)
|
747
|
-
|
748
|
-
assert isinstance(artifact_store, AzureArtifactStore)
|
749
|
-
|
750
|
-
azure_credentials = artifact_store.get_credentials()
|
751
|
-
|
752
|
-
if azure_credentials:
|
753
|
-
# Convert the credentials into the format expected by KServe
|
754
|
-
if (
|
755
|
-
azure_credentials.client_id is not None
|
756
|
-
and azure_credentials.client_secret is not None
|
757
|
-
and azure_credentials.tenant_id is not None
|
758
|
-
):
|
759
|
-
return KServeAzureSecretSchema(
|
760
|
-
azure_client_id=azure_credentials.client_id,
|
761
|
-
azure_client_secret=azure_credentials.client_secret,
|
762
|
-
azure_tenant_id=azure_credentials.tenant_id,
|
763
|
-
)
|
764
|
-
else:
|
765
|
-
logger.warning(
|
766
|
-
"The KServe model deployer could not use the "
|
767
|
-
"credentials currently configured in the active Azure "
|
768
|
-
"artifact store because it only supports service "
|
769
|
-
"principal Azure credentials. "
|
770
|
-
"Please configure Azure principal credentials for your "
|
771
|
-
"artifact store or specify a custom ZenML secret in "
|
772
|
-
"the model deployer configuration that holds the "
|
773
|
-
"credentials required to access the model artifacts. "
|
774
|
-
"The KServe model deployer will assume an implicit "
|
775
|
-
"form of authentication is available in the target "
|
776
|
-
"Kubernetes cluster, but the served model "
|
777
|
-
"may not be able to access the model artifacts."
|
778
|
-
)
|
779
|
-
|
780
|
-
return None
|
781
|
-
|
782
|
-
logger.warning(
|
783
|
-
"No credentials are configured for the active Azure "
|
784
|
-
"artifact store. The Seldon Core model deployer will "
|
785
|
-
"assume an implicit form of authentication is available "
|
786
|
-
"in the target Kubernetes cluster, but the served model "
|
787
|
-
"may not be able to access the model artifacts."
|
788
|
-
)
|
789
|
-
return None
|
790
|
-
|
791
|
-
logger.warning(
|
792
|
-
"The KServe model deployer doesn't know how to configure "
|
793
|
-
f"credentials automatically for the `{artifact_store.flavor}` "
|
794
|
-
"active artifact store flavor. "
|
795
|
-
"Please use one of the supported artifact stores (S3 or GCP) "
|
796
|
-
"or specify a ZenML secret in the model deployer "
|
797
|
-
"configuration that holds the credentials required to access "
|
798
|
-
"the model artifacts. The KServe model deployer will "
|
799
|
-
"assume an implicit form of authentication is available "
|
800
|
-
"in the target Kubernetes cluster, but the served model "
|
801
|
-
"may not be able to access the model artifacts."
|
802
|
-
)
|
803
|
-
|
804
|
-
return None
|
805
|
-
|
806
|
-
def create_or_update_k8s_secret(
|
807
|
-
self,
|
808
|
-
name: Optional[str] = None,
|
809
|
-
secret_values: Dict[str, Any] = {},
|
810
|
-
annotations: Dict[str, str] = {},
|
811
|
-
) -> str:
|
812
|
-
"""Create or update a Kubernetes Secret resource.
|
813
|
-
|
814
|
-
Args:
|
815
|
-
name: the name of the Secret resource to create. If not
|
816
|
-
specified, a random name will be generated.
|
817
|
-
secret_values: secret key-values that should be
|
818
|
-
stored in the Secret resource.
|
819
|
-
annotations: optional annotations to add to the Secret resource.
|
820
|
-
|
821
|
-
Returns:
|
822
|
-
The name of the created Secret resource.
|
823
|
-
|
824
|
-
Raises:
|
825
|
-
RuntimeError: if an unknown error occurs during the creation of
|
826
|
-
the secret.
|
827
|
-
"""
|
828
|
-
name = name or f"zenml-kserve-{uuid4().hex}"
|
829
|
-
|
830
|
-
try:
|
831
|
-
logger.debug(f"Creating Secret resource: {name}")
|
832
|
-
|
833
|
-
core_api = k8s_client.CoreV1Api()
|
834
|
-
|
835
|
-
secret_data = {
|
836
|
-
k: base64.b64encode(str(v).encode("utf-8")).decode("ascii")
|
837
|
-
for k, v in secret_values.items()
|
838
|
-
if v is not None
|
839
|
-
}
|
840
|
-
|
841
|
-
secret = k8s_client.V1Secret(
|
842
|
-
metadata=k8s_client.V1ObjectMeta(
|
843
|
-
name=name,
|
844
|
-
labels={"app": "zenml"},
|
845
|
-
annotations=annotations,
|
846
|
-
),
|
847
|
-
type="Opaque",
|
848
|
-
data=secret_data,
|
849
|
-
)
|
850
|
-
|
851
|
-
try:
|
852
|
-
# check if the secret is already present
|
853
|
-
core_api.read_namespaced_secret(
|
854
|
-
name=name,
|
855
|
-
namespace=self.config.kubernetes_namespace,
|
856
|
-
)
|
857
|
-
# if we got this far, the secret is already present, update it
|
858
|
-
# in place
|
859
|
-
response = core_api.replace_namespaced_secret(
|
860
|
-
name=name,
|
861
|
-
namespace=self.config.kubernetes_namespace,
|
862
|
-
body=secret,
|
863
|
-
)
|
864
|
-
except k8s_client.rest.ApiException as e:
|
865
|
-
if e.status != 404:
|
866
|
-
# if an error other than 404 is raised here, treat it
|
867
|
-
# as an unexpected error
|
868
|
-
raise RuntimeError(
|
869
|
-
"Exception when reading Secret resource: %s", str(e)
|
870
|
-
)
|
871
|
-
response = core_api.create_namespaced_secret(
|
872
|
-
namespace=self.config.kubernetes_namespace,
|
873
|
-
body=secret,
|
874
|
-
)
|
875
|
-
logger.debug("Kubernetes API response: %s", response)
|
876
|
-
except k8s_client.rest.ApiException as e:
|
877
|
-
raise RuntimeError(
|
878
|
-
"Exception when creating Secret resource %s", str(e)
|
879
|
-
)
|
880
|
-
|
881
|
-
return name
|
882
|
-
|
883
|
-
def delete_k8s_secret(
|
884
|
-
self,
|
885
|
-
name: str,
|
886
|
-
) -> None:
|
887
|
-
"""Delete a Kubernetes Secret resource managed by ZenML.
|
888
|
-
|
889
|
-
Args:
|
890
|
-
name: the name of the Kubernetes Secret resource to delete.
|
891
|
-
|
892
|
-
Raises:
|
893
|
-
RuntimeError: if an unknown error occurs during the removal
|
894
|
-
of the secret.
|
895
|
-
"""
|
896
|
-
try:
|
897
|
-
logger.debug(f"Deleting Secret resource: {name}")
|
898
|
-
|
899
|
-
core_api = k8s_client.CoreV1Api()
|
900
|
-
|
901
|
-
response = core_api.delete_namespaced_secret(
|
902
|
-
name=name,
|
903
|
-
namespace=self.config.kubernetes_namespace,
|
904
|
-
)
|
905
|
-
logger.debug("Kubernetes API response: %s", response)
|
906
|
-
except k8s_client.rest.ApiException as e:
|
907
|
-
if e.status == 404:
|
908
|
-
# the secret is no longer present, nothing to do
|
909
|
-
return
|
910
|
-
raise RuntimeError(
|
911
|
-
f"Exception when deleting Secret resource {name}: {e}"
|
912
|
-
)
|
913
|
-
|
914
|
-
def create_or_update_k8s_service_account(
|
915
|
-
self, name: Optional[str] = None, secret_name: Optional[str] = None
|
916
|
-
) -> str:
|
917
|
-
"""Create or update a Kubernetes ServiceAccount resource with a secret managed by ZenML.
|
918
|
-
|
919
|
-
Args:
|
920
|
-
name: the name of the ServiceAccount resource to create. If not
|
921
|
-
specified, a random name will be generated.
|
922
|
-
secret_name: the name of a secret to attach to the ServiceAccount.
|
923
|
-
|
924
|
-
Returns:
|
925
|
-
The name of the created ServiceAccount resource.
|
926
|
-
|
927
|
-
Raises:
|
928
|
-
RuntimeError: if an unknown error occurs during the creation of
|
929
|
-
the service account.
|
930
|
-
"""
|
931
|
-
name = name or f"zenml-kserve-{uuid4().hex}"
|
932
|
-
|
933
|
-
service_account = k8s_client.V1ServiceAccount(
|
934
|
-
metadata=k8s_client.V1ObjectMeta(
|
935
|
-
name=name,
|
936
|
-
),
|
937
|
-
)
|
938
|
-
|
939
|
-
if secret_name:
|
940
|
-
service_account.secrets = [
|
941
|
-
k8s_client.V1ObjectReference(kind="Secret", name=secret_name)
|
942
|
-
]
|
943
|
-
|
944
|
-
core_api = k8s_client.CoreV1Api()
|
945
|
-
|
946
|
-
try:
|
947
|
-
# check if the service account is already present
|
948
|
-
core_api.read_namespaced_service_account(
|
949
|
-
name=name,
|
950
|
-
namespace=self.config.kubernetes_namespace,
|
951
|
-
)
|
952
|
-
# if we got this far, the service account is already present, update
|
953
|
-
# it in place
|
954
|
-
core_api.replace_namespaced_service_account(
|
955
|
-
name=name,
|
956
|
-
namespace=self.config.kubernetes_namespace,
|
957
|
-
body=service_account,
|
958
|
-
)
|
959
|
-
except k8s_client.rest.ApiException as e:
|
960
|
-
if e.status != 404:
|
961
|
-
# if an error other than 404 is raised here, treat it
|
962
|
-
# as an unexpected error
|
963
|
-
raise RuntimeError(
|
964
|
-
"Exception when reading ServiceAccount resource: %s",
|
965
|
-
str(e),
|
966
|
-
)
|
967
|
-
core_api.create_namespaced_service_account(
|
968
|
-
namespace=self.config.kubernetes_namespace,
|
969
|
-
body=service_account,
|
970
|
-
)
|
971
|
-
|
972
|
-
return name
|
973
|
-
|
974
|
-
def delete_k8s_service_account(
|
975
|
-
self,
|
976
|
-
name: str,
|
977
|
-
) -> None:
|
978
|
-
"""Delete a Kubernetes ServiceAccount resource managed by ZenML.
|
979
|
-
|
980
|
-
Args:
|
981
|
-
name: the name of the Kubernetes ServiceAccount resource to delete.
|
982
|
-
|
983
|
-
Raises:
|
984
|
-
RuntimeError: if an unknown error occurs during the removal
|
985
|
-
of the service account.
|
986
|
-
"""
|
987
|
-
try:
|
988
|
-
logger.debug(f"Deleting ServiceAccount resource: {name}")
|
989
|
-
|
990
|
-
core_api = k8s_client.CoreV1Api()
|
991
|
-
|
992
|
-
response = core_api.delete_namespaced_service_account(
|
993
|
-
name=name,
|
994
|
-
namespace=self.config.kubernetes_namespace,
|
995
|
-
)
|
996
|
-
logger.debug("Kubernetes API response: %s", response)
|
997
|
-
except k8s_client.rest.ApiException as e:
|
998
|
-
if e.status == 404:
|
999
|
-
# the service account is no longer present, nothing to do
|
1000
|
-
return
|
1001
|
-
raise RuntimeError(
|
1002
|
-
f"Exception when deleting ServiceAccount resource {name}: {e}"
|
1003
|
-
)
|