flyte 0.2.0b1__py3-none-any.whl → 2.0.0b46__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.
Files changed (266) hide show
  1. flyte/__init__.py +83 -30
  2. flyte/_bin/connect.py +61 -0
  3. flyte/_bin/debug.py +38 -0
  4. flyte/_bin/runtime.py +87 -19
  5. flyte/_bin/serve.py +351 -0
  6. flyte/_build.py +3 -2
  7. flyte/_cache/cache.py +6 -5
  8. flyte/_cache/local_cache.py +216 -0
  9. flyte/_code_bundle/_ignore.py +31 -5
  10. flyte/_code_bundle/_packaging.py +42 -11
  11. flyte/_code_bundle/_utils.py +57 -34
  12. flyte/_code_bundle/bundle.py +130 -27
  13. flyte/_constants.py +1 -0
  14. flyte/_context.py +21 -5
  15. flyte/_custom_context.py +73 -0
  16. flyte/_debug/constants.py +37 -0
  17. flyte/_debug/utils.py +17 -0
  18. flyte/_debug/vscode.py +315 -0
  19. flyte/_deploy.py +396 -75
  20. flyte/_deployer.py +109 -0
  21. flyte/_environment.py +94 -11
  22. flyte/_excepthook.py +37 -0
  23. flyte/_group.py +2 -1
  24. flyte/_hash.py +1 -16
  25. flyte/_image.py +544 -231
  26. flyte/_initialize.py +456 -316
  27. flyte/_interface.py +40 -5
  28. flyte/_internal/controllers/__init__.py +22 -8
  29. flyte/_internal/controllers/_local_controller.py +159 -35
  30. flyte/_internal/controllers/_trace.py +18 -10
  31. flyte/_internal/controllers/remote/__init__.py +38 -9
  32. flyte/_internal/controllers/remote/_action.py +82 -12
  33. flyte/_internal/controllers/remote/_client.py +6 -2
  34. flyte/_internal/controllers/remote/_controller.py +290 -64
  35. flyte/_internal/controllers/remote/_core.py +155 -95
  36. flyte/_internal/controllers/remote/_informer.py +40 -20
  37. flyte/_internal/controllers/remote/_service_protocol.py +2 -2
  38. flyte/_internal/imagebuild/__init__.py +2 -10
  39. flyte/_internal/imagebuild/docker_builder.py +391 -84
  40. flyte/_internal/imagebuild/image_builder.py +111 -55
  41. flyte/_internal/imagebuild/remote_builder.py +409 -0
  42. flyte/_internal/imagebuild/utils.py +79 -0
  43. flyte/_internal/resolvers/_app_env_module.py +92 -0
  44. flyte/_internal/resolvers/_task_module.py +5 -38
  45. flyte/_internal/resolvers/app_env.py +26 -0
  46. flyte/_internal/resolvers/common.py +8 -1
  47. flyte/_internal/resolvers/default.py +2 -2
  48. flyte/_internal/runtime/convert.py +319 -36
  49. flyte/_internal/runtime/entrypoints.py +106 -18
  50. flyte/_internal/runtime/io.py +71 -23
  51. flyte/_internal/runtime/resources_serde.py +21 -7
  52. flyte/_internal/runtime/reuse.py +125 -0
  53. flyte/_internal/runtime/rusty.py +196 -0
  54. flyte/_internal/runtime/task_serde.py +239 -66
  55. flyte/_internal/runtime/taskrunner.py +48 -8
  56. flyte/_internal/runtime/trigger_serde.py +162 -0
  57. flyte/_internal/runtime/types_serde.py +7 -16
  58. flyte/_keyring/file.py +115 -0
  59. flyte/_link.py +30 -0
  60. flyte/_logging.py +241 -42
  61. flyte/_map.py +312 -0
  62. flyte/_metrics.py +59 -0
  63. flyte/_module.py +74 -0
  64. flyte/_pod.py +30 -0
  65. flyte/_resources.py +296 -33
  66. flyte/_retry.py +1 -7
  67. flyte/_reusable_environment.py +72 -7
  68. flyte/_run.py +462 -132
  69. flyte/_secret.py +47 -11
  70. flyte/_serve.py +333 -0
  71. flyte/_task.py +245 -56
  72. flyte/_task_environment.py +219 -97
  73. flyte/_task_plugins.py +47 -0
  74. flyte/_tools.py +8 -8
  75. flyte/_trace.py +15 -24
  76. flyte/_trigger.py +1027 -0
  77. flyte/_utils/__init__.py +12 -1
  78. flyte/_utils/asyn.py +3 -1
  79. flyte/_utils/async_cache.py +139 -0
  80. flyte/_utils/coro_management.py +5 -4
  81. flyte/_utils/description_parser.py +19 -0
  82. flyte/_utils/docker_credentials.py +173 -0
  83. flyte/_utils/helpers.py +45 -19
  84. flyte/_utils/module_loader.py +123 -0
  85. flyte/_utils/org_discovery.py +57 -0
  86. flyte/_utils/uv_script_parser.py +8 -1
  87. flyte/_version.py +16 -3
  88. flyte/app/__init__.py +27 -0
  89. flyte/app/_app_environment.py +362 -0
  90. flyte/app/_connector_environment.py +40 -0
  91. flyte/app/_deploy.py +130 -0
  92. flyte/app/_parameter.py +343 -0
  93. flyte/app/_runtime/__init__.py +3 -0
  94. flyte/app/_runtime/app_serde.py +383 -0
  95. flyte/app/_types.py +113 -0
  96. flyte/app/extras/__init__.py +9 -0
  97. flyte/app/extras/_auth_middleware.py +217 -0
  98. flyte/app/extras/_fastapi.py +93 -0
  99. flyte/app/extras/_model_loader/__init__.py +3 -0
  100. flyte/app/extras/_model_loader/config.py +7 -0
  101. flyte/app/extras/_model_loader/loader.py +288 -0
  102. flyte/cli/__init__.py +12 -0
  103. flyte/cli/_abort.py +28 -0
  104. flyte/cli/_build.py +114 -0
  105. flyte/cli/_common.py +493 -0
  106. flyte/cli/_create.py +371 -0
  107. flyte/cli/_delete.py +45 -0
  108. flyte/cli/_deploy.py +401 -0
  109. flyte/cli/_gen.py +316 -0
  110. flyte/cli/_get.py +446 -0
  111. flyte/cli/_option.py +33 -0
  112. flyte/{_cli → cli}/_params.py +57 -17
  113. flyte/cli/_plugins.py +209 -0
  114. flyte/cli/_prefetch.py +292 -0
  115. flyte/cli/_run.py +690 -0
  116. flyte/cli/_serve.py +338 -0
  117. flyte/cli/_update.py +86 -0
  118. flyte/cli/_user.py +20 -0
  119. flyte/cli/main.py +246 -0
  120. flyte/config/__init__.py +2 -167
  121. flyte/config/_config.py +215 -163
  122. flyte/config/_internal.py +10 -1
  123. flyte/config/_reader.py +225 -0
  124. flyte/connectors/__init__.py +11 -0
  125. flyte/connectors/_connector.py +330 -0
  126. flyte/connectors/_server.py +194 -0
  127. flyte/connectors/utils.py +159 -0
  128. flyte/errors.py +134 -2
  129. flyte/extend.py +24 -0
  130. flyte/extras/_container.py +69 -56
  131. flyte/git/__init__.py +3 -0
  132. flyte/git/_config.py +279 -0
  133. flyte/io/__init__.py +8 -1
  134. flyte/io/{structured_dataset → _dataframe}/__init__.py +32 -30
  135. flyte/io/{structured_dataset → _dataframe}/basic_dfs.py +75 -68
  136. flyte/io/{structured_dataset/structured_dataset.py → _dataframe/dataframe.py} +207 -242
  137. flyte/io/_dir.py +575 -113
  138. flyte/io/_file.py +587 -141
  139. flyte/io/_hashing_io.py +342 -0
  140. flyte/io/extend.py +7 -0
  141. flyte/models.py +635 -0
  142. flyte/prefetch/__init__.py +22 -0
  143. flyte/prefetch/_hf_model.py +563 -0
  144. flyte/remote/__init__.py +14 -3
  145. flyte/remote/_action.py +879 -0
  146. flyte/remote/_app.py +346 -0
  147. flyte/remote/_auth_metadata.py +42 -0
  148. flyte/remote/_client/_protocols.py +62 -4
  149. flyte/remote/_client/auth/_auth_utils.py +19 -0
  150. flyte/remote/_client/auth/_authenticators/base.py +8 -2
  151. flyte/remote/_client/auth/_authenticators/device_code.py +4 -5
  152. flyte/remote/_client/auth/_authenticators/factory.py +4 -0
  153. flyte/remote/_client/auth/_authenticators/passthrough.py +79 -0
  154. flyte/remote/_client/auth/_authenticators/pkce.py +17 -18
  155. flyte/remote/_client/auth/_channel.py +47 -18
  156. flyte/remote/_client/auth/_client_config.py +5 -3
  157. flyte/remote/_client/auth/_keyring.py +15 -2
  158. flyte/remote/_client/auth/_token_client.py +3 -3
  159. flyte/remote/_client/controlplane.py +206 -18
  160. flyte/remote/_common.py +66 -0
  161. flyte/remote/_data.py +107 -22
  162. flyte/remote/_logs.py +116 -33
  163. flyte/remote/_project.py +21 -19
  164. flyte/remote/_run.py +164 -631
  165. flyte/remote/_secret.py +72 -29
  166. flyte/remote/_task.py +387 -46
  167. flyte/remote/_trigger.py +368 -0
  168. flyte/remote/_user.py +43 -0
  169. flyte/report/_report.py +10 -6
  170. flyte/storage/__init__.py +13 -1
  171. flyte/storage/_config.py +237 -0
  172. flyte/storage/_parallel_reader.py +289 -0
  173. flyte/storage/_storage.py +268 -59
  174. flyte/syncify/__init__.py +56 -0
  175. flyte/syncify/_api.py +414 -0
  176. flyte/types/__init__.py +39 -0
  177. flyte/types/_interface.py +22 -7
  178. flyte/{io/pickle/transformer.py → types/_pickle.py} +37 -9
  179. flyte/types/_string_literals.py +8 -9
  180. flyte/types/_type_engine.py +226 -126
  181. flyte/types/_utils.py +1 -1
  182. flyte-2.0.0b46.data/scripts/debug.py +38 -0
  183. flyte-2.0.0b46.data/scripts/runtime.py +194 -0
  184. flyte-2.0.0b46.dist-info/METADATA +352 -0
  185. flyte-2.0.0b46.dist-info/RECORD +221 -0
  186. flyte-2.0.0b46.dist-info/entry_points.txt +8 -0
  187. flyte-2.0.0b46.dist-info/licenses/LICENSE +201 -0
  188. flyte/_api_commons.py +0 -3
  189. flyte/_cli/_common.py +0 -299
  190. flyte/_cli/_create.py +0 -42
  191. flyte/_cli/_delete.py +0 -23
  192. flyte/_cli/_deploy.py +0 -140
  193. flyte/_cli/_get.py +0 -235
  194. flyte/_cli/_run.py +0 -174
  195. flyte/_cli/main.py +0 -98
  196. flyte/_datastructures.py +0 -342
  197. flyte/_internal/controllers/pbhash.py +0 -39
  198. flyte/_protos/common/authorization_pb2.py +0 -66
  199. flyte/_protos/common/authorization_pb2.pyi +0 -108
  200. flyte/_protos/common/authorization_pb2_grpc.py +0 -4
  201. flyte/_protos/common/identifier_pb2.py +0 -71
  202. flyte/_protos/common/identifier_pb2.pyi +0 -82
  203. flyte/_protos/common/identifier_pb2_grpc.py +0 -4
  204. flyte/_protos/common/identity_pb2.py +0 -48
  205. flyte/_protos/common/identity_pb2.pyi +0 -72
  206. flyte/_protos/common/identity_pb2_grpc.py +0 -4
  207. flyte/_protos/common/list_pb2.py +0 -36
  208. flyte/_protos/common/list_pb2.pyi +0 -69
  209. flyte/_protos/common/list_pb2_grpc.py +0 -4
  210. flyte/_protos/common/policy_pb2.py +0 -37
  211. flyte/_protos/common/policy_pb2.pyi +0 -27
  212. flyte/_protos/common/policy_pb2_grpc.py +0 -4
  213. flyte/_protos/common/role_pb2.py +0 -37
  214. flyte/_protos/common/role_pb2.pyi +0 -53
  215. flyte/_protos/common/role_pb2_grpc.py +0 -4
  216. flyte/_protos/common/runtime_version_pb2.py +0 -28
  217. flyte/_protos/common/runtime_version_pb2.pyi +0 -24
  218. flyte/_protos/common/runtime_version_pb2_grpc.py +0 -4
  219. flyte/_protos/logs/dataplane/payload_pb2.py +0 -96
  220. flyte/_protos/logs/dataplane/payload_pb2.pyi +0 -168
  221. flyte/_protos/logs/dataplane/payload_pb2_grpc.py +0 -4
  222. flyte/_protos/secret/definition_pb2.py +0 -49
  223. flyte/_protos/secret/definition_pb2.pyi +0 -93
  224. flyte/_protos/secret/definition_pb2_grpc.py +0 -4
  225. flyte/_protos/secret/payload_pb2.py +0 -62
  226. flyte/_protos/secret/payload_pb2.pyi +0 -94
  227. flyte/_protos/secret/payload_pb2_grpc.py +0 -4
  228. flyte/_protos/secret/secret_pb2.py +0 -38
  229. flyte/_protos/secret/secret_pb2.pyi +0 -6
  230. flyte/_protos/secret/secret_pb2_grpc.py +0 -198
  231. flyte/_protos/secret/secret_pb2_grpc_grpc.py +0 -198
  232. flyte/_protos/validate/validate/validate_pb2.py +0 -76
  233. flyte/_protos/workflow/node_execution_service_pb2.py +0 -26
  234. flyte/_protos/workflow/node_execution_service_pb2.pyi +0 -4
  235. flyte/_protos/workflow/node_execution_service_pb2_grpc.py +0 -32
  236. flyte/_protos/workflow/queue_service_pb2.py +0 -106
  237. flyte/_protos/workflow/queue_service_pb2.pyi +0 -141
  238. flyte/_protos/workflow/queue_service_pb2_grpc.py +0 -172
  239. flyte/_protos/workflow/run_definition_pb2.py +0 -128
  240. flyte/_protos/workflow/run_definition_pb2.pyi +0 -310
  241. flyte/_protos/workflow/run_definition_pb2_grpc.py +0 -4
  242. flyte/_protos/workflow/run_logs_service_pb2.py +0 -41
  243. flyte/_protos/workflow/run_logs_service_pb2.pyi +0 -28
  244. flyte/_protos/workflow/run_logs_service_pb2_grpc.py +0 -69
  245. flyte/_protos/workflow/run_service_pb2.py +0 -133
  246. flyte/_protos/workflow/run_service_pb2.pyi +0 -175
  247. flyte/_protos/workflow/run_service_pb2_grpc.py +0 -412
  248. flyte/_protos/workflow/state_service_pb2.py +0 -58
  249. flyte/_protos/workflow/state_service_pb2.pyi +0 -71
  250. flyte/_protos/workflow/state_service_pb2_grpc.py +0 -138
  251. flyte/_protos/workflow/task_definition_pb2.py +0 -72
  252. flyte/_protos/workflow/task_definition_pb2.pyi +0 -65
  253. flyte/_protos/workflow/task_definition_pb2_grpc.py +0 -4
  254. flyte/_protos/workflow/task_service_pb2.py +0 -44
  255. flyte/_protos/workflow/task_service_pb2.pyi +0 -31
  256. flyte/_protos/workflow/task_service_pb2_grpc.py +0 -104
  257. flyte/io/_dataframe.py +0 -0
  258. flyte/io/pickle/__init__.py +0 -0
  259. flyte/remote/_console.py +0 -18
  260. flyte-0.2.0b1.dist-info/METADATA +0 -179
  261. flyte-0.2.0b1.dist-info/RECORD +0 -204
  262. flyte-0.2.0b1.dist-info/entry_points.txt +0 -3
  263. /flyte/{_cli → _debug}/__init__.py +0 -0
  264. /flyte/{_protos → _keyring}/__init__.py +0 -0
  265. {flyte-0.2.0b1.dist-info → flyte-2.0.0b46.dist-info}/WHEEL +0 -0
  266. {flyte-0.2.0b1.dist-info → flyte-2.0.0b46.dist-info}/top_level.txt +0 -0
