flyte 0.0.1b0__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 (455) 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 -234
  26. flyte/_initialize.py +443 -294
  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 +322 -33
  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 +461 -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. {union/_cli → flyte/cli}/_params.py +152 -153
  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 +3 -0
  121. flyte/config/_config.py +248 -0
  122. flyte/config/_internal.py +73 -0
  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 +230 -129
  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 -287
  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 -152
  195. flyte/_cli/main.py +0 -72
  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.0.1b0.dist-info/METADATA +0 -179
  261. flyte-0.0.1b0.dist-info/RECORD +0 -390
  262. flyte-0.0.1b0.dist-info/entry_points.txt +0 -3
  263. union/__init__.py +0 -54
  264. union/_api_commons.py +0 -3
  265. union/_bin/__init__.py +0 -0
  266. union/_bin/runtime.py +0 -113
  267. union/_build.py +0 -25
  268. union/_cache/__init__.py +0 -12
  269. union/_cache/cache.py +0 -141
  270. union/_cache/defaults.py +0 -9
  271. union/_cache/policy_function_body.py +0 -42
  272. union/_cli/__init__.py +0 -0
  273. union/_cli/_common.py +0 -263
  274. union/_cli/_create.py +0 -40
  275. union/_cli/_delete.py +0 -23
  276. union/_cli/_deploy.py +0 -120
  277. union/_cli/_get.py +0 -162
  278. union/_cli/_run.py +0 -150
  279. union/_cli/main.py +0 -72
  280. union/_code_bundle/__init__.py +0 -8
  281. union/_code_bundle/_ignore.py +0 -113
  282. union/_code_bundle/_packaging.py +0 -187
  283. union/_code_bundle/_utils.py +0 -342
  284. union/_code_bundle/bundle.py +0 -176
  285. union/_context.py +0 -146
  286. union/_datastructures.py +0 -295
  287. union/_deploy.py +0 -185
  288. union/_doc.py +0 -29
  289. union/_docstring.py +0 -26
  290. union/_environment.py +0 -43
  291. union/_group.py +0 -31
  292. union/_hash.py +0 -23
  293. union/_image.py +0 -760
  294. union/_initialize.py +0 -585
  295. union/_interface.py +0 -84
  296. union/_internal/__init__.py +0 -3
  297. union/_internal/controllers/__init__.py +0 -77
  298. union/_internal/controllers/_local_controller.py +0 -77
  299. union/_internal/controllers/pbhash.py +0 -39
  300. union/_internal/controllers/remote/__init__.py +0 -40
  301. union/_internal/controllers/remote/_action.py +0 -131
  302. union/_internal/controllers/remote/_client.py +0 -43
  303. union/_internal/controllers/remote/_controller.py +0 -169
  304. union/_internal/controllers/remote/_core.py +0 -341
  305. union/_internal/controllers/remote/_informer.py +0 -260
  306. union/_internal/controllers/remote/_service_protocol.py +0 -44
  307. union/_internal/imagebuild/__init__.py +0 -11
  308. union/_internal/imagebuild/docker_builder.py +0 -416
  309. union/_internal/imagebuild/image_builder.py +0 -243
  310. union/_internal/imagebuild/remote_builder.py +0 -0
  311. union/_internal/resolvers/__init__.py +0 -0
  312. union/_internal/resolvers/_task_module.py +0 -31
  313. union/_internal/resolvers/common.py +0 -24
  314. union/_internal/resolvers/default.py +0 -27
  315. union/_internal/runtime/__init__.py +0 -0
  316. union/_internal/runtime/convert.py +0 -163
  317. union/_internal/runtime/entrypoints.py +0 -121
  318. union/_internal/runtime/io.py +0 -136
  319. union/_internal/runtime/resources_serde.py +0 -134
  320. union/_internal/runtime/task_serde.py +0 -202
  321. union/_internal/runtime/taskrunner.py +0 -179
  322. union/_internal/runtime/types_serde.py +0 -53
  323. union/_logging.py +0 -124
  324. union/_protos/__init__.py +0 -0
  325. union/_protos/common/authorization_pb2.py +0 -66
  326. union/_protos/common/authorization_pb2.pyi +0 -106
  327. union/_protos/common/authorization_pb2_grpc.py +0 -4
  328. union/_protos/common/identifier_pb2.py +0 -71
  329. union/_protos/common/identifier_pb2.pyi +0 -82
  330. union/_protos/common/identifier_pb2_grpc.py +0 -4
  331. union/_protos/common/identity_pb2.py +0 -48
  332. union/_protos/common/identity_pb2.pyi +0 -72
  333. union/_protos/common/identity_pb2_grpc.py +0 -4
  334. union/_protos/common/list_pb2.py +0 -36
  335. union/_protos/common/list_pb2.pyi +0 -69
  336. union/_protos/common/list_pb2_grpc.py +0 -4
  337. union/_protos/common/policy_pb2.py +0 -37
  338. union/_protos/common/policy_pb2.pyi +0 -27
  339. union/_protos/common/policy_pb2_grpc.py +0 -4
  340. union/_protos/common/role_pb2.py +0 -37
  341. union/_protos/common/role_pb2.pyi +0 -51
  342. union/_protos/common/role_pb2_grpc.py +0 -4
  343. union/_protos/common/runtime_version_pb2.py +0 -28
  344. union/_protos/common/runtime_version_pb2.pyi +0 -24
  345. union/_protos/common/runtime_version_pb2_grpc.py +0 -4
  346. union/_protos/logs/dataplane/payload_pb2.py +0 -96
  347. union/_protos/logs/dataplane/payload_pb2.pyi +0 -168
  348. union/_protos/logs/dataplane/payload_pb2_grpc.py +0 -4
  349. union/_protos/secret/definition_pb2.py +0 -49
  350. union/_protos/secret/definition_pb2.pyi +0 -93
  351. union/_protos/secret/definition_pb2_grpc.py +0 -4
  352. union/_protos/secret/payload_pb2.py +0 -62
  353. union/_protos/secret/payload_pb2.pyi +0 -94
  354. union/_protos/secret/payload_pb2_grpc.py +0 -4
  355. union/_protos/secret/secret_pb2.py +0 -38
  356. union/_protos/secret/secret_pb2.pyi +0 -6
  357. union/_protos/secret/secret_pb2_grpc.py +0 -198
  358. union/_protos/validate/validate/validate_pb2.py +0 -76
  359. union/_protos/workflow/node_execution_service_pb2.py +0 -26
  360. union/_protos/workflow/node_execution_service_pb2.pyi +0 -4
  361. union/_protos/workflow/node_execution_service_pb2_grpc.py +0 -32
  362. union/_protos/workflow/queue_service_pb2.py +0 -75
  363. union/_protos/workflow/queue_service_pb2.pyi +0 -103
  364. union/_protos/workflow/queue_service_pb2_grpc.py +0 -172
  365. union/_protos/workflow/run_definition_pb2.py +0 -100
  366. union/_protos/workflow/run_definition_pb2.pyi +0 -256
  367. union/_protos/workflow/run_definition_pb2_grpc.py +0 -4
  368. union/_protos/workflow/run_logs_service_pb2.py +0 -41
  369. union/_protos/workflow/run_logs_service_pb2.pyi +0 -28
  370. union/_protos/workflow/run_logs_service_pb2_grpc.py +0 -69
  371. union/_protos/workflow/run_service_pb2.py +0 -133
  372. union/_protos/workflow/run_service_pb2.pyi +0 -173
  373. union/_protos/workflow/run_service_pb2_grpc.py +0 -412
  374. union/_protos/workflow/state_service_pb2.py +0 -58
  375. union/_protos/workflow/state_service_pb2.pyi +0 -69
  376. union/_protos/workflow/state_service_pb2_grpc.py +0 -138
  377. union/_protos/workflow/task_definition_pb2.py +0 -72
  378. union/_protos/workflow/task_definition_pb2.pyi +0 -65
  379. union/_protos/workflow/task_definition_pb2_grpc.py +0 -4
  380. union/_protos/workflow/task_service_pb2.py +0 -44
  381. union/_protos/workflow/task_service_pb2.pyi +0 -31
  382. union/_protos/workflow/task_service_pb2_grpc.py +0 -104
  383. union/_resources.py +0 -226
  384. union/_retry.py +0 -32
  385. union/_reusable_environment.py +0 -25
  386. union/_run.py +0 -374
  387. union/_secret.py +0 -61
  388. union/_task.py +0 -354
  389. union/_task_environment.py +0 -186
  390. union/_timeout.py +0 -47
  391. union/_tools.py +0 -27
  392. union/_utils/__init__.py +0 -11
  393. union/_utils/asyn.py +0 -119
  394. union/_utils/file_handling.py +0 -71
  395. union/_utils/helpers.py +0 -46
  396. union/_utils/lazy_module.py +0 -54
  397. union/_utils/uv_script_parser.py +0 -49
  398. union/_version.py +0 -21
  399. union/connectors/__init__.py +0 -0
  400. union/errors.py +0 -128
  401. union/extras/__init__.py +0 -5
  402. union/extras/_container.py +0 -263
  403. union/io/__init__.py +0 -11
  404. union/io/_dataframe.py +0 -0
  405. union/io/_dir.py +0 -425
  406. union/io/_file.py +0 -418
  407. union/io/pickle/__init__.py +0 -0
  408. union/io/pickle/transformer.py +0 -117
  409. union/io/structured_dataset/__init__.py +0 -122
  410. union/io/structured_dataset/basic_dfs.py +0 -219
  411. union/io/structured_dataset/structured_dataset.py +0 -1057
  412. union/py.typed +0 -0
  413. union/remote/__init__.py +0 -23
  414. union/remote/_client/__init__.py +0 -0
  415. union/remote/_client/_protocols.py +0 -129
  416. union/remote/_client/auth/__init__.py +0 -12
  417. union/remote/_client/auth/_authenticators/__init__.py +0 -0
  418. union/remote/_client/auth/_authenticators/base.py +0 -391
  419. union/remote/_client/auth/_authenticators/client_credentials.py +0 -73
  420. union/remote/_client/auth/_authenticators/device_code.py +0 -120
  421. union/remote/_client/auth/_authenticators/external_command.py +0 -77
  422. union/remote/_client/auth/_authenticators/factory.py +0 -200
  423. union/remote/_client/auth/_authenticators/pkce.py +0 -515
  424. union/remote/_client/auth/_channel.py +0 -184
  425. union/remote/_client/auth/_client_config.py +0 -83
  426. union/remote/_client/auth/_default_html.py +0 -32
  427. union/remote/_client/auth/_grpc_utils/__init__.py +0 -0
  428. union/remote/_client/auth/_grpc_utils/auth_interceptor.py +0 -204
  429. union/remote/_client/auth/_grpc_utils/default_metadata_interceptor.py +0 -144
  430. union/remote/_client/auth/_keyring.py +0 -154
  431. union/remote/_client/auth/_token_client.py +0 -258
  432. union/remote/_client/auth/errors.py +0 -16
  433. union/remote/_client/controlplane.py +0 -86
  434. union/remote/_data.py +0 -149
  435. union/remote/_logs.py +0 -74
  436. union/remote/_project.py +0 -86
  437. union/remote/_run.py +0 -820
  438. union/remote/_secret.py +0 -132
  439. union/remote/_task.py +0 -193
  440. union/report/__init__.py +0 -3
  441. union/report/_report.py +0 -178
  442. union/report/_template.html +0 -124
  443. union/storage/__init__.py +0 -24
  444. union/storage/_remote_fs.py +0 -34
  445. union/storage/_storage.py +0 -247
  446. union/storage/_utils.py +0 -5
  447. union/types/__init__.py +0 -11
  448. union/types/_renderer.py +0 -162
  449. union/types/_string_literals.py +0 -120
  450. union/types/_type_engine.py +0 -2131
  451. union/types/_utils.py +0 -80
  452. /flyte/{_cli → _debug}/__init__.py +0 -0
  453. /flyte/{_protos → _keyring}/__init__.py +0 -0
  454. {flyte-0.0.1b0.dist-info → flyte-2.0.0b46.dist-info}/WHEEL +0 -0
  455. {flyte-0.0.1b0.dist-info → flyte-2.0.0b46.dist-info}/top_level.txt +0 -0
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  import asyncio
4
4
  import json
