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.

Files changed (390) hide show
  1. flyte/__init__.py +62 -0
  2. flyte/_api_commons.py +3 -0
  3. flyte/_bin/__init__.py +0 -0
  4. flyte/_bin/runtime.py +126 -0
  5. flyte/_build.py +25 -0
  6. flyte/_cache/__init__.py +12 -0
  7. flyte/_cache/cache.py +146 -0
  8. flyte/_cache/defaults.py +9 -0
  9. flyte/_cache/policy_function_body.py +42 -0
  10. flyte/_cli/__init__.py +0 -0
  11. flyte/_cli/_common.py +287 -0
  12. flyte/_cli/_create.py +42 -0
  13. flyte/_cli/_delete.py +23 -0
  14. flyte/_cli/_deploy.py +140 -0
  15. flyte/_cli/_get.py +235 -0
  16. flyte/_cli/_run.py +152 -0
  17. flyte/_cli/main.py +72 -0
  18. flyte/_code_bundle/__init__.py +8 -0
  19. flyte/_code_bundle/_ignore.py +113 -0
  20. flyte/_code_bundle/_packaging.py +187 -0
  21. flyte/_code_bundle/_utils.py +339 -0
  22. flyte/_code_bundle/bundle.py +178 -0
  23. flyte/_context.py +146 -0
  24. flyte/_datastructures.py +342 -0
  25. flyte/_deploy.py +202 -0
  26. flyte/_doc.py +29 -0
  27. flyte/_docstring.py +32 -0
  28. flyte/_environment.py +43 -0
  29. flyte/_group.py +31 -0
  30. flyte/_hash.py +23 -0
  31. flyte/_image.py +760 -0
  32. flyte/_initialize.py +634 -0
  33. flyte/_interface.py +84 -0
  34. flyte/_internal/__init__.py +3 -0
  35. flyte/_internal/controllers/__init__.py +115 -0
  36. flyte/_internal/controllers/_local_controller.py +118 -0
  37. flyte/_internal/controllers/_trace.py +40 -0
  38. flyte/_internal/controllers/pbhash.py +39 -0
  39. flyte/_internal/controllers/remote/__init__.py +40 -0
  40. flyte/_internal/controllers/remote/_action.py +141 -0
  41. flyte/_internal/controllers/remote/_client.py +43 -0
  42. flyte/_internal/controllers/remote/_controller.py +361 -0
  43. flyte/_internal/controllers/remote/_core.py +402 -0
  44. flyte/_internal/controllers/remote/_informer.py +361 -0
  45. flyte/_internal/controllers/remote/_service_protocol.py +50 -0
  46. flyte/_internal/imagebuild/__init__.py +11 -0
  47. flyte/_internal/imagebuild/docker_builder.py +416 -0
  48. flyte/_internal/imagebuild/image_builder.py +241 -0
  49. flyte/_internal/imagebuild/remote_builder.py +0 -0
  50. flyte/_internal/resolvers/__init__.py +0 -0
  51. flyte/_internal/resolvers/_task_module.py +54 -0
  52. flyte/_internal/resolvers/common.py +31 -0
  53. flyte/_internal/resolvers/default.py +28 -0
  54. flyte/_internal/runtime/__init__.py +0 -0
  55. flyte/_internal/runtime/convert.py +199 -0
  56. flyte/_internal/runtime/entrypoints.py +135 -0
  57. flyte/_internal/runtime/io.py +136 -0
  58. flyte/_internal/runtime/resources_serde.py +138 -0
  59. flyte/_internal/runtime/task_serde.py +210 -0
  60. flyte/_internal/runtime/taskrunner.py +190 -0
  61. flyte/_internal/runtime/types_serde.py +54 -0
  62. flyte/_logging.py +124 -0
  63. flyte/_protos/__init__.py +0 -0
  64. flyte/_protos/common/authorization_pb2.py +66 -0
  65. flyte/_protos/common/authorization_pb2.pyi +108 -0
  66. flyte/_protos/common/authorization_pb2_grpc.py +4 -0
  67. flyte/_protos/common/identifier_pb2.py +71 -0
  68. flyte/_protos/common/identifier_pb2.pyi +82 -0
  69. flyte/_protos/common/identifier_pb2_grpc.py +4 -0
  70. flyte/_protos/common/identity_pb2.py +48 -0
  71. flyte/_protos/common/identity_pb2.pyi +72 -0
  72. flyte/_protos/common/identity_pb2_grpc.py +4 -0
  73. flyte/_protos/common/list_pb2.py +36 -0
  74. flyte/_protos/common/list_pb2.pyi +69 -0
  75. flyte/_protos/common/list_pb2_grpc.py +4 -0
  76. flyte/_protos/common/policy_pb2.py +37 -0
  77. flyte/_protos/common/policy_pb2.pyi +27 -0
  78. flyte/_protos/common/policy_pb2_grpc.py +4 -0
  79. flyte/_protos/common/role_pb2.py +37 -0
  80. flyte/_protos/common/role_pb2.pyi +53 -0
  81. flyte/_protos/common/role_pb2_grpc.py +4 -0
  82. flyte/_protos/common/runtime_version_pb2.py +28 -0
  83. flyte/_protos/common/runtime_version_pb2.pyi +24 -0
  84. flyte/_protos/common/runtime_version_pb2_grpc.py +4 -0
  85. flyte/_protos/logs/dataplane/payload_pb2.py +96 -0
  86. flyte/_protos/logs/dataplane/payload_pb2.pyi +168 -0
  87. flyte/_protos/logs/dataplane/payload_pb2_grpc.py +4 -0
  88. flyte/_protos/secret/definition_pb2.py +49 -0
  89. flyte/_protos/secret/definition_pb2.pyi +93 -0
  90. flyte/_protos/secret/definition_pb2_grpc.py +4 -0
  91. flyte/_protos/secret/payload_pb2.py +62 -0
  92. flyte/_protos/secret/payload_pb2.pyi +94 -0
  93. flyte/_protos/secret/payload_pb2_grpc.py +4 -0
  94. flyte/_protos/secret/secret_pb2.py +38 -0
  95. flyte/_protos/secret/secret_pb2.pyi +6 -0
  96. flyte/_protos/secret/secret_pb2_grpc.py +198 -0
  97. flyte/_protos/secret/secret_pb2_grpc_grpc.py +198 -0
  98. flyte/_protos/validate/validate/validate_pb2.py +76 -0
  99. flyte/_protos/workflow/node_execution_service_pb2.py +26 -0
  100. flyte/_protos/workflow/node_execution_service_pb2.pyi +4 -0
  101. flyte/_protos/workflow/node_execution_service_pb2_grpc.py +32 -0
  102. flyte/_protos/workflow/queue_service_pb2.py +106 -0
  103. flyte/_protos/workflow/queue_service_pb2.pyi +141 -0
  104. flyte/_protos/workflow/queue_service_pb2_grpc.py +172 -0
  105. flyte/_protos/workflow/run_definition_pb2.py +128 -0
  106. flyte/_protos/workflow/run_definition_pb2.pyi +310 -0
  107. flyte/_protos/workflow/run_definition_pb2_grpc.py +4 -0
  108. flyte/_protos/workflow/run_logs_service_pb2.py +41 -0
  109. flyte/_protos/workflow/run_logs_service_pb2.pyi +28 -0
  110. flyte/_protos/workflow/run_logs_service_pb2_grpc.py +69 -0
  111. flyte/_protos/workflow/run_service_pb2.py +133 -0
  112. flyte/_protos/workflow/run_service_pb2.pyi +175 -0
  113. flyte/_protos/workflow/run_service_pb2_grpc.py +412 -0
  114. flyte/_protos/workflow/state_service_pb2.py +58 -0
  115. flyte/_protos/workflow/state_service_pb2.pyi +71 -0
  116. flyte/_protos/workflow/state_service_pb2_grpc.py +138 -0
  117. flyte/_protos/workflow/task_definition_pb2.py +72 -0
  118. flyte/_protos/workflow/task_definition_pb2.pyi +65 -0
  119. flyte/_protos/workflow/task_definition_pb2_grpc.py +4 -0
  120. flyte/_protos/workflow/task_service_pb2.py +44 -0
  121. flyte/_protos/workflow/task_service_pb2.pyi +31 -0
  122. flyte/_protos/workflow/task_service_pb2_grpc.py +104 -0
  123. flyte/_resources.py +226 -0
  124. flyte/_retry.py +32 -0
  125. flyte/_reusable_environment.py +25 -0
  126. flyte/_run.py +411 -0
  127. flyte/_secret.py +61 -0
  128. flyte/_task.py +367 -0
  129. flyte/_task_environment.py +200 -0
  130. flyte/_timeout.py +47 -0
  131. flyte/_tools.py +27 -0
  132. flyte/_trace.py +128 -0
  133. flyte/_utils/__init__.py +20 -0
  134. flyte/_utils/asyn.py +119 -0
  135. flyte/_utils/coro_management.py +25 -0
  136. flyte/_utils/file_handling.py +72 -0
  137. flyte/_utils/helpers.py +108 -0
  138. flyte/_utils/lazy_module.py +54 -0
  139. flyte/_utils/uv_script_parser.py +49 -0
  140. flyte/_version.py +21 -0
  141. flyte/connectors/__init__.py +0 -0
  142. flyte/errors.py +143 -0
  143. flyte/extras/__init__.py +5 -0
  144. flyte/extras/_container.py +273 -0
  145. flyte/io/__init__.py +11 -0
  146. flyte/io/_dataframe.py +0 -0
  147. flyte/io/_dir.py +448 -0
  148. flyte/io/_file.py +468 -0
  149. flyte/io/pickle/__init__.py +0 -0
  150. flyte/io/pickle/transformer.py +117 -0
  151. flyte/io/structured_dataset/__init__.py +129 -0
  152. flyte/io/structured_dataset/basic_dfs.py +219 -0
  153. flyte/io/structured_dataset/structured_dataset.py +1061 -0
  154. flyte/py.typed +0 -0
  155. flyte/remote/__init__.py +25 -0
  156. flyte/remote/_client/__init__.py +0 -0
  157. flyte/remote/_client/_protocols.py +131 -0
  158. flyte/remote/_client/auth/__init__.py +12 -0
  159. flyte/remote/_client/auth/_authenticators/__init__.py +0 -0
  160. flyte/remote/_client/auth/_authenticators/base.py +397 -0
  161. flyte/remote/_client/auth/_authenticators/client_credentials.py +73 -0
  162. flyte/remote/_client/auth/_authenticators/device_code.py +118 -0
  163. flyte/remote/_client/auth/_authenticators/external_command.py +79 -0
  164. flyte/remote/_client/auth/_authenticators/factory.py +200 -0
  165. flyte/remote/_client/auth/_authenticators/pkce.py +516 -0
  166. flyte/remote/_client/auth/_channel.py +184 -0
  167. flyte/remote/_client/auth/_client_config.py +83 -0
  168. flyte/remote/_client/auth/_default_html.py +32 -0
  169. flyte/remote/_client/auth/_grpc_utils/__init__.py +0 -0
  170. flyte/remote/_client/auth/_grpc_utils/auth_interceptor.py +288 -0
  171. flyte/remote/_client/auth/_grpc_utils/default_metadata_interceptor.py +151 -0
  172. flyte/remote/_client/auth/_keyring.py +143 -0
  173. flyte/remote/_client/auth/_token_client.py +260 -0
  174. flyte/remote/_client/auth/errors.py +16 -0
  175. flyte/remote/_client/controlplane.py +95 -0
  176. flyte/remote/_console.py +18 -0
  177. flyte/remote/_data.py +155 -0
  178. flyte/remote/_logs.py +116 -0
  179. flyte/remote/_project.py +86 -0
  180. flyte/remote/_run.py +873 -0
  181. flyte/remote/_secret.py +132 -0
  182. flyte/remote/_task.py +227 -0
  183. flyte/report/__init__.py +3 -0
  184. flyte/report/_report.py +178 -0
  185. flyte/report/_template.html +124 -0
  186. flyte/storage/__init__.py +24 -0
  187. flyte/storage/_remote_fs.py +34 -0
  188. flyte/storage/_storage.py +251 -0
  189. flyte/storage/_utils.py +5 -0
  190. flyte/types/__init__.py +13 -0
  191. flyte/types/_interface.py +25 -0
  192. flyte/types/_renderer.py +162 -0
  193. flyte/types/_string_literals.py +120 -0
  194. flyte/types/_type_engine.py +2210 -0
  195. flyte/types/_utils.py +80 -0
  196. flyte-0.0.1b0.dist-info/METADATA +179 -0
  197. flyte-0.0.1b0.dist-info/RECORD +390 -0
  198. flyte-0.0.1b0.dist-info/WHEEL +5 -0
  199. flyte-0.0.1b0.dist-info/entry_points.txt +3 -0
  200. flyte-0.0.1b0.dist-info/top_level.txt +1 -0
  201. union/__init__.py +54 -0
  202. union/_api_commons.py +3 -0
  203. union/_bin/__init__.py +0 -0
  204. union/_bin/runtime.py +113 -0
  205. union/_build.py +25 -0
  206. union/_cache/__init__.py +12 -0
  207. union/_cache/cache.py +141 -0
  208. union/_cache/defaults.py +9 -0
  209. union/_cache/policy_function_body.py +42 -0
  210. union/_cli/__init__.py +0 -0
  211. union/_cli/_common.py +263 -0
  212. union/_cli/_create.py +40 -0
  213. union/_cli/_delete.py +23 -0
  214. union/_cli/_deploy.py +120 -0
  215. union/_cli/_get.py +162 -0
  216. union/_cli/_params.py +579 -0
  217. union/_cli/_run.py +150 -0
  218. union/_cli/main.py +72 -0
  219. union/_code_bundle/__init__.py +8 -0
  220. union/_code_bundle/_ignore.py +113 -0
  221. union/_code_bundle/_packaging.py +187 -0
  222. union/_code_bundle/_utils.py +342 -0
  223. union/_code_bundle/bundle.py +176 -0
  224. union/_context.py +146 -0
  225. union/_datastructures.py +295 -0
  226. union/_deploy.py +185 -0
  227. union/_doc.py +29 -0
  228. union/_docstring.py +26 -0
  229. union/_environment.py +43 -0
  230. union/_group.py +31 -0
  231. union/_hash.py +23 -0
  232. union/_image.py +760 -0
  233. union/_initialize.py +585 -0
  234. union/_interface.py +84 -0
  235. union/_internal/__init__.py +3 -0
  236. union/_internal/controllers/__init__.py +77 -0
  237. union/_internal/controllers/_local_controller.py +77 -0
  238. union/_internal/controllers/pbhash.py +39 -0
  239. union/_internal/controllers/remote/__init__.py +40 -0
  240. union/_internal/controllers/remote/_action.py +131 -0
  241. union/_internal/controllers/remote/_client.py +43 -0
  242. union/_internal/controllers/remote/_controller.py +169 -0
  243. union/_internal/controllers/remote/_core.py +341 -0
  244. union/_internal/controllers/remote/_informer.py +260 -0
  245. union/_internal/controllers/remote/_service_protocol.py +44 -0
  246. union/_internal/imagebuild/__init__.py +11 -0
  247. union/_internal/imagebuild/docker_builder.py +416 -0
  248. union/_internal/imagebuild/image_builder.py +243 -0
  249. union/_internal/imagebuild/remote_builder.py +0 -0
  250. union/_internal/resolvers/__init__.py +0 -0
  251. union/_internal/resolvers/_task_module.py +31 -0
  252. union/_internal/resolvers/common.py +24 -0
  253. union/_internal/resolvers/default.py +27 -0
  254. union/_internal/runtime/__init__.py +0 -0
  255. union/_internal/runtime/convert.py +163 -0
  256. union/_internal/runtime/entrypoints.py +121 -0
  257. union/_internal/runtime/io.py +136 -0
  258. union/_internal/runtime/resources_serde.py +134 -0
  259. union/_internal/runtime/task_serde.py +202 -0
  260. union/_internal/runtime/taskrunner.py +179 -0
  261. union/_internal/runtime/types_serde.py +53 -0
  262. union/_logging.py +124 -0
  263. union/_protos/__init__.py +0 -0
  264. union/_protos/common/authorization_pb2.py +66 -0
  265. union/_protos/common/authorization_pb2.pyi +106 -0
  266. union/_protos/common/authorization_pb2_grpc.py +4 -0
  267. union/_protos/common/identifier_pb2.py +71 -0
  268. union/_protos/common/identifier_pb2.pyi +82 -0
  269. union/_protos/common/identifier_pb2_grpc.py +4 -0
  270. union/_protos/common/identity_pb2.py +48 -0
  271. union/_protos/common/identity_pb2.pyi +72 -0
  272. union/_protos/common/identity_pb2_grpc.py +4 -0
  273. union/_protos/common/list_pb2.py +36 -0
  274. union/_protos/common/list_pb2.pyi +69 -0
  275. union/_protos/common/list_pb2_grpc.py +4 -0
  276. union/_protos/common/policy_pb2.py +37 -0
  277. union/_protos/common/policy_pb2.pyi +27 -0
  278. union/_protos/common/policy_pb2_grpc.py +4 -0
  279. union/_protos/common/role_pb2.py +37 -0
  280. union/_protos/common/role_pb2.pyi +51 -0
  281. union/_protos/common/role_pb2_grpc.py +4 -0
  282. union/_protos/common/runtime_version_pb2.py +28 -0
  283. union/_protos/common/runtime_version_pb2.pyi +24 -0
  284. union/_protos/common/runtime_version_pb2_grpc.py +4 -0
  285. union/_protos/logs/dataplane/payload_pb2.py +96 -0
  286. union/_protos/logs/dataplane/payload_pb2.pyi +168 -0
  287. union/_protos/logs/dataplane/payload_pb2_grpc.py +4 -0
  288. union/_protos/secret/definition_pb2.py +49 -0
  289. union/_protos/secret/definition_pb2.pyi +93 -0
  290. union/_protos/secret/definition_pb2_grpc.py +4 -0
  291. union/_protos/secret/payload_pb2.py +62 -0
  292. union/_protos/secret/payload_pb2.pyi +94 -0
  293. union/_protos/secret/payload_pb2_grpc.py +4 -0
  294. union/_protos/secret/secret_pb2.py +38 -0
  295. union/_protos/secret/secret_pb2.pyi +6 -0
  296. union/_protos/secret/secret_pb2_grpc.py +198 -0
  297. union/_protos/validate/validate/validate_pb2.py +76 -0
  298. union/_protos/workflow/node_execution_service_pb2.py +26 -0
  299. union/_protos/workflow/node_execution_service_pb2.pyi +4 -0
  300. union/_protos/workflow/node_execution_service_pb2_grpc.py +32 -0
  301. union/_protos/workflow/queue_service_pb2.py +75 -0
  302. union/_protos/workflow/queue_service_pb2.pyi +103 -0
  303. union/_protos/workflow/queue_service_pb2_grpc.py +172 -0
  304. union/_protos/workflow/run_definition_pb2.py +100 -0
  305. union/_protos/workflow/run_definition_pb2.pyi +256 -0
  306. union/_protos/workflow/run_definition_pb2_grpc.py +4 -0
  307. union/_protos/workflow/run_logs_service_pb2.py +41 -0
  308. union/_protos/workflow/run_logs_service_pb2.pyi +28 -0
  309. union/_protos/workflow/run_logs_service_pb2_grpc.py +69 -0
  310. union/_protos/workflow/run_service_pb2.py +133 -0
  311. union/_protos/workflow/run_service_pb2.pyi +173 -0
  312. union/_protos/workflow/run_service_pb2_grpc.py +412 -0
  313. union/_protos/workflow/state_service_pb2.py +58 -0
  314. union/_protos/workflow/state_service_pb2.pyi +69 -0
  315. union/_protos/workflow/state_service_pb2_grpc.py +138 -0
  316. union/_protos/workflow/task_definition_pb2.py +72 -0
  317. union/_protos/workflow/task_definition_pb2.pyi +65 -0
  318. union/_protos/workflow/task_definition_pb2_grpc.py +4 -0
  319. union/_protos/workflow/task_service_pb2.py +44 -0
  320. union/_protos/workflow/task_service_pb2.pyi +31 -0
  321. union/_protos/workflow/task_service_pb2_grpc.py +104 -0
  322. union/_resources.py +226 -0
  323. union/_retry.py +32 -0
  324. union/_reusable_environment.py +25 -0
  325. union/_run.py +374 -0
  326. union/_secret.py +61 -0
  327. union/_task.py +354 -0
  328. union/_task_environment.py +186 -0
  329. union/_timeout.py +47 -0
  330. union/_tools.py +27 -0
  331. union/_utils/__init__.py +11 -0
  332. union/_utils/asyn.py +119 -0
  333. union/_utils/file_handling.py +71 -0
  334. union/_utils/helpers.py +46 -0
  335. union/_utils/lazy_module.py +54 -0
  336. union/_utils/uv_script_parser.py +49 -0
  337. union/_version.py +21 -0
  338. union/connectors/__init__.py +0 -0
  339. union/errors.py +128 -0
  340. union/extras/__init__.py +5 -0
  341. union/extras/_container.py +263 -0
  342. union/io/__init__.py +11 -0
  343. union/io/_dataframe.py +0 -0
  344. union/io/_dir.py +425 -0
  345. union/io/_file.py +418 -0
  346. union/io/pickle/__init__.py +0 -0
  347. union/io/pickle/transformer.py +117 -0
  348. union/io/structured_dataset/__init__.py +122 -0
  349. union/io/structured_dataset/basic_dfs.py +219 -0
  350. union/io/structured_dataset/structured_dataset.py +1057 -0
  351. union/py.typed +0 -0
  352. union/remote/__init__.py +23 -0
  353. union/remote/_client/__init__.py +0 -0
  354. union/remote/_client/_protocols.py +129 -0
  355. union/remote/_client/auth/__init__.py +12 -0
  356. union/remote/_client/auth/_authenticators/__init__.py +0 -0
  357. union/remote/_client/auth/_authenticators/base.py +391 -0
  358. union/remote/_client/auth/_authenticators/client_credentials.py +73 -0
  359. union/remote/_client/auth/_authenticators/device_code.py +120 -0
  360. union/remote/_client/auth/_authenticators/external_command.py +77 -0
  361. union/remote/_client/auth/_authenticators/factory.py +200 -0
  362. union/remote/_client/auth/_authenticators/pkce.py +515 -0
  363. union/remote/_client/auth/_channel.py +184 -0
  364. union/remote/_client/auth/_client_config.py +83 -0
  365. union/remote/_client/auth/_default_html.py +32 -0
  366. union/remote/_client/auth/_grpc_utils/__init__.py +0 -0
  367. union/remote/_client/auth/_grpc_utils/auth_interceptor.py +204 -0
  368. union/remote/_client/auth/_grpc_utils/default_metadata_interceptor.py +144 -0
  369. union/remote/_client/auth/_keyring.py +154 -0
  370. union/remote/_client/auth/_token_client.py +258 -0
  371. union/remote/_client/auth/errors.py +16 -0
  372. union/remote/_client/controlplane.py +86 -0
  373. union/remote/_data.py +149 -0
  374. union/remote/_logs.py +74 -0
  375. union/remote/_project.py +86 -0
  376. union/remote/_run.py +820 -0
  377. union/remote/_secret.py +132 -0
  378. union/remote/_task.py +193 -0
  379. union/report/__init__.py +3 -0
  380. union/report/_report.py +178 -0
  381. union/report/_template.html +124 -0
  382. union/storage/__init__.py +24 -0
  383. union/storage/_remote_fs.py +34 -0
  384. union/storage/_storage.py +247 -0
  385. union/storage/_utils.py +5 -0
  386. union/types/__init__.py +11 -0
  387. union/types/_renderer.py +162 -0
  388. union/types/_string_literals.py +120 -0
  389. union/types/_type_engine.py +2131 -0
  390. 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)