flyte/__init__.py CHANGED
@@ -1,32 +1,85 @@
1
1
  """
2
- Flyte SDK for authoring Compound AI applications, services and workflows.
2
+ Flyte SDK for authoring compound AI applications, services and workflows.
3
+ """
3
4
 
4
- ## Environments
5
+ from __future__ import annotations
5
6
 
6
- TaskEnvironment class to define a new environment for a set of tasks.
7
+ import sys
7
8
 
8
- Example usage:
9
+ from ._build import build
10
+ from ._cache import Cache, CachePolicy, CacheRequest
11
+ from ._context import ctx
12
+ from ._custom_context import custom_context, get_custom_context
13
+ from ._deploy import build_images, deploy
14
+ from ._environment import Environment
15
+ from ._excepthook import custom_excepthook
16
+ from ._group import group
17
+ from ._image import Image
18
+ from ._initialize import current_domain, init, init_from_api_key, init_from_config, init_in_cluster, init_passthrough
19
+ from ._link import Link
20
+ from ._logging import logger
21
+ from ._map import map
22
+ from ._pod import PodTemplate
23
+ from ._resources import AMD_GPU, GPU, HABANA_GAUDI, TPU, Device, DeviceClass, Neuron, Resources
24
+ from ._retry import RetryStrategy
25
+ from ._reusable_environment import ReusePolicy
26
+ from ._run import run, with_runcontext
27
+ from ._secret import Secret, SecretRequest
28
+ from ._serve import serve, with_servecontext
29
+ from ._task_environment import TaskEnvironment
30
+ from ._timeout import Timeout, TimeoutType
31
+ from ._trace import trace
32
+ from ._trigger import Cron, FixedRate, Trigger, TriggerTime
33
+ from ._version import __version__
9
34
 