5
5
  import typing
6
+ from importlib.metadata import entry_points
6
7
  from typing import ClassVar, Dict, Optional, Tuple
7
8
 
8
9
  from async_lru import alru_cache
@@ -10,18 +11,26 @@ from pydantic import BaseModel
10
11
  from typing_extensions import Protocol
11
12
 
12
13
  from flyte._image import Architecture, Image
14
+ from flyte._initialize import _get_init_config
13
15
  from flyte._logging import logger
14
16
 
15
17
 
16
18
  class ImageBuilder(Protocol):
17
19
  async def build_image(self, image: Image, dry_run: bool) -> str: ...
18
20
 
21
+ def get_checkers(self) -> Optional[typing.List[typing.Type[ImageChecker]]]:
22
+ """
23
+ Returns ImageCheckers that can be used to check if the image exists in the registry.
24
+ If None, then use the default checkers.
25
+ """
26
+ return None
27
+
19
28
 
20
29
  class ImageChecker(Protocol):
21
30
  @classmethod
22
31
  async def image_exists(
23
32
  cls, repository: str, tag: str, arch: Tuple[Architecture, ...] = ("linux/amd64",)
24
- ) -> bool: ...
33
+ ) -> Optional[str]: ...
25
34
 
26
35
 
27
36
  class DockerAPIImageChecker(ImageChecker):
