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/_cli/_common.py ADDED
@@ -0,0 +1,287 @@
1
+ from __future__ import annotations
2
+
3
+ import importlib.util
4
+ import logging
5
+ import os
6
+ import sys
7
+ from abc import abstractmethod
8
+ from dataclasses import dataclass, replace
9
+ from pathlib import Path
10
+ from types import MappingProxyType, ModuleType
11
+ from typing import Any, Dict, Iterable, List, Optional
12
+
13
+ import rich.box
14
+ import rich_click as click
15
+ from rich.panel import Panel
16
+ from rich.table import Table
17
+
18
+ import flyte.errors
19
+
20
+ PREFERRED_BORDER_COLOR = "dim cyan"
21
+ PREFERRED_ACCENT_COLOR = "bold #FFD700"
22
+ HEADER_STYLE = f"{PREFERRED_ACCENT_COLOR} on black"
23
+
24
+ PROJECT_OPTION = click.Option(
25
+ param_decls=["-p", "--project"],
26
+ required=False,
27
+ type=str,
28
+ default="default",
29
+ help="Project to operate on",
30
+ show_default=True,
31
+ )
32
+
33
+ DOMAIN_OPTION = click.Option(
34
+ param_decls=["-d", "--domain"],
35
+ required=False,
36
+ type=str,
37
+ default="development",
38
+ help="Domain to operate on",
39
+ show_default=True,
40
+ )
41
+
42
+ DRY_RUN_OPTION = click.Option(
43
+ param_decls=["--dry-run", "--dryrun"],
44
+ required=False,
45
+ type=bool,
46
+ is_flag=True,
47
+ default=False,
48
+ help="Dry run, do not actually call the backend service.",
49
+ show_default=True,
50
+ )
51
+
52
+
53
+ def _common_options() -> List[click.Option]:
54
+ """
55
+ Common options for that will be added to all commands and groups that inherit from CommandBase or GroupBase.
56
+ """
57
+ return [PROJECT_OPTION, DOMAIN_OPTION]
58
+
59
+
60
+ # This is global state for the CLI, it is manipulated by the main command
61
+
62
+
63
+ @dataclass(frozen=True)
64
+ class CLIConfig:
65
+ """
66
+ This is the global state for the CLI. It is manipulated by the main command.
67
+ """
68
+
69
+ log_level: int | None = logging.ERROR
70
+ endpoint: str | None = None
71
+ insecure: bool = False
72
+ org_override: str | None = None
73
+
74
+ def replace(self, **kwargs) -> CLIConfig:
75
+ """
76
+ Replace the global state with a new one.
77
+ """
78
+ return replace(self, **kwargs)
79
+
80
+ def init(self, project: str | None = None, domain: str | None = None):
81
+ import flyte
82
+
83
+ flyte.init(
84
+ endpoint=self.endpoint,
85
+ insecure=self.insecure,
86
+ org=self.org_override,
87
+ project=project,
88
+ domain=domain,
89
+ log_level=self.log_level,
90
+ )
91
+
92
+
93
+ class InvokeBaseMixin:
94
+ """
95
+ Mixin to catch grpc.RpcError, flyte.RpcError, other errors and other exceptions and raise them as
96
+ gclick.ClickException.
97
+ """
98
+
99
+ def invoke(self, ctx):
100
+ import grpc
101
+
102
+ try:
103
+ return super().invoke(ctx) # type: ignore
104
+ except grpc.aio.AioRpcError as e:
105
+ if e.code() == grpc.StatusCode.UNAUTHENTICATED:
106
+ raise click.ClickException(f"Authentication failed. Please check your credentials. {e.details()}")
107
+ if e.code() == grpc.StatusCode.NOT_FOUND:
108
+ raise click.ClickException(f"Requested object NOT FOUND. Please check your input. Error: {e.details()}")
109
+ if e.code() == grpc.StatusCode.ALREADY_EXISTS:
110
+ raise click.ClickException("Resource already exists.")
111
+ raise click.ClickException(f"RPC error invoking command: {e!s}") from e
112
+ except flyte.errors.InitializationError:
113
+ raise click.ClickException("Initialize the CLI with a remote configuration. For example, pass --endpoint")
114
+ except Exception as e:
115
+ raise click.ClickException(f"Error invoking command: {e}") from e
116
+
117
+
118
+ class CommandBase(InvokeBaseMixin, click.RichCommand):
119
+ """
120
+ Base class for all commands, that adds common options to all commands if enabled.
121
+ """
122
+
123
+ common_options_enabled = True
124
+
125
+ def __init__(self, *args, **kwargs):
126
+ if "params" not in kwargs:
127
+ kwargs["params"] = []
128
+ if self.common_options_enabled:
129
+ kwargs["params"].extend(_common_options())
130
+ super().__init__(*args, **kwargs)
131
+
132
+
133
+ class GroupBase(InvokeBaseMixin, click.RichGroup):
134
+ """
135
+ Base class for all commands, that adds common options to all commands if enabled.
136
+ """
137
+
138
+ common_options_enabled = True
139
+
140
+ def __init__(self, *args, **kwargs):
141
+ if "params" not in kwargs:
142
+ kwargs["params"] = []
143
+ if self.common_options_enabled:
144
+ kwargs["params"].extend(_common_options())
145
+ super().__init__(*args, **kwargs)
146
+
147
+
148
+ class GroupBaseNoOptions(GroupBase):
149
+ common_options_enabled = False
150
+
151
+
152
+ def get_option_from_metadata(metadata: MappingProxyType) -> click.Option:
153
+ return metadata["click.option"]
154
+
155
+
156
+ def key_value_callback(_: Any, param: str, values: List[str]) -> Optional[Dict[str, str]]:
157
+ """
158
+ Callback for click to parse key-value pairs.
159
+ """
160
+ if not values:
161
+ return None
162
+ result = {}
163
+ for v in values:
164
+ if "=" not in v:
165
+ raise click.BadParameter(f"Expected key-value pair of the form key=value, got {v}")
166
+ k, v_ = v.split("=", 1)
167
+ result[k.strip()] = v_.strip()
168
+ return result
169
+
170
+
171
+ class ObjectsPerFileGroup(GroupBase):
172
+ """
173
+ Group that creates a command for each object in a python file.
174
+ """
175
+
176
+ def __init__(self, filename: Path, *args, **kwargs):
177
+ super().__init__(*args, **kwargs)
178
+ if not filename.exists():
179
+ raise click.ClickException(f"{filename} does not exists")
180
+ self.filename = filename
181
+ self._objs: Dict[str, Any] | None = None
182
+
183
+ @abstractmethod
184
+ def _filter_objects(self, module: ModuleType) -> Dict[str, Any]:
185
+ """
186
+ Filter the objects in the module to only include the ones we want to expose.
187
+ """
188
+ raise NotImplementedError
189
+
190
+ @property
191
+ def objs(self) -> Dict[str, Any]:
192
+ if self._objs is not None:
193
+ return self._objs
194
+
195
+ module_name = os.path.splitext(os.path.basename(self.filename))[0]
196
+ module_path = os.path.dirname(os.path.abspath(self.filename))
197
+
198
+ spec = importlib.util.spec_from_file_location(module_name, self.filename)
199
+ if spec is None or spec.loader is None:
200
+ raise click.ClickException(f"Could not load module {module_name} from {self.filename}")
201
+
202
+ module = importlib.util.module_from_spec(spec)
203
+ sys.modules[module_name] = module
204
+
205
+ sys.path.append(module_path)
206
+ spec.loader.exec_module(module)
207
+
208
+ self._objs = self._filter_objects(module)
209
+ if not self._objs:
210
+ raise click.ClickException(f"No objects found in {self.filename}")
211
+ return self._objs
212
+
213
+ def list_commands(self, ctx):
214
+ m = list(self.objs.keys())
215
+ return sorted(m)
216
+
217
+ @abstractmethod
218
+ def _get_command_for_obj(self, ctx: click.Context, obj_name: str, obj: Any) -> click.Command: ...
219
+
220
+ def get_command(self, ctx, obj_name):
221
+ obj = self.objs[obj_name]
222
+ return self._get_command_for_obj(ctx, obj_name, obj)
223
+
224
+
225
+ class FileGroup(GroupBase):
226
+ """
227
+ Group that creates a command for each file in the current directory that is not __init__.py.
228
+ """
229
+
230
+ common_options_enabled = False
231
+
232
+ def __init__(
233
+ self,
234
+ *args,
235
+ directory: Path | None = None,
236
+ **kwargs,
237
+ ):
238
+ if "params" not in kwargs:
239
+ kwargs["params"] = []
240
+ super().__init__(*args, **kwargs)
241
+ self._files = None
242
+ self._dir = directory
243
+
244
+ @property
245
+ def files(self):
246
+ if self._files is None:
247
+ directory = self._dir or Path(".").absolute()
248
+ self._files = [os.fspath(p) for p in directory.glob("*.py") if p.name != "__init__.py"]
249
+ return self._files
250
+
251
+ def list_commands(self, ctx):
252
+ return self.files
253
+
254
+ def get_command(self, ctx, filename):
255
+ raise NotImplementedError
256
+
257
+
258
+ def get_table(title: str, vals: Iterable[Any]) -> Table:
259
+ """
260
+ Get a table from a list of values.
261
+ """
262
+ table = Table(
263
+ title=title,
264
+ box=rich.box.SQUARE_DOUBLE_HEAD,
265
+ header_style=HEADER_STYLE,
266
+ show_header=True,
267
+ border_style=PREFERRED_BORDER_COLOR,
268
+ )
269
+ headers = None
270
+ for p in vals:
271
+ if headers is None:
272
+ headers = [k for k, _ in p.__rich_repr__()]
273
+ for h in headers:
274
+ table.add_column(h.capitalize())
275
+ table.add_row(*[str(v) for _, v in p.__rich_repr__()])
276
+ return table
277
+
278
+
279
+ def get_panel(title: str, renderable: Any) -> Panel:
280
+ """
281
+ Get a panel from a list of values.
282
+ """
283
+ return Panel.fit(
284
+ renderable,
285
+ title=f"[{PREFERRED_ACCENT_COLOR}]{title}[/{PREFERRED_ACCENT_COLOR}]",
286
+ border_style=PREFERRED_BORDER_COLOR,
287
+ )
flyte/_cli/_create.py ADDED
@@ -0,0 +1,42 @@
1
+ from typing import get_args
2
+
3
+ import rich_click as click
4
+
5
+ import flyte._cli._common as common
6
+ from flyte.remote._secret import SecretTypes
7
+
8
+
9
+ @click.group(name="create")
10
+ def create():
11
+ """
12
+ Create a new task or environment.
13
+ """
14
+
15
+
16
+ @create.command(cls=common.CommandBase)
17
+ @click.argument("name", type=str, required=True)
18
+ @click.argument("value", type=str, required=False)
19
+ @click.option("--from-file", type=click.Path(exists=True), help="Path to the file with the binary secret.")
20
+ @click.option(
21
+ "--type", type=click.Choice(get_args(SecretTypes)), default="regular", help="Type of the secret.", show_default=True
22
+ )
23
+ @click.pass_obj
24
+ def secret(
25
+ cfg: common.CLIConfig,
26
+ name: str,
27
+ value: str | bytes | None = None,
28
+ from_file: str | None = None,
29
+ type: SecretTypes = "regular",
30
+ project: str | None = None,
31
+ domain: str | None = None,
32
+ ):
33
+ """
34
+ Create a new secret.
35
+ """
36
+ from flyte.remote import Secret
37
+
38
+ cfg.init(project, domain)
39
+ if from_file:
40
+ with open(from_file, "rb") as f:
41
+ value = f.read()
42
+ Secret.create(name=name, value=value, type=type)
flyte/_cli/_delete.py ADDED
@@ -0,0 +1,23 @@
1
+ import rich_click as click
2
+
3
+ import flyte._cli._common as common
4
+
5
+
6
+ @click.group(name="delete")
7
+ def delete():
8
+ """
9
+ Delete a task or environment.
10
+ """
11
+
12
+
13
+ @click.command(cls=common.CommandBase)
14
+ @click.argument("name", type=str, required=True)
15
+ @click.pass_obj
16
+ def secret(cfg: common.CLIConfig, name: str, project: str | None = None, domain: str | None = None):
17
+ """
18
+ Delete a secret.
19
+ """
20
+ from flyte.remote import Secret
21
+
22
+ cfg.init(project, domain)
23
+ Secret.delete(name=name)
flyte/_cli/_deploy.py ADDED
@@ -0,0 +1,140 @@
1
+ from dataclasses import dataclass, field, fields
2
+ from pathlib import Path
3
+ from types import ModuleType
4
+ from typing import Any, Dict, List, cast, get_args
5
+
6
+ import click
7
+ from click import Context
8
+
9
+ import flyte
10
+
11
+ from .._code_bundle._utils import CopyFiles
12
+ from . import _common as common
13
+ from ._common import CLIConfig
14
+
15
+
16
+ @dataclass
17
+ class DeployArguments:
18
+ project: str = field(
19
+ default=cast(str, common.PROJECT_OPTION.default), metadata={"click.option": common.PROJECT_OPTION}
20
+ )
21
+ domain: str = field(
22
+ default=cast(str, common.DOMAIN_OPTION.default), metadata={"click.option": common.DOMAIN_OPTION}
23
+ )
24
+ version: str = field(
25
+ default="",
26
+ metadata={
27
+ "click.option": click.Option(
28
+ ["--version"],
29
+ type=str,
30
+ help="Version of the environment to deploy",
31
+ )
32
+ },
33
+ )
34
+ dry_run: bool = field(default=False, metadata={"click.option": common.DRY_RUN_OPTION})
35
+ local: bool = field(
36
+ default=False,
37
+ metadata={
38
+ "click.option": click.Option(
39
+ ["--local"],
40
+ is_flag=True,
41
+ help="Run the task locally",
42
+ )
43
+ },
44
+ )
45
+ copy_style: CopyFiles = field(
46
+ default="loaded_modules",
47
+ metadata={
48
+ "click.option": click.Option(
49
+ ["--copy-style"],
50
+ type=click.Choice(get_args(CopyFiles)),
51
+ default="loaded_modules",
52
+ help="Copy style to use when running the task",
53
+ )
54
+ },
55
+ )
56
+
57
+ @classmethod
58
+ def from_dict(cls, d: Dict[str, Any]) -> "DeployArguments":
59
+ return cls(**d)
60
+
61
+ @classmethod
62
+ def options(cls) -> List[click.Option]:
63
+ """
64
+ Return the set of base parameters added to every pyflyte run workflow subcommand.
65
+ """
66
+ return [common.get_option_from_metadata(f.metadata) for f in fields(cls) if f.metadata]
67
+
68
+
69
+ class DeployEnvCommand(click.Command):
70
+ def __init__(self, obj_name: str, obj: Any, deploy_args: DeployArguments, *args, **kwargs):
71
+ self.obj_name = obj_name
72
+ self.obj = obj
73
+ self.deploy_args = deploy_args
74
+ super().__init__(*args, **kwargs)
75
+
76
+ def invoke(self, ctx: Context):
77
+ print(f"Deploying environment: {self.obj_name}")
78
+ obj: CLIConfig = ctx.obj
79
+ obj.init(self.deploy_args.project, self.deploy_args.domain)
80
+ return flyte.deploy(
81
+ self.obj,
82
+ dryrun=self.deploy_args.dry_run,
83
+ copy_style=self.deploy_args.copy_style,
84
+ version=self.deploy_args.version,
85
+ )
86
+
87
+
88
+ class EnvPerFileGroup(common.ObjectsPerFileGroup):
89
+ """
90
+ Group that creates a command for each task in the current directory that is not __init__.py.
91
+ """
92
+
93
+ def __init__(self, filename: Path, deploy_args: DeployArguments, *args, **kwargs):
94
+ super().__init__(*args, **kwargs)
95
+ self.deploy_args = deploy_args
96
+
97
+ def _filter_objects(self, module: ModuleType) -> Dict[str, Any]:
98
+ return {k: v for k, v in module.__dict__.items() if isinstance(v, flyte.TaskEnvironment)}
99
+
100
+ def _get_command_for_obj(self, ctx: click.Context, obj_name: str, obj: Any) -> click.Command:
101
+ obj = cast(flyte.TaskEnvironment, obj)
102
+ return DeployEnvCommand(
103
+ obj_name=obj_name,
104
+ obj=obj,
105
+ help=obj.description,
106
+ deploy_args=self.deploy_args,
107
+ )
108
+
109
+
110
+ class EnvFiles(common.FileGroup):
111
+ """
112
+ Group that creates a command for each file in the current directory that is not __init__.py.
113
+ """
114
+
115
+ common_options_enabled = False
116
+
117
+ def __init__(
118
+ self,
119
+ *args,
120
+ **kwargs,
121
+ ):
122
+ if "params" not in kwargs:
123
+ kwargs["params"] = []
124
+ kwargs["params"].extend(DeployArguments.options())
125
+ super().__init__(*args, **kwargs)
126
+
127
+ def get_command(self, ctx, filename):
128
+ deploy_args = DeployArguments.from_dict(ctx.params)
129
+ return EnvPerFileGroup(
130
+ filename=Path(filename),
131
+ deploy_args=deploy_args,
132
+ name=filename,
133
+ help=f"Run, functions decorated `env.task` or instances of Tasks in {filename}",
134
+ )
135
+
136
+
137
+ deploy = EnvFiles(
138
+ name="deploy",
139
+ help="deploy one or more environments from a python file.",
140
+ )