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
@@ -0,0 +1,120 @@
1
+ import click
2
+
3
+ from union._logging import logger
4
+ from union.remote._client.auth import _token_client as token_client
5
+ from union.remote._client.auth._authenticators.base import Authenticator
6
+ from union.remote._client.auth._keyring import Credentials
7
+ from union.remote._client.auth.errors import AuthenticationError, AuthenticationPending
8
+
9
+
10
+ class DeviceCodeAuthenticator(Authenticator):
11
+ """
12
+ This Authenticator implements the Device Code authorization flow useful for headless user authentication.
13
+
14
+ Examples described
15
+ - https://developer.okta.com/docs/guides/device-authorization-grant/main/
16
+ - https://auth0.com/docs/get-started/authentication-and-authorization-flow/device-authorization-flow#device-flow
17
+ """
18
+
19
+ def __init__(
20
+ self,
21
+ **kwargs,
22
+ ):
23
+ """
24
+ Initialize the device code authenticator.
25
+
26
+ :param kwargs: Keyword arguments passed to the base Authenticator
27
+
28
+ **Keyword Arguments passed to base Authenticator**:
29
+ :param endpoint: The endpoint URL for authentication (required)
30
+ :param cfg_store: Optional client configuration store for retrieving remote configuration
31
+ :param client_config: Optional client configuration containing authentication settings
32
+ :param credentials: Optional credentials to use for authentication
33
+ :param http_session: Optional HTTP session to use for requests
34
+ :param http_proxy_url: Optional HTTP proxy URL
35
+ :param verify: Whether to verify SSL certificates (default: True)
36
+ :param ca_cert_path: Optional path to CA certificate file
37
+ :param client_id: Client ID for authentication
38
+ :param scopes: List of scopes to request during authentication
39
+ :param audience: Audience for the token
40
+ :param device_authorization_endpoint: Endpoint for device authorization
41
+ """
42
+
43
+ super().__init__(
44
+ **kwargs,
45
+ )
46
+
47
+ async def _do_refresh_credentials(self) -> Credentials:
48
+ """
49
+ Refreshes the authentication credentials using device code flow.
50
+
51
+ First attempts to refresh using a refresh token if available.
52
+ If that fails, falls back to the full device code authorization flow.
53
+ """
54
+ cfg = await self._resolve_config()
55
+
56
+ # These always come from the public client config
57
+ if cfg.device_authorization_endpoint is None:
58
+ raise AuthenticationError(
59
+ "Device Authentication is not available on the Flyte backend / authentication server"
60
+ )
61
+
62
+ if self._creds and self._creds.refresh_token:
63
+ """We have an refresh token so lets try to refresh it"""
64
+ try:
65
+ access_token, refresh_token, expires_in = await token_client.get_token(
66
+ token_endpoint=cfg.token_endpoint,
67
+ client_id=cfg.client_id,
68
+ audience=cfg.audience,
69
+ scopes=cfg.scopes,
70
+ http_proxy_url=self._http_proxy_url,
71
+ verify=self._verify,
72
+ grant_type=token_client.GrantType.REFRESH_TOKEN,
73
+ refresh_token=self._creds.refresh_token,
74
+ http_session=self._http_session,
75
+ )
76
+
77
+ return Credentials(
78
+ access_token=access_token,
79
+ refresh_token=refresh_token,
80
+ expires_in=expires_in,
81
+ for_endpoint=self._endpoint,
82
+ )
83
+ except (AuthenticationError, AuthenticationPending):
84
+ logger.warning("Failed to refresh token. Kicking off a full authorization flow.")
85
+
86
+ """Fall back to device flow"""
87
+ resp = await token_client.get_device_code(
88
+ cfg.device_authorization_endpoint,
89
+ cfg.client_id,
90
+ audience=cfg.audience,
91
+ scopes=cfg.scopes,
92
+ http_proxy_url=self._http_proxy_url,
93
+ verify=self._verify,
94
+ http_session=self._http_session,
95
+ )
96
+
97
+ full_uri = f"{resp.verification_uri}?user_code={resp.user_code}"
98
+ text = (
99
+ f"To Authenticate, navigate in a browser to the following URL: "
100
+ f"{click.style(full_uri, fg='blue', underline=True)}"
101
+ )
102
+ click.secho(text)
103
+ try:
104
+ token, refresh_token, expires_in = await token_client.poll_token_endpoint(
105
+ resp,
106
+ token_endpoint=cfg.token_endpoint,
107
+ client_id=cfg.client_id,
108
+ audience=cfg.audience,
109
+ scopes=cfg.scopes,
110
+ http_proxy_url=self._http_proxy_url,
111
+ verify=self._verify,
112
+ http_session=self._http_session,
113
+ )
114
+
115
+ return Credentials(
116
+ access_token=token, refresh_token=refresh_token, expires_in=expires_in, for_endpoint=self._endpoint
117
+ )
118
+
119
+ except Exception:
120
+ raise
@@ -0,0 +1,77 @@
1
+ import asyncio
2
+ import typing
3
+
4
+ from union._logging import logger
5
+ from union.remote._client.auth._authenticators.base import Authenticator
6
+ from union.remote._client.auth._keyring import Credentials
7
+ from union.remote._client.auth.errors import AuthenticationError
8
+
9
+
10
+ class AsyncCommandAuthenticator(Authenticator):
11
+ """
12
+ This Authenticator retrieves access_token using the provided command
13
+ """
14
+
15
+ def __init__(self, command: typing.List[str], **kwargs):
16
+ """
17
+ Initialize the command authenticator.
18
+
19
+ :param command: List of command strings to execute for token retrieval
20
+ :param kwargs: Additional keyword arguments passed to the base Authenticator
21
+
22
+ **Keyword Arguments passed to base Authenticator**:
23
+ :param endpoint: The endpoint URL for authentication
24
+ :param cfg_store: Optional client configuration store for retrieving remote configuration
25
+ :param client_config: Optional client configuration containing authentication settings
26
+ :param credentials: Optional credentials to use for authentication
27
+ :param http_session: Optional HTTP session to use for requests
28
+ :param http_proxy_url: Optional HTTP proxy URL
29
+ :param verify: Whether to verify SSL certificates (default: True)
30
+ :param ca_cert_path: Optional path to CA certificate file
31
+
32
+ **Additional Keyword Arguments**:
33
+ :param header_key: Header key to use for authentication (defaults to "authorization")
34
+ :param proxy_env: Environment variables for the command execution
35
+ :param proxy_timeout: Timeout for command execution
36
+ """
37
+ self._cmd = command
38
+ if not self._cmd:
39
+ raise AuthenticationError("Command cannot be empty for command authenticator")
40
+ super().__init__(**kwargs)
41
+
42
+ async def _do_refresh_credentials(self) -> Credentials:
43
+ """
44
+ Refreshes the authentication credentials by executing an external command.
45
+
46
+ This function is used when the configuration value for AUTH_MODE is set to 'external_process'.
47
+ It reads an id token generated by an external process started by running the 'command'.
48
+ Uses asyncio.create_subprocess_exec for non-blocking operation.
49
+
50
+ The command is executed with stdout and stderr captured, and the stdout output is used
51
+ as the access token for authentication.
52
+
53
+ :raises AuthenticationError: If the command fails to execute or returns a non-zero exit code
54
+ """
55
+ cmd_joined = " ".join(self._cmd)
56
+ logger.debug("Starting external process to generate id token. Command `{}`".format(" ".join(cmd_joined)))
57
+ try:
58
+ # Use asyncio subprocess for non-blocking operation
59
+ process = await asyncio.create_subprocess_exec(
60
+ *self._cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
61
+ )
62
+ stdout, stderr = await process.communicate()
63
+
64
+ if process.returncode != 0:
65
+ logger.error(f"Failed to generate token from command `{cmd_joined}`. Error: {stderr.decode()}")
66
+ raise AuthenticationError(
67
+ f"Failed to refresh token with command `{cmd_joined}`."
68
+ f" Please execute this command in your terminal to debug."
69
+ )
70
+
71
+ return Credentials(for_endpoint=self._endpoint, access_token=stdout.decode().strip())
72
+ except Exception as e:
73
+ logger.error(f"Failed to generate token from command `{cmd_joined}`. Error: {e!s}")
74
+ raise AuthenticationError(
75
+ f"Failed to refresh token with command `{cmd_joined}`."
76
+ f" Please execute this command in your terminal to debug."
77
+ )
@@ -0,0 +1,200 @@
1
+ import typing
2
+
3
+ import grpc.aio
4
+
5
+ from union.remote._client.auth._authenticators.base import Authenticator
6
+ from union.remote._client.auth._authenticators.external_command import (
7
+ AsyncCommandAuthenticator,
8
+ )
9
+ from union.remote._client.auth._client_config import AuthType, ClientConfigStore, RemoteClientConfigStore
10
+
11
+
12
+ def create_auth_interceptors(
13
+ endpoint: str, in_channel: grpc.aio.Channel, **kwargs
14
+ ) -> typing.List[grpc.aio.ClientInterceptor]:
15
+ """
16
+ Async version of upgrade_channel_to_authenticated.
17
+ Given a grpc.Channel, preferably a secure channel, it returns a list of interceptors to
18
+ perform an Oauth2.0 Auth flow for all RPC call types.
19
+
20
+ :param endpoint: The endpoint URL for authentication
21
+ :param in_channel: grpc.Channel Precreated channel
22
+ :param kwargs: Additional arguments passed to the authenticator, including:
23
+ - insecure: Whether to use an insecure channel
24
+ - insecure_skip_verify: Whether to skip SSL certificate verification
25
+ - ca_cert_file_path: Path to CA certificate file for SSL verification
26
+ - auth_type: The authentication type to use ("Pkce", "ClientSecret", "ExternalCommand", "DeviceFlow")
27
+ - command: Command to execute for ExternalCommand authentication
28
+ - client_id: Client ID for ClientSecret authentication
29
+ - client_secret: Client secret for ClientSecret authentication
30
+ - scopes: List of scopes to request during authentication
31
+ - audience: Audience for the token
32
+ - http_proxy_url: HTTP proxy URL
33
+ - http_session: httpx.AsyncClient session
34
+ - verify: Whether to verify SSL certificates
35
+ - ca_cert_path: Optional path to CA certificate file
36
+ - header_key: Header key to use for authentication
37
+ - proxy_env: Environment variables for proxy command
38
+ - proxy_timeout: Timeout for proxy command execution
39
+ - redirect_uri: OAuth2 redirect URI for PKCE authentication
40
+ - add_request_auth_code_params_to_request_access_token_params: Whether to add auth code params to token request
41
+ - request_auth_code_params: Parameters to add to login URI opened in browser
42
+ - request_access_token_params: Parameters to add when exchanging auth code for access token
43
+ - refresh_access_token_params: Parameters to add when refreshing access token
44
+ :return: List of gRPC interceptors for different call types
45
+ """
46
+ from union.remote._client.auth._grpc_utils.auth_interceptor import (
47
+ AuthStreamStreamInterceptor,
48
+ AuthStreamUnaryInterceptor,
49
+ AuthUnaryStreamInterceptor,
50
+ AuthUnaryUnaryInterceptor,
51
+ )
52
+
53
+ def authenticator_factory() -> Authenticator:
54
+ return get_async_authenticator(endpoint=endpoint, cfg_store=RemoteClientConfigStore(in_channel), **kwargs)
55
+
56
+ return [
57
+ AuthUnaryUnaryInterceptor(authenticator_factory),
58
+ AuthUnaryStreamInterceptor(authenticator_factory),
59
+ AuthStreamUnaryInterceptor(authenticator_factory),
60
+ AuthStreamStreamInterceptor(authenticator_factory),
61
+ ]
62
+
63
+
64
+ def create_proxy_auth_interceptors(
65
+ endpoint: str, proxy_command: typing.Optional[typing.List[str]] = None, **kwargs
66
+ ) -> typing.List[grpc.aio.ClientInterceptor]:
67
+ """
68
+ Async version of upgrade_channel_to_proxy_authenticated.
69
+ If activated in the platform config, given a grpc.Channel, preferably a secure channel, it returns a list of
70
+ interceptors to perform authentication with a proxy in front of Flyte for all RPC call types.
71
+
72
+ :param endpoint: The endpoint URL for authentication
73
+ :param proxy_command: Command to execute to get proxy authentication token
74
+ :param kwargs: Additional arguments passed to the authenticator, including:
75
+ - proxy_env: Environment variables for the proxy command
76
+ - proxy_timeout: Timeout for the proxy command
77
+ - header_key: Header key to use for authentication (defaults to "proxy-authorization")
78
+ - http_session: httpx.AsyncClient session to use for requests
79
+ - verify: Whether to verify SSL certificates
80
+ - ca_cert_path: Optional path to CA certificate file
81
+ :return: List of gRPC interceptors for different call types
82
+ """
83
+ if proxy_command:
84
+ from union.remote._client.auth._grpc_utils.auth_interceptor import (
85
+ AuthStreamStreamInterceptor,
86
+ AuthStreamUnaryInterceptor,
87
+ AuthUnaryStreamInterceptor,
88
+ AuthUnaryUnaryInterceptor,
89
+ )
90
+
91
+ def authenticator_factory() -> Authenticator:
92
+ return get_async_proxy_authenticator(endpoint=endpoint, proxy_command=proxy_command, **kwargs)
93
+
94
+ return [
95
+ AuthUnaryUnaryInterceptor(authenticator_factory),
96
+ AuthUnaryStreamInterceptor(authenticator_factory),
97
+ AuthStreamUnaryInterceptor(authenticator_factory),
98
+ AuthStreamStreamInterceptor(authenticator_factory),
99
+ ]
100
+ else:
101
+ return []
102
+
103
+
104
+ def get_async_authenticator(
105
+ endpoint: str,
106
+ cfg_store: ClientConfigStore,
107
+ *,
108
+ command: typing.Optional[typing.List[str]] = None,
109
+ insecure_skip_verify: bool = False,
110
+ auth_type: AuthType = "Pkce",
111
+ ca_cert_file_path: typing.Optional[str] = None,
112
+ **kwargs,
113
+ ) -> Authenticator:
114
+ """
115
+ Returns a new authenticator based on the platform config.
116
+ This is an async-compatible version of get_authenticator.
117
+ Must be async because it calls get_async_session which may perform IO operations.
118
+
119
+ :param endpoint: The endpoint URL for authentication
120
+ :param cfg_store: The client configuration store
121
+ :param command: Command to execute for ExternalCommand authentication
122
+ :param insecure_skip_verify: Whether to skip SSL certificate verification
123
+ :param auth_type: The authentication type to use
124
+ :param ca_cert_file_path: Path to CA certificate file for SSL verification
125
+ :param kwargs: Additional arguments passed to the authenticator, which may include:
126
+ - http_session: httpx.AsyncClient session to use for requests
127
+ - client_config: Optional client configuration containing authentication settings
128
+ - credentials: Optional credentials to use for authentication
129
+ - http_proxy_url: HTTP proxy URL
130
+ - verify: Whether to verify SSL certificates (bool or path to cert)
131
+ - ca_cert_path: Optional path to CA certificate file
132
+ - client_id: Client ID for ClientSecret authentication
133
+ - client_secret: Client secret for ClientSecret authentication (for ClientSecret auth)
134
+ - client_credentials_secret: Client secret for ClientSecret authentication (alias)
135
+ - scopes: List of scopes to request during authentication
136
+ - audience: Audience for the token
137
+ - header_key: Header key to use for authentication
138
+ - proxy_env: Environment variables for proxy command
139
+ - proxy_timeout: Timeout for proxy command execution
140
+ - redirect_uri: OAuth2 redirect URI for PKCE authentication
141
+ - add_request_auth_code_params_to_request_access_token_params: Whether to add auth code params to token request
142
+ - request_auth_code_params: Parameters to add to login URI opened in browser
143
+ - request_access_token_params: Parameters to add when exchanging auth code for access token
144
+ - refresh_access_token_params: Parameters to add when refreshing access token
145
+ :return: An authenticator instance
146
+ """
147
+ verify = None
148
+ if insecure_skip_verify:
149
+ verify = False
150
+ elif ca_cert_file_path:
151
+ verify = ca_cert_file_path
152
+
153
+ # Note: The authenticator classes already have async refresh_credentials methods
154
+ # so we can reuse them with our async session
155
+ match auth_type:
156
+ case "Pkce":
157
+ from union.remote._client.auth._authenticators.pkce import PKCEAuthenticator
158
+
159
+ return PKCEAuthenticator(endpoint=endpoint, cfg_store=cfg_store, verify=verify, **kwargs)
160
+ case "ClientSecret":
161
+ from union.remote._client.auth._authenticators.client_credentials import ClientCredentialsAuthenticator
162
+
163
+ return ClientCredentialsAuthenticator(endpoint=endpoint, cfg_store=cfg_store, verify=verify, **kwargs)
164
+ case "ExternalCommand":
165
+ from union.remote._client.auth._authenticators.external_command import AsyncCommandAuthenticator
166
+
167
+ return AsyncCommandAuthenticator(endpoint=endpoint, command=command, verify=verify, **kwargs)
168
+ case "DeviceFlow":
169
+ from union.remote._client.auth._authenticators.device_code import DeviceCodeAuthenticator
170
+
171
+ return DeviceCodeAuthenticator(endpoint=endpoint, cfg_store=cfg_store, verify=verify, **kwargs)
172
+ case _:
173
+ raise ValueError(
174
+ f"Invalid auth mode [{auth_type}] specified. Please update the creds config to use a valid value"
175
+ )
176
+
177
+
178
+ def get_async_proxy_authenticator(endpoint: str, *, proxy_command: typing.List[str], **kwargs) -> Authenticator:
179
+ """
180
+ Returns an async authenticator for proxy authentication.
181
+ This function needs to be async because it calls get_async_command_authenticator which performs IO operations.
182
+
183
+ :param endpoint: The endpoint URL for authentication
184
+ :param proxy_command: Command to execute to get proxy authentication token
185
+ :param kwargs: Additional arguments passed to the authenticator, including:
186
+ - header_key: Header key to use for authentication (defaults to "proxy-authorization")
187
+ - proxy_env: Environment variables for the proxy command
188
+ - proxy_timeout: Timeout for the proxy command
189
+ - http_session: httpx.AsyncClient session to use for requests
190
+ - cfg_store: Optional client configuration store for retrieving remote configuration
191
+ - client_config: Optional client configuration containing authentication settings
192
+ - credentials: Optional credentials to use for authentication
193
+ - http_proxy_url: Optional HTTP proxy URL
194
+ - verify: Whether to verify SSL certificates (default: True)
195
+ - ca_cert_path: Optional path to CA certificate file
196
+ :return: An authenticator instance for proxy authentication
197
+ """
198
+ return AsyncCommandAuthenticator(
199
+ endpoint=endpoint, command=proxy_command, header_key="proxy-authorization", **kwargs
200
+ )