flyte 0.0.1b3__py3-none-any.whl → 0.2.0b0__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/_cli/_common.py +12 -0
- {union → flyte}/_cli/_params.py +106 -147
- flyte/_cli/_run.py +24 -2
- flyte/_cli/main.py +28 -2
- flyte/_image.py +1 -2
- flyte/_initialize.py +24 -15
- flyte/_internal/runtime/convert.py +6 -0
- flyte/_run.py +0 -1
- flyte/_version.py +2 -2
- flyte/config/__init__.py +168 -0
- flyte/config/_config.py +196 -0
- flyte/config/_internal.py +64 -0
- flyte/remote/_console.py +1 -1
- flyte/types/_type_engine.py +4 -3
- {flyte-0.0.1b3.dist-info → flyte-0.2.0b0.dist-info}/METADATA +1 -1
- flyte-0.2.0b0.dist-info/RECORD +204 -0
- 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/authorization_pb2_grpc.py +0 -4
- union/_protos/common/identifier_pb2.py +0 -71
- union/_protos/common/identifier_pb2.pyi +0 -82
- union/_protos/common/identifier_pb2_grpc.py +0 -4
- 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
- {flyte-0.0.1b3.dist-info → flyte-0.2.0b0.dist-info}/WHEEL +0 -0
- {flyte-0.0.1b3.dist-info → flyte-0.2.0b0.dist-info}/entry_points.txt +0 -0
- {flyte-0.0.1b3.dist-info → flyte-0.2.0b0.dist-info}/top_level.txt +0 -0
union/_cli/_create.py
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
from typing import get_args
|
|
2
|
-
|
|
3
|
-
import rich_click as click
|
|
4
|
-
|
|
5
|
-
import union._cli._common as common
|
|
6
|
-
from union.remote._secret import SecretTypes
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
@click.group(name="create")
|
|
10
|
-
def create():
|
|
11
|
-
"""
|
|
12
|
-
Create a new task or environment.
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
@create.command(cls=common.CommandBase)
|
|
17
|
-
@click.argument("name", type=str, required=True)
|
|
18
|
-
@click.argument("value", type=str, required=False)
|
|
19
|
-
@click.option("--from-file", type=click.Path(exists=True), help="Path to the file with the binary secret.")
|
|
20
|
-
@click.option("--type", type=click.Choice(get_args(SecretTypes)), default="regular", help="Type of the secret.")
|
|
21
|
-
@click.pass_obj
|
|
22
|
-
def secret(
|
|
23
|
-
cfg: common.CLIConfig,
|
|
24
|
-
name: str,
|
|
25
|
-
value: str | None = None,
|
|
26
|
-
from_file: str | None = None,
|
|
27
|
-
type: SecretTypes = "regular",
|
|
28
|
-
project: str | None = None,
|
|
29
|
-
domain: str | None = None,
|
|
30
|
-
):
|
|
31
|
-
"""
|
|
32
|
-
Create a new secret.
|
|
33
|
-
"""
|
|
34
|
-
from union.remote import Secret
|
|
35
|
-
|
|
36
|
-
cfg.init(project, domain)
|
|
37
|
-
if from_file:
|
|
38
|
-
with open(from_file, "rb") as f:
|
|
39
|
-
value = f.read()
|
|
40
|
-
Secret.create(name=name, value=value, type=type)
|
union/_cli/_delete.py
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import rich_click as click
|
|
2
|
-
|
|
3
|
-
import union._cli._common as common
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
@click.group(name="delete")
|
|
7
|
-
def delete():
|
|
8
|
-
"""
|
|
9
|
-
Delete a task or environment.
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
@click.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.
|
|
19
|
-
"""
|
|
20
|
-
from union.remote import Secret
|
|
21
|
-
|
|
22
|
-
cfg.init(project, domain)
|
|
23
|
-
Secret.delete(name=name)
|
union/_cli/_deploy.py
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass, fields
|
|
2
|
-
from pathlib import Path
|
|
3
|
-
from types import ModuleType
|
|
4
|
-
from typing import Any, Dict, List, cast
|
|
5
|
-
|
|
6
|
-
import click
|
|
7
|
-
|
|
8
|
-
import union
|
|
9
|
-
|
|
10
|
-
from .._code_bundle._utils import CopyFiles
|
|
11
|
-
from . import _common as common
|
|
12
|
-
from ._common import CLIConfig
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
@dataclass
|
|
16
|
-
class DeployArguments:
|
|
17
|
-
project: str = common.make_click_option_field(common.PROJECT_OPTION)
|
|
18
|
-
domain: str = common.make_click_option_field(common.DOMAIN_OPTION)
|
|
19
|
-
dry_run: bool = common.make_click_option_field(common.DRY_RUN_OPTION)
|
|
20
|
-
copy_style: CopyFiles = common.make_click_option_field(
|
|
21
|
-
click.Option(
|
|
22
|
-
["--copy-style"],
|
|
23
|
-
type=click.Choice(["loaded_modules", "all_files", "none"]),
|
|
24
|
-
default="loaded_modules",
|
|
25
|
-
help="Copy style to use when running the task",
|
|
26
|
-
)
|
|
27
|
-
)
|
|
28
|
-
version: CopyFiles = common.make_click_option_field(
|
|
29
|
-
click.Option(
|
|
30
|
-
["--version"],
|
|
31
|
-
type=str,
|
|
32
|
-
required=False,
|
|
33
|
-
help="If no files are copied, user must specify a version to register tasks with",
|
|
34
|
-
)
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
@classmethod
|
|
38
|
-
def from_dict(cls, d: Dict[str, Any]) -> "DeployArguments":
|
|
39
|
-
return cls(**d)
|
|
40
|
-
|
|
41
|
-
@classmethod
|
|
42
|
-
def options(cls) -> List[click.Option]:
|
|
43
|
-
"""
|
|
44
|
-
Return the set of base parameters added to every pyflyte run workflow subcommand.
|
|
45
|
-
"""
|
|
46
|
-
return [common.get_option_from_metadata(f.metadata) for f in fields(cls) if f.metadata]
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
class DeployEnvCommand(click.Command):
|
|
50
|
-
def __init__(self, obj_name: str, obj: Any, deploy_args: DeployArguments, *args, **kwargs):
|
|
51
|
-
self.obj_name = obj_name
|
|
52
|
-
self.obj = obj
|
|
53
|
-
self.deploy_args = deploy_args
|
|
54
|
-
super().__init__(name=obj_name, *args, **kwargs)
|
|
55
|
-
|
|
56
|
-
def invoke(self, ctx):
|
|
57
|
-
print(f"Deploying environment: {self.obj_name}")
|
|
58
|
-
obj: CLIConfig = ctx.obj
|
|
59
|
-
obj.remote_init(self.deploy_args.project, self.deploy_args.domain)
|
|
60
|
-
return union.deploy(
|
|
61
|
-
self.obj,
|
|
62
|
-
dryrun=self.deploy_args.dry_run,
|
|
63
|
-
copy_style=self.deploy_args.copy_style,
|
|
64
|
-
version=self.deploy_args.version,
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
class EnvPerFileGroup(common.ObjectsPerFileGroup):
|
|
69
|
-
"""
|
|
70
|
-
Group that creates a command for each task in the current directory that is not __init__.py.
|
|
71
|
-
"""
|
|
72
|
-
|
|
73
|
-
def __init__(self, filename: Path, deploy_args: DeployArguments, *args, **kwargs):
|
|
74
|
-
super().__init__(*args, filename=filename, **kwargs)
|
|
75
|
-
self.deploy_args = deploy_args
|
|
76
|
-
|
|
77
|
-
def _filter_objects(self, module: ModuleType) -> Dict[str, Any]:
|
|
78
|
-
return {k: v for k, v in module.__dict__.items() if isinstance(v, union.TaskEnvironment)}
|
|
79
|
-
|
|
80
|
-
def _get_command_for_obj(self, ctx: click.Context, obj_name: str, obj: Any) -> click.Command:
|
|
81
|
-
obj = cast(union.TaskEnvironment, obj)
|
|
82
|
-
return DeployEnvCommand(
|
|
83
|
-
obj_name=obj_name,
|
|
84
|
-
obj=obj,
|
|
85
|
-
help=obj.description,
|
|
86
|
-
deploy_args=self.deploy_args,
|
|
87
|
-
)
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
class EnvFiles(common.FileGroup):
|
|
91
|
-
"""
|
|
92
|
-
Group that creates a command for each file in the current directory that is not __init__.py.
|
|
93
|
-
"""
|
|
94
|
-
|
|
95
|
-
common_options_enabled = False
|
|
96
|
-
|
|
97
|
-
def __init__(
|
|
98
|
-
self,
|
|
99
|
-
*args,
|
|
100
|
-
**kwargs,
|
|
101
|
-
):
|
|
102
|
-
if "params" not in kwargs:
|
|
103
|
-
kwargs["params"] = []
|
|
104
|
-
kwargs["params"].extend(DeployArguments.options())
|
|
105
|
-
super().__init__(*args, **kwargs)
|
|
106
|
-
|
|
107
|
-
def get_command(self, ctx, filename):
|
|
108
|
-
deploy_args = DeployArguments.from_dict(ctx.params)
|
|
109
|
-
return EnvPerFileGroup(
|
|
110
|
-
filename=Path(filename),
|
|
111
|
-
deploy_args=deploy_args,
|
|
112
|
-
name=filename,
|
|
113
|
-
help=f"Run, functions decorated `env.task` or instances of Tasks in {filename}",
|
|
114
|
-
)
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
deploy = EnvFiles(
|
|
118
|
-
name="deploy",
|
|
119
|
-
help="deploy one or more environments from a python file.",
|
|
120
|
-
)
|
union/_cli/_get.py
DELETED
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
import asyncio
|
|
2
|
-
|
|
3
|
-
import rich_click as click
|
|
4
|
-
from rich.console import Console
|
|
5
|
-
|
|
6
|
-
from . import _common as common
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
@click.group(name="get")
|
|
10
|
-
def get():
|
|
11
|
-
"""
|
|
12
|
-
Get the value of a task or environment.
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
@get.command()
|
|
17
|
-
@click.argument("name", type=str, required=False)
|
|
18
|
-
@click.pass_obj
|
|
19
|
-
def project(cfg: common.CLIConfig, name: str | None = None):
|
|
20
|
-
"""
|
|
21
|
-
Get the current project.
|
|
22
|
-
"""
|
|
23
|
-
from union.remote import Project
|
|
24
|
-
|
|
25
|
-
print(cfg)
|
|
26
|
-
cfg.init()
|
|
27
|
-
|
|
28
|
-
console = Console()
|
|
29
|
-
if name:
|
|
30
|
-
console.print(Project.get(name))
|
|
31
|
-
else:
|
|
32
|
-
console.print(common.get_table("Projects", Project.listall()))
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
@get.command(cls=common.CommandBase)
|
|
36
|
-
@click.argument("name", type=str, required=False)
|
|
37
|
-
@click.pass_obj
|
|
38
|
-
def run(cfg: common.CLIConfig, name: str | None = None, project: str | None = None, domain: str | None = None):
|
|
39
|
-
"""
|
|
40
|
-
Get the current run.
|
|
41
|
-
"""
|
|
42
|
-
from union.remote import Run, RunDetails
|
|
43
|
-
|
|
44
|
-
cfg.init(project=project, domain=domain)
|
|
45
|
-
|
|
46
|
-
console = Console()
|
|
47
|
-
if name:
|
|
48
|
-
details = RunDetails.get(name=name)
|
|
49
|
-
console.print(details)
|
|
50
|
-
else:
|
|
51
|
-
console.print(common.get_table("Runs", Run.listall()))
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
@get.command(cls=common.CommandBase)
|
|
55
|
-
@click.argument("name", type=str, required=False)
|
|
56
|
-
@click.argument("version", type=str, required=False)
|
|
57
|
-
@click.pass_obj
|
|
58
|
-
def task(
|
|
59
|
-
cfg: common.CLIConfig,
|
|
60
|
-
name: str | None = None,
|
|
61
|
-
version: str | None = None,
|
|
62
|
-
project: str | None = None,
|
|
63
|
-
domain: str | None = None,
|
|
64
|
-
):
|
|
65
|
-
"""
|
|
66
|
-
Get the current task.
|
|
67
|
-
"""
|
|
68
|
-
from union.remote import Task
|
|
69
|
-
|
|
70
|
-
cfg.init(project=project, domain=domain)
|
|
71
|
-
|
|
72
|
-
console = Console()
|
|
73
|
-
if name:
|
|
74
|
-
v = Task.get(name=name, version=version)
|
|
75
|
-
if v is None:
|
|
76
|
-
raise click.BadParameter(f"Task {name} not found.")
|
|
77
|
-
t = v.fetch()
|
|
78
|
-
console.print(t)
|
|
79
|
-
else:
|
|
80
|
-
raise click.BadParameter("Task listing is not supported yet, please provide a name.")
|
|
81
|
-
# console.print(common.get_table("Tasks", Task.listall()))
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
@get.command(cls=common.CommandBase)
|
|
85
|
-
@click.argument("run_name", type=str, required=True)
|
|
86
|
-
@click.argument("action_name", type=str, required=False)
|
|
87
|
-
@click.pass_obj
|
|
88
|
-
def action(
|
|
89
|
-
cfg: common.CLIConfig,
|
|
90
|
-
run_name: str,
|
|
91
|
-
action_name: str | None = None,
|
|
92
|
-
project: str | None = None,
|
|
93
|
-
domain: str | None = None,
|
|
94
|
-
):
|
|
95
|
-
"""
|
|
96
|
-
Get all actions for a run or details for a specific action.
|
|
97
|
-
"""
|
|
98
|
-
import union.remote as remote
|
|
99
|
-
|
|
100
|
-
cfg.init(project=project, domain=domain)
|
|
101
|
-
|
|
102
|
-
console = Console()
|
|
103
|
-
if action_name:
|
|
104
|
-
console.print(remote.Action.get(run_name=run_name, name=action_name))
|
|
105
|
-
else:
|
|
106
|
-
# List all actions for the run
|
|
107
|
-
console.print(common.get_table(f"Actions for {run_name}", remote.Action.listall(for_run_name=run_name)))
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
@get.command(cls=common.CommandBase)
|
|
111
|
-
@click.argument("run_name", type=str, required=False)
|
|
112
|
-
@click.argument("action_name", type=str, required=False)
|
|
113
|
-
@click.pass_obj
|
|
114
|
-
def logs(
|
|
115
|
-
cfg: common.CLIConfig,
|
|
116
|
-
run_name: str,
|
|
117
|
-
action_name: str | None = None,
|
|
118
|
-
project: str | None = None,
|
|
119
|
-
domain: str | None = None,
|
|
120
|
-
):
|
|
121
|
-
"""
|
|
122
|
-
Get the current run.
|
|
123
|
-
"""
|
|
124
|
-
import union.remote as remote
|
|
125
|
-
|
|
126
|
-
cfg.init(project=project, domain=domain)
|
|
127
|
-
|
|
128
|
-
async def _run_log_view(_obj):
|
|
129
|
-
task = asyncio.create_task(_obj.show_logs())
|
|
130
|
-
try:
|
|
131
|
-
await task
|
|
132
|
-
except KeyboardInterrupt:
|
|
133
|
-
task.cancel()
|
|
134
|
-
|
|
135
|
-
if action_name:
|
|
136
|
-
obj = remote.Action.get(run_name=run_name, name=action_name)
|
|
137
|
-
else:
|
|
138
|
-
obj = remote.Run.get(run_name)
|
|
139
|
-
asyncio.run(_run_log_view(obj))
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
@get.command(cls=common.CommandBase)
|
|
143
|
-
@click.argument("name", type=str, required=False)
|
|
144
|
-
@click.pass_obj
|
|
145
|
-
def secret(
|
|
146
|
-
cfg: common.CLIConfig,
|
|
147
|
-
name: str | None = None,
|
|
148
|
-
project: str | None = None,
|
|
149
|
-
domain: str | None = None,
|
|
150
|
-
):
|
|
151
|
-
"""
|
|
152
|
-
Get the current secret.
|
|
153
|
-
"""
|
|
154
|
-
import union.remote as remote
|
|
155
|
-
|
|
156
|
-
cfg.init(project=project, domain=domain)
|
|
157
|
-
|
|
158
|
-
console = Console()
|
|
159
|
-
if name:
|
|
160
|
-
console.print(remote.Secret.get(name))
|
|
161
|
-
else:
|
|
162
|
-
console.print(common.get_table("Secrets", remote.Secret.listall()))
|
union/_cli/_run.py
DELETED
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from union._logging import logger
|
|
4
|
-
from dataclasses import dataclass, fields
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
from types import ModuleType
|
|
7
|
-
from typing import Any, Dict, List, cast
|
|
8
|
-
|
|
9
|
-
import click
|
|
10
|
-
|
|
11
|
-
import union
|
|
12
|
-
|
|
13
|
-
from .._code_bundle._utils import CopyFiles
|
|
14
|
-
from .._initialize import initialize_in_cluster, S3
|
|
15
|
-
from .._task import TaskTemplate
|
|
16
|
-
from . import _common as common
|
|
17
|
-
from ._common import CLIConfig
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
@dataclass
|
|
21
|
-
class RunArguments:
|
|
22
|
-
project: str = common.make_click_option_field(common.PROJECT_OPTION)
|
|
23
|
-
domain: str = common.make_click_option_field(common.DOMAIN_OPTION)
|
|
24
|
-
local: bool = common.make_click_option_field(
|
|
25
|
-
click.Option(
|
|
26
|
-
["--local"],
|
|
27
|
-
is_flag=True,
|
|
28
|
-
help="Run the task locally",
|
|
29
|
-
)
|
|
30
|
-
)
|
|
31
|
-
hybrid: bool = common.make_click_option_field(
|
|
32
|
-
click.Option(
|
|
33
|
-
["--hybrid"],
|
|
34
|
-
is_flag=True,
|
|
35
|
-
help="hybrid mode",
|
|
36
|
-
)
|
|
37
|
-
)
|
|
38
|
-
copy_style: CopyFiles = common.make_click_option_field(
|
|
39
|
-
click.Option(
|
|
40
|
-
["--copy-style"],
|
|
41
|
-
type=click.Choice(["loaded_modules", "all_files", "none"]),
|
|
42
|
-
default="loaded_modules",
|
|
43
|
-
help="Copy style to use when running the task",
|
|
44
|
-
)
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
@classmethod
|
|
48
|
-
def from_dict(cls, d: Dict[str, Any]) -> RunArguments:
|
|
49
|
-
return cls(**d)
|
|
50
|
-
|
|
51
|
-
@classmethod
|
|
52
|
-
def options(cls) -> List[click.Option]:
|
|
53
|
-
"""
|
|
54
|
-
Return the set of base parameters added to run subcommand.
|
|
55
|
-
"""
|
|
56
|
-
return [common.get_option_from_metadata(f.metadata) for f in fields(cls) if f.metadata]
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
class RunTaskCommand(click.Command):
|
|
60
|
-
def __init__(self, obj_name: str, obj: Any, run_args: RunArguments, *args, **kwargs):
|
|
61
|
-
self.obj_name = obj_name
|
|
62
|
-
self.obj = cast(TaskTemplate, obj)
|
|
63
|
-
self.run_args = run_args
|
|
64
|
-
super().__init__(name=obj_name, *args, **kwargs)
|
|
65
|
-
|
|
66
|
-
def invoke(self, ctx):
|
|
67
|
-
obj: CLIConfig = ctx.obj
|
|
68
|
-
obj.init(self.run_args.project, self.run_args.domain)
|
|
69
|
-
|
|
70
|
-
# todo: remove this when backend supports
|
|
71
|
-
from union.storage import get_random_local_path
|
|
72
|
-
|
|
73
|
-
run_name = "random-run-" + str(get_random_local_path())[-8:]
|
|
74
|
-
if self.run_args.local:
|
|
75
|
-
mode = "local"
|
|
76
|
-
elif self.run_args.hybrid:
|
|
77
|
-
mode = "hybrid"
|
|
78
|
-
# TODO configure storage correctly for cluster
|
|
79
|
-
initialize_in_cluster(storage=S3.auto())
|
|
80
|
-
else:
|
|
81
|
-
mode = "remote"
|
|
82
|
-
logger.debug(f"Running {self.obj_name} in {mode} mode")
|
|
83
|
-
r = union.with_runcontext(
|
|
84
|
-
name=run_name,
|
|
85
|
-
copy_style=self.run_args.copy_style,
|
|
86
|
-
version=self.run_args.copy_style,
|
|
87
|
-
mode=mode,
|
|
88
|
-
).run(self.obj)
|
|
89
|
-
# click.secho(f"Created Run: {r.action.id}", fg="green")
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
class TaskPerFileGroup(common.ObjectsPerFileGroup):
|
|
93
|
-
"""
|
|
94
|
-
Group that creates a command for each task in the current directory that is not __init__.py.
|
|
95
|
-
"""
|
|
96
|
-
|
|
97
|
-
def __init__(self, filename: Path, run_args: RunArguments, *args, **kwargs):
|
|
98
|
-
super().__init__(*args, filename=filename, **kwargs)
|
|
99
|
-
self.run_args = run_args
|
|
100
|
-
|
|
101
|
-
def _filter_objects(self, module: ModuleType) -> Dict[str, Any]:
|
|
102
|
-
return {k: v for k, v in module.__dict__.items() if isinstance(v, TaskTemplate)}
|
|
103
|
-
|
|
104
|
-
def _get_command_for_obj(self, ctx: click.Context, obj_name: str, obj: Any) -> click.Command:
|
|
105
|
-
obj = cast(TaskTemplate, obj)
|
|
106
|
-
return RunTaskCommand(
|
|
107
|
-
obj_name=obj_name,
|
|
108
|
-
obj=obj,
|
|
109
|
-
help=obj.docs.__help__str__() if obj.docs else None,
|
|
110
|
-
run_args=self.run_args,
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
class TaskFiles(common.FileGroup):
|
|
115
|
-
"""
|
|
116
|
-
Group that creates a command for each file in the current directory that is not __init__.py.
|
|
117
|
-
"""
|
|
118
|
-
|
|
119
|
-
common_options_enabled = False
|
|
120
|
-
|
|
121
|
-
def __init__(
|
|
122
|
-
self,
|
|
123
|
-
*args,
|
|
124
|
-
directory: Path | None = None,
|
|
125
|
-
**kwargs,
|
|
126
|
-
):
|
|
127
|
-
if "params" not in kwargs:
|
|
128
|
-
kwargs["params"] = []
|
|
129
|
-
kwargs["params"].extend(RunArguments.options())
|
|
130
|
-
super().__init__(*args, directory=directory, **kwargs)
|
|
131
|
-
|
|
132
|
-
def get_command(self, ctx, filename):
|
|
133
|
-
run_args = RunArguments.from_dict(ctx.params)
|
|
134
|
-
fp = Path(filename)
|
|
135
|
-
if not fp.exists():
|
|
136
|
-
raise click.BadParameter(f"File {filename} does not exist")
|
|
137
|
-
if fp.is_dir():
|
|
138
|
-
return TaskFiles(directory=fp)
|
|
139
|
-
return TaskPerFileGroup(
|
|
140
|
-
filename=Path(filename),
|
|
141
|
-
run_args=run_args,
|
|
142
|
-
name=filename,
|
|
143
|
-
help=f"Run, functions decorated `env.task` or instances of Tasks in {filename}",
|
|
144
|
-
)
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
run = TaskFiles(
|
|
148
|
-
name="run",
|
|
149
|
-
help="Run a task from a python file",
|
|
150
|
-
)
|
union/_cli/main.py
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import rich_click as click
|
|
2
|
-
|
|
3
|
-
from ._common import CLIConfig
|
|
4
|
-
from ._create import create
|
|
5
|
-
from ._deploy import deploy
|
|
6
|
-
from ._get import get
|
|
7
|
-
from ._run import run
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def _verbosity_to_loglevel(verbosity: int) -> int | None:
|
|
11
|
-
"""
|
|
12
|
-
Converts a verbosity level from the CLI to a logging level.
|
|
13
|
-
|
|
14
|
-
:param verbosity: verbosity level from the CLI
|
|
15
|
-
:return: logging level
|
|
16
|
-
"""
|
|
17
|
-
import logging
|
|
18
|
-
|
|
19
|
-
match verbosity:
|
|
20
|
-
case 0:
|
|
21
|
-
return None
|
|
22
|
-
case 1:
|
|
23
|
-
return logging.WARNING
|
|
24
|
-
case 2:
|
|
25
|
-
return logging.INFO
|
|
26
|
-
case _:
|
|
27
|
-
return logging.DEBUG
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
@click.group(cls=click.RichGroup)
|
|
31
|
-
@click.option(
|
|
32
|
-
"--endpoint",
|
|
33
|
-
type=str,
|
|
34
|
-
required=False,
|
|
35
|
-
help="The endpoint to connect to, this will override any config and simply used pkce to connect.",
|
|
36
|
-
)
|
|
37
|
-
@click.option(
|
|
38
|
-
"--insecure",
|
|
39
|
-
is_flag=True,
|
|
40
|
-
required=False,
|
|
41
|
-
help="insecure",
|
|
42
|
-
type=bool,
|
|
43
|
-
default=False,
|
|
44
|
-
)
|
|
45
|
-
@click.option(
|
|
46
|
-
"-v",
|
|
47
|
-
"--verbose",
|
|
48
|
-
required=False,
|
|
49
|
-
help="Show verbose messages and exception traces",
|
|
50
|
-
count=True,
|
|
51
|
-
default=0,
|
|
52
|
-
type=int,
|
|
53
|
-
)
|
|
54
|
-
@click.option(
|
|
55
|
-
"--org-override",
|
|
56
|
-
type=str,
|
|
57
|
-
required=False,
|
|
58
|
-
help="Override for org",
|
|
59
|
-
)
|
|
60
|
-
@click.pass_context
|
|
61
|
-
def main(ctx: click.Context, endpoint: str | None, insecure: bool, verbose: int, org_override: str | None):
|
|
62
|
-
"""
|
|
63
|
-
v2 cli. Root command, please use one of the subcommands.
|
|
64
|
-
"""
|
|
65
|
-
log_level = _verbosity_to_loglevel(verbose)
|
|
66
|
-
ctx.obj = CLIConfig(log_level=log_level, endpoint=endpoint, insecure=insecure, org_override=org_override)
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
main.add_command(run)
|
|
70
|
-
main.add_command(deploy)
|
|
71
|
-
main.add_command(get) # type: ignore
|
|
72
|
-
main.add_command(create) # type: ignore
|
union/_code_bundle/__init__.py
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
from ._ignore import GitIgnore, IgnoreGroup, StandardIgnore
|
|
2
|
-
from ._utils import CopyFiles
|
|
3
|
-
from .bundle import build_code_bundle, build_pkl_bundle, download_bundle
|
|
4
|
-
|
|
5
|
-
__all__ = ["CopyFiles", "build_code_bundle", "build_pkl_bundle", "default_ignores", "download_bundle"]
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
default_ignores = [GitIgnore, StandardIgnore, IgnoreGroup]
|
union/_code_bundle/_ignore.py
DELETED
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import pathlib
|
|
3
|
-
import subprocess
|
|
4
|
-
import tarfile as _tarfile
|
|
5
|
-
from abc import ABC, abstractmethod
|
|
6
|
-
from fnmatch import fnmatch
|
|
7
|
-
from pathlib import Path
|
|
8
|
-
from shutil import which
|
|
9
|
-
from typing import List, Optional, Type
|
|
10
|
-
|
|
11
|
-
from union._logging import logger
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class Ignore(ABC):
|
|
15
|
-
"""Base for Ignores, implements core logic. Children have to implement _is_ignored"""
|
|
16
|
-
|
|
17
|
-
def __init__(self, root: Path):
|
|
18
|
-
self.root = root
|
|
19
|
-
|
|
20
|
-
def is_ignored(self, path: pathlib.Path) -> bool:
|
|
21
|
-
return self._is_ignored(path)
|
|
22
|
-
|
|
23
|
-
def tar_filter(self, tarinfo: _tarfile.TarInfo) -> Optional[_tarfile.TarInfo]:
|
|
24
|
-
if self.is_ignored(pathlib.Path(tarinfo.name)):
|
|
25
|
-
return None
|
|
26
|
-
return tarinfo
|
|
27
|
-
|
|
28
|
-
@abstractmethod
|
|
29
|
-
def _is_ignored(self, path: pathlib.Path) -> bool:
|
|
30
|
-
pass
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
class GitIgnore(Ignore):
|
|
34
|
-
"""Uses git cli (if available) to list all ignored files and compare with those."""
|
|
35
|
-
|
|
36
|
-
def __init__(self, root: Path):
|
|
37
|
-
super().__init__(root)
|
|
38
|
-
self.has_git = which("git") is not None
|
|
39
|
-
self.ignored_files = self._list_ignored_files()
|
|
40
|
-
self.ignored_dirs = self._list_ignored_dirs()
|
|
41
|
-
|
|
42
|
-
def _git_wrapper(self, extra_args: List[str]) -> set[str]:
|
|
43
|
-
if self.has_git:
|
|
44
|
-
out = subprocess.run(
|
|
45
|
-
["git", "ls-files", "-io", "--exclude-standard", *extra_args],
|
|
46
|
-
cwd=self.root,
|
|
47
|
-
capture_output=True,
|
|
48
|
-
check=False,
|
|
49
|
-
)
|
|
50
|
-
if out.returncode == 0:
|
|
51
|
-
return set(out.stdout.decode("utf-8").split("\n")[:-1])
|
|
52
|
-
logger.info(f"Could not determine ignored paths due to:\n{out.stderr}\nNot applying any filters")
|
|
53
|
-
return set()
|
|
54
|
-
logger.info("No git executable found, not applying any filters")
|
|
55
|
-
return set()
|
|
56
|
-
|
|
57
|
-
def _list_ignored_files(self) -> set[str]:
|
|
58
|
-
return self._git_wrapper([])
|
|
59
|
-
|
|
60
|
-
def _list_ignored_dirs(self) -> set[str]:
|
|
61
|
-
return self._git_wrapper(["--directory"])
|
|
62
|
-
|
|
63
|
-
def _is_ignored(self, path: str) -> bool:
|
|
64
|
-
if self.ignored_files:
|
|
65
|
-
# git-ls-files uses POSIX paths
|
|
66
|
-
if Path(path).as_posix() in self.ignored_files:
|
|
67
|
-
return True
|
|
68
|
-
# Ignore empty directories
|
|
69
|
-
if os.path.isdir(os.path.join(self.root, path)) and self.ignored_dirs:
|
|
70
|
-
return Path(path).as_posix() + "/" in self.ignored_dirs
|
|
71
|
-
return False
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
STANDARD_IGNORE_PATTERNS = ["*.pyc", ".cache", ".cache/*", "__pycache__", "**/__pycache__"]
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
class StandardIgnore(Ignore):
|
|
78
|
-
"""Retains the standard ignore functionality that previously existed. Could in theory
|
|
79
|
-
by fed with custom ignore patterns from cli."""
|
|
80
|
-
|
|
81
|
-
def __init__(self, root: Path, patterns: Optional[List[str]] = None):
|
|
82
|
-
super().__init__(root)
|
|
83
|
-
self.patterns = patterns if patterns else STANDARD_IGNORE_PATTERNS
|
|
84
|
-
|
|
85
|
-
def _is_ignored(self, path: pathlib.Path) -> bool:
|
|
86
|
-
for pattern in self.patterns:
|
|
87
|
-
if fnmatch(str(path), pattern):
|
|
88
|
-
return True
|
|
89
|
-
return False
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
class IgnoreGroup(Ignore):
|
|
93
|
-
"""Groups multiple Ignores and checks a path against them. A file is ignored if any
|
|
94
|
-
Ignore considers it ignored."""
|
|
95
|
-
|
|
96
|
-
def __init__(self, root: Path, *ignores: Type[Ignore]):
|
|
97
|
-
super().__init__(root)
|
|
98
|
-
self.ignores = [ignore(root) for ignore in ignores]
|
|
99
|
-
|
|
100
|
-
def _is_ignored(self, path: pathlib.Path) -> bool:
|
|
101
|
-
for ignore in self.ignores:
|
|
102
|
-
if ignore.is_ignored(path):
|
|
103
|
-
return True
|
|
104
|
-
return False
|
|
105
|
-
|
|
106
|
-
def list_ignored(self) -> List[str]:
|
|
107
|
-
ignored = []
|
|
108
|
-
for dir, _, files in self.root.walk():
|
|
109
|
-
for file in files:
|
|
110
|
-
abs_path = dir / file
|
|
111
|
-
if self.is_ignored(abs_path):
|
|
112
|
-
ignored.append(str(abs_path.relative_to(self.root)))
|
|
113
|
-
return ignored
|