10
- ```python
11
- env = flyte.TaskEnvironment(name="my_env", image="my_image", resources=Resources(cpu="1", memory="1Gi"))
35
+ sys.excepthook = custom_excepthook
36
+
37
+
38
+ def _silence_grpc_warnings():
39
+ """
40
+ Silences gRPC warnings that can clutter the output.
41
+ """
42
+ import os
43
+
44
+ # Set environment variables for gRPC, this reduces log spew and avoids unnecessary warnings
45
+ # before importing grpc
46
+ if "GRPC_VERBOSITY" not in os.environ:
47
+ os.environ["GRPC_VERBOSITY"] = "ERROR"
48
+ os.environ["GRPC_CPP_MIN_LOG_LEVEL"] = "ERROR"
49
+ # Disable fork support (stops "skipping fork() handlers")
50
+ os.environ["GRPC_ENABLE_FORK_SUPPORT"] = "0"
51
+ # Reduce absl/glog verbosity
52
+ os.environ["GLOG_minloglevel"] = "2"
53
+ os.environ["ABSL_LOG"] = "0"
54
+
55
+
56
+ _silence_grpc_warnings()
57
+
58
+
59
+ def version() -> str:
60
+ """
61
+ Returns the version of the Flyte SDK.
62
+ """
63
+ return __version__
12
64
 
13
- @env.task
14
- async def my_task():
15
- pass
16
- ```
17
- """
18
65
 
19
66
  __all__ = [
20
- "ABFS",
21
- "GCS",
67
+ "AMD_GPU",
22
68
  "GPU",
23
- "S3",
69
+ "HABANA_GAUDI",
24
70
  "TPU",
25
71
  "Cache",
26
72
  "CachePolicy",
27
73
  "CacheRequest",
74
+ "Cron",
28
75
  "Device",
76
+ "DeviceClass",
77
+ "Environment",
78
+ "FixedRate",
29
79
  "Image",
80
+ "Link",
81
+ "Neuron",
82
+ "PodTemplate",
30
83
  "Resources",
31
84
  "RetryStrategy",
32
85
  "ReusePolicy",
@@ -35,28 +88,28 @@ __all__ = [
35
88
  "TaskEnvironment",
36
89
  "Timeout",
37
90
  "TimeoutType",
91
+ "Trigger",
92
+ "TriggerTime",
38
93
  "__version__",
94
+ "build",
95
+ "build_images",
39
96
  "ctx",
97
+ "current_domain",
98
+ "custom_context",
40
99
  "deploy",
100
+ "get_custom_context",
41
101
  "group",
42
102
  "init",
103
+ "init_from_api_key",
104
+ "init_from_config",
105
+ "init_in_cluster",
106
+ "init_passthrough",
107
+ "logger",
108
+ "map",
43
109
  "run",
110
+ "serve",
44
111
  "trace",
112
+ "version",
45
113
  "with_runcontext",
114
+ "with_servecontext",
46
115
  ]
47
-
48
- from ._cache import Cache, CachePolicy, CacheRequest
49
- from ._context import ctx
50
- from ._deploy import deploy
51
- from ._group import group
52
- from ._image import Image
53
- from ._initialize import ABFS, GCS, S3, init
54
- from ._resources import GPU, TPU, Device, Resources
55
- from ._retry import RetryStrategy
56
- from ._reusable_environment import ReusePolicy
57
- from ._run import run, with_runcontext
58
- from ._secret import Secret, SecretRequest
59
- from ._task_environment import TaskEnvironment
60
- from ._timeout import Timeout, TimeoutType
61
- from ._trace import trace
62
- from ._version import __version__
flyte/_bin/connect.py ADDED
@@ -0,0 +1,61 @@
1
+ from typing import List
2
+
3
+ import click
4
+
5
+
6
+ @click.group()
7
+ def _connect():
8
+ """Debug commands for Flyte."""
9
+
10
+
11
+ @_connect.command()
12
+ @click.option(
13
+ "--port",
14
+ default="8000",
15
+ is_flag=False,
16
+ type=int,
17
+ help="Grpc port for the connector service. Defaults to 8000",
18
+ )
19
+ @click.option(
20
+ "--prometheus_port",
21
+ default="9090",
22
+ is_flag=False,
23
+ type=int,
24
+ help="Prometheus port for the connector service. Defaults to 9090",
25
+ )
26
+ @click.option(
27
+ "--worker",
28
+ default="10",
29
+ is_flag=False,
30
+ type=int,
31
+ help="Number of workers for the grpc server",
32
+ )
33
+ @click.option(
34
+ "--timeout",
35
+ default=None,
36
+ is_flag=False,
37
+ type=int,
38
+ help="It will wait for the specified number of seconds before shutting down grpc server. It should only be used "
39
+ "for testing.",
40
+ )
41
+ @click.option(
42
+ "--modules",
43
+ required=False,
44
+ multiple=True,
45
+ type=str,
46
+ help="List of additional files or module that defines the connector",
47
+ )
48
+ @click.pass_context
49
+ def main(
50
+ _: click.Context, port: int, prometheus_port: int, worker: int, timeout: int | None, modules: List[str] | None
51
+ ):
52
+ """
53
+ Start a grpc server for the connector service.
54
+ """
55
+ from flyte.connectors import ConnectorService
56
+
57
+ ConnectorService.run(port, prometheus_port, worker, timeout, modules)
58
+
59
+
60
+ if __name__ == "__main__":
61
+ _connect()
flyte/_bin/debug.py ADDED
@@ -0,0 +1,38 @@
1
+ import click
2
+
3
+
4
+ @click.group()
5
+ def _debug():
6
+ """Debug commands for Flyte."""
7
+
8
+
9
+ @_debug.command("resume")
10
+ @click.option("--pid", "-m", type=int, required=True, help="PID of the vscode server.")
11
+ def resume(pid):
12
+ """
13
+ Resume a Flyte task for debugging purposes.
14
+
15
+ Args:
16
+ pid (int): PID of the vscode server.
17
+ """
18
+ import os
19
+ import signal
20
+
21
+ print("Terminating server and resuming task.")
22
+ answer = (
23
+ input(
24
+ "This operation will kill the server. All unsaved data will be lost,"
25
+ " and you will no longer be able to connect to it. Do you really want to terminate? (Y/N): "
26
+ )
27
+ .strip()
28
+ .upper()
29
+ )
30
+ if answer == "Y":
31
+ os.kill(pid, signal.SIGTERM)
32
+ print("The server has been terminated and the task has been resumed.")
33
+ else:
34
+ print("Operation canceled.")
35
+
36
+
37
+ if __name__ == "__main__":
38
+ _debug()
flyte/_bin/runtime.py CHANGED
@@ -12,23 +12,28 @@ from typing import List
12
12
 
13
13
  import click
14
14
 
15
- # Todo: work with pvditt to make these the names
16
- # ACTION_NAME = "_U_ACTION_NAME"
17
- # RUN_NAME = "_U_RUN_NAME"
18
- # PROJECT_NAME = "_U_PROJECT_NAME"
19
- # DOMAIN_NAME = "_U_DOMAIN_NAME"
20
- # ORG_NAME = "_U_ORG_NAME"
15
+ from flyte.models import PathRewrite
21
16
 
22
17
  ACTION_NAME = "ACTION_NAME"
23
18
  RUN_NAME = "RUN_NAME"
24
- PROJECT_NAME = "FLYTE_INTERNAL_TASK_PROJECT"
25
- DOMAIN_NAME = "FLYTE_INTERNAL_TASK_DOMAIN"
19
+ PROJECT_NAME = "FLYTE_INTERNAL_EXECUTION_PROJECT"
20
+ DOMAIN_NAME = "FLYTE_INTERNAL_EXECUTION_DOMAIN"
26
21
  ORG_NAME = "_U_ORG_NAME"
27
22
  ENDPOINT_OVERRIDE = "_U_EP_OVERRIDE"
23
+ INSECURE_SKIP_VERIFY_OVERRIDE = "_U_INSECURE_SKIP_VERIFY"
28
24
  RUN_OUTPUT_BASE_DIR = "_U_RUN_BASE"
25
+ FLYTE_ENABLE_VSCODE_KEY = "_F_E_VS"
29
26
 
27
+ _UNION_EAGER_API_KEY_ENV_VAR = "_UNION_EAGER_API_KEY"
28
+ _F_PATH_REWRITE = "_F_PATH_REWRITE"
30
29
 
31
- @click.command("a0")
30
+
31
+ @click.group()
32
+ def _pass_through():
33
+ pass
34
+
35
+
36
+ @_pass_through.command("a0")
32
37
  @click.option("--inputs", "-i", required=True)
33
38
  @click.option("--outputs-path", "-o", required=True)
34
39
  @click.option("--version", "-v", required=True)
@@ -41,6 +46,8 @@ RUN_OUTPUT_BASE_DIR = "_U_RUN_BASE"
41
46
  @click.option("--project", envvar=PROJECT_NAME, required=False)
42
47
  @click.option("--domain", envvar=DOMAIN_NAME, required=False)
43
48
  @click.option("--org", envvar=ORG_NAME, required=False)
49
+ @click.option("--debug", envvar=FLYTE_ENABLE_VSCODE_KEY, type=click.BOOL, required=False)
50
+ @click.option("--interactive-mode", type=click.BOOL, required=False)
44
51
  @click.option("--image-cache", required=False)
45
52
  @click.option("--tgz", required=False)
46
53
  @click.option("--pkl", required=False)
@@ -51,12 +58,16 @@ RUN_OUTPUT_BASE_DIR = "_U_RUN_BASE"
51
58
  type=click.UNPROCESSED,
52
59
  nargs=-1,
53
60
  )
61
+ @click.pass_context
54
62
  def main(
63
+ ctx: click.Context,
55
64
  run_name: str,
56
65
  name: str,
57
66
  project: str,
58
67
  domain: str,
59
68
  org: str,
69
+ debug: bool,
70
+ interactive_mode: bool,
60
71
  image_cache: str,
61
72
  version: str,
62
73
  inputs: str,
@@ -73,13 +84,24 @@ def main(
73
84
  ):
74
85
  sys.path.insert(0, ".")
75
86
 
87
+ import faulthandler
88
+ import signal
89
+
90
+ import flyte
76
91
  import flyte._utils as utils
77
- from flyte._datastructures import ActionID, Checkpoints, CodeBundle, RawDataPath
78
- from flyte._initialize import S3, initialize_in_cluster
92
+ import flyte.errors
93
+ import flyte.storage as storage
94
+ from flyte._initialize import init_in_cluster
79
95
  from flyte._internal.controllers import create_controller
80
96
  from flyte._internal.imagebuild.image_builder import ImageCache
81
97
  from flyte._internal.runtime.entrypoints import load_and_run_task
98
+ from flyte._logging import logger
99
+ from flyte.models import ActionID, Checkpoints, CodeBundle, RawDataPath
100
+
101
+ logger.info("Registering faulthandler for SIGUSR1")
102
+ faulthandler.register(signal.SIGUSR1)
82
103
 
104
+ logger.info(f"Initializing flyte runtime - version {flyte.__version__}")
83
105
  assert org, "Org is required for now"
84
106
  assert project, "Project is required"
85
107
  assert domain, "Domain is required"
@@ -91,21 +113,42 @@ def main(
91
113
  if name.startswith("{{"):
92
114
  name = os.getenv("ACTION_NAME", "")
93
115
 
94
- ep = os.environ.get(ENDPOINT_OVERRIDE, "host.docker.internal:8090")
116
+ logger.warning(f"Flyte runtime started for action {name} with run name {run_name}")
117
+
118
+ if debug and name == "a0":
119
+ from flyte._debug.vscode import _start_vscode_server
95
120
 
96
- bundle = CodeBundle(tgz=tgz, pkl=pkl, destination=dest, computed_version=version)
97
- # TODO configure storage correctly for cluster
98
- initialize_in_cluster(storage=S3.auto())
99
- controller = create_controller(ct="remote", endpoint=ep, insecure=True)
121
+ asyncio.run(_start_vscode_server(ctx))
122
+
123
+ bundle = None
124
+ if tgz or pkl:
125
+ bundle = CodeBundle(tgz=tgz, pkl=pkl, destination=dest, computed_version=version)
126
+
127
+ controller_kwargs = init_in_cluster(org=org, project=project, domain=domain)
128
+ # Controller is created with the same kwargs as init, so that it can be used to run tasks
129
+ controller = create_controller(ct="remote", **controller_kwargs)
100
130
 
101
131
  ic = ImageCache.from_transport(image_cache) if image_cache else None
102
132
 
133
+ path_rewrite_cfg = os.getenv(_F_PATH_REWRITE, None)
134
+ path_rewrite = None
135
+ if path_rewrite_cfg:
136
+ potential_path_rewrite = PathRewrite.from_str(path_rewrite_cfg)
137
+ if storage.exists_sync(potential_path_rewrite.new_prefix):
138
+ path_rewrite = potential_path_rewrite
139
+ logger.info(f"Path rewrite configured for {path_rewrite.new_prefix}")
140
+ else:
141
+ logger.error(
142
+ f"Path rewrite failed for path {potential_path_rewrite.new_prefix}, "
143
+ f"not found, reverting to original path {potential_path_rewrite.old_prefix}"
144
+ )
145
+
103
146
  # Create a coroutine to load the task and run it
104
147
  task_coroutine = load_and_run_task(
105
148
  resolver=resolver,
106
149
  resolver_args=resolver_args,
107
150
  action=ActionID(name=name, run_name=run_name, project=project, domain=domain, org=org),
108
- raw_data_path=RawDataPath(path=raw_data_path),
151
+ raw_data_path=RawDataPath(path=raw_data_path, path_rewrite=path_rewrite),
109
152
  checkpoints=Checkpoints(checkpoint_path, prev_checkpoint),
110
153
  code_bundle=bundle,
111
154
  input_path=inputs,
@@ -114,13 +157,38 @@ def main(
114
157
  version=version,
115
158
  controller=controller,
116
159
  image_cache=ic,
160
+ interactive_mode=interactive_mode or debug,
117
161
  )
118
162
  # Create a coroutine to watch for errors
119
163
  controller_failure = controller.watch_for_errors()
120
164
 
121
165
  # Run both coroutines concurrently and wait for first to finish and cancel the other
122
166
  async def _run_and_stop():
123
- await utils.run_coros(controller_failure, task_coroutine)
124
- await controller.stop()
167
+ loop = asyncio.get_event_loop()
168
+ loop.set_exception_handler(flyte.errors.silence_grpc_polling_error)
169
+ try:
170
+ await utils.run_coros(controller_failure, task_coroutine)
171
+ await controller.stop()
172
+ except flyte.errors.RuntimeSystemError as e:
173
+ logger.error(f"Runtime system error: {e}")
174
+ from flyte._internal.runtime.convert import convert_from_native_to_error
175
+ from flyte._internal.runtime.io import upload_error
176
+
177
+ logger.error(f"Flyte runtime failed for action {name} with run name {run_name}, error: {e}")
178
+ err = convert_from_native_to_error(e)
179
+ path = await upload_error(err.err, outputs_path)
180
+ logger.error(f"Run {run_name} Action {name} failed with error: {err}. Uploaded error to {path}")
181
+ await controller.stop()
125
182
 
126
183
  asyncio.run(_run_and_stop())
184
+ logger.warning(f"Flyte runtime completed for action {name} with run name {run_name}")
185
+ for h in logger.handlers:
186
+ h.flush()
187
+ sys.stdout.flush()
188
+ # We os._exit here to ensure that grpc does not block the exiting! grpc currently has a graceful shutdown system
189
+ # that blocks the process from exiting
190
+ os._exit(0)
191
+
192
+
193
+ if __name__ == "__main__":
194
+ _pass_through()