flyte 0.0.1b0__py3-none-any.whl → 2.0.0b46__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- flyte/__init__.py +83 -30
- flyte/_bin/connect.py +61 -0
- flyte/_bin/debug.py +38 -0
- flyte/_bin/runtime.py +87 -19
- flyte/_bin/serve.py +351 -0
- flyte/_build.py +3 -2
- flyte/_cache/cache.py +6 -5
- flyte/_cache/local_cache.py +216 -0
- flyte/_code_bundle/_ignore.py +31 -5
- flyte/_code_bundle/_packaging.py +42 -11
- flyte/_code_bundle/_utils.py +57 -34
- flyte/_code_bundle/bundle.py +130 -27
- flyte/_constants.py +1 -0
- flyte/_context.py +21 -5
- flyte/_custom_context.py +73 -0
- flyte/_debug/constants.py +37 -0
- flyte/_debug/utils.py +17 -0
- flyte/_debug/vscode.py +315 -0
- flyte/_deploy.py +396 -75
- flyte/_deployer.py +109 -0
- flyte/_environment.py +94 -11
- flyte/_excepthook.py +37 -0
- flyte/_group.py +2 -1
- flyte/_hash.py +1 -16
- flyte/_image.py +544 -234
- flyte/_initialize.py +443 -294
- flyte/_interface.py +40 -5
- flyte/_internal/controllers/__init__.py +22 -8
- flyte/_internal/controllers/_local_controller.py +159 -35
- flyte/_internal/controllers/_trace.py +18 -10
- flyte/_internal/controllers/remote/__init__.py +38 -9
- flyte/_internal/controllers/remote/_action.py +82 -12
- flyte/_internal/controllers/remote/_client.py +6 -2
- flyte/_internal/controllers/remote/_controller.py +290 -64
- flyte/_internal/controllers/remote/_core.py +155 -95
- flyte/_internal/controllers/remote/_informer.py +40 -20
- flyte/_internal/controllers/remote/_service_protocol.py +2 -2
- flyte/_internal/imagebuild/__init__.py +2 -10
- flyte/_internal/imagebuild/docker_builder.py +391 -84
- flyte/_internal/imagebuild/image_builder.py +111 -55
- flyte/_internal/imagebuild/remote_builder.py +409 -0
- flyte/_internal/imagebuild/utils.py +79 -0
- flyte/_internal/resolvers/_app_env_module.py +92 -0
- flyte/_internal/resolvers/_task_module.py +5 -38
- flyte/_internal/resolvers/app_env.py +26 -0
- flyte/_internal/resolvers/common.py +8 -1
- flyte/_internal/resolvers/default.py +2 -2
- flyte/_internal/runtime/convert.py +322 -33
- flyte/_internal/runtime/entrypoints.py +106 -18
- flyte/_internal/runtime/io.py +71 -23
- flyte/_internal/runtime/resources_serde.py +21 -7
- flyte/_internal/runtime/reuse.py +125 -0
- flyte/_internal/runtime/rusty.py +196 -0
- flyte/_internal/runtime/task_serde.py +239 -66
- flyte/_internal/runtime/taskrunner.py +48 -8
- flyte/_internal/runtime/trigger_serde.py +162 -0
- flyte/_internal/runtime/types_serde.py +7 -16
- flyte/_keyring/file.py +115 -0
- flyte/_link.py +30 -0
- flyte/_logging.py +241 -42
- flyte/_map.py +312 -0
- flyte/_metrics.py +59 -0
- flyte/_module.py +74 -0
- flyte/_pod.py +30 -0
- flyte/_resources.py +296 -33
- flyte/_retry.py +1 -7
- flyte/_reusable_environment.py +72 -7
- flyte/_run.py +461 -132
- flyte/_secret.py +47 -11
- flyte/_serve.py +333 -0
- flyte/_task.py +245 -56
- flyte/_task_environment.py +219 -97
- flyte/_task_plugins.py +47 -0
- flyte/_tools.py +8 -8
- flyte/_trace.py +15 -24
- flyte/_trigger.py +1027 -0
- flyte/_utils/__init__.py +12 -1
- flyte/_utils/asyn.py +3 -1
- flyte/_utils/async_cache.py +139 -0
- flyte/_utils/coro_management.py +5 -4
- flyte/_utils/description_parser.py +19 -0
- flyte/_utils/docker_credentials.py +173 -0
- flyte/_utils/helpers.py +45 -19
- flyte/_utils/module_loader.py +123 -0
- flyte/_utils/org_discovery.py +57 -0
- flyte/_utils/uv_script_parser.py +8 -1
- flyte/_version.py +16 -3
- flyte/app/__init__.py +27 -0
- flyte/app/_app_environment.py +362 -0
- flyte/app/_connector_environment.py +40 -0
- flyte/app/_deploy.py +130 -0
- flyte/app/_parameter.py +343 -0
- flyte/app/_runtime/__init__.py +3 -0
- flyte/app/_runtime/app_serde.py +383 -0
- flyte/app/_types.py +113 -0
- flyte/app/extras/__init__.py +9 -0
- flyte/app/extras/_auth_middleware.py +217 -0
- flyte/app/extras/_fastapi.py +93 -0
- flyte/app/extras/_model_loader/__init__.py +3 -0
- flyte/app/extras/_model_loader/config.py +7 -0
- flyte/app/extras/_model_loader/loader.py +288 -0
- flyte/cli/__init__.py +12 -0
- flyte/cli/_abort.py +28 -0
- flyte/cli/_build.py +114 -0
- flyte/cli/_common.py +493 -0
- flyte/cli/_create.py +371 -0
- flyte/cli/_delete.py +45 -0
- flyte/cli/_deploy.py +401 -0
- flyte/cli/_gen.py +316 -0
- flyte/cli/_get.py +446 -0
- flyte/cli/_option.py +33 -0
- {union/_cli → flyte/cli}/_params.py +152 -153
- flyte/cli/_plugins.py +209 -0
- flyte/cli/_prefetch.py +292 -0
- flyte/cli/_run.py +690 -0
- flyte/cli/_serve.py +338 -0
- flyte/cli/_update.py +86 -0
- flyte/cli/_user.py +20 -0
- flyte/cli/main.py +246 -0
- flyte/config/__init__.py +3 -0
- flyte/config/_config.py +248 -0
- flyte/config/_internal.py +73 -0
- flyte/config/_reader.py +225 -0
- flyte/connectors/__init__.py +11 -0
- flyte/connectors/_connector.py +330 -0
- flyte/connectors/_server.py +194 -0
- flyte/connectors/utils.py +159 -0
- flyte/errors.py +134 -2
- flyte/extend.py +24 -0
- flyte/extras/_container.py +69 -56
- flyte/git/__init__.py +3 -0
- flyte/git/_config.py +279 -0
- flyte/io/__init__.py +8 -1
- flyte/io/{structured_dataset → _dataframe}/__init__.py +32 -30
- flyte/io/{structured_dataset → _dataframe}/basic_dfs.py +75 -68
- flyte/io/{structured_dataset/structured_dataset.py → _dataframe/dataframe.py} +207 -242
- flyte/io/_dir.py +575 -113
- flyte/io/_file.py +587 -141
- flyte/io/_hashing_io.py +342 -0
- flyte/io/extend.py +7 -0
- flyte/models.py +635 -0
- flyte/prefetch/__init__.py +22 -0
- flyte/prefetch/_hf_model.py +563 -0
- flyte/remote/__init__.py +14 -3
- flyte/remote/_action.py +879 -0
- flyte/remote/_app.py +346 -0
- flyte/remote/_auth_metadata.py +42 -0
- flyte/remote/_client/_protocols.py +62 -4
- flyte/remote/_client/auth/_auth_utils.py +19 -0
- flyte/remote/_client/auth/_authenticators/base.py +8 -2
- flyte/remote/_client/auth/_authenticators/device_code.py +4 -5
- flyte/remote/_client/auth/_authenticators/factory.py +4 -0
- flyte/remote/_client/auth/_authenticators/passthrough.py +79 -0
- flyte/remote/_client/auth/_authenticators/pkce.py +17 -18
- flyte/remote/_client/auth/_channel.py +47 -18
- flyte/remote/_client/auth/_client_config.py +5 -3
- flyte/remote/_client/auth/_keyring.py +15 -2
- flyte/remote/_client/auth/_token_client.py +3 -3
- flyte/remote/_client/controlplane.py +206 -18
- flyte/remote/_common.py +66 -0
- flyte/remote/_data.py +107 -22
- flyte/remote/_logs.py +116 -33
- flyte/remote/_project.py +21 -19
- flyte/remote/_run.py +164 -631
- flyte/remote/_secret.py +72 -29
- flyte/remote/_task.py +387 -46
- flyte/remote/_trigger.py +368 -0
- flyte/remote/_user.py +43 -0
- flyte/report/_report.py +10 -6
- flyte/storage/__init__.py +13 -1
- flyte/storage/_config.py +237 -0
- flyte/storage/_parallel_reader.py +289 -0
- flyte/storage/_storage.py +268 -59
- flyte/syncify/__init__.py +56 -0
- flyte/syncify/_api.py +414 -0
- flyte/types/__init__.py +39 -0
- flyte/types/_interface.py +22 -7
- flyte/{io/pickle/transformer.py → types/_pickle.py} +37 -9
- flyte/types/_string_literals.py +8 -9
- flyte/types/_type_engine.py +230 -129
- flyte/types/_utils.py +1 -1
- flyte-2.0.0b46.data/scripts/debug.py +38 -0
- flyte-2.0.0b46.data/scripts/runtime.py +194 -0
- flyte-2.0.0b46.dist-info/METADATA +352 -0
- flyte-2.0.0b46.dist-info/RECORD +221 -0
- flyte-2.0.0b46.dist-info/entry_points.txt +8 -0
- flyte-2.0.0b46.dist-info/licenses/LICENSE +201 -0
- flyte/_api_commons.py +0 -3
- flyte/_cli/_common.py +0 -287
- flyte/_cli/_create.py +0 -42
- flyte/_cli/_delete.py +0 -23
- flyte/_cli/_deploy.py +0 -140
- flyte/_cli/_get.py +0 -235
- flyte/_cli/_run.py +0 -152
- flyte/_cli/main.py +0 -72
- flyte/_datastructures.py +0 -342
- flyte/_internal/controllers/pbhash.py +0 -39
- flyte/_protos/common/authorization_pb2.py +0 -66
- flyte/_protos/common/authorization_pb2.pyi +0 -108
- flyte/_protos/common/authorization_pb2_grpc.py +0 -4
- flyte/_protos/common/identifier_pb2.py +0 -71
- flyte/_protos/common/identifier_pb2.pyi +0 -82
- flyte/_protos/common/identifier_pb2_grpc.py +0 -4
- flyte/_protos/common/identity_pb2.py +0 -48
- flyte/_protos/common/identity_pb2.pyi +0 -72
- flyte/_protos/common/identity_pb2_grpc.py +0 -4
- flyte/_protos/common/list_pb2.py +0 -36
- flyte/_protos/common/list_pb2.pyi +0 -69
- flyte/_protos/common/list_pb2_grpc.py +0 -4
- flyte/_protos/common/policy_pb2.py +0 -37
- flyte/_protos/common/policy_pb2.pyi +0 -27
- flyte/_protos/common/policy_pb2_grpc.py +0 -4
- flyte/_protos/common/role_pb2.py +0 -37
- flyte/_protos/common/role_pb2.pyi +0 -53
- flyte/_protos/common/role_pb2_grpc.py +0 -4
- flyte/_protos/common/runtime_version_pb2.py +0 -28
- flyte/_protos/common/runtime_version_pb2.pyi +0 -24
- flyte/_protos/common/runtime_version_pb2_grpc.py +0 -4
- flyte/_protos/logs/dataplane/payload_pb2.py +0 -96
- flyte/_protos/logs/dataplane/payload_pb2.pyi +0 -168
- flyte/_protos/logs/dataplane/payload_pb2_grpc.py +0 -4
- flyte/_protos/secret/definition_pb2.py +0 -49
- flyte/_protos/secret/definition_pb2.pyi +0 -93
- flyte/_protos/secret/definition_pb2_grpc.py +0 -4
- flyte/_protos/secret/payload_pb2.py +0 -62
- flyte/_protos/secret/payload_pb2.pyi +0 -94
- flyte/_protos/secret/payload_pb2_grpc.py +0 -4
- flyte/_protos/secret/secret_pb2.py +0 -38
- flyte/_protos/secret/secret_pb2.pyi +0 -6
- flyte/_protos/secret/secret_pb2_grpc.py +0 -198
- flyte/_protos/secret/secret_pb2_grpc_grpc.py +0 -198
- flyte/_protos/validate/validate/validate_pb2.py +0 -76
- flyte/_protos/workflow/node_execution_service_pb2.py +0 -26
- flyte/_protos/workflow/node_execution_service_pb2.pyi +0 -4
- flyte/_protos/workflow/node_execution_service_pb2_grpc.py +0 -32
- flyte/_protos/workflow/queue_service_pb2.py +0 -106
- flyte/_protos/workflow/queue_service_pb2.pyi +0 -141
- flyte/_protos/workflow/queue_service_pb2_grpc.py +0 -172
- flyte/_protos/workflow/run_definition_pb2.py +0 -128
- flyte/_protos/workflow/run_definition_pb2.pyi +0 -310
- flyte/_protos/workflow/run_definition_pb2_grpc.py +0 -4
- flyte/_protos/workflow/run_logs_service_pb2.py +0 -41
- flyte/_protos/workflow/run_logs_service_pb2.pyi +0 -28
- flyte/_protos/workflow/run_logs_service_pb2_grpc.py +0 -69
- flyte/_protos/workflow/run_service_pb2.py +0 -133
- flyte/_protos/workflow/run_service_pb2.pyi +0 -175
- flyte/_protos/workflow/run_service_pb2_grpc.py +0 -412
- flyte/_protos/workflow/state_service_pb2.py +0 -58
- flyte/_protos/workflow/state_service_pb2.pyi +0 -71
- flyte/_protos/workflow/state_service_pb2_grpc.py +0 -138
- flyte/_protos/workflow/task_definition_pb2.py +0 -72
- flyte/_protos/workflow/task_definition_pb2.pyi +0 -65
- flyte/_protos/workflow/task_definition_pb2_grpc.py +0 -4
- flyte/_protos/workflow/task_service_pb2.py +0 -44
- flyte/_protos/workflow/task_service_pb2.pyi +0 -31
- flyte/_protos/workflow/task_service_pb2_grpc.py +0 -104
- flyte/io/_dataframe.py +0 -0
- flyte/io/pickle/__init__.py +0 -0
- flyte/remote/_console.py +0 -18
- flyte-0.0.1b0.dist-info/METADATA +0 -179
- flyte-0.0.1b0.dist-info/RECORD +0 -390
- flyte-0.0.1b0.dist-info/entry_points.txt +0 -3
- union/__init__.py +0 -54
- union/_api_commons.py +0 -3
- union/_bin/__init__.py +0 -0
- union/_bin/runtime.py +0 -113
- union/_build.py +0 -25
- union/_cache/__init__.py +0 -12
- union/_cache/cache.py +0 -141
- union/_cache/defaults.py +0 -9
- union/_cache/policy_function_body.py +0 -42
- union/_cli/__init__.py +0 -0
- union/_cli/_common.py +0 -263
- union/_cli/_create.py +0 -40
- union/_cli/_delete.py +0 -23
- union/_cli/_deploy.py +0 -120
- union/_cli/_get.py +0 -162
- union/_cli/_run.py +0 -150
- union/_cli/main.py +0 -72
- union/_code_bundle/__init__.py +0 -8
- union/_code_bundle/_ignore.py +0 -113
- union/_code_bundle/_packaging.py +0 -187
- union/_code_bundle/_utils.py +0 -342
- union/_code_bundle/bundle.py +0 -176
- union/_context.py +0 -146
- union/_datastructures.py +0 -295
- union/_deploy.py +0 -185
- union/_doc.py +0 -29
- union/_docstring.py +0 -26
- union/_environment.py +0 -43
- union/_group.py +0 -31
- union/_hash.py +0 -23
- union/_image.py +0 -760
- union/_initialize.py +0 -585
- union/_interface.py +0 -84
- union/_internal/__init__.py +0 -3
- union/_internal/controllers/__init__.py +0 -77
- union/_internal/controllers/_local_controller.py +0 -77
- union/_internal/controllers/pbhash.py +0 -39
- union/_internal/controllers/remote/__init__.py +0 -40
- union/_internal/controllers/remote/_action.py +0 -131
- union/_internal/controllers/remote/_client.py +0 -43
- union/_internal/controllers/remote/_controller.py +0 -169
- union/_internal/controllers/remote/_core.py +0 -341
- union/_internal/controllers/remote/_informer.py +0 -260
- union/_internal/controllers/remote/_service_protocol.py +0 -44
- union/_internal/imagebuild/__init__.py +0 -11
- union/_internal/imagebuild/docker_builder.py +0 -416
- union/_internal/imagebuild/image_builder.py +0 -243
- union/_internal/imagebuild/remote_builder.py +0 -0
- union/_internal/resolvers/__init__.py +0 -0
- union/_internal/resolvers/_task_module.py +0 -31
- union/_internal/resolvers/common.py +0 -24
- union/_internal/resolvers/default.py +0 -27
- union/_internal/runtime/__init__.py +0 -0
- union/_internal/runtime/convert.py +0 -163
- union/_internal/runtime/entrypoints.py +0 -121
- union/_internal/runtime/io.py +0 -136
- union/_internal/runtime/resources_serde.py +0 -134
- union/_internal/runtime/task_serde.py +0 -202
- union/_internal/runtime/taskrunner.py +0 -179
- union/_internal/runtime/types_serde.py +0 -53
- union/_logging.py +0 -124
- union/_protos/__init__.py +0 -0
- union/_protos/common/authorization_pb2.py +0 -66
- union/_protos/common/authorization_pb2.pyi +0 -106
- union/_protos/common/authorization_pb2_grpc.py +0 -4
- union/_protos/common/identifier_pb2.py +0 -71
- union/_protos/common/identifier_pb2.pyi +0 -82
- union/_protos/common/identifier_pb2_grpc.py +0 -4
- union/_protos/common/identity_pb2.py +0 -48
- union/_protos/common/identity_pb2.pyi +0 -72
- union/_protos/common/identity_pb2_grpc.py +0 -4
- union/_protos/common/list_pb2.py +0 -36
- union/_protos/common/list_pb2.pyi +0 -69
- union/_protos/common/list_pb2_grpc.py +0 -4
- union/_protos/common/policy_pb2.py +0 -37
- union/_protos/common/policy_pb2.pyi +0 -27
- union/_protos/common/policy_pb2_grpc.py +0 -4
- union/_protos/common/role_pb2.py +0 -37
- union/_protos/common/role_pb2.pyi +0 -51
- union/_protos/common/role_pb2_grpc.py +0 -4
- union/_protos/common/runtime_version_pb2.py +0 -28
- union/_protos/common/runtime_version_pb2.pyi +0 -24
- union/_protos/common/runtime_version_pb2_grpc.py +0 -4
- union/_protos/logs/dataplane/payload_pb2.py +0 -96
- union/_protos/logs/dataplane/payload_pb2.pyi +0 -168
- union/_protos/logs/dataplane/payload_pb2_grpc.py +0 -4
- union/_protos/secret/definition_pb2.py +0 -49
- union/_protos/secret/definition_pb2.pyi +0 -93
- union/_protos/secret/definition_pb2_grpc.py +0 -4
- union/_protos/secret/payload_pb2.py +0 -62
- union/_protos/secret/payload_pb2.pyi +0 -94
- union/_protos/secret/payload_pb2_grpc.py +0 -4
- union/_protos/secret/secret_pb2.py +0 -38
- union/_protos/secret/secret_pb2.pyi +0 -6
- union/_protos/secret/secret_pb2_grpc.py +0 -198
- union/_protos/validate/validate/validate_pb2.py +0 -76
- union/_protos/workflow/node_execution_service_pb2.py +0 -26
- union/_protos/workflow/node_execution_service_pb2.pyi +0 -4
- union/_protos/workflow/node_execution_service_pb2_grpc.py +0 -32
- union/_protos/workflow/queue_service_pb2.py +0 -75
- union/_protos/workflow/queue_service_pb2.pyi +0 -103
- union/_protos/workflow/queue_service_pb2_grpc.py +0 -172
- union/_protos/workflow/run_definition_pb2.py +0 -100
- union/_protos/workflow/run_definition_pb2.pyi +0 -256
- union/_protos/workflow/run_definition_pb2_grpc.py +0 -4
- union/_protos/workflow/run_logs_service_pb2.py +0 -41
- union/_protos/workflow/run_logs_service_pb2.pyi +0 -28
- union/_protos/workflow/run_logs_service_pb2_grpc.py +0 -69
- union/_protos/workflow/run_service_pb2.py +0 -133
- union/_protos/workflow/run_service_pb2.pyi +0 -173
- union/_protos/workflow/run_service_pb2_grpc.py +0 -412
- union/_protos/workflow/state_service_pb2.py +0 -58
- union/_protos/workflow/state_service_pb2.pyi +0 -69
- union/_protos/workflow/state_service_pb2_grpc.py +0 -138
- union/_protos/workflow/task_definition_pb2.py +0 -72
- union/_protos/workflow/task_definition_pb2.pyi +0 -65
- union/_protos/workflow/task_definition_pb2_grpc.py +0 -4
- union/_protos/workflow/task_service_pb2.py +0 -44
- union/_protos/workflow/task_service_pb2.pyi +0 -31
- union/_protos/workflow/task_service_pb2_grpc.py +0 -104
- union/_resources.py +0 -226
- union/_retry.py +0 -32
- union/_reusable_environment.py +0 -25
- union/_run.py +0 -374
- union/_secret.py +0 -61
- union/_task.py +0 -354
- union/_task_environment.py +0 -186
- union/_timeout.py +0 -47
- union/_tools.py +0 -27
- union/_utils/__init__.py +0 -11
- union/_utils/asyn.py +0 -119
- union/_utils/file_handling.py +0 -71
- union/_utils/helpers.py +0 -46
- union/_utils/lazy_module.py +0 -54
- union/_utils/uv_script_parser.py +0 -49
- union/_version.py +0 -21
- union/connectors/__init__.py +0 -0
- union/errors.py +0 -128
- union/extras/__init__.py +0 -5
- union/extras/_container.py +0 -263
- union/io/__init__.py +0 -11
- union/io/_dataframe.py +0 -0
- union/io/_dir.py +0 -425
- union/io/_file.py +0 -418
- union/io/pickle/__init__.py +0 -0
- union/io/pickle/transformer.py +0 -117
- union/io/structured_dataset/__init__.py +0 -122
- union/io/structured_dataset/basic_dfs.py +0 -219
- union/io/structured_dataset/structured_dataset.py +0 -1057
- union/py.typed +0 -0
- union/remote/__init__.py +0 -23
- union/remote/_client/__init__.py +0 -0
- union/remote/_client/_protocols.py +0 -129
- union/remote/_client/auth/__init__.py +0 -12
- union/remote/_client/auth/_authenticators/__init__.py +0 -0
- union/remote/_client/auth/_authenticators/base.py +0 -391
- union/remote/_client/auth/_authenticators/client_credentials.py +0 -73
- union/remote/_client/auth/_authenticators/device_code.py +0 -120
- union/remote/_client/auth/_authenticators/external_command.py +0 -77
- union/remote/_client/auth/_authenticators/factory.py +0 -200
- union/remote/_client/auth/_authenticators/pkce.py +0 -515
- union/remote/_client/auth/_channel.py +0 -184
- union/remote/_client/auth/_client_config.py +0 -83
- union/remote/_client/auth/_default_html.py +0 -32
- union/remote/_client/auth/_grpc_utils/__init__.py +0 -0
- union/remote/_client/auth/_grpc_utils/auth_interceptor.py +0 -204
- union/remote/_client/auth/_grpc_utils/default_metadata_interceptor.py +0 -144
- union/remote/_client/auth/_keyring.py +0 -154
- union/remote/_client/auth/_token_client.py +0 -258
- union/remote/_client/auth/errors.py +0 -16
- union/remote/_client/controlplane.py +0 -86
- union/remote/_data.py +0 -149
- union/remote/_logs.py +0 -74
- union/remote/_project.py +0 -86
- union/remote/_run.py +0 -820
- union/remote/_secret.py +0 -132
- union/remote/_task.py +0 -193
- union/report/__init__.py +0 -3
- union/report/_report.py +0 -178
- union/report/_template.html +0 -124
- union/storage/__init__.py +0 -24
- union/storage/_remote_fs.py +0 -34
- union/storage/_storage.py +0 -247
- union/storage/_utils.py +0 -5
- union/types/__init__.py +0 -11
- union/types/_renderer.py +0 -162
- union/types/_string_literals.py +0 -120
- union/types/_type_engine.py +0 -2131
- union/types/_utils.py +0 -80
- /flyte/{_cli → _debug}/__init__.py +0 -0
- /flyte/{_protos → _keyring}/__init__.py +0 -0
- {flyte-0.0.1b0.dist-info → flyte-2.0.0b46.dist-info}/WHEEL +0 -0
- {flyte-0.0.1b0.dist-info → flyte-2.0.0b46.dist-info}/top_level.txt +0 -0
flyte/_secret.py
CHANGED
|
@@ -7,30 +7,30 @@ from typing import List, Optional, Union
|
|
|
7
7
|
@dataclass
|
|
8
8
|
class Secret:
|
|
9
9
|
"""
|
|
10
|
-
Secrets are used to inject sensitive information into tasks
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
"file" the secret will be mounted as a file. The as_env_var is an optional parameter that can be used to specify the
|
|
10
|
+
Secrets are used to inject sensitive information into tasks or image build context.
|
|
11
|
+
Secrets can be mounted as environment variables or files.
|
|
12
|
+
The secret key is the name of the secret in the secret store. The group is optional and maybe used with some
|
|
13
|
+
secret stores to organize secrets. The as_env_var is an optional parameter that can be used to specify the
|
|
15
14
|
name of the environment variable that the secret should be mounted as.
|
|
16
15
|
|
|
17
16
|
Example:
|
|
18
17
|
```python
|
|
19
|
-
@task(secrets="
|
|
18
|
+
@task(secrets="my-secret")
|
|
20
19
|
async def my_task():
|
|
21
|
-
|
|
20
|
+
# This will be set to the value of the secret. Note: The env var is always uppercase, and - is replaced with _.
|
|
21
|
+
os.environ["MY_SECRET"]
|
|
22
22
|
|
|
23
|
-
@task(secrets=Secret("
|
|
23
|
+
@task(secrets=Secret("my-openai-api-key", as_env_var="OPENAI_API_KEY"))
|
|
24
24
|
async def my_task2():
|
|
25
|
-
|
|
26
|
-
secret_value = f.read()
|
|
25
|
+
os.environ["OPENAI_API_KEY"]
|
|
27
26
|
```
|
|
28
27
|
|
|
29
28
|
TODO: Add support for secret versioning (some stores) and secret groups (some stores) and mounting as files.
|
|
30
29
|
|
|
31
30
|
:param key: The name of the secret in the secret store.
|
|
32
31
|
:param group: The group of the secret in the secret store.
|
|
33
|
-
:param mount:
|
|
32
|
+
:param mount: For now, the only supported mount path is "/etc/flyte/secrets".
|
|
33
|
+
TODO: support arbitrary mount paths. Today only "/etc/flyte/secrets" is supported
|
|
34
34
|
:param as_env_var: The name of the environment variable that the secret should be mounted as.
|
|
35
35
|
"""
|
|
36
36
|
|
|
@@ -40,11 +40,38 @@ class Secret:
|
|
|
40
40
|
as_env_var: Optional[str] = None
|
|
41
41
|
|
|
42
42
|
def __post_init__(self):
|
|
43
|
+
if not self.mount and not self.as_env_var:
|
|
44
|
+
self.as_env_var = f"{self.group}_{self.key}" if self.group else self.key
|
|
45
|
+
self.as_env_var = self.as_env_var.replace("-", "_").upper()
|
|
46
|
+
if self.mount:
|
|
47
|
+
if str(self.mount) != "/etc/flyte/secrets":
|
|
48
|
+
raise ValueError("Only /etc/flyte/secrets is supported as secret mount path today.")
|
|
43
49
|
if self.as_env_var is not None:
|
|
44
50
|
pattern = r"^[A-Z_][A-Z0-9_]*$"
|
|
45
51
|
if not re.match(pattern, self.as_env_var):
|
|
46
52
|
raise ValueError(f"Invalid environment variable name: {self.as_env_var}, must match {pattern}")
|
|
47
53
|
|
|
54
|
+
def stable_hash(self) -> str:
|
|
55
|
+
"""
|
|
56
|
+
Deterministic, process-independent hash (as hex string).
|
|
57
|
+
"""
|
|
58
|
+
import hashlib
|
|
59
|
+
|
|
60
|
+
data = (
|
|
61
|
+
self.key,
|
|
62
|
+
self.group or "",
|
|
63
|
+
str(self.mount) if self.mount else "",
|
|
64
|
+
self.as_env_var or "",
|
|
65
|
+
)
|
|
66
|
+
joined = "|".join(data)
|
|
67
|
+
return hashlib.sha256(joined.encode("utf-8")).hexdigest()
|
|
68
|
+
|
|
69
|
+
def __hash__(self) -> int:
|
|
70
|
+
"""
|
|
71
|
+
Deterministic hash function for the Secret class.
|
|
72
|
+
"""
|
|
73
|
+
return int(self.stable_hash()[:16], 16)
|
|
74
|
+
|
|
48
75
|
|
|
49
76
|
SecretRequest = Union[str, Secret, List[str | Secret]]
|
|
50
77
|
|
|
@@ -59,3 +86,12 @@ def secrets_from_request(secrets: SecretRequest) -> List[Secret]:
|
|
|
59
86
|
return [secrets]
|
|
60
87
|
else:
|
|
61
88
|
return [Secret(key=s) if isinstance(s, str) else s for s in secrets]
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
if __name__ == "__main__":
|
|
92
|
+
# Example usage
|
|
93
|
+
secret1 = Secret(key="MY_SECRET", mount=pathlib.Path("/path/to/secret"), as_env_var="MY_SECRET_ENV")
|
|
94
|
+
secret2 = Secret(
|
|
95
|
+
key="ANOTHER_SECRET",
|
|
96
|
+
)
|
|
97
|
+
print(hash(secret1), hash(secret2))
|
flyte/_serve.py
ADDED
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import hashlib
|
|
4
|
+
import pathlib
|
|
5
|
+
from dataclasses import replace
|
|
6
|
+
from typing import TYPE_CHECKING, Optional
|
|
7
|
+
|
|
8
|
+
import cloudpickle
|
|
9
|
+
|
|
10
|
+
from flyte._initialize import get_init_config
|
|
11
|
+
from flyte._logging import LogFormat, logger
|
|
12
|
+
from flyte._tools import ipython_check
|
|
13
|
+
from flyte.models import SerializationContext
|
|
14
|
+
from flyte.syncify import syncify
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
import flyte.io
|
|
18
|
+
from flyte.app import AppEnvironment
|
|
19
|
+
from flyte.remote import App
|
|
20
|
+
|
|
21
|
+
from ._code_bundle import CopyFiles
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class _Serve:
|
|
25
|
+
"""
|
|
26
|
+
Context manager for serving apps with custom configuration.
|
|
27
|
+
|
|
28
|
+
Similar to _Runner for tasks, but specifically for AppEnvironment serving.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
version: Optional[str] = None,
|
|
34
|
+
copy_style: CopyFiles = "loaded_modules",
|
|
35
|
+
dry_run: bool = False,
|
|
36
|
+
project: str | None = None,
|
|
37
|
+
domain: str | None = None,
|
|
38
|
+
env_vars: dict[str, str] | None = None,
|
|
39
|
+
parameter_values: dict[str, dict[str, str | flyte.io.File | flyte.io.Dir]] | None = None,
|
|
40
|
+
cluster_pool: str | None = None,
|
|
41
|
+
log_level: int | None = None,
|
|
42
|
+
log_format: LogFormat = "console",
|
|
43
|
+
interactive_mode: bool | None = None,
|
|
44
|
+
copy_bundle_to: pathlib.Path | None = None,
|
|
45
|
+
):
|
|
46
|
+
"""
|
|
47
|
+
Initialize serve context.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
version: Optional version override for the app deployment
|
|
51
|
+
copy_style: Code bundle copy style (default: "loaded_modules")
|
|
52
|
+
dry_run: If True, don't actually deploy (default: False)
|
|
53
|
+
project: Optional project override
|
|
54
|
+
domain: Optional domain override
|
|
55
|
+
env_vars: Optional environment variables to inject into the app
|
|
56
|
+
parameter_values: Optional parameter values to inject into the app
|
|
57
|
+
cluster_pool: Optional cluster pool override
|
|
58
|
+
log_level: Optional log level to set for the app (e.g., logging.INFO)
|
|
59
|
+
log_format: Optional log format ("console" or "json", default: "console")
|
|
60
|
+
interactive_mode: If True, raises NotImplementedError (apps don't support interactive/notebook mode)
|
|
61
|
+
copy_bundle_to: When dry_run is True, the bundle will be copied to this location if specified
|
|
62
|
+
"""
|
|
63
|
+
self._version = version
|
|
64
|
+
self._copy_style = copy_style
|
|
65
|
+
self._dry_run = dry_run
|
|
66
|
+
self._project = project
|
|
67
|
+
self._domain = domain
|
|
68
|
+
self._env_vars = env_vars or {}
|
|
69
|
+
self._parameter_values = parameter_values or {}
|
|
70
|
+
self._cluster_pool = cluster_pool
|
|
71
|
+
self._log_level = log_level
|
|
72
|
+
self._log_format = log_format
|
|
73
|
+
self._interactive_mode = interactive_mode if interactive_mode is not None else ipython_check()
|
|
74
|
+
self._copy_bundle_to = copy_bundle_to
|
|
75
|
+
|
|
76
|
+
@syncify
|
|
77
|
+
async def serve(self, app_env: "AppEnvironment") -> "App":
|
|
78
|
+
"""
|
|
79
|
+
Serve an app with the configured context.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
app_env: The app environment to serve
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
Deployed and activated App instance
|
|
86
|
+
|
|
87
|
+
Raises:
|
|
88
|
+
NotImplementedError: If interactive mode is detected
|
|
89
|
+
"""
|
|
90
|
+
from copy import deepcopy
|
|
91
|
+
|
|
92
|
+
from flyte.app import _deploy
|
|
93
|
+
|
|
94
|
+
from ._code_bundle import build_code_bundle, build_pkl_bundle
|
|
95
|
+
from ._deploy import build_images, plan_deploy
|
|
96
|
+
|
|
97
|
+
cfg = get_init_config()
|
|
98
|
+
project = self._project or cfg.project
|
|
99
|
+
domain = self._domain or cfg.domain
|
|
100
|
+
|
|
101
|
+
# Configure logging env vars (similar to _run.py)
|
|
102
|
+
env = self._env_vars.copy()
|
|
103
|
+
if env.get("LOG_LEVEL") is None:
|
|
104
|
+
if self._log_level:
|
|
105
|
+
env["LOG_LEVEL"] = str(self._log_level)
|
|
106
|
+
else:
|
|
107
|
+
env["LOG_LEVEL"] = str(logger.getEffectiveLevel())
|
|
108
|
+
env["LOG_FORMAT"] = self._log_format
|
|
109
|
+
|
|
110
|
+
# Update env_vars with logging configuration
|
|
111
|
+
self._env_vars = env
|
|
112
|
+
|
|
113
|
+
# Plan deployment
|
|
114
|
+
deployments = plan_deploy(app_env)
|
|
115
|
+
assert deployments
|
|
116
|
+
app_deployment = deployments[0]
|
|
117
|
+
|
|
118
|
+
# Build images
|
|
119
|
+
image_cache = await build_images.aio(app_env)
|
|
120
|
+
assert image_cache
|
|
121
|
+
|
|
122
|
+
# Build code bundle (tgz style)
|
|
123
|
+
if self._interactive_mode:
|
|
124
|
+
code_bundle = await build_pkl_bundle(
|
|
125
|
+
app_env,
|
|
126
|
+
upload_to_controlplane=not self._dry_run,
|
|
127
|
+
copy_bundle_to=self._copy_bundle_to,
|
|
128
|
+
)
|
|
129
|
+
else:
|
|
130
|
+
code_bundle = await build_code_bundle(
|
|
131
|
+
from_dir=cfg.root_dir,
|
|
132
|
+
dryrun=self._dry_run,
|
|
133
|
+
copy_style=self._copy_style,
|
|
134
|
+
copy_bundle_to=self._copy_bundle_to,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
# Compute version
|
|
138
|
+
if self._version:
|
|
139
|
+
version = self._version
|
|
140
|
+
elif app_deployment.version:
|
|
141
|
+
version = app_deployment.version
|
|
142
|
+
else:
|
|
143
|
+
h = hashlib.md5()
|
|
144
|
+
h.update(cloudpickle.dumps(app_deployment.envs))
|
|
145
|
+
h.update(code_bundle.computed_version.encode("utf-8"))
|
|
146
|
+
h.update(cloudpickle.dumps(image_cache))
|
|
147
|
+
version = h.hexdigest()
|
|
148
|
+
|
|
149
|
+
# Create serialization context
|
|
150
|
+
sc = SerializationContext(
|
|
151
|
+
project=project,
|
|
152
|
+
domain=domain,
|
|
153
|
+
org=cfg.org,
|
|
154
|
+
code_bundle=code_bundle,
|
|
155
|
+
version=version,
|
|
156
|
+
image_cache=image_cache,
|
|
157
|
+
root_dir=cfg.root_dir,
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
# Inject parameter overrides from the serve
|
|
161
|
+
parameter_overrides = None
|
|
162
|
+
if app_env_parameter_values := self._parameter_values.get(app_env.name):
|
|
163
|
+
parameter_overrides = []
|
|
164
|
+
for parameter in app_env.parameters:
|
|
165
|
+
value = app_env_parameter_values.get(parameter.name, parameter.value)
|
|
166
|
+
parameter_overrides.append(replace(parameter, value=value))
|
|
167
|
+
|
|
168
|
+
# Deploy app
|
|
169
|
+
deployed_app = await _deploy._deploy_app(app_env, sc, parameter_overrides=parameter_overrides)
|
|
170
|
+
assert deployed_app
|
|
171
|
+
|
|
172
|
+
logger.warning(f"Deployed App, you can check the console at {deployed_app.url}")
|
|
173
|
+
# Mutate app_idl if env_vars or cluster_pool are provided
|
|
174
|
+
# This is a temporary solution until the update/create APIs support these attributes
|
|
175
|
+
if self._env_vars or self._cluster_pool:
|
|
176
|
+
from flyteidl2.core import literals_pb2
|
|
177
|
+
|
|
178
|
+
app_idl = deepcopy(deployed_app.pb2)
|
|
179
|
+
|
|
180
|
+
# TODO This should be part of the params!
|
|
181
|
+
# Update env_vars
|
|
182
|
+
if self._env_vars:
|
|
183
|
+
if app_idl.spec.container:
|
|
184
|
+
# Merge with existing env vars
|
|
185
|
+
if app_idl.spec.container.env:
|
|
186
|
+
existing_env = {kv.key: kv.value for kv in app_idl.spec.container.env}
|
|
187
|
+
else:
|
|
188
|
+
existing_env = {}
|
|
189
|
+
existing_env.update(self._env_vars)
|
|
190
|
+
app_idl.spec.container.env.extend(
|
|
191
|
+
[literals_pb2.KeyValuePair(key=k, value=v) for k, v in existing_env.items()]
|
|
192
|
+
)
|
|
193
|
+
elif app_idl.spec.pod:
|
|
194
|
+
# For pod specs, we'd need to update the containers in the pod
|
|
195
|
+
# This is more complex as it requires modifying the serialized pod_spec
|
|
196
|
+
raise NotImplementedError(
|
|
197
|
+
"Env var override for pod-based apps is not yet supported. "
|
|
198
|
+
"Please use container-based apps or set env_vars in the AppEnvironment definition."
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
# Update cluster_pool
|
|
202
|
+
if self._cluster_pool:
|
|
203
|
+
app_idl.spec.cluster_pool = self._cluster_pool
|
|
204
|
+
|
|
205
|
+
# Update the deployed app with mutated IDL
|
|
206
|
+
# Note: This is a workaround. Ideally, the API would support these fields directly
|
|
207
|
+
deployed_app = type(deployed_app)(pb2=app_idl)
|
|
208
|
+
|
|
209
|
+
# Watch for activation
|
|
210
|
+
return await deployed_app.watch.aio(wait_for="activated")
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def with_servecontext(
|
|
214
|
+
version: Optional[str] = None,
|
|
215
|
+
copy_style: CopyFiles = "loaded_modules",
|
|
216
|
+
dry_run: bool = False,
|
|
217
|
+
project: str | None = None,
|
|
218
|
+
domain: str | None = None,
|
|
219
|
+
env_vars: dict[str, str] | None = None,
|
|
220
|
+
parameter_values: dict[str, dict[str, str | flyte.io.File | flyte.io.Dir]] | None = None,
|
|
221
|
+
cluster_pool: str | None = None,
|
|
222
|
+
log_level: int | None = None,
|
|
223
|
+
log_format: LogFormat = "console",
|
|
224
|
+
interactive_mode: bool | None = None,
|
|
225
|
+
copy_bundle_to: pathlib.Path | None = None,
|
|
226
|
+
) -> _Serve:
|
|
227
|
+
"""
|
|
228
|
+
Create a serve context with custom configuration.
|
|
229
|
+
|
|
230
|
+
This function allows you to customize how an app is served, including
|
|
231
|
+
overriding environment variables, cluster pool, logging, and other deployment settings.
|
|
232
|
+
|
|
233
|
+
Example:
|
|
234
|
+
```python
|
|
235
|
+
import logging
|
|
236
|
+
import flyte
|
|
237
|
+
from flyte.app.extras import FastAPIAppEnvironment
|
|
238
|
+
|
|
239
|
+
env = FastAPIAppEnvironment(name="my-app", ...)
|
|
240
|
+
|
|
241
|
+
# Serve with custom env vars, logging, and cluster pool
|
|
242
|
+
app = flyte.with_servecontext(
|
|
243
|
+
env_vars={"DATABASE_URL": "postgresql://..."},
|
|
244
|
+
log_level=logging.DEBUG,
|
|
245
|
+
log_format="json",
|
|
246
|
+
cluster_pool="gpu-pool",
|
|
247
|
+
project="my-project",
|
|
248
|
+
domain="development",
|
|
249
|
+
).serve(env)
|
|
250
|
+
|
|
251
|
+
print(f"App URL: {app.url}")
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
Args:
|
|
255
|
+
version: Optional version override for the app deployment
|
|
256
|
+
copy_style: Code bundle copy style. Options: "loaded_modules", "all", "none" (default: "loaded_modules")
|
|
257
|
+
dry_run: If True, don't actually deploy (default: False)
|
|
258
|
+
project: Optional project override
|
|
259
|
+
domain: Optional domain override
|
|
260
|
+
env_vars: Optional environment variables to inject/override in the app container
|
|
261
|
+
parameter_values: Optional parameter values to inject/override in the app container. Must be a dictionary that
|
|
262
|
+
maps app environment names to a dictionary of parameter names to values.
|
|
263
|
+
cluster_pool: Optional cluster pool to deploy the app to
|
|
264
|
+
log_level: Optional log level (e.g., logging.DEBUG, logging.INFO). If not provided, uses init config or default
|
|
265
|
+
log_format: Optional log format ("console" or "json", default: "console")
|
|
266
|
+
interactive_mode: Optional, can be forced to True or False.
|
|
267
|
+
If not provided, it will be set based on the current environment. For example Jupyter notebooks are
|
|
268
|
+
considered interactive mode, while scripts are not. This is used to determine how the code bundle is
|
|
269
|
+
created. This is used to determine if the app should be served in interactive mode or not.
|
|
270
|
+
copy_bundle_to: When dry_run is True, the bundle will be copied to this location if specified
|
|
271
|
+
|
|
272
|
+
Returns:
|
|
273
|
+
_Serve: Serve context manager with configured settings
|
|
274
|
+
|
|
275
|
+
Raises:
|
|
276
|
+
NotImplementedError: If called from a notebook/interactive environment
|
|
277
|
+
|
|
278
|
+
Notes:
|
|
279
|
+
- Apps do not support pickle-based bundling (interactive mode)
|
|
280
|
+
- LOG_LEVEL and LOG_FORMAT are automatically set as env vars if not explicitly provided in env_vars
|
|
281
|
+
- The env_vars and cluster_pool overrides mutate the app IDL after creation
|
|
282
|
+
- This is a temporary solution until the API natively supports these fields
|
|
283
|
+
"""
|
|
284
|
+
return _Serve(
|
|
285
|
+
version=version,
|
|
286
|
+
copy_style=copy_style,
|
|
287
|
+
dry_run=dry_run,
|
|
288
|
+
project=project,
|
|
289
|
+
domain=domain,
|
|
290
|
+
env_vars=env_vars,
|
|
291
|
+
parameter_values=parameter_values,
|
|
292
|
+
cluster_pool=cluster_pool,
|
|
293
|
+
log_level=log_level,
|
|
294
|
+
log_format=log_format,
|
|
295
|
+
interactive_mode=interactive_mode,
|
|
296
|
+
copy_bundle_to=copy_bundle_to,
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
@syncify
|
|
301
|
+
async def serve(app_env: "AppEnvironment") -> "App":
|
|
302
|
+
"""
|
|
303
|
+
Serve a Flyte app using an AppEnvironment.
|
|
304
|
+
|
|
305
|
+
This is the simple, direct way to serve an app. For more control over
|
|
306
|
+
deployment settings (env vars, cluster pool, etc.), use with_servecontext().
|
|
307
|
+
|
|
308
|
+
Example:
|
|
309
|
+
```python
|
|
310
|
+
import flyte
|
|
311
|
+
from flyte.app.extras import FastAPIAppEnvironment
|
|
312
|
+
|
|
313
|
+
env = FastAPIAppEnvironment(name="my-app", ...)
|
|
314
|
+
|
|
315
|
+
# Simple serve
|
|
316
|
+
app = flyte.serve(env)
|
|
317
|
+
print(f"App URL: {app.url}")
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
Args:
|
|
321
|
+
app_env: The app environment to serve
|
|
322
|
+
|
|
323
|
+
Returns:
|
|
324
|
+
Deployed and activated App instance
|
|
325
|
+
|
|
326
|
+
Raises:
|
|
327
|
+
NotImplementedError: If called from a notebook/interactive environment
|
|
328
|
+
|
|
329
|
+
See Also:
|
|
330
|
+
with_servecontext: For customizing deployment settings
|
|
331
|
+
"""
|
|
332
|
+
# Use default serve context
|
|
333
|
+
return await _Serve().serve.aio(app_env)
|