@@ -32,13 +41,12 @@ class DockerAPIImageChecker(ImageChecker):
32
41
  """
33
42
 
34
43
  @classmethod
35
- async def image_exists(cls, repository: str, tag: str, arch: Tuple[Architecture, ...] = ("linux/amd64",)) -> bool:
44
+ async def image_exists(
45
+ cls, repository: str, tag: str, arch: Tuple[Architecture, ...] = ("linux/amd64",)
46
+ ) -> Optional[str]:
36
47
  import httpx
37
48
 
38
- if "/" in repository:
39
- if not repository.startswith("library/"):
40
- raise ValueError("This checker only works with Docker Hub")
41
- else:
49
+ if "/" not in repository:
42
50
  repository = f"library/{repository}"
43
51
 
44
52
  auth_url = "https://auth.docker.io/token"
@@ -50,8 +58,10 @@ class DockerAPIImageChecker(ImageChecker):
50
58
  auth_response = await client.get(auth_url, params={"service": service, "scope": scope})
51
59
  if auth_response.status_code != 200:
52
60
  raise Exception(f"Failed to get auth token: {auth_response.status_code}")
61
+
53
62
  token = auth_response.json()["token"]
54
63
 
64
+ # ghcr.io/union-oss/flyte:latest
55
65
  manifest_url = f"https://registry-1.docker.io/v2/{repository}/manifests/{tag}"
56
66
  headers = {
57
67
  "Authorization": f"Bearer {token}",
@@ -60,26 +70,30 @@ class DockerAPIImageChecker(ImageChecker):
60
70
  "application/vnd.docker.distribution.manifest.list.v2+json"
61
71
  ),
62
72
  }
63
- manifest_response = await client.get(manifest_url, headers=headers)
64
73
 
74
+ manifest_response = await client.get(manifest_url, headers=headers)
65
75
  if manifest_response.status_code != 200:
66
- raise Exception(f"Failed to get manifest: {manifest_response.status_code}")
76
+ logger.warning(f"Image not found: {repository}:{tag} (HTTP {manifest_response.status_code})")
77
+ return None
78
+
67
79
  manifest_list = manifest_response.json()["manifests"]
68
- architectures = [f"{x['platform']['os']}/{x['platform']['architecture']}" for x in manifest_list]
80
+ architectures = [f"{m['platform']['os']}/{m['platform']['architecture']}" for m in manifest_list]
69
81
 
70
- if set(architectures) >= set(arch):
71
- logger.debug(f"Image {repository}:{tag} found for architecture(s) {arch}, has {architectures}")
72
- return True
82
+ if set(arch).issubset(set(architectures)):
83
+ logger.debug(f"Image {repository}:{tag} found with arch {architectures}")
84
+ return f"{repository}:{tag}"
73
85
  else:
74
- logger.debug(f"Image {repository}:{tag} not found for architecture(s) {arch}, only has {architectures}")
75
- return False
86
+ logger.debug(f"Image {repository}:{tag} has {architectures}, but missing {arch}")
87
+ return None
76
88
 
77
89
 
78
90
  class LocalDockerCommandImageChecker(ImageChecker):
79
91
  command_name: ClassVar[str] = "docker"
80
92
 
81
93
  @classmethod
82
- async def image_exists(cls, repository: str, tag: str, arch: Tuple[Architecture, ...] = ("linux/amd64",)) -> bool:
94
+ async def image_exists(
95
+ cls, repository: str, tag: str, arch: Tuple[Architecture, ...] = ("linux/amd64",)
96
+ ) -> Optional[str]:
83
97
  # Check if the image exists locally by running the docker inspect command
84
98
  process = await asyncio.create_subprocess_exec(
85
99
  cls.command_name,
@@ -90,9 +104,9 @@ class LocalDockerCommandImageChecker(ImageChecker):
90
104
  stderr=asyncio.subprocess.PIPE,
91
105
  )
92
106
  stdout, stderr = await process.communicate()
93
- if stderr and "manifest unknown" in stderr.decode():
107
+ if (stderr and "manifest unknown") or "no such manifest" in stderr.decode():
94
108
  logger.debug(f"Image {repository}:{tag} not found using the docker command.")
95
- return False
109
+ return None
96
110
 
97
111
  if process.returncode != 0:
98
112
  raise RuntimeError(f"Failed to run docker image inspect {repository}:{tag}")
@@ -104,11 +118,11 @@ class LocalDockerCommandImageChecker(ImageChecker):
104
118
  architectures = [f"{x['platform']['os']}/{x['platform']['architecture']}" for x in manifest_list]
105
119
  if set(architectures) >= set(arch):
106
120
  logger.debug(f"Image {repository}:{tag} found for architecture(s) {arch}, has {architectures}")
107
- return True
121
+ return f"{repository}:{tag}"
108
122
 
109
123
  # Otherwise write a message and return false to trigger build
110
124
  logger.debug(f"Image {repository}:{tag} not found for architecture(s) {arch}, only has {architectures}")
111
- return False
125
+ return None
112
126
 
113
127
 
114
128
  class LocalPodmanCommandImageChecker(LocalDockerCommandImageChecker):
@@ -120,55 +134,54 @@ class ImageBuildEngine:
120
134
  ImageBuildEngine contains a list of builders that can be used to build an ImageSpec.
121
135
  """
