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.
Files changed (266) hide show
  1. flyte/__init__.py +83 -30
  2. flyte/_bin/connect.py +61 -0
  3. flyte/_bin/debug.py +38 -0
  4. flyte/_bin/runtime.py +87 -19
  5. flyte/_bin/serve.py +351 -0
  6. flyte/_build.py +3 -2
  7. flyte/_cache/cache.py +6 -5
  8. flyte/_cache/local_cache.py +216 -0
  9. flyte/_code_bundle/_ignore.py +31 -5
  10. flyte/_code_bundle/_packaging.py +42 -11
  11. flyte/_code_bundle/_utils.py +57 -34
  12. flyte/_code_bundle/bundle.py +130 -27
  13. flyte/_constants.py +1 -0
  14. flyte/_context.py +21 -5
  15. flyte/_custom_context.py +73 -0
  16. flyte/_debug/constants.py +37 -0
  17. flyte/_debug/utils.py +17 -0
  18. flyte/_debug/vscode.py +315 -0
  19. flyte/_deploy.py +396 -75
  20. flyte/_deployer.py +109 -0
  21. flyte/_environment.py +94 -11
  22. flyte/_excepthook.py +37 -0
  23. flyte/_group.py +2 -1
  24. flyte/_hash.py +1 -16
  25. flyte/_image.py +544 -231
  26. flyte/_initialize.py +456 -316
  27. flyte/_interface.py +40 -5
  28. flyte/_internal/controllers/__init__.py +22 -8
  29. flyte/_internal/controllers/_local_controller.py +159 -35
  30. flyte/_internal/controllers/_trace.py +18 -10
  31. flyte/_internal/controllers/remote/__init__.py +38 -9
  32. flyte/_internal/controllers/remote/_action.py +82 -12
  33. flyte/_internal/controllers/remote/_client.py +6 -2
  34. flyte/_internal/controllers/remote/_controller.py +290 -64
  35. flyte/_internal/controllers/remote/_core.py +155 -95
  36. flyte/_internal/controllers/remote/_informer.py +40 -20
  37. flyte/_internal/controllers/remote/_service_protocol.py +2 -2
  38. flyte/_internal/imagebuild/__init__.py +2 -10
  39. flyte/_internal/imagebuild/docker_builder.py +391 -84
  40. flyte/_internal/imagebuild/image_builder.py +111 -55
  41. flyte/_internal/imagebuild/remote_builder.py +409 -0
  42. flyte/_internal/imagebuild/utils.py +79 -0
  43. flyte/_internal/resolvers/_app_env_module.py +92 -0
  44. flyte/_internal/resolvers/_task_module.py +5 -38
  45. flyte/_internal/resolvers/app_env.py +26 -0
  46. flyte/_internal/resolvers/common.py +8 -1
  47. flyte/_internal/resolvers/default.py +2 -2
  48. flyte/_internal/runtime/convert.py +319 -36
  49. flyte/_internal/runtime/entrypoints.py +106 -18
  50. flyte/_internal/runtime/io.py +71 -23
  51. flyte/_internal/runtime/resources_serde.py +21 -7
  52. flyte/_internal/runtime/reuse.py +125 -0
  53. flyte/_internal/runtime/rusty.py +196 -0
  54. flyte/_internal/runtime/task_serde.py +239 -66
  55. flyte/_internal/runtime/taskrunner.py +48 -8
  56. flyte/_internal/runtime/trigger_serde.py +162 -0
  57. flyte/_internal/runtime/types_serde.py +7 -16
  58. flyte/_keyring/file.py +115 -0
  59. flyte/_link.py +30 -0
  60. flyte/_logging.py +241 -42
  61. flyte/_map.py +312 -0
  62. flyte/_metrics.py +59 -0
  63. flyte/_module.py +74 -0
  64. flyte/_pod.py +30 -0
  65. flyte/_resources.py +296 -33
  66. flyte/_retry.py +1 -7
  67. flyte/_reusable_environment.py +72 -7
  68. flyte/_run.py +462 -132
  69. flyte/_secret.py +47 -11
  70. flyte/_serve.py +333 -0
  71. flyte/_task.py +245 -56
  72. flyte/_task_environment.py +219 -97
  73. flyte/_task_plugins.py +47 -0
  74. flyte/_tools.py +8 -8
  75. flyte/_trace.py +15 -24
  76. flyte/_trigger.py +1027 -0
  77. flyte/_utils/__init__.py +12 -1
  78. flyte/_utils/asyn.py +3 -1
  79. flyte/_utils/async_cache.py +139 -0
  80. flyte/_utils/coro_management.py +5 -4
  81. flyte/_utils/description_parser.py +19 -0
  82. flyte/_utils/docker_credentials.py +173 -0
  83. flyte/_utils/helpers.py +45 -19
  84. flyte/_utils/module_loader.py +123 -0
  85. flyte/_utils/org_discovery.py +57 -0
  86. flyte/_utils/uv_script_parser.py +8 -1
  87. flyte/_version.py +16 -3
  88. flyte/app/__init__.py +27 -0
  89. flyte/app/_app_environment.py +362 -0
  90. flyte/app/_connector_environment.py +40 -0
  91. flyte/app/_deploy.py +130 -0
  92. flyte/app/_parameter.py +343 -0
  93. flyte/app/_runtime/__init__.py +3 -0
  94. flyte/app/_runtime/app_serde.py +383 -0
  95. flyte/app/_types.py +113 -0
  96. flyte/app/extras/__init__.py +9 -0
  97. flyte/app/extras/_auth_middleware.py +217 -0
  98. flyte/app/extras/_fastapi.py +93 -0
  99. flyte/app/extras/_model_loader/__init__.py +3 -0
  100. flyte/app/extras/_model_loader/config.py +7 -0
  101. flyte/app/extras/_model_loader/loader.py +288 -0
  102. flyte/cli/__init__.py +12 -0
  103. flyte/cli/_abort.py +28 -0
  104. flyte/cli/_build.py +114 -0
  105. flyte/cli/_common.py +493 -0
  106. flyte/cli/_create.py +371 -0
  107. flyte/cli/_delete.py +45 -0
  108. flyte/cli/_deploy.py +401 -0
  109. flyte/cli/_gen.py +316 -0
  110. flyte/cli/_get.py +446 -0
  111. flyte/cli/_option.py +33 -0
  112. flyte/{_cli → cli}/_params.py +57 -17
  113. flyte/cli/_plugins.py +209 -0
  114. flyte/cli/_prefetch.py +292 -0
  115. flyte/cli/_run.py +690 -0
  116. flyte/cli/_serve.py +338 -0
  117. flyte/cli/_update.py +86 -0
  118. flyte/cli/_user.py +20 -0
  119. flyte/cli/main.py +246 -0
  120. flyte/config/__init__.py +2 -167
  121. flyte/config/_config.py +215 -163
  122. flyte/config/_internal.py +10 -1
  123. flyte/config/_reader.py +225 -0
  124. flyte/connectors/__init__.py +11 -0
  125. flyte/connectors/_connector.py +330 -0
  126. flyte/connectors/_server.py +194 -0
  127. flyte/connectors/utils.py +159 -0
  128. flyte/errors.py +134 -2
  129. flyte/extend.py +24 -0
  130. flyte/extras/_container.py +69 -56
  131. flyte/git/__init__.py +3 -0
  132. flyte/git/_config.py +279 -0
  133. flyte/io/__init__.py +8 -1
  134. flyte/io/{structured_dataset → _dataframe}/__init__.py +32 -30
  135. flyte/io/{structured_dataset → _dataframe}/basic_dfs.py +75 -68
  136. flyte/io/{structured_dataset/structured_dataset.py → _dataframe/dataframe.py} +207 -242
  137. flyte/io/_dir.py +575 -113
  138. flyte/io/_file.py +587 -141
  139. flyte/io/_hashing_io.py +342 -0
  140. flyte/io/extend.py +7 -0
  141. flyte/models.py +635 -0
  142. flyte/prefetch/__init__.py +22 -0
  143. flyte/prefetch/_hf_model.py +563 -0
  144. flyte/remote/__init__.py +14 -3
  145. flyte/remote/_action.py +879 -0
  146. flyte/remote/_app.py +346 -0
  147. flyte/remote/_auth_metadata.py +42 -0
  148. flyte/remote/_client/_protocols.py +62 -4
  149. flyte/remote/_client/auth/_auth_utils.py +19 -0
  150. flyte/remote/_client/auth/_authenticators/base.py +8 -2
  151. flyte/remote/_client/auth/_authenticators/device_code.py +4 -5
  152. flyte/remote/_client/auth/_authenticators/factory.py +4 -0
  153. flyte/remote/_client/auth/_authenticators/passthrough.py +79 -0
  154. flyte/remote/_client/auth/_authenticators/pkce.py +17 -18
  155. flyte/remote/_client/auth/_channel.py +47 -18
  156. flyte/remote/_client/auth/_client_config.py +5 -3
  157. flyte/remote/_client/auth/_keyring.py +15 -2
  158. flyte/remote/_client/auth/_token_client.py +3 -3
  159. flyte/remote/_client/controlplane.py +206 -18
  160. flyte/remote/_common.py +66 -0
  161. flyte/remote/_data.py +107 -22
  162. flyte/remote/_logs.py +116 -33
  163. flyte/remote/_project.py +21 -19
  164. flyte/remote/_run.py +164 -631
  165. flyte/remote/_secret.py +72 -29
  166. flyte/remote/_task.py +387 -46
  167. flyte/remote/_trigger.py +368 -0
  168. flyte/remote/_user.py +43 -0
  169. flyte/report/_report.py +10 -6
  170. flyte/storage/__init__.py +13 -1
  171. flyte/storage/_config.py +237 -0
  172. flyte/storage/_parallel_reader.py +289 -0
  173. flyte/storage/_storage.py +268 -59
  174. flyte/syncify/__init__.py +56 -0
  175. flyte/syncify/_api.py +414 -0
  176. flyte/types/__init__.py +39 -0
  177. flyte/types/_interface.py +22 -7
  178. flyte/{io/pickle/transformer.py → types/_pickle.py} +37 -9
  179. flyte/types/_string_literals.py +8 -9
  180. flyte/types/_type_engine.py +226 -126
  181. flyte/types/_utils.py +1 -1
  182. flyte-2.0.0b46.data/scripts/debug.py +38 -0
  183. flyte-2.0.0b46.data/scripts/runtime.py +194 -0
  184. flyte-2.0.0b46.dist-info/METADATA +352 -0
  185. flyte-2.0.0b46.dist-info/RECORD +221 -0
  186. flyte-2.0.0b46.dist-info/entry_points.txt +8 -0
  187. flyte-2.0.0b46.dist-info/licenses/LICENSE +201 -0
  188. flyte/_api_commons.py +0 -3
  189. flyte/_cli/_common.py +0 -299
  190. flyte/_cli/_create.py +0 -42
  191. flyte/_cli/_delete.py +0 -23
  192. flyte/_cli/_deploy.py +0 -140
  193. flyte/_cli/_get.py +0 -235
  194. flyte/_cli/_run.py +0 -174
  195. flyte/_cli/main.py +0 -98
  196. flyte/_datastructures.py +0 -342
  197. flyte/_internal/controllers/pbhash.py +0 -39
  198. flyte/_protos/common/authorization_pb2.py +0 -66
  199. flyte/_protos/common/authorization_pb2.pyi +0 -108
  200. flyte/_protos/common/authorization_pb2_grpc.py +0 -4
  201. flyte/_protos/common/identifier_pb2.py +0 -71
  202. flyte/_protos/common/identifier_pb2.pyi +0 -82
  203. flyte/_protos/common/identifier_pb2_grpc.py +0 -4
  204. flyte/_protos/common/identity_pb2.py +0 -48
  205. flyte/_protos/common/identity_pb2.pyi +0 -72
  206. flyte/_protos/common/identity_pb2_grpc.py +0 -4
  207. flyte/_protos/common/list_pb2.py +0 -36
  208. flyte/_protos/common/list_pb2.pyi +0 -69
  209. flyte/_protos/common/list_pb2_grpc.py +0 -4
  210. flyte/_protos/common/policy_pb2.py +0 -37
  211. flyte/_protos/common/policy_pb2.pyi +0 -27
  212. flyte/_protos/common/policy_pb2_grpc.py +0 -4
  213. flyte/_protos/common/role_pb2.py +0 -37
  214. flyte/_protos/common/role_pb2.pyi +0 -53
  215. flyte/_protos/common/role_pb2_grpc.py +0 -4
  216. flyte/_protos/common/runtime_version_pb2.py +0 -28
  217. flyte/_protos/common/runtime_version_pb2.pyi +0 -24
  218. flyte/_protos/common/runtime_version_pb2_grpc.py +0 -4
  219. flyte/_protos/logs/dataplane/payload_pb2.py +0 -96
  220. flyte/_protos/logs/dataplane/payload_pb2.pyi +0 -168
  221. flyte/_protos/logs/dataplane/payload_pb2_grpc.py +0 -4
  222. flyte/_protos/secret/definition_pb2.py +0 -49
  223. flyte/_protos/secret/definition_pb2.pyi +0 -93
  224. flyte/_protos/secret/definition_pb2_grpc.py +0 -4
  225. flyte/_protos/secret/payload_pb2.py +0 -62
  226. flyte/_protos/secret/payload_pb2.pyi +0 -94
  227. flyte/_protos/secret/payload_pb2_grpc.py +0 -4
  228. flyte/_protos/secret/secret_pb2.py +0 -38
  229. flyte/_protos/secret/secret_pb2.pyi +0 -6
  230. flyte/_protos/secret/secret_pb2_grpc.py +0 -198
  231. flyte/_protos/secret/secret_pb2_grpc_grpc.py +0 -198
  232. flyte/_protos/validate/validate/validate_pb2.py +0 -76
  233. flyte/_protos/workflow/node_execution_service_pb2.py +0 -26
  234. flyte/_protos/workflow/node_execution_service_pb2.pyi +0 -4
  235. flyte/_protos/workflow/node_execution_service_pb2_grpc.py +0 -32
  236. flyte/_protos/workflow/queue_service_pb2.py +0 -106
  237. flyte/_protos/workflow/queue_service_pb2.pyi +0 -141
  238. flyte/_protos/workflow/queue_service_pb2_grpc.py +0 -172
  239. flyte/_protos/workflow/run_definition_pb2.py +0 -128
  240. flyte/_protos/workflow/run_definition_pb2.pyi +0 -310
  241. flyte/_protos/workflow/run_definition_pb2_grpc.py +0 -4
  242. flyte/_protos/workflow/run_logs_service_pb2.py +0 -41
  243. flyte/_protos/workflow/run_logs_service_pb2.pyi +0 -28
  244. flyte/_protos/workflow/run_logs_service_pb2_grpc.py +0 -69
  245. flyte/_protos/workflow/run_service_pb2.py +0 -133
  246. flyte/_protos/workflow/run_service_pb2.pyi +0 -175
  247. flyte/_protos/workflow/run_service_pb2_grpc.py +0 -412
  248. flyte/_protos/workflow/state_service_pb2.py +0 -58
  249. flyte/_protos/workflow/state_service_pb2.pyi +0 -71
  250. flyte/_protos/workflow/state_service_pb2_grpc.py +0 -138
  251. flyte/_protos/workflow/task_definition_pb2.py +0 -72
  252. flyte/_protos/workflow/task_definition_pb2.pyi +0 -65
  253. flyte/_protos/workflow/task_definition_pb2_grpc.py +0 -4
  254. flyte/_protos/workflow/task_service_pb2.py +0 -44
  255. flyte/_protos/workflow/task_service_pb2.pyi +0 -31
  256. flyte/_protos/workflow/task_service_pb2_grpc.py +0 -104
  257. flyte/io/_dataframe.py +0 -0
  258. flyte/io/pickle/__init__.py +0 -0
  259. flyte/remote/_console.py +0 -18
  260. flyte-0.2.0b1.dist-info/METADATA +0 -179
  261. flyte-0.2.0b1.dist-info/RECORD +0 -204
  262. flyte-0.2.0b1.dist-info/entry_points.txt +0 -3
  263. /flyte/{_cli → _debug}/__init__.py +0 -0
  264. /flyte/{_protos → _keyring}/__init__.py +0 -0
  265. {flyte-0.2.0b1.dist-info → flyte-2.0.0b46.dist-info}/WHEEL +0 -0
  266. {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]")