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/_create.py
ADDED
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from typing import Any, Dict, get_args
|
|
3
|
+
|
|
4
|
+
import rich_click as click
|
|
5
|
+
|
|
6
|
+
import flyte
|
|
7
|
+
import flyte.cli._common as common
|
|
8
|
+
from flyte.cli._option import MutuallyExclusiveOption
|
|
9
|
+
from flyte.remote import SecretTypes
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@click.group(name="create")
|
|
13
|
+
def create():
|
|
14
|
+
"""
|
|
15
|
+
Create resources in a Flyte deployment.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@create.command(cls=common.CommandBase)
|
|
20
|
+
@click.argument("name", type=str, required=True)
|
|
21
|
+
@click.option(
|
|
22
|
+
"--value",
|
|
23
|
+
help="Secret value",
|
|
24
|
+
prompt="Enter secret value",
|
|
25
|
+
hide_input=True,
|
|
26
|
+
cls=MutuallyExclusiveOption,
|
|
27
|
+
mutually_exclusive=["from_file", "from_docker_config", "registry"],
|
|
28
|
+
)
|
|
29
|
+
@click.option(
|
|
30
|
+
"--from-file",
|
|
31
|
+
type=click.Path(exists=True),
|
|
32
|
+
help="Path to the file with the binary secret.",
|
|
33
|
+
cls=MutuallyExclusiveOption,
|
|
34
|
+
mutually_exclusive=["value", "from_docker_config", "registry"],
|
|
35
|
+
)
|
|
36
|
+
@click.option(
|
|
37
|
+
"--type", type=click.Choice(get_args(SecretTypes)), default="regular", help="Type of the secret.", show_default=True
|
|
38
|
+
)
|
|
39
|
+
@click.option(
|
|
40
|
+
"--from-docker-config",
|
|
41
|
+
is_flag=True,
|
|
42
|
+
help="Create image pull secret from Docker config file (only for --type image_pull).",
|
|
43
|
+
cls=MutuallyExclusiveOption,
|
|
44
|
+
mutually_exclusive=["value", "from_file", "registry", "username", "password"],
|
|
45
|
+
)
|
|
46
|
+
@click.option(
|
|
47
|
+
"--docker-config-path",
|
|
48
|
+
type=click.Path(exists=True),
|
|
49
|
+
help="Path to Docker config file (defaults to ~/.docker/config.json or $DOCKER_CONFIG).",
|
|
50
|
+
)
|
|
51
|
+
@click.option(
|
|
52
|
+
"--registries",
|
|
53
|
+
help="Comma-separated list of registries to include (only with --from-docker-config).",
|
|
54
|
+
)
|
|
55
|
+
@click.option(
|
|
56
|
+
"--registry",
|
|
57
|
+
help="Registry hostname (e.g., ghcr.io, docker.io) for explicit credentials (only for --type image_pull).",
|
|
58
|
+
cls=MutuallyExclusiveOption,
|
|
59
|
+
mutually_exclusive=["value", "from_file", "from_docker_config"],
|
|
60
|
+
)
|
|
61
|
+
@click.option(
|
|
62
|
+
"--username",
|
|
63
|
+
help="Username for the registry (only with --registry).",
|
|
64
|
+
)
|
|
65
|
+
@click.option(
|
|
66
|
+
"--password",
|
|
67
|
+
help="Password for the registry (only with --registry). If not provided, will prompt.",
|
|
68
|
+
hide_input=True,
|
|
69
|
+
)
|
|
70
|
+
@click.pass_obj
|
|
71
|
+
def secret(
|
|
72
|
+
cfg: common.CLIConfig,
|
|
73
|
+
name: str,
|
|
74
|
+
value: str | bytes | None = None,
|
|
75
|
+
from_file: str | None = None,
|
|
76
|
+
type: SecretTypes = "regular",
|
|
77
|
+
from_docker_config: bool = False,
|
|
78
|
+
docker_config_path: str | None = None,
|
|
79
|
+
registries: str | None = None,
|
|
80
|
+
registry: str | None = None,
|
|
81
|
+
username: str | None = None,
|
|
82
|
+
password: str | None = None,
|
|
83
|
+
project: str | None = None,
|
|
84
|
+
domain: str | None = None,
|
|
85
|
+
):
|
|
86
|
+
"""
|
|
87
|
+
Create a new secret. The name of the secret is required. For example:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
$ flyte create secret my_secret --value my_value
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
If you don't provide a `--value` flag, you will be prompted to enter the
|
|
94
|
+
secret value in the terminal.
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
$ flyte create secret my_secret
|
|
98
|
+
Enter secret value:
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
If `--from-file` is specified, the value will be read from the file instead of being provided directly:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
$ flyte create secret my_secret --from-file /path/to/secret_file
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
The `--type` option can be used to create specific types of secrets.
|
|
108
|
+
Either `regular` or `image_pull` can be specified.
|
|
109
|
+
Secrets intended to access container images should be specified as `image_pull`.
|
|
110
|
+
Other secrets should be specified as `regular`.
|
|
111
|
+
If no type is specified, `regular` is assumed.
|
|
112
|
+
|
|
113
|
+
For image pull secrets, you have several options:
|
|
114
|
+
|
|
115
|
+
1. Interactive mode (prompts for registry, username, password):
|
|
116
|
+
```bash
|
|
117
|
+
$ flyte create secret my_secret --type image_pull
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
2. With explicit credentials:
|
|
121
|
+
```bash
|
|
122
|
+
$ flyte create secret my_secret --type image_pull --registry ghcr.io --username myuser
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
3. Lastly, you can create a secret from your existing Docker installation (i.e., you've run `docker login` in
|
|
126
|
+
the past) and you just want to pull from those credentials. Since you may have logged in to multiple registries,
|
|
127
|
+
you can specify which registries to include. If no registries are specified, all registries are added.
|
|
128
|
+
```bash
|
|
129
|
+
$ flyte create secret my_secret --type image_pull --from-docker-config --registries ghcr.io,docker.io
|
|
130
|
+
```
|
|
131
|
+
"""
|
|
132
|
+
from flyte.remote import Secret
|
|
133
|
+
|
|
134
|
+
# todo: remove this hack when secrets creation more easily distinguishes between org and project/domain level
|
|
135
|
+
# (and domain level) secrets
|
|
136
|
+
project = "" if project is None else project
|
|
137
|
+
domain = "" if domain is None else domain
|
|
138
|
+
cfg.init(project, domain)
|
|
139
|
+
|
|
140
|
+
# Handle image pull secret creation
|
|
141
|
+
if type == "image_pull":
|
|
142
|
+
if project != "" or domain != "":
|
|
143
|
+
raise click.ClickException("Project and domain must not be set when creating an image pull secret.")
|
|
144
|
+
|
|
145
|
+
if from_docker_config:
|
|
146
|
+
# Mode 3: From Docker config
|
|
147
|
+
from flyte._utils.docker_credentials import create_dockerconfigjson_from_config
|
|
148
|
+
|
|
149
|
+
registry_list = [r.strip() for r in registries.split(",")] if registries else None
|
|
150
|
+
try:
|
|
151
|
+
value = create_dockerconfigjson_from_config(
|
|
152
|
+
registries=registry_list,
|
|
153
|
+
docker_config_path=docker_config_path,
|
|
154
|
+
)
|
|
155
|
+
except Exception as e:
|
|
156
|
+
raise click.ClickException(f"Failed to create dockerconfigjson from Docker config: {e}") from e
|
|
157
|
+
|
|
158
|
+
elif registry:
|
|
159
|
+
# Mode 2: Explicit credentials
|
|
160
|
+
from flyte._utils.docker_credentials import create_dockerconfigjson_from_credentials
|
|
161
|
+
|
|
162
|
+
if not username:
|
|
163
|
+
username = click.prompt("Username")
|
|
164
|
+
if not password:
|
|
165
|
+
password = click.prompt("Password", hide_input=True)
|
|
166
|
+
|
|
167
|
+
value = create_dockerconfigjson_from_credentials(registry, username, password)
|
|
168
|
+
|
|
169
|
+
else:
|
|
170
|
+
# Mode 1: Interactive prompts
|
|
171
|
+
from flyte._utils.docker_credentials import create_dockerconfigjson_from_credentials
|
|
172
|
+
|
|
173
|
+
registry = click.prompt("Registry (e.g., ghcr.io, docker.io)")
|
|
174
|
+
username = click.prompt("Username")
|
|
175
|
+
password = click.prompt("Password", hide_input=True)
|
|
176
|
+
|
|
177
|
+
value = create_dockerconfigjson_from_credentials(registry, username, password)
|
|
178
|
+
|
|
179
|
+
elif from_file:
|
|
180
|
+
with open(from_file, "rb") as f:
|
|
181
|
+
value = f.read()
|
|
182
|
+
|
|
183
|
+
# Encode string values to bytes
|
|
184
|
+
if isinstance(value, str):
|
|
185
|
+
value = value.encode("utf-8")
|
|
186
|
+
|
|
187
|
+
Secret.create(name=name, value=value, type=type)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
@create.command(cls=common.CommandBase)
|
|
191
|
+
@click.option("--endpoint", type=str, help="Endpoint of the Flyte backend.")
|
|
192
|
+
@click.option("--insecure", is_flag=True, help="Use an insecure connection to the Flyte backend.")
|
|
193
|
+
@click.option(
|
|
194
|
+
"--org",
|
|
195
|
+
type=str,
|
|
196
|
+
required=False,
|
|
197
|
+
help="Organization to use. This will override the organization in the configuration file.",
|
|
198
|
+
)
|
|
199
|
+
@click.option(
|
|
200
|
+
"-o",
|
|
201
|
+
"--output",
|
|
202
|
+
type=click.Path(exists=False, writable=True),
|
|
203
|
+
default=Path.cwd() / ".flyte" / "config.yaml",
|
|
204
|
+
help="Path to the output directory where the configuration will be saved. Defaults to current directory.",
|
|
205
|
+
show_default=True,
|
|
206
|
+
)
|
|
207
|
+
@click.option(
|
|
208
|
+
"--force",
|
|
209
|
+
is_flag=True,
|
|
210
|
+
default=False,
|
|
211
|
+
help="Force overwrite of the configuration file if it already exists.",
|
|
212
|
+
show_default=True,
|
|
213
|
+
)
|
|
214
|
+
@click.option(
|
|
215
|
+
"--image-builder",
|
|
216
|
+
"--builder",
|
|
217
|
+
type=click.Choice(["local", "remote"]),
|
|
218
|
+
default="local",
|
|
219
|
+
help="Image builder to use for building images. Defaults to 'local'.",
|
|
220
|
+
show_default=True,
|
|
221
|
+
)
|
|
222
|
+
@click.option(
|
|
223
|
+
"--auth-type",
|
|
224
|
+
type=click.Choice(common.ALL_AUTH_OPTIONS, case_sensitive=False),
|
|
225
|
+
default=None,
|
|
226
|
+
help="Authentication type to use for the Flyte backend. Defaults to 'pkce'.",
|
|
227
|
+
show_default=True,
|
|
228
|
+
required=False,
|
|
229
|
+
)
|
|
230
|
+
def config(
|
|
231
|
+
output: str,
|
|
232
|
+
endpoint: str | None = None,
|
|
233
|
+
insecure: bool = False,
|
|
234
|
+
org: str | None = None,
|
|
235
|
+
project: str | None = None,
|
|
236
|
+
domain: str | None = None,
|
|
237
|
+
force: bool = False,
|
|
238
|
+
image_builder: str | None = None,
|
|
239
|
+
auth_type: str | None = None,
|
|
240
|
+
):
|
|
241
|
+
"""
|
|
242
|
+
Creates a configuration file for Flyte CLI.
|
|
243
|
+
If the `--output` option is not specified, it will create a file named `config.yaml` in the current directory.
|
|
244
|
+
If the file already exists, it will raise an error unless the `--force` option is used.
|
|
245
|
+
"""
|
|
246
|
+
import yaml
|
|
247
|
+
|
|
248
|
+
from flyte._utils import org_from_endpoint, sanitize_endpoint
|
|
249
|
+
|
|
250
|
+
output_path = Path(output)
|
|
251
|
+
|
|
252
|
+
if not output_path.parent.exists():
|
|
253
|
+
output_path.parent.mkdir(parents=True)
|
|
254
|
+
|
|
255
|
+
if output_path.exists() and not force:
|
|
256
|
+
force = click.confirm(f"Overwrite [{output_path}]?", default=False)
|
|
257
|
+
if not force:
|
|
258
|
+
click.echo(f"Will not overwrite the existing config file at {output_path}")
|
|
259
|
+
return
|
|
260
|
+
|
|
261
|
+
admin: Dict[str, Any] = {}
|
|
262
|
+
if endpoint:
|
|
263
|
+
endpoint = sanitize_endpoint(endpoint)
|
|
264
|
+
admin["endpoint"] = endpoint
|
|
265
|
+
if insecure:
|
|
266
|
+
admin["insecure"] = insecure
|
|
267
|
+
if auth_type:
|
|
268
|
+
admin["authType"] = common.sanitize_auth_type(auth_type)
|
|
269
|
+
|
|
270
|
+
if not org and endpoint:
|
|
271
|
+
org = org_from_endpoint(endpoint)
|
|
272
|
+
|
|
273
|
+
task: Dict[str, str] = {}
|
|
274
|
+
if org:
|
|
275
|
+
task["org"] = org
|
|
276
|
+
if project:
|
|
277
|
+
task["project"] = project
|
|
278
|
+
if domain:
|
|
279
|
+
task["domain"] = domain
|
|
280
|
+
|
|
281
|
+
image: Dict[str, str] = {}
|
|
282
|
+
if image_builder:
|
|
283
|
+
image["builder"] = image_builder
|
|
284
|
+
|
|
285
|
+
if not admin and not task:
|
|
286
|
+
raise click.BadParameter("At least one of --endpoint or --org must be provided.")
|
|
287
|
+
|
|
288
|
+
with open(output_path, "w") as f:
|
|
289
|
+
d: Dict[str, Any] = {}
|
|
290
|
+
if admin:
|
|
291
|
+
d["admin"] = admin
|
|
292
|
+
if task:
|
|
293
|
+
d["task"] = task
|
|
294
|
+
if image:
|
|
295
|
+
d["image"] = image
|
|
296
|
+
yaml.dump(d, f)
|
|
297
|
+
|
|
298
|
+
click.echo(f"Config file written to {output_path}")
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
@create.command(cls=common.CommandBase)
|
|
302
|
+
@click.argument("task_name", type=str, required=True)
|
|
303
|
+
@click.argument("name", type=str, required=True)
|
|
304
|
+
@click.option(
|
|
305
|
+
"--schedule",
|
|
306
|
+
type=str,
|
|
307
|
+
required=True,
|
|
308
|
+
help="Cron schedule for the trigger. Defaults to every minute.",
|
|
309
|
+
show_default=True,
|
|
310
|
+
)
|
|
311
|
+
@click.option(
|
|
312
|
+
"--description",
|
|
313
|
+
type=str,
|
|
314
|
+
default="",
|
|
315
|
+
help="Description of the trigger.",
|
|
316
|
+
show_default=True,
|
|
317
|
+
)
|
|
318
|
+
@click.option(
|
|
319
|
+
"--auto-activate",
|
|
320
|
+
is_flag=True,
|
|
321
|
+
default=True,
|
|
322
|
+
help="Whether the trigger should not be automatically activated. Defaults to True.",
|
|
323
|
+
show_default=True,
|
|
324
|
+
)
|
|
325
|
+
@click.option(
|
|
326
|
+
"--trigger-time-var",
|
|
327
|
+
type=str,
|
|
328
|
+
default="trigger_time",
|
|
329
|
+
help="Variable name for the trigger time in the task inputs. Defaults to 'trigger_time'.",
|
|
330
|
+
show_default=True,
|
|
331
|
+
)
|
|
332
|
+
@click.pass_obj
|
|
333
|
+
def trigger(
|
|
334
|
+
cfg: common.CLIConfig,
|
|
335
|
+
task_name: str,
|
|
336
|
+
name: str,
|
|
337
|
+
schedule: str,
|
|
338
|
+
trigger_time_var: str = "trigger_time",
|
|
339
|
+
auto_activate: bool = True,
|
|
340
|
+
description: str = "",
|
|
341
|
+
project: str | None = None,
|
|
342
|
+
domain: str | None = None,
|
|
343
|
+
):
|
|
344
|
+
"""
|
|
345
|
+
Create a new trigger for a task. The task name and trigger name are required.
|
|
346
|
+
|
|
347
|
+
Example:
|
|
348
|
+
|
|
349
|
+
```bash
|
|
350
|
+
$ flyte create trigger my_task my_trigger --schedule "0 0 * * *"
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
This will create a trigger that runs every day at midnight.
|
|
354
|
+
"""
|
|
355
|
+
from flyte.remote import Trigger
|
|
356
|
+
|
|
357
|
+
cfg.init(project, domain)
|
|
358
|
+
console = common.get_console()
|
|
359
|
+
|
|
360
|
+
trigger = flyte.Trigger(
|
|
361
|
+
name=name,
|
|
362
|
+
automation=flyte.Cron(schedule),
|
|
363
|
+
description=description,
|
|
364
|
+
auto_activate=auto_activate,
|
|
365
|
+
inputs={trigger_time_var: flyte.TriggerTime}, # Use the trigger time variable in inputs
|
|
366
|
+
env_vars=None,
|
|
367
|
+
interruptible=None,
|
|
368
|
+
)
|
|
369
|
+
with console.status("Creating trigger..."):
|
|
370
|
+
v = Trigger.create(trigger, task_name=task_name)
|
|
371
|
+
console.print(f"[bold green]Trigger {v.name} created successfully![/bold green]")
|
flyte/cli/_delete.py
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import rich_click as click
|
|
2
|
+
|
|
3
|
+
import flyte.cli._common as common
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@click.group(name="delete")
|
|
7
|
+
def delete():
|
|
8
|
+
"""
|
|
9
|
+
Remove resources from a Flyte deployment.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@delete.command(cls=common.CommandBase)
|
|
14
|
+
@click.argument("name", type=str, required=True)
|
|
15
|
+
@click.pass_obj
|
|
16
|
+
def secret(cfg: common.CLIConfig, name: str, project: str | None = None, domain: str | None = None):
|
|
17
|
+
"""
|
|
18
|
+
Delete a secret. The name of the secret is required.
|
|
19
|
+
"""
|
|
20
|
+
from flyte.remote import Secret
|
|
21
|
+
|
|
22
|
+
cfg.init(project, domain)
|
|
23
|
+
console = common.get_console()
|
|
24
|
+
with console.status(f"Deleting secret {name}..."):
|
|
25
|
+
Secret.delete(name=name)
|
|
26
|
+
console.print(f"Successfully deleted secret {name}.")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@delete.command(cls=common.CommandBase)
|
|
30
|
+
@click.argument("name", type=str, required=True)
|
|
31
|
+
@click.argument("task-name", type=str, required=True)
|
|
32
|
+
@click.pass_obj
|
|
33
|
+
def trigger(cfg: common.CLIConfig, name: str, task_name: str, project: str | None = None, domain: str | None = None):
|
|
34
|
+
"""
|
|
35
|
+
Delete a trigger. The name of the trigger is required.
|
|
36
|
+
"""
|
|
37
|
+
from flyte.remote import Trigger
|
|
38
|
+
|
|
39
|
+
cfg.init(project, domain)
|
|
40
|
+
console = common.get_console()
|
|
41
|
+
|
|
42
|
+
with console.status(f"Deleting trigger {name}..."):
|
|
43
|
+
Trigger.delete(name=name, task_name=task_name)
|
|
44
|
+
|
|
45
|
+
console.log(f"[green]Successfully deleted trigger {name}[/green]")
|