flyte 0.0.1b0__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.
Potentially problematic release.
This version of flyte might be problematic. Click here for more details.
- flyte/__init__.py +62 -0
- flyte/_api_commons.py +3 -0
- flyte/_bin/__init__.py +0 -0
- flyte/_bin/runtime.py +126 -0
- flyte/_build.py +25 -0
- flyte/_cache/__init__.py +12 -0
- flyte/_cache/cache.py +146 -0
- flyte/_cache/defaults.py +9 -0
- flyte/_cache/policy_function_body.py +42 -0
- flyte/_cli/__init__.py +0 -0
- flyte/_cli/_common.py +287 -0
- flyte/_cli/_create.py +42 -0
- flyte/_cli/_delete.py +23 -0
- flyte/_cli/_deploy.py +140 -0
- flyte/_cli/_get.py +235 -0
- flyte/_cli/_run.py +152 -0
- flyte/_cli/main.py +72 -0
- flyte/_code_bundle/__init__.py +8 -0
- flyte/_code_bundle/_ignore.py +113 -0
- flyte/_code_bundle/_packaging.py +187 -0
- flyte/_code_bundle/_utils.py +339 -0
- flyte/_code_bundle/bundle.py +178 -0
- flyte/_context.py +146 -0
- flyte/_datastructures.py +342 -0
- flyte/_deploy.py +202 -0
- flyte/_doc.py +29 -0
- flyte/_docstring.py +32 -0
- flyte/_environment.py +43 -0
- flyte/_group.py +31 -0
- flyte/_hash.py +23 -0
- flyte/_image.py +760 -0
- flyte/_initialize.py +634 -0
- flyte/_interface.py +84 -0
- flyte/_internal/__init__.py +3 -0
- flyte/_internal/controllers/__init__.py +115 -0
- flyte/_internal/controllers/_local_controller.py +118 -0
- flyte/_internal/controllers/_trace.py +40 -0
- flyte/_internal/controllers/pbhash.py +39 -0
- flyte/_internal/controllers/remote/__init__.py +40 -0
- flyte/_internal/controllers/remote/_action.py +141 -0
- flyte/_internal/controllers/remote/_client.py +43 -0
- flyte/_internal/controllers/remote/_controller.py +361 -0
- flyte/_internal/controllers/remote/_core.py +402 -0
- flyte/_internal/controllers/remote/_informer.py +361 -0
- flyte/_internal/controllers/remote/_service_protocol.py +50 -0
- flyte/_internal/imagebuild/__init__.py +11 -0
- flyte/_internal/imagebuild/docker_builder.py +416 -0
- flyte/_internal/imagebuild/image_builder.py +241 -0
- flyte/_internal/imagebuild/remote_builder.py +0 -0
- flyte/_internal/resolvers/__init__.py +0 -0
- flyte/_internal/resolvers/_task_module.py +54 -0
- flyte/_internal/resolvers/common.py +31 -0
- flyte/_internal/resolvers/default.py +28 -0
- flyte/_internal/runtime/__init__.py +0 -0
- flyte/_internal/runtime/convert.py +199 -0
- flyte/_internal/runtime/entrypoints.py +135 -0
- flyte/_internal/runtime/io.py +136 -0
- flyte/_internal/runtime/resources_serde.py +138 -0
- flyte/_internal/runtime/task_serde.py +210 -0
- flyte/_internal/runtime/taskrunner.py +190 -0
- flyte/_internal/runtime/types_serde.py +54 -0
- flyte/_logging.py +124 -0
- flyte/_protos/__init__.py +0 -0
- flyte/_protos/common/authorization_pb2.py +66 -0
- flyte/_protos/common/authorization_pb2.pyi +108 -0
- flyte/_protos/common/authorization_pb2_grpc.py +4 -0
- flyte/_protos/common/identifier_pb2.py +71 -0
- flyte/_protos/common/identifier_pb2.pyi +82 -0
- flyte/_protos/common/identifier_pb2_grpc.py +4 -0
- flyte/_protos/common/identity_pb2.py +48 -0
- flyte/_protos/common/identity_pb2.pyi +72 -0
- flyte/_protos/common/identity_pb2_grpc.py +4 -0
- flyte/_protos/common/list_pb2.py +36 -0
- flyte/_protos/common/list_pb2.pyi +69 -0
- flyte/_protos/common/list_pb2_grpc.py +4 -0
- flyte/_protos/common/policy_pb2.py +37 -0
- flyte/_protos/common/policy_pb2.pyi +27 -0
- flyte/_protos/common/policy_pb2_grpc.py +4 -0
- flyte/_protos/common/role_pb2.py +37 -0
- flyte/_protos/common/role_pb2.pyi +53 -0
- flyte/_protos/common/role_pb2_grpc.py +4 -0
- flyte/_protos/common/runtime_version_pb2.py +28 -0
- flyte/_protos/common/runtime_version_pb2.pyi +24 -0
- flyte/_protos/common/runtime_version_pb2_grpc.py +4 -0
- flyte/_protos/logs/dataplane/payload_pb2.py +96 -0
- flyte/_protos/logs/dataplane/payload_pb2.pyi +168 -0
- flyte/_protos/logs/dataplane/payload_pb2_grpc.py +4 -0
- flyte/_protos/secret/definition_pb2.py +49 -0
- flyte/_protos/secret/definition_pb2.pyi +93 -0
- flyte/_protos/secret/definition_pb2_grpc.py +4 -0
- flyte/_protos/secret/payload_pb2.py +62 -0
- flyte/_protos/secret/payload_pb2.pyi +94 -0
- flyte/_protos/secret/payload_pb2_grpc.py +4 -0
- flyte/_protos/secret/secret_pb2.py +38 -0
- flyte/_protos/secret/secret_pb2.pyi +6 -0
- flyte/_protos/secret/secret_pb2_grpc.py +198 -0
- flyte/_protos/secret/secret_pb2_grpc_grpc.py +198 -0
- flyte/_protos/validate/validate/validate_pb2.py +76 -0
- flyte/_protos/workflow/node_execution_service_pb2.py +26 -0
- flyte/_protos/workflow/node_execution_service_pb2.pyi +4 -0
- flyte/_protos/workflow/node_execution_service_pb2_grpc.py +32 -0
- flyte/_protos/workflow/queue_service_pb2.py +106 -0
- flyte/_protos/workflow/queue_service_pb2.pyi +141 -0
- flyte/_protos/workflow/queue_service_pb2_grpc.py +172 -0
- flyte/_protos/workflow/run_definition_pb2.py +128 -0
- flyte/_protos/workflow/run_definition_pb2.pyi +310 -0
- flyte/_protos/workflow/run_definition_pb2_grpc.py +4 -0
- flyte/_protos/workflow/run_logs_service_pb2.py +41 -0
- flyte/_protos/workflow/run_logs_service_pb2.pyi +28 -0
- flyte/_protos/workflow/run_logs_service_pb2_grpc.py +69 -0
- flyte/_protos/workflow/run_service_pb2.py +133 -0
- flyte/_protos/workflow/run_service_pb2.pyi +175 -0
- flyte/_protos/workflow/run_service_pb2_grpc.py +412 -0
- flyte/_protos/workflow/state_service_pb2.py +58 -0
- flyte/_protos/workflow/state_service_pb2.pyi +71 -0
- flyte/_protos/workflow/state_service_pb2_grpc.py +138 -0
- flyte/_protos/workflow/task_definition_pb2.py +72 -0
- flyte/_protos/workflow/task_definition_pb2.pyi +65 -0
- flyte/_protos/workflow/task_definition_pb2_grpc.py +4 -0
- flyte/_protos/workflow/task_service_pb2.py +44 -0
- flyte/_protos/workflow/task_service_pb2.pyi +31 -0
- flyte/_protos/workflow/task_service_pb2_grpc.py +104 -0
- flyte/_resources.py +226 -0
- flyte/_retry.py +32 -0
- flyte/_reusable_environment.py +25 -0
- flyte/_run.py +411 -0
- flyte/_secret.py +61 -0
- flyte/_task.py +367 -0
- flyte/_task_environment.py +200 -0
- flyte/_timeout.py +47 -0
- flyte/_tools.py +27 -0
- flyte/_trace.py +128 -0
- flyte/_utils/__init__.py +20 -0
- flyte/_utils/asyn.py +119 -0
- flyte/_utils/coro_management.py +25 -0
- flyte/_utils/file_handling.py +72 -0
- flyte/_utils/helpers.py +108 -0
- flyte/_utils/lazy_module.py +54 -0
- flyte/_utils/uv_script_parser.py +49 -0
- flyte/_version.py +21 -0
- flyte/connectors/__init__.py +0 -0
- flyte/errors.py +143 -0
- flyte/extras/__init__.py +5 -0
- flyte/extras/_container.py +273 -0
- flyte/io/__init__.py +11 -0
- flyte/io/_dataframe.py +0 -0
- flyte/io/_dir.py +448 -0
- flyte/io/_file.py +468 -0
- flyte/io/pickle/__init__.py +0 -0
- flyte/io/pickle/transformer.py +117 -0
- flyte/io/structured_dataset/__init__.py +129 -0
- flyte/io/structured_dataset/basic_dfs.py +219 -0
- flyte/io/structured_dataset/structured_dataset.py +1061 -0
- flyte/py.typed +0 -0
- flyte/remote/__init__.py +25 -0
- flyte/remote/_client/__init__.py +0 -0
- flyte/remote/_client/_protocols.py +131 -0
- flyte/remote/_client/auth/__init__.py +12 -0
- flyte/remote/_client/auth/_authenticators/__init__.py +0 -0
- flyte/remote/_client/auth/_authenticators/base.py +397 -0
- flyte/remote/_client/auth/_authenticators/client_credentials.py +73 -0
- flyte/remote/_client/auth/_authenticators/device_code.py +118 -0
- flyte/remote/_client/auth/_authenticators/external_command.py +79 -0
- flyte/remote/_client/auth/_authenticators/factory.py +200 -0
- flyte/remote/_client/auth/_authenticators/pkce.py +516 -0
- flyte/remote/_client/auth/_channel.py +184 -0
- flyte/remote/_client/auth/_client_config.py +83 -0
- flyte/remote/_client/auth/_default_html.py +32 -0
- flyte/remote/_client/auth/_grpc_utils/__init__.py +0 -0
- flyte/remote/_client/auth/_grpc_utils/auth_interceptor.py +288 -0
- flyte/remote/_client/auth/_grpc_utils/default_metadata_interceptor.py +151 -0
- flyte/remote/_client/auth/_keyring.py +143 -0
- flyte/remote/_client/auth/_token_client.py +260 -0
- flyte/remote/_client/auth/errors.py +16 -0
- flyte/remote/_client/controlplane.py +95 -0
- flyte/remote/_console.py +18 -0
- flyte/remote/_data.py +155 -0
- flyte/remote/_logs.py +116 -0
- flyte/remote/_project.py +86 -0
- flyte/remote/_run.py +873 -0
- flyte/remote/_secret.py +132 -0
- flyte/remote/_task.py +227 -0
- flyte/report/__init__.py +3 -0
- flyte/report/_report.py +178 -0
- flyte/report/_template.html +124 -0
- flyte/storage/__init__.py +24 -0
- flyte/storage/_remote_fs.py +34 -0
- flyte/storage/_storage.py +251 -0
- flyte/storage/_utils.py +5 -0
- flyte/types/__init__.py +13 -0
- flyte/types/_interface.py +25 -0
- flyte/types/_renderer.py +162 -0
- flyte/types/_string_literals.py +120 -0
- flyte/types/_type_engine.py +2210 -0
- flyte/types/_utils.py +80 -0
- flyte-0.0.1b0.dist-info/METADATA +179 -0
- flyte-0.0.1b0.dist-info/RECORD +390 -0
- flyte-0.0.1b0.dist-info/WHEEL +5 -0
- flyte-0.0.1b0.dist-info/entry_points.txt +3 -0
- flyte-0.0.1b0.dist-info/top_level.txt +1 -0
- union/__init__.py +54 -0
- union/_api_commons.py +3 -0
- union/_bin/__init__.py +0 -0
- union/_bin/runtime.py +113 -0
- union/_build.py +25 -0
- union/_cache/__init__.py +12 -0
- union/_cache/cache.py +141 -0
- union/_cache/defaults.py +9 -0
- union/_cache/policy_function_body.py +42 -0
- union/_cli/__init__.py +0 -0
- union/_cli/_common.py +263 -0
- union/_cli/_create.py +40 -0
- union/_cli/_delete.py +23 -0
- union/_cli/_deploy.py +120 -0
- union/_cli/_get.py +162 -0
- union/_cli/_params.py +579 -0
- union/_cli/_run.py +150 -0
- union/_cli/main.py +72 -0
- union/_code_bundle/__init__.py +8 -0
- union/_code_bundle/_ignore.py +113 -0
- union/_code_bundle/_packaging.py +187 -0
- union/_code_bundle/_utils.py +342 -0
- union/_code_bundle/bundle.py +176 -0
- union/_context.py +146 -0
- union/_datastructures.py +295 -0
- union/_deploy.py +185 -0
- union/_doc.py +29 -0
- union/_docstring.py +26 -0
- union/_environment.py +43 -0
- union/_group.py +31 -0
- union/_hash.py +23 -0
- union/_image.py +760 -0
- union/_initialize.py +585 -0
- union/_interface.py +84 -0
- union/_internal/__init__.py +3 -0
- union/_internal/controllers/__init__.py +77 -0
- union/_internal/controllers/_local_controller.py +77 -0
- union/_internal/controllers/pbhash.py +39 -0
- union/_internal/controllers/remote/__init__.py +40 -0
- union/_internal/controllers/remote/_action.py +131 -0
- union/_internal/controllers/remote/_client.py +43 -0
- union/_internal/controllers/remote/_controller.py +169 -0
- union/_internal/controllers/remote/_core.py +341 -0
- union/_internal/controllers/remote/_informer.py +260 -0
- union/_internal/controllers/remote/_service_protocol.py +44 -0
- union/_internal/imagebuild/__init__.py +11 -0
- union/_internal/imagebuild/docker_builder.py +416 -0
- union/_internal/imagebuild/image_builder.py +243 -0
- union/_internal/imagebuild/remote_builder.py +0 -0
- union/_internal/resolvers/__init__.py +0 -0
- union/_internal/resolvers/_task_module.py +31 -0
- union/_internal/resolvers/common.py +24 -0
- union/_internal/resolvers/default.py +27 -0
- union/_internal/runtime/__init__.py +0 -0
- union/_internal/runtime/convert.py +163 -0
- union/_internal/runtime/entrypoints.py +121 -0
- union/_internal/runtime/io.py +136 -0
- union/_internal/runtime/resources_serde.py +134 -0
- union/_internal/runtime/task_serde.py +202 -0
- union/_internal/runtime/taskrunner.py +179 -0
- union/_internal/runtime/types_serde.py +53 -0
- union/_logging.py +124 -0
- union/_protos/__init__.py +0 -0
- union/_protos/common/authorization_pb2.py +66 -0
- union/_protos/common/authorization_pb2.pyi +106 -0
- union/_protos/common/authorization_pb2_grpc.py +4 -0
- union/_protos/common/identifier_pb2.py +71 -0
- union/_protos/common/identifier_pb2.pyi +82 -0
- union/_protos/common/identifier_pb2_grpc.py +4 -0
- union/_protos/common/identity_pb2.py +48 -0
- union/_protos/common/identity_pb2.pyi +72 -0
- union/_protos/common/identity_pb2_grpc.py +4 -0
- union/_protos/common/list_pb2.py +36 -0
- union/_protos/common/list_pb2.pyi +69 -0
- union/_protos/common/list_pb2_grpc.py +4 -0
- union/_protos/common/policy_pb2.py +37 -0
- union/_protos/common/policy_pb2.pyi +27 -0
- union/_protos/common/policy_pb2_grpc.py +4 -0
- union/_protos/common/role_pb2.py +37 -0
- union/_protos/common/role_pb2.pyi +51 -0
- union/_protos/common/role_pb2_grpc.py +4 -0
- union/_protos/common/runtime_version_pb2.py +28 -0
- union/_protos/common/runtime_version_pb2.pyi +24 -0
- union/_protos/common/runtime_version_pb2_grpc.py +4 -0
- union/_protos/logs/dataplane/payload_pb2.py +96 -0
- union/_protos/logs/dataplane/payload_pb2.pyi +168 -0
- union/_protos/logs/dataplane/payload_pb2_grpc.py +4 -0
- union/_protos/secret/definition_pb2.py +49 -0
- union/_protos/secret/definition_pb2.pyi +93 -0
- union/_protos/secret/definition_pb2_grpc.py +4 -0
- union/_protos/secret/payload_pb2.py +62 -0
- union/_protos/secret/payload_pb2.pyi +94 -0
- union/_protos/secret/payload_pb2_grpc.py +4 -0
- union/_protos/secret/secret_pb2.py +38 -0
- union/_protos/secret/secret_pb2.pyi +6 -0
- union/_protos/secret/secret_pb2_grpc.py +198 -0
- union/_protos/validate/validate/validate_pb2.py +76 -0
- union/_protos/workflow/node_execution_service_pb2.py +26 -0
- union/_protos/workflow/node_execution_service_pb2.pyi +4 -0
- union/_protos/workflow/node_execution_service_pb2_grpc.py +32 -0
- union/_protos/workflow/queue_service_pb2.py +75 -0
- union/_protos/workflow/queue_service_pb2.pyi +103 -0
- union/_protos/workflow/queue_service_pb2_grpc.py +172 -0
- union/_protos/workflow/run_definition_pb2.py +100 -0
- union/_protos/workflow/run_definition_pb2.pyi +256 -0
- union/_protos/workflow/run_definition_pb2_grpc.py +4 -0
- union/_protos/workflow/run_logs_service_pb2.py +41 -0
- union/_protos/workflow/run_logs_service_pb2.pyi +28 -0
- union/_protos/workflow/run_logs_service_pb2_grpc.py +69 -0
- union/_protos/workflow/run_service_pb2.py +133 -0
- union/_protos/workflow/run_service_pb2.pyi +173 -0
- union/_protos/workflow/run_service_pb2_grpc.py +412 -0
- union/_protos/workflow/state_service_pb2.py +58 -0
- union/_protos/workflow/state_service_pb2.pyi +69 -0
- union/_protos/workflow/state_service_pb2_grpc.py +138 -0
- union/_protos/workflow/task_definition_pb2.py +72 -0
- union/_protos/workflow/task_definition_pb2.pyi +65 -0
- union/_protos/workflow/task_definition_pb2_grpc.py +4 -0
- union/_protos/workflow/task_service_pb2.py +44 -0
- union/_protos/workflow/task_service_pb2.pyi +31 -0
- union/_protos/workflow/task_service_pb2_grpc.py +104 -0
- union/_resources.py +226 -0
- union/_retry.py +32 -0
- union/_reusable_environment.py +25 -0
- union/_run.py +374 -0
- union/_secret.py +61 -0
- union/_task.py +354 -0
- union/_task_environment.py +186 -0
- union/_timeout.py +47 -0
- union/_tools.py +27 -0
- union/_utils/__init__.py +11 -0
- union/_utils/asyn.py +119 -0
- union/_utils/file_handling.py +71 -0
- union/_utils/helpers.py +46 -0
- union/_utils/lazy_module.py +54 -0
- union/_utils/uv_script_parser.py +49 -0
- union/_version.py +21 -0
- union/connectors/__init__.py +0 -0
- union/errors.py +128 -0
- union/extras/__init__.py +5 -0
- union/extras/_container.py +263 -0
- union/io/__init__.py +11 -0
- union/io/_dataframe.py +0 -0
- union/io/_dir.py +425 -0
- union/io/_file.py +418 -0
- union/io/pickle/__init__.py +0 -0
- union/io/pickle/transformer.py +117 -0
- union/io/structured_dataset/__init__.py +122 -0
- union/io/structured_dataset/basic_dfs.py +219 -0
- union/io/structured_dataset/structured_dataset.py +1057 -0
- union/py.typed +0 -0
- union/remote/__init__.py +23 -0
- union/remote/_client/__init__.py +0 -0
- union/remote/_client/_protocols.py +129 -0
- union/remote/_client/auth/__init__.py +12 -0
- union/remote/_client/auth/_authenticators/__init__.py +0 -0
- union/remote/_client/auth/_authenticators/base.py +391 -0
- union/remote/_client/auth/_authenticators/client_credentials.py +73 -0
- union/remote/_client/auth/_authenticators/device_code.py +120 -0
- union/remote/_client/auth/_authenticators/external_command.py +77 -0
- union/remote/_client/auth/_authenticators/factory.py +200 -0
- union/remote/_client/auth/_authenticators/pkce.py +515 -0
- union/remote/_client/auth/_channel.py +184 -0
- union/remote/_client/auth/_client_config.py +83 -0
- union/remote/_client/auth/_default_html.py +32 -0
- union/remote/_client/auth/_grpc_utils/__init__.py +0 -0
- union/remote/_client/auth/_grpc_utils/auth_interceptor.py +204 -0
- union/remote/_client/auth/_grpc_utils/default_metadata_interceptor.py +144 -0
- union/remote/_client/auth/_keyring.py +154 -0
- union/remote/_client/auth/_token_client.py +258 -0
- union/remote/_client/auth/errors.py +16 -0
- union/remote/_client/controlplane.py +86 -0
- union/remote/_data.py +149 -0
- union/remote/_logs.py +74 -0
- union/remote/_project.py +86 -0
- union/remote/_run.py +820 -0
- union/remote/_secret.py +132 -0
- union/remote/_task.py +193 -0
- union/report/__init__.py +3 -0
- union/report/_report.py +178 -0
- union/report/_template.html +124 -0
- union/storage/__init__.py +24 -0
- union/storage/_remote_fs.py +34 -0
- union/storage/_storage.py +247 -0
- union/storage/_utils.py +5 -0
- union/types/__init__.py +11 -0
- union/types/_renderer.py +162 -0
- union/types/_string_literals.py +120 -0
- union/types/_type_engine.py +2131 -0
- union/types/_utils.py +80 -0
flyte/_deploy.py
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import TYPE_CHECKING, Dict, List, Optional, Tuple
|
|
6
|
+
|
|
7
|
+
import rich.repr
|
|
8
|
+
|
|
9
|
+
from ._api_commons import syncer
|
|
10
|
+
from ._datastructures import SerializationContext
|
|
11
|
+
from ._environment import Environment
|
|
12
|
+
from ._image import Image
|
|
13
|
+
from ._initialize import get_client, get_common_config, requires_client, requires_initialization
|
|
14
|
+
from ._logging import logger
|
|
15
|
+
from ._task import TaskTemplate
|
|
16
|
+
from ._task_environment import TaskEnvironment
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from flyte._protos.workflow import task_definition_pb2
|
|
20
|
+
|
|
21
|
+
from ._code_bundle import CopyFiles
|
|
22
|
+
from ._internal.imagebuild.image_builder import ImageCache
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@rich.repr.auto
|
|
26
|
+
@dataclass
|
|
27
|
+
class DeploymentPlan:
|
|
28
|
+
envs: Dict[str, Environment]
|
|
29
|
+
version: Optional[str] = None
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@rich.repr.auto
|
|
33
|
+
@dataclass
|
|
34
|
+
class Deployment:
|
|
35
|
+
envs: Dict[str, Environment]
|
|
36
|
+
deployed_tasks: List[task_definition_pb2.TaskSpec] | None = None
|
|
37
|
+
|
|
38
|
+
def summary_repr(self) -> str:
|
|
39
|
+
"""
|
|
40
|
+
Returns a summary representation of the deployment.
|
|
41
|
+
"""
|
|
42
|
+
env_names = ", ".join(self.envs.keys())
|
|
43
|
+
task_names_versions = ", ".join(
|
|
44
|
+
f"{task.task_template.id.name} (v{task.task_template.id.version})" for task in self.deployed_tasks or []
|
|
45
|
+
)
|
|
46
|
+
return f"Deployment(envs=[{env_names}], tasks=[{task_names_versions}])"
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@requires_client
|
|
50
|
+
async def _deploy_task(
|
|
51
|
+
task: TaskTemplate, serialization_context: SerializationContext, dryrun: bool = False
|
|
52
|
+
) -> task_definition_pb2.TaskSpec:
|
|
53
|
+
"""
|
|
54
|
+
Deploy the given task.
|
|
55
|
+
"""
|
|
56
|
+
from ._internal.runtime.task_serde import translate_task_to_wire
|
|
57
|
+
from ._protos.workflow import task_definition_pb2, task_service_pb2
|
|
58
|
+
|
|
59
|
+
image_uri = task.image.uri if isinstance(task.image, Image) else task.image
|
|
60
|
+
|
|
61
|
+
spec = translate_task_to_wire(task, serialization_context)
|
|
62
|
+
if dryrun:
|
|
63
|
+
return spec
|
|
64
|
+
msg = f"Deploying task {task.name}, with image {image_uri} version {serialization_context.version}"
|
|
65
|
+
if spec.task_template.HasField("container") and spec.task_template.container.args:
|
|
66
|
+
msg += f" from {spec.task_template.container.args[-3]}.{spec.task_template.container.args[-1]}"
|
|
67
|
+
logger.info(msg)
|
|
68
|
+
task_id = task_definition_pb2.TaskIdentifier(
|
|
69
|
+
org=spec.task_template.id.org,
|
|
70
|
+
project=spec.task_template.id.project,
|
|
71
|
+
domain=spec.task_template.id.domain,
|
|
72
|
+
version=spec.task_template.id.version,
|
|
73
|
+
name=spec.task_template.id.name,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
await get_client().task_service.DeployTask(task_service_pb2.DeployTaskRequest(task_id=task_id, spec=spec))
|
|
77
|
+
logger.info(f"Deployed task {task.name} with version {task_id.version}")
|
|
78
|
+
return spec
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
async def _build_image_bg(env_name: str, image: Image) -> Tuple[str, str]:
|
|
82
|
+
"""
|
|
83
|
+
Build the image in the background and return the environment name and the built image.
|
|
84
|
+
"""
|
|
85
|
+
from ._build import build
|
|
86
|
+
|
|
87
|
+
logger.info(f"Building image {image.name} for environment {env_name}")
|
|
88
|
+
return env_name, await build.aio(image)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
async def build_images(deployment: DeploymentPlan) -> ImageCache:
|
|
92
|
+
"""
|
|
93
|
+
Build the images for the given deployment plan and update the environment with the built image.
|
|
94
|
+
"""
|
|
95
|
+
from ._internal.imagebuild.image_builder import ImageCache
|
|
96
|
+
|
|
97
|
+
images = []
|
|
98
|
+
image_identifier_map = {}
|
|
99
|
+
for env_name, env in deployment.envs.items():
|
|
100
|
+
if not isinstance(env.image, str):
|
|
101
|
+
logger.info(f"Building Image for environment {env_name}, image: {env.image}")
|
|
102
|
+
images.append(_build_image_bg(env_name, env.image))
|
|
103
|
+
|
|
104
|
+
elif env.image == "auto" and "auto" not in image_identifier_map:
|
|
105
|
+
auto_image = Image.auto()
|
|
106
|
+
image_identifier_map["auto"] = auto_image.uri
|
|
107
|
+
final_images = await asyncio.gather(*images)
|
|
108
|
+
|
|
109
|
+
for env_name, image_uri in final_images:
|
|
110
|
+
logger.info(f"Built Image for environment {env_name}, image: {image_uri}")
|
|
111
|
+
env = deployment.envs[env_name]
|
|
112
|
+
if isinstance(env.image, Image):
|
|
113
|
+
image_identifier_map[env.image.identifier] = env.image.uri
|
|
114
|
+
|
|
115
|
+
return ImageCache(image_lookup=image_identifier_map)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@requires_initialization
|
|
119
|
+
async def apply(deployment: DeploymentPlan, copy_style: CopyFiles, dryrun: bool = False) -> Deployment:
|
|
120
|
+
from ._code_bundle import build_code_bundle
|
|
121
|
+
|
|
122
|
+
cfg = get_common_config()
|
|
123
|
+
image_cache = await build_images(deployment)
|
|
124
|
+
if copy_style == "none":
|
|
125
|
+
code_bundle = None
|
|
126
|
+
assert deployment.version is not None, "Version must be set when copy_style is none"
|
|
127
|
+
else:
|
|
128
|
+
code_bundle = await build_code_bundle(from_dir=cfg.root_dir, dryrun=dryrun, copy_style=copy_style)
|
|
129
|
+
deployment.version = code_bundle.computed_version
|
|
130
|
+
|
|
131
|
+
sc = SerializationContext(
|
|
132
|
+
project=cfg.project,
|
|
133
|
+
domain=cfg.domain,
|
|
134
|
+
org=cfg.org,
|
|
135
|
+
code_bundle=code_bundle,
|
|
136
|
+
version=deployment.version,
|
|
137
|
+
image_cache=image_cache,
|
|
138
|
+
root_dir=cfg.root_dir,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
tasks = []
|
|
142
|
+
for env_name, env in deployment.envs.items():
|
|
143
|
+
logger.info(f"Deploying environment {env_name}")
|
|
144
|
+
if isinstance(env, TaskEnvironment):
|
|
145
|
+
for task in env.tasks.values():
|
|
146
|
+
tasks.append(_deploy_task(task, dryrun=dryrun, serialization_context=sc))
|
|
147
|
+
return Deployment(envs=deployment.envs, deployed_tasks=await asyncio.gather(*tasks))
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def _recursive_discover(
|
|
151
|
+
planned_envs: Dict[str, Environment], envs: Environment | List[Environment]
|
|
152
|
+
) -> Dict[str, Environment]:
|
|
153
|
+
"""
|
|
154
|
+
Recursively deploy the environment and its dependencies, if not already deployed (present in env_tasks) and
|
|
155
|
+
return the updated env_tasks.
|
|
156
|
+
"""
|
|
157
|
+
if isinstance(envs, Environment):
|
|
158
|
+
envs = [envs]
|
|
159
|
+
for env in envs:
|
|
160
|
+
# Skip if the environment is already planned
|
|
161
|
+
if env.name in planned_envs:
|
|
162
|
+
continue
|
|
163
|
+
# Recursively discover dependent environments
|
|
164
|
+
for dependent_env in env.env_dep_hints:
|
|
165
|
+
_recursive_discover(planned_envs, dependent_env)
|
|
166
|
+
# Add the environment to the existing envs
|
|
167
|
+
planned_envs[env.name] = env
|
|
168
|
+
return planned_envs
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def plan_deploy(*envs: Environment, version: Optional[str] = None) -> DeploymentPlan:
|
|
172
|
+
if envs is None:
|
|
173
|
+
return DeploymentPlan({})
|
|
174
|
+
planned_envs = _recursive_discover({}, *envs)
|
|
175
|
+
return DeploymentPlan(planned_envs, version=version)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
@syncer.wrap
|
|
179
|
+
async def deploy(
|
|
180
|
+
*envs: Environment,
|
|
181
|
+
dryrun: bool = False,
|
|
182
|
+
version: str | None = None,
|
|
183
|
+
interactive_mode: bool | None = None,
|
|
184
|
+
copy_style: CopyFiles = "loaded_modules",
|
|
185
|
+
) -> Deployment:
|
|
186
|
+
"""
|
|
187
|
+
Deploy the given environment or list of environments.
|
|
188
|
+
:param envs: Environment or list of environments to deploy.
|
|
189
|
+
:param dryrun: dryrun mode, if True, the deployment will not be applied to the control plane.
|
|
190
|
+
:param version: version of the deployment, if None, the version will be computed from the code bundle.
|
|
191
|
+
TODO: Support for interactive_mode
|
|
192
|
+
:param interactive_mode: Optional, can be forced to True or False.
|
|
193
|
+
If not provided, it will be set based on the current environment. For example Jupyter notebooks are considered
|
|
194
|
+
interactive mode, while scripts are not. This is used to determine how the code bundle is created.
|
|
195
|
+
:param copy_style: Copy style to use when running the task
|
|
196
|
+
|
|
197
|
+
:return: Deployment object containing the deployed environments and tasks.
|
|
198
|
+
"""
|
|
199
|
+
if interactive_mode:
|
|
200
|
+
raise NotImplementedError("Interactive mode not yet implemented for deployment")
|
|
201
|
+
deployment = plan_deploy(*envs, version=version)
|
|
202
|
+
return await apply(deployment, copy_style=copy_style, dryrun=dryrun)
|
flyte/_doc.py
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import inspect
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import Callable, Optional
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@dataclass
|
|
7
|
+
class Documentation:
|
|
8
|
+
"""
|
|
9
|
+
This class is used to store the documentation of a task.
|
|
10
|
+
|
|
11
|
+
It can be set explicitly or extracted from the docstring of the task.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
description: str
|
|
15
|
+
|
|
16
|
+
def __help__str__(self):
|
|
17
|
+
return self.description
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def extract_docstring(func: Optional[Callable]) -> Documentation:
|
|
21
|
+
"""
|
|
22
|
+
Extracts the description from a docstring.
|
|
23
|
+
"""
|
|
24
|
+
if func is None:
|
|
25
|
+
return Documentation(description="")
|
|
26
|
+
docstring = inspect.getdoc(func)
|
|
27
|
+
if not docstring:
|
|
28
|
+
return Documentation(description="")
|
|
29
|
+
return Documentation(description=docstring)
|
flyte/_docstring.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, Callable, Dict, Optional
|
|
2
|
+
|
|
3
|
+
if TYPE_CHECKING:
|
|
4
|
+
pass
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Docstring(object):
|
|
8
|
+
def __init__(self, docstring: Optional[str] = None, callable_: Optional[Callable] = None):
|
|
9
|
+
import docstring_parser
|
|
10
|
+
|
|
11
|
+
self._parsed_docstring: docstring_parser.Docstring
|
|
12
|
+
|
|
13
|
+
if docstring is not None:
|
|
14
|
+
self._parsed_docstring = docstring_parser.parse(docstring)
|
|
15
|
+
elif callable_.__doc__ is not None:
|
|
16
|
+
self._parsed_docstring = docstring_parser.parse(callable_.__doc__)
|
|
17
|
+
|
|
18
|
+
@property
|
|
19
|
+
def input_descriptions(self) -> Dict[str, Optional[str]]:
|
|
20
|
+
return {p.arg_name: p.description for p in self._parsed_docstring.params}
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
def output_descriptions(self) -> Dict[str, Optional[str]]:
|
|
24
|
+
return {p.return_name: p.description for p in self._parsed_docstring.many_returns if p.return_name is not None}
|
|
25
|
+
|
|
26
|
+
@property
|
|
27
|
+
def short_description(self) -> Optional[str]:
|
|
28
|
+
return self._parsed_docstring.short_description
|
|
29
|
+
|
|
30
|
+
@property
|
|
31
|
+
def long_description(self) -> Optional[str]:
|
|
32
|
+
return self._parsed_docstring.long_description
|
flyte/_environment.py
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass, field
|
|
4
|
+
from typing import TYPE_CHECKING, Dict, List, Literal, Optional, Union
|
|
5
|
+
|
|
6
|
+
import rich.repr
|
|
7
|
+
|
|
8
|
+
from flyte._secret import SecretRequest
|
|
9
|
+
|
|
10
|
+
from ._image import Image
|
|
11
|
+
from ._resources import Resources
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from kubernetes.client import V1PodTemplate
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@rich.repr.auto
|
|
18
|
+
@dataclass(init=True, repr=True)
|
|
19
|
+
class Environment:
|
|
20
|
+
"""
|
|
21
|
+
:param name: Name of the environment
|
|
22
|
+
:param image: Docker image to use for the environment. If set to "auto", will use the default image.
|
|
23
|
+
:param resources: Resources to allocate for the environment.
|
|
24
|
+
:param env: Environment variables to set for the environment.
|
|
25
|
+
:param secrets: Secrets to inject into the environment.
|
|
26
|
+
:param env_dep_hints: Environment dependencies to hint, so when you deploy the environment, the dependencies are
|
|
27
|
+
also deployed. This is useful when you have a set of environments that depend on each other.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
name: str
|
|
31
|
+
env_dep_hints: List[Environment] = field(default_factory=list)
|
|
32
|
+
pod_template: Optional[Union[str, "V1PodTemplate"]] = None
|
|
33
|
+
description: Optional[str] = None
|
|
34
|
+
secrets: Optional[SecretRequest] = None
|
|
35
|
+
env: Optional[Dict[str, str]] = None
|
|
36
|
+
resources: Optional[Resources] = None
|
|
37
|
+
image: Union[str, Image, Literal["auto"]] = "auto"
|
|
38
|
+
|
|
39
|
+
def add_dependency(self, *env: Environment):
|
|
40
|
+
"""
|
|
41
|
+
Add a dependency to the environment.
|
|
42
|
+
"""
|
|
43
|
+
self.env_dep_hints.extend(env)
|
flyte/_group.py
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from contextlib import contextmanager
|
|
2
|
+
|
|
3
|
+
from ._context import internal_ctx
|
|
4
|
+
from ._datastructures import GroupData
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@contextmanager
|
|
8
|
+
def group(name: str):
|
|
9
|
+
"""
|
|
10
|
+
Create a new group with the given name. The method is intended to be used as a context manager.
|
|
11
|
+
|
|
12
|
+
Example:
|
|
13
|
+
```python
|
|
14
|
+
@task
|
|
15
|
+
async def my_task():
|
|
16
|
+
...
|
|
17
|
+
with group("my_group"):
|
|
18
|
+
t1(x,y) # tasks in this block will be grouped under "my_group"
|
|
19
|
+
...
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
:param name: The name of the group
|
|
23
|
+
"""
|
|
24
|
+
ctx = internal_ctx()
|
|
25
|
+
if ctx.data.task_context is None:
|
|
26
|
+
yield
|
|
27
|
+
return
|
|
28
|
+
tctx = ctx.data.task_context
|
|
29
|
+
new_tctx = tctx.replace(group_data=GroupData(name))
|
|
30
|
+
with ctx.replace_task_context(new_tctx):
|
|
31
|
+
yield
|
flyte/_hash.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from typing import Callable, Generic, TypeVar
|
|
2
|
+
|
|
3
|
+
T = TypeVar("T")
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class HashOnReferenceMixin(object):
|
|
7
|
+
def __hash__(self):
|
|
8
|
+
return hash(id(self))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class HashMethod(Generic[T]):
|
|
12
|
+
"""
|
|
13
|
+
Flyte-specific object used to wrap the hash function for a specific type
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def __init__(self, function: Callable[[T], str]):
|
|
17
|
+
self._function = function
|
|
18
|
+
|
|
19
|
+
def calculate(self, obj: T) -> str:
|
|
20
|
+
"""
|
|
21
|
+
Calculate hash for `obj`.
|
|
22
|
+
"""
|
|
23
|
+
return self._function(obj)
|