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/cli/_serve.py
ADDED
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
from dataclasses import dataclass, field, fields
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from types import ModuleType
|
|
7
|
+
from typing import Any, Dict, List, cast
|
|
8
|
+
|
|
9
|
+
import rich_click as click
|
|
10
|
+
from typing_extensions import get_args
|
|
11
|
+
|
|
12
|
+
from flyte._code_bundle._utils import CopyFiles
|
|
13
|
+
from flyte.app import AppEnvironment
|
|
14
|
+
|
|
15
|
+
from . import _common as common
|
|
16
|
+
from ._common import CLIConfig
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass
|
|
20
|
+
class ServeArguments:
|
|
21
|
+
project: str = field(
|
|
22
|
+
default=cast(str, common.PROJECT_OPTION.default), metadata={"click.option": common.PROJECT_OPTION}
|
|
23
|
+
)
|
|
24
|
+
domain: str = field(
|
|
25
|
+
default=cast(str, common.DOMAIN_OPTION.default), metadata={"click.option": common.DOMAIN_OPTION}
|
|
26
|
+
)
|
|
27
|
+
copy_style: CopyFiles = field(
|
|
28
|
+
default="loaded_modules",
|
|
29
|
+
metadata={
|
|
30
|
+
"click.option": click.Option(
|
|
31
|
+
["--copy-style"],
|
|
32
|
+
type=click.Choice(get_args(CopyFiles)),
|
|
33
|
+
default="loaded_modules",
|
|
34
|
+
help="Copy style to use when serving the app",
|
|
35
|
+
)
|
|
36
|
+
},
|
|
37
|
+
)
|
|
38
|
+
root_dir: str | None = field(
|
|
39
|
+
default=None,
|
|
40
|
+
metadata={
|
|
41
|
+
"click.option": click.Option(
|
|
42
|
+
["--root-dir"],
|
|
43
|
+
type=str,
|
|
44
|
+
help="Override the root source directory, helpful when working with monorepos.",
|
|
45
|
+
)
|
|
46
|
+
},
|
|
47
|
+
)
|
|
48
|
+
service_account: str | None = field(
|
|
49
|
+
default=None,
|
|
50
|
+
metadata={
|
|
51
|
+
"click.option": click.Option(
|
|
52
|
+
["--service-account"],
|
|
53
|
+
type=str,
|
|
54
|
+
help="Kubernetes service account. If not provided, the configured default will be used",
|
|
55
|
+
)
|
|
56
|
+
},
|
|
57
|
+
)
|
|
58
|
+
name: str | None = field(
|
|
59
|
+
default=None,
|
|
60
|
+
metadata={
|
|
61
|
+
"click.option": click.Option(
|
|
62
|
+
["--name"],
|
|
63
|
+
type=str,
|
|
64
|
+
help="Name of the app deployment. If not provided, the app environment name will be used.",
|
|
65
|
+
)
|
|
66
|
+
},
|
|
67
|
+
)
|
|
68
|
+
follow: bool = field(
|
|
69
|
+
default=False,
|
|
70
|
+
metadata={
|
|
71
|
+
"click.option": click.Option(
|
|
72
|
+
["--follow", "-f"],
|
|
73
|
+
is_flag=True,
|
|
74
|
+
default=False,
|
|
75
|
+
help="Wait and watch logs for the app. If not provided, the CLI will exit after "
|
|
76
|
+
"successfully deploying the app with a link to the UI.",
|
|
77
|
+
)
|
|
78
|
+
},
|
|
79
|
+
)
|
|
80
|
+
image: List[str] = field(
|
|
81
|
+
default_factory=list,
|
|
82
|
+
metadata={
|
|
83
|
+
"click.option": click.Option(
|
|
84
|
+
["--image"],
|
|
85
|
+
type=str,
|
|
86
|
+
multiple=True,
|
|
87
|
+
help="Image to be used in the serve. Format: imagename=imageuri. Can be specified multiple times.",
|
|
88
|
+
)
|
|
89
|
+
},
|
|
90
|
+
)
|
|
91
|
+
no_sync_local_sys_paths: bool = field(
|
|
92
|
+
default=False,
|
|
93
|
+
metadata={
|
|
94
|
+
"click.option": click.Option(
|
|
95
|
+
["--no-sync-local-sys-paths"],
|
|
96
|
+
is_flag=True,
|
|
97
|
+
flag_value=True,
|
|
98
|
+
default=False,
|
|
99
|
+
help="Disable synchronization of local sys.path entries under the root directory "
|
|
100
|
+
"to the remote container.",
|
|
101
|
+
)
|
|
102
|
+
},
|
|
103
|
+
)
|
|
104
|
+
env_var: List[str] = field(
|
|
105
|
+
default_factory=list,
|
|
106
|
+
metadata={
|
|
107
|
+
"click.option": click.Option(
|
|
108
|
+
["--env-var", "-e"],
|
|
109
|
+
type=str,
|
|
110
|
+
multiple=True,
|
|
111
|
+
help="Environment variable to set in the app. Format: KEY=VALUE. Can be specified multiple times. "
|
|
112
|
+
"Example: --env-var LOG_LEVEL=DEBUG --env-var DATABASE_URL=postgresql://...",
|
|
113
|
+
)
|
|
114
|
+
},
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
@classmethod
|
|
118
|
+
def from_dict(cls, d: Dict[str, Any]) -> ServeArguments:
|
|
119
|
+
modified = {k: v for k, v in d.items() if k in {f.name for f in fields(cls)}}
|
|
120
|
+
return cls(**modified)
|
|
121
|
+
|
|
122
|
+
@classmethod
|
|
123
|
+
def options(cls) -> List[click.Option]:
|
|
124
|
+
"""
|
|
125
|
+
Return the set of base parameters added to serve subcommand.
|
|
126
|
+
"""
|
|
127
|
+
return [common.get_option_from_metadata(f.metadata) for f in fields(cls) if f.metadata]
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class ServeAppCommand(click.RichCommand):
|
|
131
|
+
def __init__(self, obj_name: str, obj: AppEnvironment, serve_args: ServeArguments, *args, **kwargs):
|
|
132
|
+
self.obj_name = obj_name
|
|
133
|
+
self.obj = cast(AppEnvironment, obj)
|
|
134
|
+
self.serve_args = serve_args
|
|
135
|
+
kwargs.pop("name", None)
|
|
136
|
+
super().__init__(obj_name, *args, **kwargs)
|
|
137
|
+
|
|
138
|
+
def invoke(self, ctx: click.Context):
|
|
139
|
+
obj: CLIConfig = common.initialize_config(
|
|
140
|
+
ctx,
|
|
141
|
+
self.serve_args.project,
|
|
142
|
+
self.serve_args.domain,
|
|
143
|
+
self.serve_args.root_dir,
|
|
144
|
+
tuple(self.serve_args.image) or None,
|
|
145
|
+
not self.serve_args.no_sync_local_sys_paths,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
async def _serve():
|
|
149
|
+
import flyte
|
|
150
|
+
|
|
151
|
+
console = common.get_console()
|
|
152
|
+
|
|
153
|
+
# Parse env vars from CLI (format: KEY=VALUE)
|
|
154
|
+
env_vars = {}
|
|
155
|
+
for env_var in self.serve_args.env_var:
|
|
156
|
+
if "=" in env_var:
|
|
157
|
+
key, value = env_var.split("=", 1)
|
|
158
|
+
env_vars[key] = value
|
|
159
|
+
else:
|
|
160
|
+
console.print(
|
|
161
|
+
f"[yellow]Warning: Ignoring invalid env var format: {env_var} (expected KEY=VALUE)[/yellow]"
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
# Use with_servecontext to configure the serve operation
|
|
165
|
+
app = await flyte.with_servecontext(
|
|
166
|
+
copy_style=self.serve_args.copy_style,
|
|
167
|
+
project=self.serve_args.project if self.serve_args.project else None,
|
|
168
|
+
domain=self.serve_args.domain if self.serve_args.domain else None,
|
|
169
|
+
env_vars=env_vars if env_vars else None,
|
|
170
|
+
).serve.aio(self.obj)
|
|
171
|
+
|
|
172
|
+
console.print(
|
|
173
|
+
common.get_panel(
|
|
174
|
+
"Serve",
|
|
175
|
+
f"[green bold]App '{app.name}' is now being served[/green bold]\n"
|
|
176
|
+
f"➡️ [blue bold][link={app.url}]{app.url}[/link][/blue bold]",
|
|
177
|
+
obj.output_format,
|
|
178
|
+
)
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
if self.serve_args.follow:
|
|
182
|
+
# TODO: Implement log streaming for apps
|
|
183
|
+
# This should retrieve and display logs from the running app
|
|
184
|
+
# Similar to how r.show_logs.aio() works for tasks in _run.py
|
|
185
|
+
console.print(
|
|
186
|
+
"[yellow]Note: Log streaming for apps is not yet implemented. "
|
|
187
|
+
"Please check the app logs via the UI.[/yellow]"
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
asyncio.run(_serve())
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
class AppPerFileGroup(common.ObjectsPerFileGroup):
|
|
194
|
+
"""
|
|
195
|
+
Group that creates a command for each AppEnvironment in the current directory that is not __init__.py.
|
|
196
|
+
"""
|
|
197
|
+
|
|
198
|
+
def __init__(self, filename: Path, serve_args: ServeArguments, *args, **kwargs):
|
|
199
|
+
if filename.is_absolute():
|
|
200
|
+
filename = filename.relative_to(Path.cwd())
|
|
201
|
+
super().__init__(*(filename, *args), **kwargs)
|
|
202
|
+
self.serve_args = serve_args
|
|
203
|
+
|
|
204
|
+
def _filter_objects(self, module: ModuleType) -> Dict[str, Any]:
|
|
205
|
+
return {k: v for k, v in module.__dict__.items() if isinstance(v, AppEnvironment)}
|
|
206
|
+
|
|
207
|
+
def list_commands(self, ctx):
|
|
208
|
+
common.initialize_config(
|
|
209
|
+
ctx,
|
|
210
|
+
self.serve_args.project,
|
|
211
|
+
self.serve_args.domain,
|
|
212
|
+
self.serve_args.root_dir,
|
|
213
|
+
sync_local_sys_paths=not self.serve_args.no_sync_local_sys_paths,
|
|
214
|
+
)
|
|
215
|
+
return super().list_commands(ctx)
|
|
216
|
+
|
|
217
|
+
def get_command(self, ctx, obj_name):
|
|
218
|
+
common.initialize_config(
|
|
219
|
+
ctx,
|
|
220
|
+
self.serve_args.project,
|
|
221
|
+
self.serve_args.domain,
|
|
222
|
+
self.serve_args.root_dir,
|
|
223
|
+
sync_local_sys_paths=not self.serve_args.no_sync_local_sys_paths,
|
|
224
|
+
)
|
|
225
|
+
return super().get_command(ctx, obj_name)
|
|
226
|
+
|
|
227
|
+
def _get_command_for_obj(self, ctx: click.Context, obj_name: str, obj: Any) -> click.Command:
|
|
228
|
+
obj = cast(AppEnvironment, obj)
|
|
229
|
+
return ServeAppCommand(
|
|
230
|
+
obj_name=obj_name,
|
|
231
|
+
obj=obj,
|
|
232
|
+
help=f"Serve the '{obj_name}' app environment",
|
|
233
|
+
serve_args=self.serve_args,
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
class AppFiles(common.FileGroup):
|
|
238
|
+
"""
|
|
239
|
+
Group that creates a command for each file in the current directory that is not __init__.py.
|
|
240
|
+
"""
|
|
241
|
+
|
|
242
|
+
common_options_enabled = False
|
|
243
|
+
|
|
244
|
+
def __init__(
|
|
245
|
+
self,
|
|
246
|
+
*args,
|
|
247
|
+
directory: Path | None = None,
|
|
248
|
+
**kwargs,
|
|
249
|
+
):
|
|
250
|
+
if "params" not in kwargs:
|
|
251
|
+
kwargs["params"] = []
|
|
252
|
+
kwargs["params"].extend(ServeArguments.options())
|
|
253
|
+
super().__init__(*args, directory=directory, **kwargs)
|
|
254
|
+
|
|
255
|
+
def get_command(self, ctx, cmd_name):
|
|
256
|
+
serve_args = ServeArguments.from_dict(ctx.params)
|
|
257
|
+
|
|
258
|
+
fp = Path(cmd_name)
|
|
259
|
+
if not fp.exists():
|
|
260
|
+
raise click.BadParameter(f"File {cmd_name} does not exist")
|
|
261
|
+
if fp.is_dir():
|
|
262
|
+
return AppFiles(
|
|
263
|
+
directory=fp,
|
|
264
|
+
help=f"Serve `*.py` file inside the {fp} directory",
|
|
265
|
+
)
|
|
266
|
+
return AppPerFileGroup(
|
|
267
|
+
filename=fp,
|
|
268
|
+
serve_args=serve_args,
|
|
269
|
+
name=cmd_name,
|
|
270
|
+
help=f"Serve AppEnvironment instances in {cmd_name}",
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
serve = AppFiles(
|
|
275
|
+
name="serve",
|
|
276
|
+
help="""
|
|
277
|
+
Serve an app from a Python file using flyte.serve().
|
|
278
|
+
|
|
279
|
+
This command allows you to serve apps defined with `flyte.app.AppEnvironment`
|
|
280
|
+
in your Python files. The serve command will deploy the app to the Flyte backend
|
|
281
|
+
and start it, making it accessible via a URL.
|
|
282
|
+
|
|
283
|
+
Example usage:
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
flyte serve examples/apps/basic_app.py app_env
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Arguments to the serve command are provided right after the `serve` command and before the file name.
|
|
290
|
+
|
|
291
|
+
To follow the logs of the served app, use the `--follow` flag:
|
|
292
|
+
|
|
293
|
+
```bash
|
|
294
|
+
flyte serve --follow examples/apps/basic_app.py app_env
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
Note: Log streaming is not yet fully implemented and will be added in a future release.
|
|
298
|
+
|
|
299
|
+
You can provide image mappings with `--image` flag. This allows you to specify
|
|
300
|
+
the image URI for the app environment during CLI execution without changing
|
|
301
|
+
the code. Any images defined with `Image.from_ref_name("name")` will resolve to the
|
|
302
|
+
corresponding URIs you specify here.
|
|
303
|
+
|
|
304
|
+
```bash
|
|
305
|
+
flyte serve --image my_image=ghcr.io/myorg/my-image:v1.0 examples/apps/basic_app.py app_env
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
If the image name is not provided, it is regarded as a default image and will
|
|
309
|
+
be used when no image is specified in AppEnvironment:
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
flyte serve --image ghcr.io/myorg/default-image:latest examples/apps/basic_app.py app_env
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
You can specify multiple image arguments:
|
|
316
|
+
|
|
317
|
+
```bash
|
|
318
|
+
flyte serve --image ghcr.io/org/default:latest --image gpu=ghcr.io/org/gpu:v2.0 examples/apps/basic_app.py app_env
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
You can specify the `--config` flag to point to a specific Flyte cluster:
|
|
322
|
+
|
|
323
|
+
```bash
|
|
324
|
+
flyte serve --config my-config.yaml examples/apps/basic_app.py app_env
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
You can override the default configured project and domain:
|
|
328
|
+
|
|
329
|
+
```bash
|
|
330
|
+
flyte serve --project my-project --domain development examples/apps/basic_app.py app_env
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
Other arguments to the serve command are listed below.
|
|
334
|
+
|
|
335
|
+
Note: This pattern is primarily useful for serving apps defined in tasks.
|
|
336
|
+
Serving deployed apps is not currently supported through this CLI command.
|
|
337
|
+
""",
|
|
338
|
+
)
|
flyte/cli/_update.py
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import rich_click as click
|
|
2
|
+
|
|
3
|
+
import flyte.remote as remote
|
|
4
|
+
|
|
5
|
+
from . import _common as common
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@click.group(name="update")
|
|
9
|
+
def update():
|
|
10
|
+
"""
|
|
11
|
+
Update various flyte entities.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@update.command("trigger", cls=common.CommandBase)
|
|
16
|
+
@click.argument("name", type=str)
|
|
17
|
+
@click.argument("task_name", type=str)
|
|
18
|
+
@click.option("--activate/--deactivate", required=True, help="Activate or deactivate the trigger.")
|
|
19
|
+
@click.pass_obj
|
|
20
|
+
def trigger(cfg: common.CLIConfig, name: str, task_name: str, activate: bool, project: str | None, domain: str | None):
|
|
21
|
+
"""
|
|
22
|
+
Update a trigger.
|
|
23
|
+
|
|
24
|
+
\b
|
|
25
|
+
Example usage:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
flyte update trigger <trigger_name> <task_name> --activate | --deactivate
|
|
29
|
+
[--project <project_name> --domain <domain_name>]
|
|
30
|
+
```
|
|
31
|
+
"""
|
|
32
|
+
cfg.init(project, domain)
|
|
33
|
+
console = common.get_console()
|
|
34
|
+
to_state = "active" if activate else "deactivate"
|
|
35
|
+
with console.status(f"Updating trigger {name} for task {task_name} to {to_state}..."):
|
|
36
|
+
remote.Trigger.update(name, task_name, activate)
|
|
37
|
+
console.print(f"Trigger updated and is set to [fuchsia]{to_state}[/fuchsia]")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@update.command("app", cls=common.CommandBase)
|
|
41
|
+
@click.argument("name", type=str)
|
|
42
|
+
@click.option("--activate/--deactivate", "is_activate", default=None, help="Activate or deactivate app.")
|
|
43
|
+
@click.option("--wait", is_flag=True, default=False, help="Wait for the app to reach the desired state.")
|
|
44
|
+
@click.pass_obj
|
|
45
|
+
def app(
|
|
46
|
+
cfg: common.CLIConfig, name: str, is_activate: bool | None, wait: bool, project: str | None, domain: str | None
|
|
47
|
+
):
|
|
48
|
+
"""
|
|
49
|
+
Update an app by starting or stopping it.
|
|
50
|
+
|
|
51
|
+
\b
|
|
52
|
+
Example usage:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
flyte update app <app_name> --activate | --deactivate [--wait] [--project <project_name>] [--domain <domain_name>]
|
|
56
|
+
```
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
if is_activate is None:
|
|
60
|
+
raise click.UsageError("Missing option '--activate' / '--deactivate'.")
|
|
61
|
+
|
|
62
|
+
cfg.init(project, domain)
|
|
63
|
+
console = common.get_console()
|
|
64
|
+
|
|
65
|
+
app_obj = remote.App.get(name=name)
|
|
66
|
+
if is_activate:
|
|
67
|
+
if app_obj.is_active():
|
|
68
|
+
console.print(f"App [yellow]{name}[/yellow] is already active.")
|
|
69
|
+
return
|
|
70
|
+
state = "activate"
|
|
71
|
+
color = "green"
|
|
72
|
+
with console.status(f"Activating app {name}..."):
|
|
73
|
+
app_obj.activate(wait=wait)
|
|
74
|
+
else:
|
|
75
|
+
state = "deactivate"
|
|
76
|
+
color = "red"
|
|
77
|
+
if app_obj.is_deactivated():
|
|
78
|
+
console.print(f"App [red]{name}[/red] is already deactivated.")
|
|
79
|
+
return
|
|
80
|
+
with console.status(f"Deactivating app {name}..."):
|
|
81
|
+
app_obj.deactivate(wait=wait)
|
|
82
|
+
|
|
83
|
+
if wait:
|
|
84
|
+
console.print(f"App [{color}]{name}[/{color}] {state}d successfully")
|
|
85
|
+
else:
|
|
86
|
+
console.print(f"App [{color}]{name}[/{color}] {state} initiated")
|
flyte/cli/_user.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
import rich_click as click
|
|
4
|
+
|
|
5
|
+
import flyte.remote as remote
|
|
6
|
+
|
|
7
|
+
from . import _common as common
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@click.command()
|
|
11
|
+
@click.pass_obj
|
|
12
|
+
def whoami(
|
|
13
|
+
cfg: common.CLIConfig,
|
|
14
|
+
):
|
|
15
|
+
"""Display the current user information."""
|
|
16
|
+
cfg.init()
|
|
17
|
+
console = common.get_console()
|
|
18
|
+
user_info = remote.User.get()
|
|
19
|
+
console.print(user_info.to_json())
|
|
20
|
+
os._exit(0)
|
flyte/cli/main.py
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import rich_click as click
|
|
2
|
+
from typing_extensions import get_args
|
|
3
|
+
|
|
4
|
+
import flyte
|
|
5
|
+
from flyte._logging import LogFormat, initialize_logger, logger
|
|
6
|
+
|
|
7
|
+
from . import _common as common
|
|
8
|
+
from ._abort import abort
|
|
9
|
+
from ._build import build
|
|
10
|
+
from ._common import CLIConfig
|
|
11
|
+
from ._create import create
|
|
12
|
+
from ._delete import delete
|
|
13
|
+
from ._deploy import deploy
|
|
14
|
+
from ._gen import gen
|
|
15
|
+
from ._get import get
|
|
16
|
+
from ._plugins import discover_and_register_plugins
|
|
17
|
+
from ._prefetch import prefetch
|
|
18
|
+
from ._run import run
|
|
19
|
+
from ._serve import serve
|
|
20
|
+
from ._update import update
|
|
21
|
+
from ._user import whoami
|
|
22
|
+
|
|
23
|
+
help_config = click.RichHelpConfiguration(
|
|
24
|
+
use_markdown=True,
|
|
25
|
+
use_markdown_emoji=True,
|
|
26
|
+
command_groups={
|
|
27
|
+
"flyte": [
|
|
28
|
+
{
|
|
29
|
+
"name": "Run and stop tasks",
|
|
30
|
+
"commands": ["run", "abort"],
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"name": "Serve Apps",
|
|
34
|
+
"commands": ["serve"],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"name": "Management of various objects.",
|
|
38
|
+
"commands": ["create", "get", "delete", "update"],
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"name": "Build and deploy environments, tasks and images.",
|
|
42
|
+
"commands": ["build", "deploy"],
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "Prefetch artifacts from remote registries.",
|
|
46
|
+
"commands": ["prefetch"],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "Documentation generation",
|
|
50
|
+
"commands": ["gen"],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "User information",
|
|
54
|
+
"commands": ["whoami"],
|
|
55
|
+
},
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _verbosity_to_loglevel(verbosity: int) -> int | None:
|
|
62
|
+
"""
|
|
63
|
+
Converts a verbosity level from the CLI to a logging level.
|
|
64
|
+
|
|
65
|
+
:param verbosity: verbosity level from the CLI
|
|
66
|
+
:return: logging level
|
|
67
|
+
"""
|
|
68
|
+
import logging
|
|
69
|
+
|
|
70
|
+
match verbosity:
|
|
71
|
+
case 0:
|
|
72
|
+
return None
|
|
73
|
+
case 1:
|
|
74
|
+
return logging.WARNING
|
|
75
|
+
case 2:
|
|
76
|
+
return logging.INFO
|
|
77
|
+
case _:
|
|
78
|
+
return logging.DEBUG
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@click.group(cls=click.RichGroup)
|
|
82
|
+
@click.version_option(
|
|
83
|
+
message=f"Flyte SDK version: {flyte.version()}",
|
|
84
|
+
)
|
|
85
|
+
@click.option(
|
|
86
|
+
"--endpoint",
|
|
87
|
+
type=str,
|
|
88
|
+
required=False,
|
|
89
|
+
help="The endpoint to connect to. This will override any configuration file and simply use `pkce` to connect.",
|
|
90
|
+
)
|
|
91
|
+
@click.option(
|
|
92
|
+
"--insecure",
|
|
93
|
+
is_flag=True,
|
|
94
|
+
required=False,
|
|
95
|
+
help="Use an insecure connection to the endpoint. If not specified, the CLI will use TLS.",
|
|
96
|
+
type=bool,
|
|
97
|
+
default=None,
|
|
98
|
+
show_default=True,
|
|
99
|
+
)
|
|
100
|
+
@click.option(
|
|
101
|
+
"--auth-type",
|
|
102
|
+
type=click.Choice(common.ALL_AUTH_OPTIONS, case_sensitive=False),
|
|
103
|
+
default=None,
|
|
104
|
+
help="Authentication type to use for the Flyte backend. Defaults to 'pkce'.",
|
|
105
|
+
show_default=True,
|
|
106
|
+
required=False,
|
|
107
|
+
)
|
|
108
|
+
@click.option(
|
|
109
|
+
"-v",
|
|
110
|
+
"--verbose",
|
|
111
|
+
required=False,
|
|
112
|
+
help="Show verbose messages and exception traces. Repeating multiple times increases the verbosity (e.g., -vvv).",
|
|
113
|
+
count=True,
|
|
114
|
+
default=0,
|
|
115
|
+
type=int,
|
|
116
|
+
)
|
|
117
|
+
@click.option(
|
|
118
|
+
"--org",
|
|
119
|
+
type=str,
|
|
120
|
+
required=False,
|
|
121
|
+
help="The organization to which the command applies.",
|
|
122
|
+
)
|
|
123
|
+
@click.option(
|
|
124
|
+
"-c",
|
|
125
|
+
"--config",
|
|
126
|
+
"config_file",
|
|
127
|
+
required=False,
|
|
128
|
+
type=click.Path(exists=True),
|
|
129
|
+
help="Path to the configuration file to use. If not specified, the default configuration file is used.",
|
|
130
|
+
)
|
|
131
|
+
@click.option(
|
|
132
|
+
"--output-format",
|
|
133
|
+
"-of",
|
|
134
|
+
type=click.Choice(get_args(common.OutputFormat), case_sensitive=False),
|
|
135
|
+
default="table",
|
|
136
|
+
help="Output format for commands that support it. Defaults to 'table'.",
|
|
137
|
+
show_default=True,
|
|
138
|
+
required=False,
|
|
139
|
+
)
|
|
140
|
+
@click.option(
|
|
141
|
+
"--log-format",
|
|
142
|
+
type=click.Choice(get_args(LogFormat), case_sensitive=False),
|
|
143
|
+
envvar="LOG_FORMAT",
|
|
144
|
+
default="console",
|
|
145
|
+
help="Formatting for logs, defaults to 'console' which is meant to be human readable."
|
|
146
|
+
" 'json' is meant for machine parsing.",
|
|
147
|
+
show_default=True,
|
|
148
|
+
required=False,
|
|
149
|
+
)
|
|
150
|
+
@click.option(
|
|
151
|
+
"--reset-root-logger",
|
|
152
|
+
is_flag=True,
|
|
153
|
+
required=False,
|
|
154
|
+
help="If set, the root logger will be reset to use Flyte logging style",
|
|
155
|
+
type=bool,
|
|
156
|
+
default=False,
|
|
157
|
+
show_default=True,
|
|
158
|
+
)
|
|
159
|
+
@click.rich_config(help_config=help_config)
|
|
160
|
+
@click.pass_context
|
|
161
|
+
def main(
|
|
162
|
+
ctx: click.Context,
|
|
163
|
+
endpoint: str | None,
|
|
164
|
+
insecure: bool,
|
|
165
|
+
verbose: int,
|
|
166
|
+
log_format: LogFormat,
|
|
167
|
+
reset_root_logger: bool,
|
|
168
|
+
org: str | None,
|
|
169
|
+
config_file: str | None,
|
|
170
|
+
auth_type: str | None = None,
|
|
171
|
+
output_format: common.OutputFormat = "table",
|
|
172
|
+
):
|
|
173
|
+
"""
|
|
174
|
+
The Flyte CLI is the command line interface for working with the Flyte SDK and backend.
|
|
175
|
+
|
|
176
|
+
It follows a simple verb/noun structure,
|
|
177
|
+
where the top-level commands are verbs that describe the action to be taken,
|
|
178
|
+
and the subcommands are nouns that describe the object of the action.
|
|
179
|
+
|
|
180
|
+
The root command can be used to configure the CLI for persistent settings,
|
|
181
|
+
such as the endpoint, organization, and verbosity level.
|
|
182
|
+
|
|
183
|
+
Set endpoint and organization:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
$ flyte --endpoint <endpoint> --org <org> get project <project_name>
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Increase verbosity level (This is useful for debugging,
|
|
190
|
+
this will show more logs and exception traces):
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
$ flyte -vvv get logs <run-name>
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Override the default config file:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
$ flyte --config /path/to/config.yaml run ...
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
* [Documentation](https://www.union.ai/docs/flyte/user-guide/)
|
|
203
|
+
* [GitHub](https://github.com/flyteorg/flyte): Please leave a star if you like Flyte!
|
|
204
|
+
* [Slack](https://slack.flyte.org): Join the community and ask questions.
|
|
205
|
+
* [Issues](https://github.com/flyteorg/flyte/issues)
|
|
206
|
+
|
|
207
|
+
"""
|
|
208
|
+
import flyte.config as config
|
|
209
|
+
|
|
210
|
+
log_level = _verbosity_to_loglevel(verbose)
|
|
211
|
+
if log_level is not None or log_format != "console" or reset_root_logger:
|
|
212
|
+
initialize_logger(log_level=log_level, log_format=log_format, reset_root_logger=reset_root_logger)
|
|
213
|
+
|
|
214
|
+
cfg = config.auto(config_file=config_file)
|
|
215
|
+
if cfg.source:
|
|
216
|
+
logger.debug(f"Using config file discovered at location `{cfg.source.absolute()}`")
|
|
217
|
+
|
|
218
|
+
ctx.obj = CLIConfig(
|
|
219
|
+
log_level=log_level,
|
|
220
|
+
log_format=log_format,
|
|
221
|
+
reset_root_logger=reset_root_logger,
|
|
222
|
+
endpoint=endpoint,
|
|
223
|
+
insecure=insecure,
|
|
224
|
+
org=org,
|
|
225
|
+
config=cfg,
|
|
226
|
+
ctx=ctx,
|
|
227
|
+
auth_type=auth_type,
|
|
228
|
+
output_format=output_format,
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
main.add_command(run)
|
|
233
|
+
main.add_command(deploy)
|
|
234
|
+
main.add_command(get) # type: ignore
|
|
235
|
+
main.add_command(create) # type: ignore
|
|
236
|
+
main.add_command(abort) # type: ignore
|
|
237
|
+
main.add_command(gen) # type: ignore
|
|
238
|
+
main.add_command(delete) # type: ignore
|
|
239
|
+
main.add_command(build)
|
|
240
|
+
main.add_command(whoami) # type: ignore
|
|
241
|
+
main.add_command(update) # type: ignore
|
|
242
|
+
main.add_command(serve) # type: ignore
|
|
243
|
+
main.add_command(prefetch) # type: ignore
|
|
244
|
+
|
|
245
|
+
# Discover and register CLI plugins from installed packages
|
|
246
|
+
discover_and_register_plugins(main)
|
flyte/config/__init__.py
ADDED