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.
- flyte/__init__.py +62 -0
- flyte/_api_commons.py +3 -0
- flyte/_bin/__init__.py +0 -0
- flyte/_bin/runtime.py +126 -0
- flyte/_build.py +25 -0
- flyte/_cache/__init__.py +12 -0
- flyte/_cache/cache.py +146 -0
- flyte/_cache/defaults.py +9 -0
- flyte/_cache/policy_function_body.py +42 -0
- flyte/_cli/__init__.py +0 -0
- flyte/_cli/_common.py +287 -0
- flyte/_cli/_create.py +42 -0
- flyte/_cli/_delete.py +23 -0
- flyte/_cli/_deploy.py +140 -0
- flyte/_cli/_get.py +235 -0
- flyte/_cli/_run.py +152 -0
- flyte/_cli/main.py +72 -0
- flyte/_code_bundle/__init__.py +8 -0
- flyte/_code_bundle/_ignore.py +113 -0
- flyte/_code_bundle/_packaging.py +187 -0
- flyte/_code_bundle/_utils.py +339 -0
- flyte/_code_bundle/bundle.py +178 -0
- flyte/_context.py +146 -0
- flyte/_datastructures.py +342 -0
- flyte/_deploy.py +202 -0
- flyte/_doc.py +29 -0
- flyte/_docstring.py +32 -0
- flyte/_environment.py +43 -0
- flyte/_group.py +31 -0
- flyte/_hash.py +23 -0
- flyte/_image.py +760 -0
- flyte/_initialize.py +634 -0
- flyte/_interface.py +84 -0
- flyte/_internal/__init__.py +3 -0
- flyte/_internal/controllers/__init__.py +115 -0
- flyte/_internal/controllers/_local_controller.py +118 -0
- flyte/_internal/controllers/_trace.py +40 -0
- flyte/_internal/controllers/pbhash.py +39 -0
- flyte/_internal/controllers/remote/__init__.py +40 -0
- flyte/_internal/controllers/remote/_action.py +141 -0
- flyte/_internal/controllers/remote/_client.py +43 -0
- flyte/_internal/controllers/remote/_controller.py +361 -0
- flyte/_internal/controllers/remote/_core.py +402 -0
- flyte/_internal/controllers/remote/_informer.py +361 -0
- flyte/_internal/controllers/remote/_service_protocol.py +50 -0
- flyte/_internal/imagebuild/__init__.py +11 -0
- flyte/_internal/imagebuild/docker_builder.py +416 -0
- flyte/_internal/imagebuild/image_builder.py +241 -0
- flyte/_internal/imagebuild/remote_builder.py +0 -0
- flyte/_internal/resolvers/__init__.py +0 -0
- flyte/_internal/resolvers/_task_module.py +54 -0
- flyte/_internal/resolvers/common.py +31 -0
- flyte/_internal/resolvers/default.py +28 -0
- flyte/_internal/runtime/__init__.py +0 -0
- flyte/_internal/runtime/convert.py +199 -0
- flyte/_internal/runtime/entrypoints.py +135 -0
- flyte/_internal/runtime/io.py +136 -0
- flyte/_internal/runtime/resources_serde.py +138 -0
- flyte/_internal/runtime/task_serde.py +210 -0
- flyte/_internal/runtime/taskrunner.py +190 -0
- flyte/_internal/runtime/types_serde.py +54 -0
- flyte/_logging.py +124 -0
- flyte/_protos/__init__.py +0 -0
- flyte/_protos/common/authorization_pb2.py +66 -0
- flyte/_protos/common/authorization_pb2.pyi +108 -0
- flyte/_protos/common/authorization_pb2_grpc.py +4 -0
- flyte/_protos/common/identifier_pb2.py +71 -0
- flyte/_protos/common/identifier_pb2.pyi +82 -0
- flyte/_protos/common/identifier_pb2_grpc.py +4 -0
- flyte/_protos/common/identity_pb2.py +48 -0
- flyte/_protos/common/identity_pb2.pyi +72 -0
- flyte/_protos/common/identity_pb2_grpc.py +4 -0
- flyte/_protos/common/list_pb2.py +36 -0
- flyte/_protos/common/list_pb2.pyi +69 -0
- flyte/_protos/common/list_pb2_grpc.py +4 -0
- flyte/_protos/common/policy_pb2.py +37 -0
- flyte/_protos/common/policy_pb2.pyi +27 -0
- flyte/_protos/common/policy_pb2_grpc.py +4 -0
- flyte/_protos/common/role_pb2.py +37 -0
- flyte/_protos/common/role_pb2.pyi +53 -0
- flyte/_protos/common/role_pb2_grpc.py +4 -0
- flyte/_protos/common/runtime_version_pb2.py +28 -0
- flyte/_protos/common/runtime_version_pb2.pyi +24 -0
- flyte/_protos/common/runtime_version_pb2_grpc.py +4 -0
- flyte/_protos/logs/dataplane/payload_pb2.py +96 -0
- flyte/_protos/logs/dataplane/payload_pb2.pyi +168 -0
- flyte/_protos/logs/dataplane/payload_pb2_grpc.py +4 -0
- flyte/_protos/secret/definition_pb2.py +49 -0
- flyte/_protos/secret/definition_pb2.pyi +93 -0
- flyte/_protos/secret/definition_pb2_grpc.py +4 -0
- flyte/_protos/secret/payload_pb2.py +62 -0
- flyte/_protos/secret/payload_pb2.pyi +94 -0
- flyte/_protos/secret/payload_pb2_grpc.py +4 -0
- flyte/_protos/secret/secret_pb2.py +38 -0
- flyte/_protos/secret/secret_pb2.pyi +6 -0
- flyte/_protos/secret/secret_pb2_grpc.py +198 -0
- flyte/_protos/secret/secret_pb2_grpc_grpc.py +198 -0
- flyte/_protos/validate/validate/validate_pb2.py +76 -0
- flyte/_protos/workflow/node_execution_service_pb2.py +26 -0
- flyte/_protos/workflow/node_execution_service_pb2.pyi +4 -0
- flyte/_protos/workflow/node_execution_service_pb2_grpc.py +32 -0
- flyte/_protos/workflow/queue_service_pb2.py +106 -0
- flyte/_protos/workflow/queue_service_pb2.pyi +141 -0
- flyte/_protos/workflow/queue_service_pb2_grpc.py +172 -0
- flyte/_protos/workflow/run_definition_pb2.py +128 -0
- flyte/_protos/workflow/run_definition_pb2.pyi +310 -0
- flyte/_protos/workflow/run_definition_pb2_grpc.py +4 -0
- flyte/_protos/workflow/run_logs_service_pb2.py +41 -0
- flyte/_protos/workflow/run_logs_service_pb2.pyi +28 -0
- flyte/_protos/workflow/run_logs_service_pb2_grpc.py +69 -0
- flyte/_protos/workflow/run_service_pb2.py +133 -0
- flyte/_protos/workflow/run_service_pb2.pyi +175 -0
- flyte/_protos/workflow/run_service_pb2_grpc.py +412 -0
- flyte/_protos/workflow/state_service_pb2.py +58 -0
- flyte/_protos/workflow/state_service_pb2.pyi +71 -0
- flyte/_protos/workflow/state_service_pb2_grpc.py +138 -0
- flyte/_protos/workflow/task_definition_pb2.py +72 -0
- flyte/_protos/workflow/task_definition_pb2.pyi +65 -0
- flyte/_protos/workflow/task_definition_pb2_grpc.py +4 -0
- flyte/_protos/workflow/task_service_pb2.py +44 -0
- flyte/_protos/workflow/task_service_pb2.pyi +31 -0
- flyte/_protos/workflow/task_service_pb2_grpc.py +104 -0
- flyte/_resources.py +226 -0
- flyte/_retry.py +32 -0
- flyte/_reusable_environment.py +25 -0
- flyte/_run.py +411 -0
- flyte/_secret.py +61 -0
- flyte/_task.py +367 -0
- flyte/_task_environment.py +200 -0
- flyte/_timeout.py +47 -0
- flyte/_tools.py +27 -0
- flyte/_trace.py +128 -0
- flyte/_utils/__init__.py +20 -0
- flyte/_utils/asyn.py +119 -0
- flyte/_utils/coro_management.py +25 -0
- flyte/_utils/file_handling.py +72 -0
- flyte/_utils/helpers.py +108 -0
- flyte/_utils/lazy_module.py +54 -0
- flyte/_utils/uv_script_parser.py +49 -0
- flyte/_version.py +21 -0
- flyte/connectors/__init__.py +0 -0
- flyte/errors.py +143 -0
- flyte/extras/__init__.py +5 -0
- flyte/extras/_container.py +273 -0
- flyte/io/__init__.py +11 -0
- flyte/io/_dataframe.py +0 -0
- flyte/io/_dir.py +448 -0
- flyte/io/_file.py +468 -0
- flyte/io/pickle/__init__.py +0 -0
- flyte/io/pickle/transformer.py +117 -0
- flyte/io/structured_dataset/__init__.py +129 -0
- flyte/io/structured_dataset/basic_dfs.py +219 -0
- flyte/io/structured_dataset/structured_dataset.py +1061 -0
- flyte/py.typed +0 -0
- flyte/remote/__init__.py +25 -0
- flyte/remote/_client/__init__.py +0 -0
- flyte/remote/_client/_protocols.py +131 -0
- flyte/remote/_client/auth/__init__.py +12 -0
- flyte/remote/_client/auth/_authenticators/__init__.py +0 -0
- flyte/remote/_client/auth/_authenticators/base.py +397 -0
- flyte/remote/_client/auth/_authenticators/client_credentials.py +73 -0
- flyte/remote/_client/auth/_authenticators/device_code.py +118 -0
- flyte/remote/_client/auth/_authenticators/external_command.py +79 -0
- flyte/remote/_client/auth/_authenticators/factory.py +200 -0
- flyte/remote/_client/auth/_authenticators/pkce.py +516 -0
- flyte/remote/_client/auth/_channel.py +184 -0
- flyte/remote/_client/auth/_client_config.py +83 -0
- flyte/remote/_client/auth/_default_html.py +32 -0
- flyte/remote/_client/auth/_grpc_utils/__init__.py +0 -0
- flyte/remote/_client/auth/_grpc_utils/auth_interceptor.py +288 -0
- flyte/remote/_client/auth/_grpc_utils/default_metadata_interceptor.py +151 -0
- flyte/remote/_client/auth/_keyring.py +143 -0
- flyte/remote/_client/auth/_token_client.py +260 -0
- flyte/remote/_client/auth/errors.py +16 -0
- flyte/remote/_client/controlplane.py +95 -0
- flyte/remote/_console.py +18 -0
- flyte/remote/_data.py +155 -0
- flyte/remote/_logs.py +116 -0
- flyte/remote/_project.py +86 -0
- flyte/remote/_run.py +873 -0
- flyte/remote/_secret.py +132 -0
- flyte/remote/_task.py +227 -0
- flyte/report/__init__.py +3 -0
- flyte/report/_report.py +178 -0
- flyte/report/_template.html +124 -0
- flyte/storage/__init__.py +24 -0
- flyte/storage/_remote_fs.py +34 -0
- flyte/storage/_storage.py +251 -0
- flyte/storage/_utils.py +5 -0
- flyte/types/__init__.py +13 -0
- flyte/types/_interface.py +25 -0
- flyte/types/_renderer.py +162 -0
- flyte/types/_string_literals.py +120 -0
- flyte/types/_type_engine.py +2210 -0
- flyte/types/_utils.py +80 -0
- flyte-0.0.1b0.dist-info/METADATA +179 -0
- flyte-0.0.1b0.dist-info/RECORD +390 -0
- flyte-0.0.1b0.dist-info/WHEEL +5 -0
- flyte-0.0.1b0.dist-info/entry_points.txt +3 -0
- flyte-0.0.1b0.dist-info/top_level.txt +1 -0
- union/__init__.py +54 -0
- union/_api_commons.py +3 -0
- union/_bin/__init__.py +0 -0
- union/_bin/runtime.py +113 -0
- union/_build.py +25 -0
- union/_cache/__init__.py +12 -0
- union/_cache/cache.py +141 -0
- union/_cache/defaults.py +9 -0
- union/_cache/policy_function_body.py +42 -0
- union/_cli/__init__.py +0 -0
- union/_cli/_common.py +263 -0
- union/_cli/_create.py +40 -0
- union/_cli/_delete.py +23 -0
- union/_cli/_deploy.py +120 -0
- union/_cli/_get.py +162 -0
- union/_cli/_params.py +579 -0
- union/_cli/_run.py +150 -0
- union/_cli/main.py +72 -0
- union/_code_bundle/__init__.py +8 -0
- union/_code_bundle/_ignore.py +113 -0
- union/_code_bundle/_packaging.py +187 -0
- union/_code_bundle/_utils.py +342 -0
- union/_code_bundle/bundle.py +176 -0
- union/_context.py +146 -0
- union/_datastructures.py +295 -0
- union/_deploy.py +185 -0
- union/_doc.py +29 -0
- union/_docstring.py +26 -0
- union/_environment.py +43 -0
- union/_group.py +31 -0
- union/_hash.py +23 -0
- union/_image.py +760 -0
- union/_initialize.py +585 -0
- union/_interface.py +84 -0
- union/_internal/__init__.py +3 -0
- union/_internal/controllers/__init__.py +77 -0
- union/_internal/controllers/_local_controller.py +77 -0
- union/_internal/controllers/pbhash.py +39 -0
- union/_internal/controllers/remote/__init__.py +40 -0
- union/_internal/controllers/remote/_action.py +131 -0
- union/_internal/controllers/remote/_client.py +43 -0
- union/_internal/controllers/remote/_controller.py +169 -0
- union/_internal/controllers/remote/_core.py +341 -0
- union/_internal/controllers/remote/_informer.py +260 -0
- union/_internal/controllers/remote/_service_protocol.py +44 -0
- union/_internal/imagebuild/__init__.py +11 -0
- union/_internal/imagebuild/docker_builder.py +416 -0
- union/_internal/imagebuild/image_builder.py +243 -0
- union/_internal/imagebuild/remote_builder.py +0 -0
- union/_internal/resolvers/__init__.py +0 -0
- union/_internal/resolvers/_task_module.py +31 -0
- union/_internal/resolvers/common.py +24 -0
- union/_internal/resolvers/default.py +27 -0
- union/_internal/runtime/__init__.py +0 -0
- union/_internal/runtime/convert.py +163 -0
- union/_internal/runtime/entrypoints.py +121 -0
- union/_internal/runtime/io.py +136 -0
- union/_internal/runtime/resources_serde.py +134 -0
- union/_internal/runtime/task_serde.py +202 -0
- union/_internal/runtime/taskrunner.py +179 -0
- union/_internal/runtime/types_serde.py +53 -0
- union/_logging.py +124 -0
- union/_protos/__init__.py +0 -0
- union/_protos/common/authorization_pb2.py +66 -0
- union/_protos/common/authorization_pb2.pyi +106 -0
- union/_protos/common/authorization_pb2_grpc.py +4 -0
- union/_protos/common/identifier_pb2.py +71 -0
- union/_protos/common/identifier_pb2.pyi +82 -0
- union/_protos/common/identifier_pb2_grpc.py +4 -0
- union/_protos/common/identity_pb2.py +48 -0
- union/_protos/common/identity_pb2.pyi +72 -0
- union/_protos/common/identity_pb2_grpc.py +4 -0
- union/_protos/common/list_pb2.py +36 -0
- union/_protos/common/list_pb2.pyi +69 -0
- union/_protos/common/list_pb2_grpc.py +4 -0
- union/_protos/common/policy_pb2.py +37 -0
- union/_protos/common/policy_pb2.pyi +27 -0
- union/_protos/common/policy_pb2_grpc.py +4 -0
- union/_protos/common/role_pb2.py +37 -0
- union/_protos/common/role_pb2.pyi +51 -0
- union/_protos/common/role_pb2_grpc.py +4 -0
- union/_protos/common/runtime_version_pb2.py +28 -0
- union/_protos/common/runtime_version_pb2.pyi +24 -0
- union/_protos/common/runtime_version_pb2_grpc.py +4 -0
- union/_protos/logs/dataplane/payload_pb2.py +96 -0
- union/_protos/logs/dataplane/payload_pb2.pyi +168 -0
- union/_protos/logs/dataplane/payload_pb2_grpc.py +4 -0
- union/_protos/secret/definition_pb2.py +49 -0
- union/_protos/secret/definition_pb2.pyi +93 -0
- union/_protos/secret/definition_pb2_grpc.py +4 -0
- union/_protos/secret/payload_pb2.py +62 -0
- union/_protos/secret/payload_pb2.pyi +94 -0
- union/_protos/secret/payload_pb2_grpc.py +4 -0
- union/_protos/secret/secret_pb2.py +38 -0
- union/_protos/secret/secret_pb2.pyi +6 -0
- union/_protos/secret/secret_pb2_grpc.py +198 -0
- union/_protos/validate/validate/validate_pb2.py +76 -0
- union/_protos/workflow/node_execution_service_pb2.py +26 -0
- union/_protos/workflow/node_execution_service_pb2.pyi +4 -0
- union/_protos/workflow/node_execution_service_pb2_grpc.py +32 -0
- union/_protos/workflow/queue_service_pb2.py +75 -0
- union/_protos/workflow/queue_service_pb2.pyi +103 -0
- union/_protos/workflow/queue_service_pb2_grpc.py +172 -0
- union/_protos/workflow/run_definition_pb2.py +100 -0
- union/_protos/workflow/run_definition_pb2.pyi +256 -0
- union/_protos/workflow/run_definition_pb2_grpc.py +4 -0
- union/_protos/workflow/run_logs_service_pb2.py +41 -0
- union/_protos/workflow/run_logs_service_pb2.pyi +28 -0
- union/_protos/workflow/run_logs_service_pb2_grpc.py +69 -0
- union/_protos/workflow/run_service_pb2.py +133 -0
- union/_protos/workflow/run_service_pb2.pyi +173 -0
- union/_protos/workflow/run_service_pb2_grpc.py +412 -0
- union/_protos/workflow/state_service_pb2.py +58 -0
- union/_protos/workflow/state_service_pb2.pyi +69 -0
- union/_protos/workflow/state_service_pb2_grpc.py +138 -0
- union/_protos/workflow/task_definition_pb2.py +72 -0
- union/_protos/workflow/task_definition_pb2.pyi +65 -0
- union/_protos/workflow/task_definition_pb2_grpc.py +4 -0
- union/_protos/workflow/task_service_pb2.py +44 -0
- union/_protos/workflow/task_service_pb2.pyi +31 -0
- union/_protos/workflow/task_service_pb2_grpc.py +104 -0
- union/_resources.py +226 -0
- union/_retry.py +32 -0
- union/_reusable_environment.py +25 -0
- union/_run.py +374 -0
- union/_secret.py +61 -0
- union/_task.py +354 -0
- union/_task_environment.py +186 -0
- union/_timeout.py +47 -0
- union/_tools.py +27 -0
- union/_utils/__init__.py +11 -0
- union/_utils/asyn.py +119 -0
- union/_utils/file_handling.py +71 -0
- union/_utils/helpers.py +46 -0
- union/_utils/lazy_module.py +54 -0
- union/_utils/uv_script_parser.py +49 -0
- union/_version.py +21 -0
- union/connectors/__init__.py +0 -0
- union/errors.py +128 -0
- union/extras/__init__.py +5 -0
- union/extras/_container.py +263 -0
- union/io/__init__.py +11 -0
- union/io/_dataframe.py +0 -0
- union/io/_dir.py +425 -0
- union/io/_file.py +418 -0
- union/io/pickle/__init__.py +0 -0
- union/io/pickle/transformer.py +117 -0
- union/io/structured_dataset/__init__.py +122 -0
- union/io/structured_dataset/basic_dfs.py +219 -0
- union/io/structured_dataset/structured_dataset.py +1057 -0
- union/py.typed +0 -0
- union/remote/__init__.py +23 -0
- union/remote/_client/__init__.py +0 -0
- union/remote/_client/_protocols.py +129 -0
- union/remote/_client/auth/__init__.py +12 -0
- union/remote/_client/auth/_authenticators/__init__.py +0 -0
- union/remote/_client/auth/_authenticators/base.py +391 -0
- union/remote/_client/auth/_authenticators/client_credentials.py +73 -0
- union/remote/_client/auth/_authenticators/device_code.py +120 -0
- union/remote/_client/auth/_authenticators/external_command.py +77 -0
- union/remote/_client/auth/_authenticators/factory.py +200 -0
- union/remote/_client/auth/_authenticators/pkce.py +515 -0
- union/remote/_client/auth/_channel.py +184 -0
- union/remote/_client/auth/_client_config.py +83 -0
- union/remote/_client/auth/_default_html.py +32 -0
- union/remote/_client/auth/_grpc_utils/__init__.py +0 -0
- union/remote/_client/auth/_grpc_utils/auth_interceptor.py +204 -0
- union/remote/_client/auth/_grpc_utils/default_metadata_interceptor.py +144 -0
- union/remote/_client/auth/_keyring.py +154 -0
- union/remote/_client/auth/_token_client.py +258 -0
- union/remote/_client/auth/errors.py +16 -0
- union/remote/_client/controlplane.py +86 -0
- union/remote/_data.py +149 -0
- union/remote/_logs.py +74 -0
- union/remote/_project.py +86 -0
- union/remote/_run.py +820 -0
- union/remote/_secret.py +132 -0
- union/remote/_task.py +193 -0
- union/report/__init__.py +3 -0
- union/report/_report.py +178 -0
- union/report/_template.html +124 -0
- union/storage/__init__.py +24 -0
- union/storage/_remote_fs.py +34 -0
- union/storage/_storage.py +247 -0
- union/storage/_utils.py +5 -0
- union/types/__init__.py +11 -0
- union/types/_renderer.py +162 -0
- union/types/_string_literals.py +120 -0
- union/types/_type_engine.py +2131 -0
- 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
|
+
)
|