flyte 0.2.0b1__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 -231
- flyte/_initialize.py +456 -316
- 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 +319 -36
- 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 +462 -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
- flyte/{_cli → cli}/_params.py +57 -17
- 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 +2 -167
- flyte/config/_config.py +215 -163
- flyte/config/_internal.py +10 -1
- 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 +226 -126
- 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 -299
- 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 -174
- flyte/_cli/main.py +0 -98
- 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.2.0b1.dist-info/METADATA +0 -179
- flyte-0.2.0b1.dist-info/RECORD +0 -204
- flyte-0.2.0b1.dist-info/entry_points.txt +0 -3
- /flyte/{_cli → _debug}/__init__.py +0 -0
- /flyte/{_protos → _keyring}/__init__.py +0 -0
- {flyte-0.2.0b1.dist-info → flyte-2.0.0b46.dist-info}/WHEEL +0 -0
- {flyte-0.2.0b1.dist-info → flyte-2.0.0b46.dist-info}/top_level.txt +0 -0
flyte/_cli/_get.py
DELETED
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
import asyncio
|
|
2
|
-
from typing import Tuple, Union
|
|
3
|
-
|
|
4
|
-
import rich_click as click
|
|
5
|
-
from rich.console import Console
|
|
6
|
-
from rich.pretty import pretty_repr
|
|
7
|
-
|
|
8
|
-
from . import _common as common
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
@click.group(name="get")
|
|
12
|
-
def get():
|
|
13
|
-
"""
|
|
14
|
-
Get the value of a task or environment.
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@get.command()
|
|
19
|
-
@click.argument("name", type=str, required=False)
|
|
20
|
-
@click.pass_obj
|
|
21
|
-
def project(cfg: common.CLIConfig, name: str | None = None):
|
|
22
|
-
"""
|
|
23
|
-
Get the current project.
|
|
24
|
-
"""
|
|
25
|
-
from flyte.remote import Project
|
|
26
|
-
|
|
27
|
-
print(cfg)
|
|
28
|
-
cfg.init()
|
|
29
|
-
|
|
30
|
-
console = Console()
|
|
31
|
-
if name:
|
|
32
|
-
console.print(pretty_repr(Project.get(name)))
|
|
33
|
-
else:
|
|
34
|
-
console.print(common.get_table("Projects", Project.listall()))
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
@get.command(cls=common.CommandBase)
|
|
38
|
-
@click.argument("name", type=str, required=False)
|
|
39
|
-
@click.pass_obj
|
|
40
|
-
def run(cfg: common.CLIConfig, name: str | None = None, project: str | None = None, domain: str | None = None):
|
|
41
|
-
"""
|
|
42
|
-
Get the current run.
|
|
43
|
-
"""
|
|
44
|
-
from flyte.remote import Run, RunDetails
|
|
45
|
-
|
|
46
|
-
cfg.init(project=project, domain=domain)
|
|
47
|
-
|
|
48
|
-
console = Console()
|
|
49
|
-
if name:
|
|
50
|
-
details = RunDetails.get(name=name)
|
|
51
|
-
console.print(pretty_repr(details))
|
|
52
|
-
else:
|
|
53
|
-
console.print(common.get_table("Runs", Run.listall()))
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
@get.command(cls=common.CommandBase)
|
|
57
|
-
@click.argument("name", type=str, required=False)
|
|
58
|
-
@click.argument("version", type=str, required=False)
|
|
59
|
-
@click.pass_obj
|
|
60
|
-
def task(
|
|
61
|
-
cfg: common.CLIConfig,
|
|
62
|
-
name: str | None = None,
|
|
63
|
-
version: str | None = None,
|
|
64
|
-
project: str | None = None,
|
|
65
|
-
domain: str | None = None,
|
|
66
|
-
):
|
|
67
|
-
"""
|
|
68
|
-
Get the current task.
|
|
69
|
-
"""
|
|
70
|
-
from flyte.remote import Task
|
|
71
|
-
|
|
72
|
-
cfg.init(project=project, domain=domain)
|
|
73
|
-
|
|
74
|
-
console = Console()
|
|
75
|
-
if name:
|
|
76
|
-
if not version:
|
|
77
|
-
raise click.BadParameter("Version is required when getting a task by name.")
|
|
78
|
-
v = Task.get(name=name, version=version)
|
|
79
|
-
if v is None:
|
|
80
|
-
raise click.BadParameter(f"Task {name} not found.")
|
|
81
|
-
t = v.fetch(v)
|
|
82
|
-
console.print(pretty_repr(t))
|
|
83
|
-
else:
|
|
84
|
-
raise click.BadParameter("Task listing is not supported yet, please provide a name.")
|
|
85
|
-
# console.print(common.get_table("Tasks", Task.listall()))
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
@get.command(cls=common.CommandBase)
|
|
89
|
-
@click.argument("run_name", type=str, required=True)
|
|
90
|
-
@click.argument("action_name", type=str, required=False)
|
|
91
|
-
@click.pass_obj
|
|
92
|
-
def action(
|
|
93
|
-
cfg: common.CLIConfig,
|
|
94
|
-
run_name: str,
|
|
95
|
-
action_name: str | None = None,
|
|
96
|
-
project: str | None = None,
|
|
97
|
-
domain: str | None = None,
|
|
98
|
-
):
|
|
99
|
-
"""
|
|
100
|
-
Get all actions for a run or details for a specific action.
|
|
101
|
-
"""
|
|
102
|
-
import flyte.remote as remote
|
|
103
|
-
|
|
104
|
-
cfg.init(project=project, domain=domain)
|
|
105
|
-
|
|
106
|
-
console = Console()
|
|
107
|
-
if action_name:
|
|
108
|
-
console.print(pretty_repr(remote.Action.get(run_name=run_name, name=action_name)))
|
|
109
|
-
else:
|
|
110
|
-
# List all actions for the run
|
|
111
|
-
console.print(common.get_table(f"Actions for {run_name}", remote.Action.listall(for_run_name=run_name)))
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
@get.command(cls=common.CommandBase)
|
|
115
|
-
@click.argument("run_name", type=str, required=False)
|
|
116
|
-
@click.argument("action_name", type=str, required=False)
|
|
117
|
-
@click.option("--lines", "-l", type=int, default=30, help="Number of lines to show")
|
|
118
|
-
@click.option("--show-ts", is_flag=True, help="Show timestamps")
|
|
119
|
-
@click.option(
|
|
120
|
-
"--follow",
|
|
121
|
-
"-f",
|
|
122
|
-
is_flag=True,
|
|
123
|
-
default=False,
|
|
124
|
-
help="Follow the logs (like tail -f), will open a panel with logs scrolling.",
|
|
125
|
-
)
|
|
126
|
-
@click.pass_obj
|
|
127
|
-
def logs(
|
|
128
|
-
cfg: common.CLIConfig,
|
|
129
|
-
run_name: str,
|
|
130
|
-
action_name: str | None = None,
|
|
131
|
-
project: str | None = None,
|
|
132
|
-
domain: str | None = None,
|
|
133
|
-
lines: int = 30,
|
|
134
|
-
show_ts: bool = False,
|
|
135
|
-
follow: bool = True,
|
|
136
|
-
):
|
|
137
|
-
"""
|
|
138
|
-
Get the current run.
|
|
139
|
-
"""
|
|
140
|
-
import flyte.remote as remote
|
|
141
|
-
|
|
142
|
-
cfg.init(project=project, domain=domain)
|
|
143
|
-
|
|
144
|
-
async def _run_log_view(_obj):
|
|
145
|
-
task = asyncio.create_task(_obj.show_logs(max_lines=lines, show_ts=show_ts, raw=not follow))
|
|
146
|
-
try:
|
|
147
|
-
await task
|
|
148
|
-
except KeyboardInterrupt:
|
|
149
|
-
task.cancel()
|
|
150
|
-
|
|
151
|
-
if action_name:
|
|
152
|
-
obj = remote.Action.get(run_name=run_name, name=action_name)
|
|
153
|
-
else:
|
|
154
|
-
obj = remote.Run.get(run_name)
|
|
155
|
-
asyncio.run(_run_log_view(obj))
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
@get.command(cls=common.CommandBase)
|
|
159
|
-
@click.argument("name", type=str, required=False)
|
|
160
|
-
@click.pass_obj
|
|
161
|
-
def secret(
|
|
162
|
-
cfg: common.CLIConfig,
|
|
163
|
-
name: str | None = None,
|
|
164
|
-
project: str | None = None,
|
|
165
|
-
domain: str | None = None,
|
|
166
|
-
):
|
|
167
|
-
"""
|
|
168
|
-
Get the current secret.
|
|
169
|
-
"""
|
|
170
|
-
import flyte.remote as remote
|
|
171
|
-
|
|
172
|
-
cfg.init(project=project, domain=domain)
|
|
173
|
-
|
|
174
|
-
console = Console()
|
|
175
|
-
if name:
|
|
176
|
-
console.print(pretty_repr(remote.Secret.get(name)))
|
|
177
|
-
else:
|
|
178
|
-
console.print(common.get_table("Secrets", remote.Secret.listall()))
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
@get.command(cls=common.CommandBase)
|
|
182
|
-
@click.argument("run_name", type=str, required=True)
|
|
183
|
-
@click.argument("action_name", type=str, required=False)
|
|
184
|
-
@click.option("--inputs-only", "-i", is_flag=True, help="Show only inputs")
|
|
185
|
-
@click.option("--outputs-only", "-o", is_flag=True, help="Show only outputs")
|
|
186
|
-
@click.pass_obj
|
|
187
|
-
def io(
|
|
188
|
-
cfg: common.CLIConfig,
|
|
189
|
-
run_name: str,
|
|
190
|
-
action_name: str | None = None,
|
|
191
|
-
project: str | None = None,
|
|
192
|
-
domain: str | None = None,
|
|
193
|
-
inputs_only: bool = False,
|
|
194
|
-
outputs_only: bool = False,
|
|
195
|
-
):
|
|
196
|
-
"""
|
|
197
|
-
Get the inputs and outputs of a run or action.
|
|
198
|
-
"""
|
|
199
|
-
if inputs_only and outputs_only:
|
|
200
|
-
raise click.BadParameter("Cannot use both --inputs-only and --outputs-only")
|
|
201
|
-
|
|
202
|
-
import flyte.remote as remote
|
|
203
|
-
|
|
204
|
-
cfg.init(project=project, domain=domain)
|
|
205
|
-
console = Console()
|
|
206
|
-
if action_name:
|
|
207
|
-
obj = remote.ActionDetails.get(run_name=run_name, name=action_name)
|
|
208
|
-
else:
|
|
209
|
-
obj = remote.RunDetails.get(run_name)
|
|
210
|
-
|
|
211
|
-
async def _get_io(
|
|
212
|
-
details: Union[remote.RunDetails, remote.ActionDetails],
|
|
213
|
-
) -> Tuple[remote.ActionInputs | None, remote.ActionOutputs | None | str]:
|
|
214
|
-
if inputs_only or outputs_only:
|
|
215
|
-
if inputs_only:
|
|
216
|
-
return await details.inputs(), None
|
|
217
|
-
elif outputs_only:
|
|
218
|
-
return None, await details.outputs()
|
|
219
|
-
inputs = await details.inputs()
|
|
220
|
-
outputs: remote.ActionOutputs | None | str = None
|
|
221
|
-
try:
|
|
222
|
-
outputs = await details.outputs()
|
|
223
|
-
except Exception:
|
|
224
|
-
# If the outputs are not available, we can still show the inputs
|
|
225
|
-
outputs = "[red]not yet available[/red]"
|
|
226
|
-
return inputs, outputs
|
|
227
|
-
|
|
228
|
-
inputs, outputs = asyncio.run(_get_io(obj))
|
|
229
|
-
# Show inputs and outputs side by side
|
|
230
|
-
console.print(
|
|
231
|
-
common.get_panel(
|
|
232
|
-
"Inputs & Outputs",
|
|
233
|
-
f"[green bold]Inputs[/green bold]\n{inputs}\n\n[blue bold]Outputs[/blue bold]\n{outputs}",
|
|
234
|
-
)
|
|
235
|
-
)
|
flyte/_cli/_run.py
DELETED
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import inspect
|
|
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 click
|
|
10
|
-
from click import Context, Parameter
|
|
11
|
-
from rich.console import Console
|
|
12
|
-
from typing_extensions import get_args
|
|
13
|
-
|
|
14
|
-
import flyte
|
|
15
|
-
|
|
16
|
-
from .._code_bundle._utils import CopyFiles
|
|
17
|
-
from .._task import TaskTemplate
|
|
18
|
-
from ..remote import Run
|
|
19
|
-
from . import _common as common
|
|
20
|
-
from ._common import CLIConfig
|
|
21
|
-
from ._params import to_click_option
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
@dataclass
|
|
25
|
-
class RunArguments:
|
|
26
|
-
project: str = field(
|
|
27
|
-
default=cast(str, common.PROJECT_OPTION.default), metadata={"click.option": common.PROJECT_OPTION}
|
|
28
|
-
)
|
|
29
|
-
domain: str = field(
|
|
30
|
-
default=cast(str, common.DOMAIN_OPTION.default), metadata={"click.option": common.DOMAIN_OPTION}
|
|
31
|
-
)
|
|
32
|
-
local: bool = field(
|
|
33
|
-
default=False,
|
|
34
|
-
metadata={
|
|
35
|
-
"click.option": click.Option(
|
|
36
|
-
["--local"],
|
|
37
|
-
is_flag=True,
|
|
38
|
-
help="Run the task locally",
|
|
39
|
-
)
|
|
40
|
-
},
|
|
41
|
-
)
|
|
42
|
-
copy_style: CopyFiles = field(
|
|
43
|
-
default="loaded_modules",
|
|
44
|
-
metadata={
|
|
45
|
-
"click.option": click.Option(
|
|
46
|
-
["--copy-style"],
|
|
47
|
-
type=click.Choice(get_args(CopyFiles)),
|
|
48
|
-
default="loaded_modules",
|
|
49
|
-
help="Copy style to use when running the task",
|
|
50
|
-
)
|
|
51
|
-
},
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
@classmethod
|
|
55
|
-
def from_dict(cls, d: Dict[str, Any]) -> RunArguments:
|
|
56
|
-
return cls(**d)
|
|
57
|
-
|
|
58
|
-
@classmethod
|
|
59
|
-
def options(cls) -> List[click.Option]:
|
|
60
|
-
"""
|
|
61
|
-
Return the set of base parameters added to run subcommand.
|
|
62
|
-
"""
|
|
63
|
-
return [common.get_option_from_metadata(f.metadata) for f in fields(cls) if f.metadata]
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
class RunTaskCommand(click.Command):
|
|
67
|
-
def __init__(self, obj_name: str, obj: Any, run_args: RunArguments, *args, **kwargs):
|
|
68
|
-
self.obj_name = obj_name
|
|
69
|
-
self.obj = cast(TaskTemplate, obj)
|
|
70
|
-
self.run_args = run_args
|
|
71
|
-
kwargs.pop("name", None)
|
|
72
|
-
super().__init__(obj_name, *args, **kwargs)
|
|
73
|
-
|
|
74
|
-
def invoke(self, ctx: Context):
|
|
75
|
-
obj: CLIConfig = ctx.obj or CLIConfig()
|
|
76
|
-
obj.init(self.run_args.project, self.run_args.domain)
|
|
77
|
-
|
|
78
|
-
r = flyte.with_runcontext(
|
|
79
|
-
copy_style=self.run_args.copy_style,
|
|
80
|
-
version=self.run_args.copy_style,
|
|
81
|
-
mode="local" if self.run_args.local else "remote",
|
|
82
|
-
).run(self.obj, **ctx.params)
|
|
83
|
-
if isinstance(r, Run) and r.action is not None:
|
|
84
|
-
console = Console()
|
|
85
|
-
console.print(
|
|
86
|
-
common.get_panel(
|
|
87
|
-
"Run",
|
|
88
|
-
f"[green bold]Created Run: {r.name} [/green bold] "
|
|
89
|
-
f"(Project: {r.action.action_id.run.project}, Domain: {r.action.action_id.run.domain})\n\n"
|
|
90
|
-
f"[blue bold]{r.url}[/blue bold]",
|
|
91
|
-
)
|
|
92
|
-
)
|
|
93
|
-
|
|
94
|
-
def get_params(self, ctx: Context) -> List[Parameter]:
|
|
95
|
-
# Note this function may be called multiple times by click.
|
|
96
|
-
task = self.obj
|
|
97
|
-
from .._internal.runtime.types_serde import transform_native_to_typed_interface
|
|
98
|
-
|
|
99
|
-
interface = transform_native_to_typed_interface(task.native_interface)
|
|
100
|
-
if interface is None:
|
|
101
|
-
return super().get_params(ctx)
|
|
102
|
-
inputs_interface = task.native_interface.inputs
|
|
103
|
-
|
|
104
|
-
params: List[Parameter] = []
|
|
105
|
-
for name, var in interface.inputs.variables.items():
|
|
106
|
-
default_val = None
|
|
107
|
-
if inputs_interface[name][1] is not inspect._empty:
|
|
108
|
-
default_val = inputs_interface[name][1]
|
|
109
|
-
params.append(to_click_option(name, var, inputs_interface[name][0], default_val))
|
|
110
|
-
|
|
111
|
-
self.params = params
|
|
112
|
-
return super().get_params(ctx)
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
class TaskPerFileGroup(common.ObjectsPerFileGroup):
|
|
116
|
-
"""
|
|
117
|
-
Group that creates a command for each task in the current directory that is not __init__.py.
|
|
118
|
-
"""
|
|
119
|
-
|
|
120
|
-
def __init__(self, filename: Path, run_args: RunArguments, *args, **kwargs):
|
|
121
|
-
args = (filename, *args)
|
|
122
|
-
super().__init__(*args, **kwargs)
|
|
123
|
-
self.run_args = run_args
|
|
124
|
-
|
|
125
|
-
def _filter_objects(self, module: ModuleType) -> Dict[str, Any]:
|
|
126
|
-
return {k: v for k, v in module.__dict__.items() if isinstance(v, TaskTemplate)}
|
|
127
|
-
|
|
128
|
-
def _get_command_for_obj(self, ctx: click.Context, obj_name: str, obj: Any) -> click.Command:
|
|
129
|
-
obj = cast(TaskTemplate, obj)
|
|
130
|
-
return RunTaskCommand(
|
|
131
|
-
obj_name=obj_name,
|
|
132
|
-
obj=obj,
|
|
133
|
-
help=obj.docs.__help__str__() if obj.docs else None,
|
|
134
|
-
run_args=self.run_args,
|
|
135
|
-
)
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
class TaskFiles(common.FileGroup):
|
|
139
|
-
"""
|
|
140
|
-
Group that creates a command for each file in the current directory that is not __init__.py.
|
|
141
|
-
"""
|
|
142
|
-
|
|
143
|
-
common_options_enabled = False
|
|
144
|
-
|
|
145
|
-
def __init__(
|
|
146
|
-
self,
|
|
147
|
-
*args,
|
|
148
|
-
directory: Path | None = None,
|
|
149
|
-
**kwargs,
|
|
150
|
-
):
|
|
151
|
-
if "params" not in kwargs:
|
|
152
|
-
kwargs["params"] = []
|
|
153
|
-
kwargs["params"].extend(RunArguments.options())
|
|
154
|
-
super().__init__(*args, directory=directory, **kwargs)
|
|
155
|
-
|
|
156
|
-
def get_command(self, ctx, filename):
|
|
157
|
-
run_args = RunArguments.from_dict(ctx.params)
|
|
158
|
-
fp = Path(filename)
|
|
159
|
-
if not fp.exists():
|
|
160
|
-
raise click.BadParameter(f"File {filename} does not exist")
|
|
161
|
-
if fp.is_dir():
|
|
162
|
-
return TaskFiles(directory=fp)
|
|
163
|
-
return TaskPerFileGroup(
|
|
164
|
-
filename=Path(filename),
|
|
165
|
-
run_args=run_args,
|
|
166
|
-
name=filename,
|
|
167
|
-
help=f"Run, functions decorated `env.task` or instances of Tasks in {filename}",
|
|
168
|
-
)
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
run = TaskFiles(
|
|
172
|
-
name="run",
|
|
173
|
-
help="Run a task from a python file",
|
|
174
|
-
)
|
flyte/_cli/main.py
DELETED
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import rich_click as click
|
|
2
|
-
|
|
3
|
-
from ..config import Config
|
|
4
|
-
from ._common import CLIConfig
|
|
5
|
-
from ._create import create
|
|
6
|
-
from ._deploy import deploy
|
|
7
|
-
from ._get import get
|
|
8
|
-
from ._run import run
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def _verbosity_to_loglevel(verbosity: int) -> int | None:
|
|
12
|
-
"""
|
|
13
|
-
Converts a verbosity level from the CLI to a logging level.
|
|
14
|
-
|
|
15
|
-
:param verbosity: verbosity level from the CLI
|
|
16
|
-
:return: logging level
|
|
17
|
-
"""
|
|
18
|
-
import logging
|
|
19
|
-
|
|
20
|
-
match verbosity:
|
|
21
|
-
case 0:
|
|
22
|
-
return None
|
|
23
|
-
case 1:
|
|
24
|
-
return logging.WARNING
|
|
25
|
-
case 2:
|
|
26
|
-
return logging.INFO
|
|
27
|
-
case _:
|
|
28
|
-
return logging.DEBUG
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
@click.group(cls=click.RichGroup)
|
|
32
|
-
@click.option(
|
|
33
|
-
"--endpoint",
|
|
34
|
-
type=str,
|
|
35
|
-
required=False,
|
|
36
|
-
help="The endpoint to connect to, this will override any config and simply used pkce to connect.",
|
|
37
|
-
)
|
|
38
|
-
@click.option(
|
|
39
|
-
"--insecure",
|
|
40
|
-
is_flag=True,
|
|
41
|
-
required=False,
|
|
42
|
-
help="insecure",
|
|
43
|
-
type=bool,
|
|
44
|
-
default=False,
|
|
45
|
-
)
|
|
46
|
-
@click.option(
|
|
47
|
-
"-v",
|
|
48
|
-
"--verbose",
|
|
49
|
-
required=False,
|
|
50
|
-
help="Show verbose messages and exception traces",
|
|
51
|
-
count=True,
|
|
52
|
-
default=0,
|
|
53
|
-
type=int,
|
|
54
|
-
)
|
|
55
|
-
@click.option(
|
|
56
|
-
"--org-override",
|
|
57
|
-
type=str,
|
|
58
|
-
required=False,
|
|
59
|
-
help="Override for org",
|
|
60
|
-
)
|
|
61
|
-
@click.option(
|
|
62
|
-
"-c",
|
|
63
|
-
"--config",
|
|
64
|
-
"config_file",
|
|
65
|
-
required=False,
|
|
66
|
-
type=click.Path(exists=True),
|
|
67
|
-
help="Path to config file (YAML format) to use for the CLI. If not specified,"
|
|
68
|
-
" the default config file will be used.",
|
|
69
|
-
)
|
|
70
|
-
@click.pass_context
|
|
71
|
-
def main(
|
|
72
|
-
ctx: click.Context,
|
|
73
|
-
endpoint: str | None,
|
|
74
|
-
insecure: bool,
|
|
75
|
-
verbose: int,
|
|
76
|
-
org_override: str | None,
|
|
77
|
-
config_file: str | None,
|
|
78
|
-
):
|
|
79
|
-
"""
|
|
80
|
-
v2 cli. Root command, please use one of the subcommands.
|
|
81
|
-
"""
|
|
82
|
-
log_level = _verbosity_to_loglevel(verbose)
|
|
83
|
-
|
|
84
|
-
config = Config.auto(config_file=config_file)
|
|
85
|
-
|
|
86
|
-
ctx.obj = CLIConfig(
|
|
87
|
-
log_level=log_level,
|
|
88
|
-
endpoint=endpoint or config.platform.endpoint,
|
|
89
|
-
insecure=insecure or config.platform.insecure,
|
|
90
|
-
org_override=org_override or config.task.org,
|
|
91
|
-
config=config,
|
|
92
|
-
)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
main.add_command(run)
|
|
96
|
-
main.add_command(deploy)
|
|
97
|
-
main.add_command(get) # type: ignore
|
|
98
|
-
main.add_command(create) # type: ignore
|