122
136
 
123
- _REGISTRY: typing.ClassVar[typing.Dict[str, Tuple[ImageBuilder, int]]] = {}
124
- _SEEN_IMAGES: typing.ClassVar[typing.Dict[str, str]] = {
125
- # Set default for the auto container. See Image._identifier_override for more info.
126
- "auto": Image.auto().uri,
127
- }
128
-
129
- @classmethod
130
- def register(cls, builder_type: str, image_builder: ImageBuilder, priority: int = 5):
131
- cls._REGISTRY[builder_type] = (image_builder, priority)
132
-
133
- @classmethod
134
- def get_registry(cls) -> Dict[str, Tuple[ImageBuilder, int]]:
135
- return cls._REGISTRY
137
+ ImageBuilderType = typing.Literal["local", "remote"]
136
138
 
137
139
  @staticmethod
138
140
  @alru_cache
139
- async def image_exists(image: Image) -> bool:
141
+ async def image_exists(image: Image) -> Optional[str]:
140
142
  if image.base_image is not None and not image._layers:
141
143
  logger.debug(f"Image {image} has a base image: {image.base_image} and no layers. Skip existence check.")
142
- return True
143
- assert image.registry is not None, f"Image registry is not set for {image}"
144
+ return image.uri
144
145
  assert image.name is not None, f"Image name is not set for {image}"
