flyte 0.0.1b3__py3-none-any.whl → 0.2.0a0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of flyte might be problematic. Click here for more details.
- flyte/__init__.py +20 -4
- flyte/_bin/runtime.py +33 -7
- flyte/_build.py +3 -2
- flyte/_cache/cache.py +1 -2
- flyte/_code_bundle/_packaging.py +1 -1
- flyte/_code_bundle/_utils.py +0 -16
- flyte/_code_bundle/bundle.py +43 -12
- flyte/_context.py +8 -2
- flyte/_deploy.py +56 -15
- flyte/_environment.py +45 -4
- flyte/_excepthook.py +37 -0
- flyte/_group.py +2 -1
- flyte/_image.py +8 -4
- flyte/_initialize.py +112 -254
- flyte/_interface.py +3 -3
- flyte/_internal/controllers/__init__.py +19 -6
- flyte/_internal/controllers/_local_controller.py +83 -8
- flyte/_internal/controllers/_trace.py +2 -1
- flyte/_internal/controllers/remote/__init__.py +27 -7
- flyte/_internal/controllers/remote/_action.py +7 -2
- flyte/_internal/controllers/remote/_client.py +5 -1
- flyte/_internal/controllers/remote/_controller.py +159 -26
- flyte/_internal/controllers/remote/_core.py +13 -5
- flyte/_internal/controllers/remote/_informer.py +4 -4
- flyte/_internal/controllers/remote/_service_protocol.py +6 -6
- flyte/_internal/imagebuild/docker_builder.py +12 -1
- flyte/_internal/imagebuild/image_builder.py +16 -11
- flyte/_internal/runtime/convert.py +164 -21
- flyte/_internal/runtime/entrypoints.py +1 -1
- flyte/_internal/runtime/io.py +3 -3
- flyte/_internal/runtime/task_serde.py +140 -20
- flyte/_internal/runtime/taskrunner.py +4 -3
- flyte/_internal/runtime/types_serde.py +1 -1
- flyte/_logging.py +12 -1
- flyte/_map.py +215 -0
- flyte/_pod.py +19 -0
- flyte/_protos/common/list_pb2.py +3 -3
- flyte/_protos/common/list_pb2.pyi +2 -0
- flyte/_protos/logs/dataplane/payload_pb2.py +28 -24
- flyte/_protos/logs/dataplane/payload_pb2.pyi +11 -2
- flyte/_protos/workflow/common_pb2.py +27 -0
- flyte/_protos/workflow/common_pb2.pyi +14 -0
- flyte/_protos/workflow/environment_pb2.py +29 -0
- flyte/_protos/workflow/environment_pb2.pyi +12 -0
- flyte/_protos/workflow/queue_service_pb2.py +40 -41
- flyte/_protos/workflow/queue_service_pb2.pyi +35 -30
- flyte/_protos/workflow/queue_service_pb2_grpc.py +15 -15
- flyte/_protos/workflow/run_definition_pb2.py +61 -61
- flyte/_protos/workflow/run_definition_pb2.pyi +8 -4
- flyte/_protos/workflow/run_service_pb2.py +20 -24
- flyte/_protos/workflow/run_service_pb2.pyi +2 -6
- flyte/_protos/workflow/state_service_pb2.py +36 -28
- flyte/_protos/workflow/state_service_pb2.pyi +19 -15
- flyte/_protos/workflow/state_service_pb2_grpc.py +28 -28
- flyte/_protos/workflow/task_definition_pb2.py +29 -22
- flyte/_protos/workflow/task_definition_pb2.pyi +21 -5
- flyte/_protos/workflow/task_service_pb2.py +27 -11
- flyte/_protos/workflow/task_service_pb2.pyi +29 -1
- flyte/_protos/workflow/task_service_pb2_grpc.py +34 -0
- flyte/_run.py +166 -95
- flyte/_task.py +110 -28
- flyte/_task_environment.py +55 -72
- flyte/_trace.py +6 -14
- flyte/_utils/__init__.py +6 -0
- flyte/_utils/async_cache.py +139 -0
- flyte/_utils/coro_management.py +0 -2
- flyte/_utils/helpers.py +45 -19
- flyte/_utils/org_discovery.py +57 -0
- flyte/_version.py +2 -2
- flyte/cli/__init__.py +3 -0
- flyte/cli/_abort.py +28 -0
- flyte/{_cli → cli}/_common.py +73 -23
- flyte/cli/_create.py +145 -0
- flyte/{_cli → cli}/_delete.py +4 -4
- flyte/{_cli → cli}/_deploy.py +26 -14
- flyte/cli/_gen.py +163 -0
- flyte/{_cli → cli}/_get.py +98 -23
- {union/_cli → flyte/cli}/_params.py +106 -147
- flyte/{_cli → cli}/_run.py +99 -20
- flyte/cli/main.py +166 -0
- flyte/config/__init__.py +3 -0
- flyte/config/_config.py +216 -0
- flyte/config/_internal.py +64 -0
- flyte/config/_reader.py +207 -0
- flyte/errors.py +29 -0
- flyte/extras/_container.py +33 -43
- flyte/io/__init__.py +17 -1
- flyte/io/_dir.py +2 -2
- flyte/io/_file.py +3 -4
- flyte/io/{structured_dataset → _structured_dataset}/basic_dfs.py +1 -1
- flyte/io/{structured_dataset → _structured_dataset}/structured_dataset.py +1 -1
- flyte/{_datastructures.py → models.py} +56 -7
- flyte/remote/__init__.py +2 -1
- flyte/remote/_client/_protocols.py +2 -0
- flyte/remote/_client/auth/_auth_utils.py +14 -0
- flyte/remote/_client/auth/_channel.py +34 -3
- flyte/remote/_client/auth/_token_client.py +3 -3
- flyte/remote/_client/controlplane.py +13 -13
- flyte/remote/_console.py +1 -1
- flyte/remote/_data.py +10 -6
- flyte/remote/_logs.py +89 -29
- flyte/remote/_project.py +8 -9
- flyte/remote/_run.py +228 -131
- flyte/remote/_secret.py +12 -12
- flyte/remote/_task.py +179 -15
- flyte/report/_report.py +4 -4
- flyte/storage/__init__.py +5 -0
- flyte/storage/_config.py +233 -0
- flyte/storage/_storage.py +23 -3
- flyte/syncify/__init__.py +56 -0
- flyte/syncify/_api.py +371 -0
- flyte/types/__init__.py +23 -0
- flyte/types/_interface.py +22 -7
- flyte/{io/pickle/transformer.py → types/_pickle.py} +2 -1
- flyte/types/_type_engine.py +95 -18
- flyte-0.2.0a0.dist-info/METADATA +249 -0
- flyte-0.2.0a0.dist-info/RECORD +218 -0
- {flyte-0.0.1b3.dist-info → flyte-0.2.0a0.dist-info}/entry_points.txt +1 -1
- flyte/_api_commons.py +0 -3
- flyte/_cli/__init__.py +0 -0
- flyte/_cli/_create.py +0 -42
- flyte/_cli/main.py +0 -72
- flyte/_internal/controllers/pbhash.py +0 -39
- flyte/io/_dataframe.py +0 -0
- flyte/io/pickle/__init__.py +0 -0
- flyte-0.0.1b3.dist-info/METADATA +0 -179
- flyte-0.0.1b3.dist-info/RECORD +0 -390
- 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/identifier_pb2.py +0 -71
- union/_protos/common/identifier_pb2.pyi +0 -82
- 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
- /union/_protos/common/authorization_pb2_grpc.py → /flyte/_protos/workflow/common_pb2_grpc.py +0 -0
- /union/_protos/common/identifier_pb2_grpc.py → /flyte/_protos/workflow/environment_pb2_grpc.py +0 -0
- /flyte/io/{structured_dataset → _structured_dataset}/__init__.py +0 -0
- {flyte-0.0.1b3.dist-info → flyte-0.2.0a0.dist-info}/WHEEL +0 -0
- {flyte-0.0.1b3.dist-info → flyte-0.2.0a0.dist-info}/top_level.txt +0 -0
flyte/remote/_logs.py
CHANGED
|
@@ -3,25 +3,33 @@ from collections import deque
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from typing import AsyncGenerator, AsyncIterator
|
|
5
5
|
|
|
6
|
+
import grpc
|
|
6
7
|
from rich.console import Console
|
|
7
8
|
from rich.live import Live
|
|
8
9
|
from rich.panel import Panel
|
|
9
10
|
from rich.text import Text
|
|
10
11
|
|
|
11
|
-
from flyte.
|
|
12
|
-
from flyte._initialize import get_client, requires_client
|
|
12
|
+
from flyte._initialize import ensure_client, get_client
|
|
13
13
|
from flyte._protos.logs.dataplane import payload_pb2
|
|
14
14
|
from flyte._protos.workflow import run_definition_pb2, run_logs_service_pb2
|
|
15
|
+
from flyte.errors import LogsNotYetAvailableError
|
|
16
|
+
from flyte.syncify import syncify
|
|
15
17
|
|
|
18
|
+
style_map = {
|
|
19
|
+
payload_pb2.LogLineOriginator.SYSTEM: "bold magenta",
|
|
20
|
+
payload_pb2.LogLineOriginator.USER: "cyan",
|
|
21
|
+
payload_pb2.LogLineOriginator.UNKNOWN: "light red",
|
|
22
|
+
}
|
|
16
23
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
payload_pb2.LogLineOriginator.
|
|
21
|
-
|
|
22
|
-
}
|
|
24
|
+
|
|
25
|
+
def _format_line(logline: payload_pb2.LogLine, show_ts: bool, filter_system: bool) -> Text | None:
|
|
26
|
+
if filter_system:
|
|
27
|
+
if logline.originator == payload_pb2.LogLineOriginator.SYSTEM:
|
|
28
|
+
return None
|
|
23
29
|
style = style_map.get(logline.originator, "")
|
|
24
30
|
if "flyte" in logline.message and "flyte.errors" not in logline.message:
|
|
31
|
+
if filter_system:
|
|
32
|
+
return None
|
|
25
33
|
style = "dim"
|
|
26
34
|
ts = ""
|
|
27
35
|
if show_ts:
|
|
@@ -34,7 +42,15 @@ class AsyncLogViewer:
|
|
|
34
42
|
A class to view logs asynchronously in the console or terminal or jupyter notebook.
|
|
35
43
|
"""
|
|
36
44
|
|
|
37
|
-
def __init__(
|
|
45
|
+
def __init__(
|
|
46
|
+
self,
|
|
47
|
+
log_source: AsyncIterator,
|
|
48
|
+
max_lines: int = 30,
|
|
49
|
+
name: str = "Logs",
|
|
50
|
+
show_ts: bool = False,
|
|
51
|
+
filter_system: bool = False,
|
|
52
|
+
panel: bool = False,
|
|
53
|
+
):
|
|
38
54
|
self.console = Console()
|
|
39
55
|
self.log_source = log_source
|
|
40
56
|
self.max_lines = max_lines
|
|
@@ -42,47 +58,81 @@ class AsyncLogViewer:
|
|
|
42
58
|
self.name = name
|
|
43
59
|
self.show_ts = show_ts
|
|
44
60
|
self.total_lines = 0
|
|
61
|
+
self.filter_flyte = filter_system
|
|
62
|
+
self.panel = panel
|
|
45
63
|
|
|
46
|
-
def _render(self):
|
|
64
|
+
def _render(self) -> Panel | Text:
|
|
47
65
|
log_text = Text()
|
|
48
66
|
for line in self.lines:
|
|
49
67
|
log_text.append(line)
|
|
50
|
-
|
|
68
|
+
if self.panel:
|
|
69
|
+
return Panel(log_text, title=self.name, border_style="yellow")
|
|
70
|
+
return log_text
|
|
51
71
|
|
|
52
72
|
async def run(self):
|
|
53
|
-
with Live(self._render(), refresh_per_second=
|
|
73
|
+
with Live(self._render(), refresh_per_second=20, console=self.console) as live:
|
|
54
74
|
try:
|
|
55
75
|
async for logline in self.log_source:
|
|
56
|
-
formatted = _format_line(logline, show_ts=self.show_ts)
|
|
57
|
-
|
|
76
|
+
formatted = _format_line(logline, show_ts=self.show_ts, filter_system=self.filter_flyte)
|
|
77
|
+
if formatted:
|
|
78
|
+
self.lines.append(formatted)
|
|
58
79
|
self.total_lines += 1
|
|
59
80
|
live.update(self._render())
|
|
60
81
|
except asyncio.CancelledError:
|
|
61
82
|
pass
|
|
83
|
+
except KeyboardInterrupt:
|
|
84
|
+
pass
|
|
85
|
+
except StopAsyncIteration:
|
|
86
|
+
self.console.print("[dim]Log stream ended.[/dim]")
|
|
87
|
+
except LogsNotYetAvailableError as e:
|
|
88
|
+
self.console.print(f"[red]Error:[/red] {e}")
|
|
89
|
+
live.update("")
|
|
62
90
|
self.console.print(f"Scrolled {self.total_lines} lines of logs.")
|
|
63
91
|
|
|
64
92
|
|
|
65
93
|
@dataclass
|
|
66
94
|
class Logs:
|
|
95
|
+
@syncify
|
|
67
96
|
@classmethod
|
|
68
|
-
@requires_client
|
|
69
|
-
@syncer.wrap
|
|
70
97
|
async def tail(
|
|
71
|
-
cls,
|
|
98
|
+
cls,
|
|
99
|
+
action_id: run_definition_pb2.ActionIdentifier,
|
|
100
|
+
attempt: int = 1,
|
|
101
|
+
retry: int = 3,
|
|
72
102
|
) -> AsyncGenerator[payload_pb2.LogLine, None]:
|
|
73
103
|
"""
|
|
74
104
|
Tail the logs for a given action ID and attempt.
|
|
75
105
|
:param action_id: The action ID to tail logs for.
|
|
76
106
|
:param attempt: The attempt number (default is 0).
|
|
77
107
|
"""
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
108
|
+
ensure_client()
|
|
109
|
+
retries = 0
|
|
110
|
+
while True:
|
|
111
|
+
try:
|
|
112
|
+
resp = get_client().logs_service.TailLogs(
|
|
113
|
+
run_logs_service_pb2.TailLogsRequest(action_id=action_id, attempt=attempt)
|
|
114
|
+
)
|
|
115
|
+
async for log_set in resp:
|
|
116
|
+
if log_set.logs:
|
|
117
|
+
for log in log_set.logs:
|
|
118
|
+
for line in log.lines:
|
|
119
|
+
yield line
|
|
120
|
+
return
|
|
121
|
+
except asyncio.CancelledError:
|
|
122
|
+
return
|
|
123
|
+
except KeyboardInterrupt:
|
|
124
|
+
return
|
|
125
|
+
except StopAsyncIteration:
|
|
126
|
+
return
|
|
127
|
+
except grpc.aio.AioRpcError as e:
|
|
128
|
+
retries += 1
|
|
129
|
+
if retries >= retry:
|
|
130
|
+
if e.code() == grpc.StatusCode.NOT_FOUND:
|
|
131
|
+
raise LogsNotYetAvailableError(
|
|
132
|
+
f"Log stream not available for action {action_id.name} in run {action_id.run.name}."
|
|
133
|
+
)
|
|
134
|
+
else:
|
|
135
|
+
await asyncio.sleep(1)
|
|
86
136
|
|
|
87
137
|
@classmethod
|
|
88
138
|
async def create_viewer(
|
|
@@ -92,6 +142,8 @@ class Logs:
|
|
|
92
142
|
max_lines: int = 30,
|
|
93
143
|
show_ts: bool = False,
|
|
94
144
|
raw: bool = False,
|
|
145
|
+
filter_system: bool = False,
|
|
146
|
+
panel: bool = False,
|
|
95
147
|
):
|
|
96
148
|
"""
|
|
97
149
|
Create a log viewer for a given action ID and attempt.
|
|
@@ -101,16 +153,24 @@ class Logs:
|
|
|
101
153
|
and keep only max_lines in view.
|
|
102
154
|
:param show_ts: Whether to show timestamps in the logs.
|
|
103
155
|
:param raw: if True, return the raw log lines instead of a viewer.
|
|
156
|
+
:param filter_system: Whether to filter log lines based on system logs.
|
|
157
|
+
:param panel: Whether to use a panel for the log viewer. only applicable if raw is False.
|
|
104
158
|
"""
|
|
159
|
+
if attempt < 1:
|
|
160
|
+
raise ValueError("Attempt number must be greater than 0.")
|
|
105
161
|
if raw:
|
|
106
162
|
console = Console()
|
|
107
|
-
async for line in cls.tail.aio(
|
|
108
|
-
|
|
163
|
+
async for line in cls.tail.aio(action_id=action_id, attempt=attempt):
|
|
164
|
+
line_text = _format_line(line, show_ts=show_ts, filter_system=filter_system)
|
|
165
|
+
if line_text:
|
|
166
|
+
console.print(line_text, end="")
|
|
109
167
|
return
|
|
110
168
|
viewer = AsyncLogViewer(
|
|
111
|
-
log_source=cls.tail.aio(
|
|
169
|
+
log_source=cls.tail.aio(action_id=action_id, attempt=attempt),
|
|
112
170
|
max_lines=max_lines,
|
|
113
171
|
show_ts=show_ts,
|
|
114
|
-
name=f"{action_id.run.name}:{action_id.name}",
|
|
172
|
+
name=f"{action_id.run.name}:{action_id.name} ({attempt})",
|
|
173
|
+
filter_system=filter_system,
|
|
174
|
+
panel=panel,
|
|
115
175
|
)
|
|
116
176
|
await viewer.run()
|
flyte/remote/_project.py
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
import typing
|
|
4
3
|
from dataclasses import dataclass
|
|
5
|
-
from typing import
|
|
4
|
+
from typing import AsyncIterator, Iterator, Literal, Tuple, Union
|
|
6
5
|
|
|
7
6
|
import rich.repr
|
|
8
7
|
from flyteidl.admin import common_pb2, project_pb2
|
|
9
8
|
|
|
10
|
-
from flyte.
|
|
11
|
-
from flyte.
|
|
9
|
+
from flyte._initialize import ensure_client, get_client, get_common_config
|
|
10
|
+
from flyte.syncify import syncify
|
|
12
11
|
|
|
13
12
|
|
|
14
13
|
@dataclass
|
|
@@ -19,9 +18,8 @@ class Project:
|
|
|
19
18
|
|
|
20
19
|
_pb2: project_pb2.Project
|
|
21
20
|
|
|
21
|
+
@syncify
|
|
22
22
|
@classmethod
|
|
23
|
-
@requires_client
|
|
24
|
-
@syncer.wrap
|
|
25
23
|
async def get(cls, name: str, org: str | None = None) -> Project:
|
|
26
24
|
"""
|
|
27
25
|
Get a run by its ID or name. If both are provided, the ID will take precedence.
|
|
@@ -29,6 +27,7 @@ class Project:
|
|
|
29
27
|
:param name: The name of the project.
|
|
30
28
|
:param org: The organization of the project (if applicable).
|
|
31
29
|
"""
|
|
30
|
+
ensure_client()
|
|
32
31
|
service = get_client().project_domain_service # type: ignore
|
|
33
32
|
resp = await service.GetProject(
|
|
34
33
|
project_pb2.ProjectGetRequest(
|
|
@@ -38,14 +37,13 @@ class Project:
|
|
|
38
37
|
)
|
|
39
38
|
return cls(resp)
|
|
40
39
|
|
|
40
|
+
@syncify
|
|
41
41
|
@classmethod
|
|
42
|
-
@requires_client
|
|
43
|
-
@syncer.wrap
|
|
44
42
|
async def listall(
|
|
45
43
|
cls,
|
|
46
44
|
filters: str | None = None,
|
|
47
45
|
sort_by: Tuple[str, Literal["asc", "desc"]] | None = None,
|
|
48
|
-
) ->
|
|
46
|
+
) -> Union[AsyncIterator[Project], Iterator[Project]]:
|
|
49
47
|
"""
|
|
50
48
|
Get a run by its ID or name. If both are provided, the ID will take precedence.
|
|
51
49
|
|
|
@@ -53,6 +51,7 @@ class Project:
|
|
|
53
51
|
:param sort_by: The sorting criteria for the project list, in the format (field, order).
|
|
54
52
|
:return: An iterator of projects.
|
|
55
53
|
"""
|
|
54
|
+
ensure_client()
|
|
56
55
|
token = None
|
|
57
56
|
sort_by = sort_by or ("created_at", "asc")
|
|
58
57
|
sort_pb2 = common_pb2.Sort(
|