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/remote/_trigger.py
ADDED
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from functools import cached_property
|
|
5
|
+
from typing import AsyncIterator
|
|
6
|
+
|
|
7
|
+
import grpc.aio
|
|
8
|
+
from flyteidl2.common import identifier_pb2, list_pb2
|
|
9
|
+
from flyteidl2.task import common_pb2, task_definition_pb2
|
|
10
|
+
from flyteidl2.trigger import trigger_definition_pb2, trigger_service_pb2
|
|
11
|
+
|
|
12
|
+
import flyte
|
|
13
|
+
from flyte._initialize import ensure_client, get_client, get_init_config
|
|
14
|
+
from flyte._internal.runtime import trigger_serde
|
|
15
|
+
from flyte.syncify import syncify
|
|
16
|
+
|
|
17
|
+
from ._common import ToJSONMixin
|
|
18
|
+
from ._task import Task, TaskDetails
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class TriggerDetails(ToJSONMixin):
|
|
23
|
+
pb2: trigger_definition_pb2.TriggerDetails
|
|
24
|
+
|
|
25
|
+
@syncify
|
|
26
|
+
@classmethod
|
|
27
|
+
async def get(cls, *, name: str, task_name: str) -> TriggerDetails:
|
|
28
|
+
"""
|
|
29
|
+
Retrieve detailed information about a specific trigger by its name.
|
|
30
|
+
"""
|
|
31
|
+
ensure_client()
|
|
32
|
+
cfg = get_init_config()
|
|
33
|
+
resp = await get_client().trigger_service.GetTriggerDetails(
|
|
34
|
+
request=trigger_service_pb2.GetTriggerDetailsRequest(
|
|
35
|
+
name=identifier_pb2.TriggerName(
|
|
36
|
+
task_name=task_name,
|
|
37
|
+
name=name,
|
|
38
|
+
org=cfg.org,
|
|
39
|
+
project=cfg.project,
|
|
40
|
+
domain=cfg.domain,
|
|
41
|
+
),
|
|
42
|
+
)
|
|
43
|
+
)
|
|
44
|
+
return cls(pb2=resp.trigger)
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def name(self) -> str:
|
|
48
|
+
"""
|
|
49
|
+
Name of the trigger.
|
|
50
|
+
"""
|
|
51
|
+
return self.id.name.name
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def id(self) -> identifier_pb2.TriggerIdentifier:
|
|
55
|
+
"""
|
|
56
|
+
Identifier for the trigger.
|
|
57
|
+
"""
|
|
58
|
+
return self.pb2.id
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def task_name(self) -> str:
|
|
62
|
+
"""
|
|
63
|
+
Name of the associated task
|
|
64
|
+
"""
|
|
65
|
+
return self.pb2.id.name.task_name
|
|
66
|
+
|
|
67
|
+
@property
|
|
68
|
+
def automation_spec(self) -> common_pb2.TriggerAutomationSpec:
|
|
69
|
+
"""
|
|
70
|
+
Get the automation specification for the trigger (e.g., schedule, event).
|
|
71
|
+
"""
|
|
72
|
+
return self.pb2.automation_spec
|
|
73
|
+
|
|
74
|
+
@property
|
|
75
|
+
def metadata(self) -> trigger_definition_pb2.TriggerMetadata:
|
|
76
|
+
"""
|
|
77
|
+
Get the metadata for the trigger.
|
|
78
|
+
"""
|
|
79
|
+
return self.pb2.metadata
|
|
80
|
+
|
|
81
|
+
@property
|
|
82
|
+
def status(self) -> trigger_definition_pb2.TriggerStatus:
|
|
83
|
+
"""
|
|
84
|
+
Get the current status of the trigger.
|
|
85
|
+
"""
|
|
86
|
+
return self.pb2.status
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
def is_active(self) -> bool:
|
|
90
|
+
"""
|
|
91
|
+
Check if the trigger is currently active.
|
|
92
|
+
"""
|
|
93
|
+
return self.pb2.spec.active
|
|
94
|
+
|
|
95
|
+
@cached_property
|
|
96
|
+
def trigger(self) -> trigger_definition_pb2.Trigger:
|
|
97
|
+
"""
|
|
98
|
+
Get the trigger protobuf object constructed from the details.
|
|
99
|
+
"""
|
|
100
|
+
return trigger_definition_pb2.Trigger(
|
|
101
|
+
id=self.pb2.id,
|
|
102
|
+
automation_spec=self.automation_spec,
|
|
103
|
+
metadata=self.metadata,
|
|
104
|
+
status=self.status,
|
|
105
|
+
active=self.is_active,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@dataclass
|
|
110
|
+
class Trigger(ToJSONMixin):
|
|
111
|
+
"""
|
|
112
|
+
Represents a trigger in the Flyte platform.
|
|
113
|
+
"""
|
|
114
|
+
|
|
115
|
+
pb2: trigger_definition_pb2.Trigger
|
|
116
|
+
details: TriggerDetails | None = None
|
|
117
|
+
|
|
118
|
+
@syncify
|
|
119
|
+
@classmethod
|
|
120
|
+
async def create(
|
|
121
|
+
cls,
|
|
122
|
+
trigger: flyte.Trigger,
|
|
123
|
+
task_name: str,
|
|
124
|
+
task_version: str | None = None,
|
|
125
|
+
) -> Trigger:
|
|
126
|
+
"""
|
|
127
|
+
Create a new trigger in the Flyte platform.
|
|
128
|
+
|
|
129
|
+
:param trigger: The flyte.Trigger object containing the trigger definition.
|
|
130
|
+
:param task_name: Optional name of the task to associate with the trigger.
|
|
131
|
+
"""
|
|
132
|
+
ensure_client()
|
|
133
|
+
cfg = get_init_config()
|
|
134
|
+
|
|
135
|
+
# Fetch the task to ensure it exists and to get its input definitions
|
|
136
|
+
try:
|
|
137
|
+
lazy = (
|
|
138
|
+
Task.get(name=task_name, version=task_version)
|
|
139
|
+
if task_version
|
|
140
|
+
else Task.get(name=task_name, auto_version="latest")
|
|
141
|
+
)
|
|
142
|
+
task: TaskDetails = await lazy.fetch.aio()
|
|
143
|
+
|
|
144
|
+
task_trigger = await trigger_serde.to_task_trigger(
|
|
145
|
+
t=trigger,
|
|
146
|
+
task_name=task_name,
|
|
147
|
+
task_inputs=task.pb2.spec.task_template.interface.inputs,
|
|
148
|
+
task_default_inputs=list(task.pb2.spec.default_inputs),
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
resp = await get_client().trigger_service.DeployTrigger(
|
|
152
|
+
request=trigger_service_pb2.DeployTriggerRequest(
|
|
153
|
+
name=identifier_pb2.TriggerName(
|
|
154
|
+
name=trigger.name,
|
|
155
|
+
task_name=task_name,
|
|
156
|
+
org=cfg.org,
|
|
157
|
+
project=cfg.project,
|
|
158
|
+
domain=cfg.domain,
|
|
159
|
+
),
|
|
160
|
+
spec=trigger_definition_pb2.TriggerSpec(
|
|
161
|
+
active=task_trigger.spec.active,
|
|
162
|
+
inputs=task_trigger.spec.inputs,
|
|
163
|
+
run_spec=task_trigger.spec.run_spec,
|
|
164
|
+
task_version=task.version,
|
|
165
|
+
),
|
|
166
|
+
automation_spec=task_trigger.automation_spec,
|
|
167
|
+
)
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
details = TriggerDetails(pb2=resp.trigger)
|
|
171
|
+
|
|
172
|
+
return cls(pb2=details.trigger, details=details)
|
|
173
|
+
except grpc.aio.AioRpcError as e:
|
|
174
|
+
if e.code() == grpc.StatusCode.NOT_FOUND:
|
|
175
|
+
raise ValueError(f"Task {task_name}:{task_version or 'latest'} not found") from e
|
|
176
|
+
raise
|
|
177
|
+
|
|
178
|
+
@syncify
|
|
179
|
+
@classmethod
|
|
180
|
+
async def get(cls, *, name: str, task_name: str) -> TriggerDetails:
|
|
181
|
+
"""
|
|
182
|
+
Retrieve a trigger by its name and associated task name.
|
|
183
|
+
"""
|
|
184
|
+
return await TriggerDetails.get.aio(name=name, task_name=task_name)
|
|
185
|
+
|
|
186
|
+
@syncify
|
|
187
|
+
@classmethod
|
|
188
|
+
async def listall(
|
|
189
|
+
cls, task_name: str | None = None, task_version: str | None = None, limit: int = 100
|
|
190
|
+
) -> AsyncIterator[Trigger]:
|
|
191
|
+
"""
|
|
192
|
+
List all triggers associated with a specific task or all tasks if no task name is provided.
|
|
193
|
+
"""
|
|
194
|
+
ensure_client()
|
|
195
|
+
cfg = get_init_config()
|
|
196
|
+
token = None
|
|
197
|
+
task_name_id = None
|
|
198
|
+
project_id = None
|
|
199
|
+
task_id = None
|
|
200
|
+
if task_name and task_version:
|
|
201
|
+
task_id = task_definition_pb2.TaskIdentifier(
|
|
202
|
+
name=task_name,
|
|
203
|
+
project=cfg.project,
|
|
204
|
+
domain=cfg.domain,
|
|
205
|
+
org=cfg.org,
|
|
206
|
+
version=task_version,
|
|
207
|
+
)
|
|
208
|
+
elif task_name:
|
|
209
|
+
task_name_id = task_definition_pb2.TaskName(
|
|
210
|
+
name=task_name,
|
|
211
|
+
project=cfg.project,
|
|
212
|
+
domain=cfg.domain,
|
|
213
|
+
org=cfg.org,
|
|
214
|
+
)
|
|
215
|
+
else:
|
|
216
|
+
project_id = identifier_pb2.ProjectIdentifier(
|
|
217
|
+
organization=cfg.org,
|
|
218
|
+
domain=cfg.domain,
|
|
219
|
+
name=cfg.project,
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
while True:
|
|
223
|
+
resp = await get_client().trigger_service.ListTriggers(
|
|
224
|
+
request=trigger_service_pb2.ListTriggersRequest(
|
|
225
|
+
project_id=project_id,
|
|
226
|
+
task_id=task_id,
|
|
227
|
+
task_name=task_name_id,
|
|
228
|
+
request=list_pb2.ListRequest(
|
|
229
|
+
limit=limit,
|
|
230
|
+
token=token,
|
|
231
|
+
),
|
|
232
|
+
)
|
|
233
|
+
)
|
|
234
|
+
token = resp.token
|
|
235
|
+
for r in resp.triggers:
|
|
236
|
+
yield cls(r)
|
|
237
|
+
if not token:
|
|
238
|
+
break
|
|
239
|
+
|
|
240
|
+
@syncify
|
|
241
|
+
@classmethod
|
|
242
|
+
async def update(cls, name: str, task_name: str, active: bool):
|
|
243
|
+
"""
|
|
244
|
+
Pause a trigger by its name and associated task name.
|
|
245
|
+
"""
|
|
246
|
+
ensure_client()
|
|
247
|
+
cfg = get_init_config()
|
|
248
|
+
await get_client().trigger_service.UpdateTriggers(
|
|
249
|
+
request=trigger_service_pb2.UpdateTriggersRequest(
|
|
250
|
+
names=[
|
|
251
|
+
identifier_pb2.TriggerName(
|
|
252
|
+
org=cfg.org,
|
|
253
|
+
project=cfg.project,
|
|
254
|
+
domain=cfg.domain,
|
|
255
|
+
name=name,
|
|
256
|
+
task_name=task_name,
|
|
257
|
+
)
|
|
258
|
+
],
|
|
259
|
+
active=active,
|
|
260
|
+
)
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
@syncify
|
|
264
|
+
@classmethod
|
|
265
|
+
async def delete(cls, name: str, task_name: str):
|
|
266
|
+
"""
|
|
267
|
+
Delete a trigger by its name.
|
|
268
|
+
"""
|
|
269
|
+
ensure_client()
|
|
270
|
+
cfg = get_init_config()
|
|
271
|
+
await get_client().trigger_service.DeleteTriggers(
|
|
272
|
+
request=trigger_service_pb2.DeleteTriggersRequest(
|
|
273
|
+
names=[
|
|
274
|
+
identifier_pb2.TriggerName(
|
|
275
|
+
org=cfg.org,
|
|
276
|
+
project=cfg.project,
|
|
277
|
+
domain=cfg.domain,
|
|
278
|
+
name=name,
|
|
279
|
+
task_name=task_name,
|
|
280
|
+
)
|
|
281
|
+
],
|
|
282
|
+
)
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
@property
|
|
286
|
+
def id(self) -> identifier_pb2.TriggerIdentifier:
|
|
287
|
+
"""
|
|
288
|
+
Get the unique identifier for the trigger.
|
|
289
|
+
"""
|
|
290
|
+
return self.pb2.id
|
|
291
|
+
|
|
292
|
+
@property
|
|
293
|
+
def name(self) -> str:
|
|
294
|
+
"""
|
|
295
|
+
Get the name of the trigger.
|
|
296
|
+
"""
|
|
297
|
+
return self.id.name.name
|
|
298
|
+
|
|
299
|
+
@property
|
|
300
|
+
def task_name(self) -> str:
|
|
301
|
+
"""
|
|
302
|
+
Get the name of the task associated with this trigger.
|
|
303
|
+
"""
|
|
304
|
+
return self.id.name.task_name
|
|
305
|
+
|
|
306
|
+
@property
|
|
307
|
+
def automation_spec(self) -> common_pb2.TriggerAutomationSpec:
|
|
308
|
+
"""
|
|
309
|
+
Get the automation specification for the trigger.
|
|
310
|
+
"""
|
|
311
|
+
return self.pb2.automation_spec
|
|
312
|
+
|
|
313
|
+
@property
|
|
314
|
+
def url(self) -> str:
|
|
315
|
+
"""
|
|
316
|
+
Get the console URL for viewing the trigger.
|
|
317
|
+
"""
|
|
318
|
+
client = get_client()
|
|
319
|
+
return client.console.trigger_url(
|
|
320
|
+
project=self.pb2.id.name.project,
|
|
321
|
+
domain=self.pb2.id.name.domain,
|
|
322
|
+
task_name=self.pb2.id.name.task_name,
|
|
323
|
+
trigger_name=self.name,
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
async def get_details(self) -> TriggerDetails:
|
|
327
|
+
"""
|
|
328
|
+
Get detailed information about this trigger.
|
|
329
|
+
"""
|
|
330
|
+
if not self.details:
|
|
331
|
+
details = await TriggerDetails.get.aio(name=self.pb2.id.name.name)
|
|
332
|
+
self.details = details
|
|
333
|
+
return self.details
|
|
334
|
+
|
|
335
|
+
@property
|
|
336
|
+
def is_active(self) -> bool:
|
|
337
|
+
"""
|
|
338
|
+
Check if the trigger is currently active.
|
|
339
|
+
"""
|
|
340
|
+
return self.pb2.active
|
|
341
|
+
|
|
342
|
+
def _rich_automation(self, automation: common_pb2.TriggerAutomationSpec):
|
|
343
|
+
"""
|
|
344
|
+
Generate rich representation fields for the automation specification.
|
|
345
|
+
"""
|
|
346
|
+
if automation.type == common_pb2.TriggerAutomationSpec.type.TYPE_NONE:
|
|
347
|
+
yield "none", None
|
|
348
|
+
elif automation.type == common_pb2.TriggerAutomationSpec.type.TYPE_SCHEDULE:
|
|
349
|
+
if automation.schedule.cron is not None:
|
|
350
|
+
yield "cron", automation.schedule.cron
|
|
351
|
+
elif automation.schedule.rate is not None:
|
|
352
|
+
r = automation.schedule.rate
|
|
353
|
+
yield (
|
|
354
|
+
"fixed_rate",
|
|
355
|
+
(
|
|
356
|
+
f"Every [{r.value}] {r.unit} starting at "
|
|
357
|
+
f"{r.start_time.ToDatetime() if automation.HasField('start_time') else 'now'}"
|
|
358
|
+
),
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
def __rich_repr__(self):
|
|
362
|
+
"""
|
|
363
|
+
Rich representation of the Trigger object for pretty printing.
|
|
364
|
+
"""
|
|
365
|
+
yield "task_name", self.task_name
|
|
366
|
+
yield "name", self.name
|
|
367
|
+
yield from self._rich_automation(self.pb2.automation_spec)
|
|
368
|
+
yield "auto_activate", self.is_active
|
flyte/remote/_user.py
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
from flyteidl.service import identity_pb2
|
|
6
|
+
from flyteidl.service.identity_pb2 import UserInfoResponse
|
|
7
|
+
|
|
8
|
+
from .._initialize import ensure_client, get_client
|
|
9
|
+
from ..syncify import syncify
|
|
10
|
+
from ._common import ToJSONMixin
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class User(ToJSONMixin):
|
|
15
|
+
"""
|
|
16
|
+
Represents a user in the Flyte platform.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
pb2: UserInfoResponse
|
|
20
|
+
|
|
21
|
+
@syncify
|
|
22
|
+
@classmethod
|
|
23
|
+
async def get(cls) -> User:
|
|
24
|
+
"""
|
|
25
|
+
Fetches information about the currently logged in user.
|
|
26
|
+
Returns: A User object containing details about the user.
|
|
27
|
+
"""
|
|
28
|
+
ensure_client()
|
|
29
|
+
|
|
30
|
+
resp = await get_client().identity_service.UserInfo(identity_pb2.UserInfoRequest())
|
|
31
|
+
return cls(resp)
|
|
32
|
+
|
|
33
|
+
def subject(self) -> str:
|
|
34
|
+
"""
|
|
35
|
+
Get the subject identifier of the user.
|
|
36
|
+
"""
|
|
37
|
+
return self.pb2.subject
|
|
38
|
+
|
|
39
|
+
def name(self) -> str:
|
|
40
|
+
"""
|
|
41
|
+
Get the name of the user.
|
|
42
|
+
"""
|
|
43
|
+
return self.pb2.name
|
flyte/report/_report.py
CHANGED
|
@@ -4,10 +4,9 @@ import string
|
|
|
4
4
|
from dataclasses import dataclass, field
|
|
5
5
|
from typing import TYPE_CHECKING, Dict, List, Union
|
|
6
6
|
|
|
7
|
-
from flyte._api_commons import syncer
|
|
8
|
-
from flyte._internal.runtime import io
|
|
9
7
|
from flyte._logging import logger
|
|
10
8
|
from flyte._tools import ipython_check
|
|
9
|
+
from flyte.syncify import syncify
|
|
11
10
|
|
|
12
11
|
if TYPE_CHECKING:
|
|
13
12
|
from IPython.core.display import HTML
|
|
@@ -112,7 +111,7 @@ def get_tab(name: str, /, create_if_missing: bool = True) -> Tab:
|
|
|
112
111
|
return report.get_tab(name, create_if_missing=create_if_missing)
|
|
113
112
|
|
|
114
113
|
|
|
115
|
-
@
|
|
114
|
+
@syncify
|
|
116
115
|
async def log(content: str, do_flush: bool = False):
|
|
117
116
|
"""
|
|
118
117
|
Log content to the main tab. The content should be a valid HTML string, but not a complete HTML document,
|
|
@@ -126,13 +125,14 @@ async def log(content: str, do_flush: bool = False):
|
|
|
126
125
|
await flush.aio()
|
|
127
126
|
|
|
128
127
|
|
|
129
|
-
@
|
|
128
|
+
@syncify
|
|
130
129
|
async def flush():
|
|
131
130
|
"""
|
|
132
131
|
Flush the report.
|
|
133
132
|
"""
|
|
134
133
|
import flyte.storage as storage
|
|
135
134
|
from flyte._context import internal_ctx
|
|
135
|
+
from flyte._internal.runtime import io
|
|
136
136
|
|
|
137
137
|
if not internal_ctx().is_task_context():
|
|
138
138
|
return
|
|
@@ -145,11 +145,15 @@ async def flush():
|
|
|
145
145
|
assert report_html is not None
|
|
146
146
|
assert isinstance(report_html, str)
|
|
147
147
|
report_path = io.report_path(internal_ctx().data.task_context.output_path)
|
|
148
|
-
|
|
148
|
+
content_types = {
|
|
149
|
+
"Content-Type": "text/html", # For s3
|
|
150
|
+
"content_type": "text/html", # For gcs
|
|
151
|
+
}
|
|
152
|
+
final_path = await storage.put_stream(report_html.encode("utf-8"), to_path=report_path, attributes=content_types)
|
|
149
153
|
logger.debug(f"Report flushed to {final_path}")
|
|
150
154
|
|
|
151
155
|
|
|
152
|
-
@
|
|
156
|
+
@syncify
|
|
153
157
|
async def replace(content: str, do_flush: bool = False):
|
|
154
158
|
"""
|
|
155
159
|
Get the report. Replaces the content of the main tab.
|
flyte/storage/__init__.py
CHANGED
|
@@ -1,24 +1,36 @@
|
|
|
1
1
|
__all__ = [
|
|
2
|
+
"ABFS",
|
|
3
|
+
"GCS",
|
|
4
|
+
"S3",
|
|
5
|
+
"Storage",
|
|
6
|
+
"exists",
|
|
7
|
+
"exists_sync",
|
|
2
8
|
"get",
|
|
9
|
+
"get_configured_fsspec_kwargs",
|
|
3
10
|
"get_random_local_directory",
|
|
4
11
|
"get_random_local_path",
|
|
5
12
|
"get_stream",
|
|
6
13
|
"get_underlying_filesystem",
|
|
7
14
|
"is_remote",
|
|
8
15
|
"join",
|
|
16
|
+
"open",
|
|
9
17
|
"put",
|
|
10
18
|
"put_stream",
|
|
11
|
-
"put_stream",
|
|
12
19
|
]
|
|
13
20
|
|
|
21
|
+
from ._config import ABFS, GCS, S3, Storage
|
|
14
22
|
from ._storage import (
|
|
23
|
+
exists,
|
|
24
|
+
exists_sync,
|
|
15
25
|
get,
|
|
26
|
+
get_configured_fsspec_kwargs,
|
|
16
27
|
get_random_local_directory,
|
|
17
28
|
get_random_local_path,
|
|
18
29
|
get_stream,
|
|
19
30
|
get_underlying_filesystem,
|
|
20
31
|
is_remote,
|
|
21
32
|
join,
|
|
33
|
+
open,
|
|
22
34
|
put,
|
|
23
35
|
put_stream,
|
|
24
36
|
)
|