145
146
 
146
- repository = image.registry + "/" + image.name
147
147
  tag = image._final_tag
148
148
 
149
149
  if tag == "latest":
150
150
  logger.debug(f"Image {image} has tag 'latest', skip existence check, always build")
151
- return True
151
+ return image.uri
152
152
 
153
- # Can get a public token for docker.io but ghcr requires a pat, so harder to get the manifest anonymously.
154
- checkers = [LocalDockerCommandImageChecker, LocalPodmanCommandImageChecker, DockerAPIImageChecker]
155
- for checker in checkers:
153
+ builder = None
154
+ cfg = _get_init_config()
155
+ if cfg and cfg.image_builder:
156
+ builder = cfg.image_builder
157
+ image_builder = ImageBuildEngine._get_builder(builder)
158
+ image_checker = image_builder.get_checkers()
159
+ if image_checker is None:
160
+ logger.info(f"No image checkers found for builder `{image_builder}`, assuming it exists")
161
+ return image.uri
162
+ for checker in image_checker:
156
163
  try:
157
- exists = await checker.image_exists(repository, tag, tuple(image.platform))
158
- logger.debug(f"Image {image} {exists=} in registry")
159
- return exists
164
+ repository = image.registry + "/" + image.name if image.registry else image.name
165
+ image_uri = await checker.image_exists(repository, tag, tuple(image.platform))
166
+ if image_uri:
167
+ logger.debug(f"Image {image_uri} in registry")
168
+ return image_uri
160
169
  except Exception as e:
161
170
  logger.debug(f"Error checking image existence with {checker.__name__}: {e}")
162
171
  continue
163
172
 
164
173
  # If all checkers fail, then assume the image exists. This is current flytekit behavior
165
174
  logger.info(f"All checkers failed to check existence of {image.uri}, assuming it does exists")
166
- return True
175
+ return image.uri
167
176
 
168
177
  @classmethod
169
178
  @alru_cache
170
179
  async def build(
171
- cls, image: Image, builder: Optional[str] = None, dry_run: bool = False, force: bool = False
180
+ cls,
181
+ image: Image,
182
+ builder: ImageBuildEngine.ImageBuilderType | None = None,
183
+ dry_run: bool = False,
184
+ force: bool = False,
172
185
  ) -> str:
173
186
  """
174
187
  Build the image. Images to be tagged with latest will always be built. Otherwise, this engine will check the
@@ -181,30 +194,59 @@ class ImageBuildEngine:
181
194
  :return:
182
195
  """
183
196
  # Always trigger a build if this is a dry run since builder shouldn't really do anything, or a force.
197
+ image_uri = (await cls.image_exists(image)) or image.uri
184
198
  if force or dry_run or not await cls.image_exists(image):
185
- logger.info(f"Image {image.uri} does not exist in registry or force/dry-run, building...")
199
+ logger.info(f"Image {image_uri} does not exist in registry or force/dry-run, building...")
186
200
 
187
201
  # Validate the image before building
188
202
  image.validate()
189
203
 
190
- # If builder is not specified, use the first registered builder
204
+ # If a builder is not specified, use the first registered builder
205
+ cfg = _get_init_config()
206
+ if cfg and cfg.image_builder:
207
+ builder = builder or cfg.image_builder
191
208
  img_builder = ImageBuildEngine._get_builder(builder)
209
+ logger.debug(f"Using `{img_builder}` image builder to build image.")
192
210
 
193
211
  result = await img_builder.build_image(image, dry_run=dry_run)
194
212
  return result
195
213
  else:
196
- logger.info(f"Image {image.uri} already exists in registry. Skipping build.")
197
- return image.uri
214
+ logger.info(f"Image {image_uri} already exists in registry. Skipping build.")
215
+ return image_uri
198
216
 
199
217
  @classmethod
200
- def _get_builder(cls, builder: Optional[str]) -> ImageBuilder:
201
- if not builder:
202
- from .docker_builder import DockerImageBuilder
218
+ def _get_builder(cls, builder: ImageBuildEngine.ImageBuilderType | None = "local") -> ImageBuilder:
219
+ if builder is None:
220
+ builder = "local"
221
+ if builder == "remote":
222
+ from flyte._internal.imagebuild.remote_builder import RemoteImageBuilder
223
+
224
+ return RemoteImageBuilder()
225
+ elif builder == "local":
226
+ from flyte._internal.imagebuild.docker_builder import DockerImageBuilder
203
227
 
204
228
  return DockerImageBuilder()
205
- if builder not in cls._REGISTRY:
206
- raise AssertionError(f"Image builder {builder} is not registered.")
207
- return cls._REGISTRY[builder][0]
229
+ else:
230
+ return cls._load_custom_type_transformers(builder)
231
+
232
+ @classmethod
233
+ def _load_custom_type_transformers(cls, name: str) -> ImageBuilder:
234
+ plugins = entry_points(group="flyte.plugins.image_builders")
235
+ for ep in plugins:
236
+ if ep.name != name:
237
+ continue
238
+ try:
239
+ logger.info(f"Loading image builder: {ep.name}")
240
+ builder = ep.load()
241
+ if callable(builder):
242
+ return builder()
243
+ return builder
244
+ except Exception as e:
245
+ raise RuntimeError(f"Failed to load image builder {ep.name} with error: {e}")
246
+ raise ValueError(
247
+ f"Unknown image builder type: {name}. Available builders:"
248
+ f" {[ep.name for ep in plugins] + ['local', 'remote']}"
249
+ )
208
250
 
209
251
 
210
252
  class ImageCache(BaseModel):
@@ -239,3 +281,17 @@ class ImageCache(BaseModel):
239
281
  val = cls.model_validate_json(json_str)
240
282
  val.serialized_form = s
241
283
  return val
284
+
285
+ def repr(self) -> typing.List[typing.List[Tuple[str, str]]]:
286
+ """
287
+ Returns a detailed representation of the deployed environments.
288
+ """
289
+ tuples = []
290
+ for k, v in self.image_lookup.items():
291
+ tuples.append(
292
+ [
293
+ ("Name", k),
294
+ ("image", v),
295
+ ]
296
+ )
297
+ return tuples