ob-metaflow 2.12.19.1__py2.py3-none-any.whl → 2.12.22.1__py2.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 ob-metaflow might be problematic. Click here for more details.
- metaflow/__init__.py +11 -21
- metaflow/client/core.py +1 -1
- metaflow/cmd/main_cli.py +3 -2
- metaflow/extension_support/__init__.py +120 -29
- metaflow/flowspec.py +4 -0
- metaflow/info_file.py +25 -0
- metaflow/metaflow_config.py +0 -1
- metaflow/metaflow_current.py +3 -1
- metaflow/metaflow_environment.py +1 -7
- metaflow/metaflow_version.py +130 -64
- metaflow/package.py +2 -1
- metaflow/plugins/argo/argo_workflows.py +47 -8
- metaflow/plugins/argo/argo_workflows_cli.py +26 -0
- metaflow/plugins/aws/batch/batch_client.py +3 -0
- metaflow/plugins/kubernetes/kube_utils.py +25 -0
- metaflow/plugins/kubernetes/kubernetes.py +3 -0
- metaflow/plugins/kubernetes/kubernetes_cli.py +84 -1
- metaflow/plugins/kubernetes/kubernetes_client.py +97 -0
- metaflow/plugins/kubernetes/kubernetes_decorator.py +4 -0
- metaflow/plugins/parallel_decorator.py +4 -0
- metaflow/plugins/pypi/bootstrap.py +2 -0
- metaflow/plugins/pypi/conda_decorator.py +7 -1
- metaflow/runner/click_api.py +13 -1
- metaflow/runner/deployer.py +9 -2
- metaflow/runner/metaflow_runner.py +4 -2
- metaflow/runner/subprocess_manager.py +8 -3
- metaflow/runner/utils.py +19 -2
- metaflow/version.py +1 -1
- {ob_metaflow-2.12.19.1.dist-info → ob_metaflow-2.12.22.1.dist-info}/METADATA +2 -2
- {ob_metaflow-2.12.19.1.dist-info → ob_metaflow-2.12.22.1.dist-info}/RECORD +34 -33
- {ob_metaflow-2.12.19.1.dist-info → ob_metaflow-2.12.22.1.dist-info}/WHEEL +1 -1
- metaflow/plugins/argo/daemon.py +0 -59
- {ob_metaflow-2.12.19.1.dist-info → ob_metaflow-2.12.22.1.dist-info}/LICENSE +0 -0
- {ob_metaflow-2.12.19.1.dist-info → ob_metaflow-2.12.22.1.dist-info}/entry_points.txt +0 -0
- {ob_metaflow-2.12.19.1.dist-info → ob_metaflow-2.12.22.1.dist-info}/top_level.txt +0 -0
|
@@ -24,6 +24,8 @@ class ParallelDecorator(StepDecorator):
|
|
|
24
24
|
The total number of tasks created by @parallel
|
|
25
25
|
- node_index : int
|
|
26
26
|
The index of the current task in all the @parallel tasks.
|
|
27
|
+
- control_task_id : Optional[str]
|
|
28
|
+
The task ID of the control task. Available to all tasks.
|
|
27
29
|
|
|
28
30
|
is_parallel -> bool
|
|
29
31
|
True if the current step is a @parallel step.
|
|
@@ -67,6 +69,7 @@ class ParallelDecorator(StepDecorator):
|
|
|
67
69
|
main_ip=os.environ.get("MF_PARALLEL_MAIN_IP", "127.0.0.1"),
|
|
68
70
|
num_nodes=int(os.environ.get("MF_PARALLEL_NUM_NODES", "1")),
|
|
69
71
|
node_index=int(os.environ.get("MF_PARALLEL_NODE_INDEX", "0")),
|
|
72
|
+
control_task_id=os.environ.get("MF_PARALLEL_CONTROL_TASK_ID", None),
|
|
70
73
|
)
|
|
71
74
|
),
|
|
72
75
|
)
|
|
@@ -177,6 +180,7 @@ def _local_multinode_control_task_step_func(
|
|
|
177
180
|
num_parallel = foreach_iter.num_parallel
|
|
178
181
|
os.environ["MF_PARALLEL_NUM_NODES"] = str(num_parallel)
|
|
179
182
|
os.environ["MF_PARALLEL_MAIN_IP"] = "127.0.0.1"
|
|
183
|
+
os.environ["MF_PARALLEL_CONTROL_TASK_ID"] = str(current.task_id)
|
|
180
184
|
|
|
181
185
|
run_id = current.run_id
|
|
182
186
|
step_name = current.step_name
|
|
@@ -103,6 +103,7 @@ if __name__ == "__main__":
|
|
|
103
103
|
echo "@EXPLICIT" > "$tmpfile";
|
|
104
104
|
ls -d {conda_pkgs_dir}/*/* >> "$tmpfile";
|
|
105
105
|
export PATH=$PATH:$(pwd)/micromamba;
|
|
106
|
+
export CONDA_PKGS_DIRS=$(pwd)/micromamba/pkgs;
|
|
106
107
|
micromamba create --yes --offline --no-deps --safety-checks=disabled --no-extra-safety-checks --prefix {prefix} --file "$tmpfile";
|
|
107
108
|
rm "$tmpfile"''',
|
|
108
109
|
]
|
|
@@ -123,6 +124,7 @@ if __name__ == "__main__":
|
|
|
123
124
|
[
|
|
124
125
|
f"""set -e;
|
|
125
126
|
export PATH=$PATH:$(pwd)/micromamba;
|
|
127
|
+
export CONDA_PKGS_DIRS=$(pwd)/micromamba/pkgs;
|
|
126
128
|
micromamba run --prefix {prefix} python -m pip --disable-pip-version-check install --root-user-action=ignore --no-compile {pypi_pkgs_dir}/*.whl --no-user"""
|
|
127
129
|
]
|
|
128
130
|
)
|
|
@@ -12,7 +12,7 @@ from metaflow.metadata import MetaDatum
|
|
|
12
12
|
from metaflow.metaflow_environment import InvalidEnvironmentException
|
|
13
13
|
from metaflow.util import get_metaflow_root
|
|
14
14
|
|
|
15
|
-
from ... import INFO_FILE
|
|
15
|
+
from ...info_file import INFO_FILE
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
class CondaStepDecorator(StepDecorator):
|
|
@@ -353,6 +353,12 @@ class CondaFlowDecorator(FlowDecorator):
|
|
|
353
353
|
def flow_init(
|
|
354
354
|
self, flow, graph, environment, flow_datastore, metadata, logger, echo, options
|
|
355
355
|
):
|
|
356
|
+
# NOTE: Important for extensions implementing custom virtual environments.
|
|
357
|
+
# Without this steps will not have an implicit conda step decorator on them unless the environment adds one in its decospecs.
|
|
358
|
+
from metaflow import decorators
|
|
359
|
+
|
|
360
|
+
decorators._attach_decorators(flow, ["conda"])
|
|
361
|
+
|
|
356
362
|
# @conda uses a conda environment to create a virtual environment.
|
|
357
363
|
# The conda environment can be created through micromamba.
|
|
358
364
|
_supported_virtual_envs = ["conda"]
|
metaflow/runner/click_api.py
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import os
|
|
1
2
|
import sys
|
|
2
3
|
|
|
3
4
|
if sys.version_info < (3, 7):
|
|
@@ -12,6 +13,7 @@ import importlib
|
|
|
12
13
|
import inspect
|
|
13
14
|
import itertools
|
|
14
15
|
import uuid
|
|
16
|
+
import json
|
|
15
17
|
from collections import OrderedDict
|
|
16
18
|
from typing import Any, Callable, Dict, List, Optional
|
|
17
19
|
from typing import OrderedDict as TOrderedDict
|
|
@@ -37,6 +39,9 @@ from metaflow.exception import MetaflowException
|
|
|
37
39
|
from metaflow.includefile import FilePathClass
|
|
38
40
|
from metaflow.parameters import JSONTypeClass, flow_context
|
|
39
41
|
|
|
42
|
+
# Define a recursive type alias for JSON
|
|
43
|
+
JSON = Union[Dict[str, "JSON"], List["JSON"], str, int, float, bool, None]
|
|
44
|
+
|
|
40
45
|
click_to_python_types = {
|
|
41
46
|
StringParamType: str,
|
|
42
47
|
IntParamType: int,
|
|
@@ -48,7 +53,7 @@ click_to_python_types = {
|
|
|
48
53
|
Tuple: tuple,
|
|
49
54
|
Choice: str,
|
|
50
55
|
File: str,
|
|
51
|
-
JSONTypeClass:
|
|
56
|
+
JSONTypeClass: JSON,
|
|
52
57
|
FilePathClass: str,
|
|
53
58
|
}
|
|
54
59
|
|
|
@@ -82,6 +87,11 @@ def _method_sanity_check(
|
|
|
82
87
|
% (supplied_k, annotations[supplied_k], defaults[supplied_k])
|
|
83
88
|
)
|
|
84
89
|
|
|
90
|
+
# because Click expects stringified JSON..
|
|
91
|
+
supplied_v = (
|
|
92
|
+
json.dumps(supplied_v) if annotations[supplied_k] == JSON else supplied_v
|
|
93
|
+
)
|
|
94
|
+
|
|
85
95
|
if supplied_k in possible_arg_params:
|
|
86
96
|
cli_name = possible_arg_params[supplied_k].opts[0].strip("-")
|
|
87
97
|
method_params["args"][cli_name] = supplied_v
|
|
@@ -142,6 +152,8 @@ loaded_modules = {}
|
|
|
142
152
|
|
|
143
153
|
|
|
144
154
|
def extract_flow_class_from_file(flow_file: str) -> FlowSpec:
|
|
155
|
+
if not os.path.exists(flow_file):
|
|
156
|
+
raise FileNotFoundError("Flow file not present at '%s'" % flow_file)
|
|
145
157
|
# Check if the module has already been loaded
|
|
146
158
|
if flow_file in loaded_modules:
|
|
147
159
|
module = loaded_modules[flow_file]
|
metaflow/runner/deployer.py
CHANGED
|
@@ -5,6 +5,8 @@ import time
|
|
|
5
5
|
import importlib
|
|
6
6
|
import functools
|
|
7
7
|
import tempfile
|
|
8
|
+
|
|
9
|
+
from subprocess import CalledProcessError
|
|
8
10
|
from typing import Optional, Dict, ClassVar
|
|
9
11
|
|
|
10
12
|
from metaflow.exception import MetaflowNotFound
|
|
@@ -25,6 +27,8 @@ def handle_timeout(
|
|
|
25
27
|
Temporary file that stores runner attribute data.
|
|
26
28
|
command_obj : CommandManager
|
|
27
29
|
Command manager object that encapsulates the running command details.
|
|
30
|
+
file_read_timeout : int
|
|
31
|
+
Timeout for reading the file.
|
|
28
32
|
|
|
29
33
|
Returns
|
|
30
34
|
-------
|
|
@@ -39,10 +43,10 @@ def handle_timeout(
|
|
|
39
43
|
"""
|
|
40
44
|
try:
|
|
41
45
|
content = read_from_file_when_ready(
|
|
42
|
-
tfp_runner_attribute.name, timeout=file_read_timeout
|
|
46
|
+
tfp_runner_attribute.name, command_obj, timeout=file_read_timeout
|
|
43
47
|
)
|
|
44
48
|
return content
|
|
45
|
-
except TimeoutError as e:
|
|
49
|
+
except (CalledProcessError, TimeoutError) as e:
|
|
46
50
|
stdout_log = open(command_obj.log_files["stdout"]).read()
|
|
47
51
|
stderr_log = open(command_obj.log_files["stderr"]).read()
|
|
48
52
|
command = " ".join(command_obj.command)
|
|
@@ -397,6 +401,9 @@ class DeployerImpl(object):
|
|
|
397
401
|
self.name = content.get("name")
|
|
398
402
|
self.flow_name = content.get("flow_name")
|
|
399
403
|
self.metadata = content.get("metadata")
|
|
404
|
+
# Additional info is used to pass additional deployer specific information.
|
|
405
|
+
# It is used in non-OSS deployers (extensions).
|
|
406
|
+
self.additional_info = content.get("additional_info", {})
|
|
400
407
|
|
|
401
408
|
if command_obj.process.returncode == 0:
|
|
402
409
|
deployed_flow = DeployedFlow(deployer=self)
|
|
@@ -2,6 +2,8 @@ import importlib
|
|
|
2
2
|
import os
|
|
3
3
|
import sys
|
|
4
4
|
import tempfile
|
|
5
|
+
|
|
6
|
+
from subprocess import CalledProcessError
|
|
5
7
|
from typing import Dict, Iterator, Optional, Tuple
|
|
6
8
|
|
|
7
9
|
from metaflow import Run, metadata
|
|
@@ -275,13 +277,13 @@ class Runner(object):
|
|
|
275
277
|
|
|
276
278
|
# Set the correct metadata from the runner_attribute file corresponding to this run.
|
|
277
279
|
content = read_from_file_when_ready(
|
|
278
|
-
tfp_runner_attribute.name, timeout=self.file_read_timeout
|
|
280
|
+
tfp_runner_attribute.name, command_obj, timeout=self.file_read_timeout
|
|
279
281
|
)
|
|
280
282
|
metadata_for_flow, pathspec = content.rsplit(":", maxsplit=1)
|
|
281
283
|
metadata(metadata_for_flow)
|
|
282
284
|
run_object = Run(pathspec, _namespace_check=False)
|
|
283
285
|
return ExecutingRun(self, command_obj, run_object)
|
|
284
|
-
except TimeoutError as e:
|
|
286
|
+
except (CalledProcessError, TimeoutError) as e:
|
|
285
287
|
stdout_log = open(command_obj.log_files["stdout"]).read()
|
|
286
288
|
stderr_log = open(command_obj.log_files["stderr"]).read()
|
|
287
289
|
command = " ".join(command_obj.command)
|
|
@@ -1,18 +1,22 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import os
|
|
3
|
+
import time
|
|
3
4
|
import shutil
|
|
4
5
|
import signal
|
|
5
6
|
import subprocess
|
|
6
7
|
import sys
|
|
7
8
|
import tempfile
|
|
8
9
|
import threading
|
|
9
|
-
import time
|
|
10
10
|
from typing import Callable, Dict, Iterator, List, Optional, Tuple
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
def kill_process_and_descendants(pid, termination_timeout):
|
|
14
|
+
# TODO: there's a race condition that new descendants might
|
|
15
|
+
# spawn b/w the invocations of 'pkill' and 'kill'.
|
|
16
|
+
# Needs to be fixed in future.
|
|
14
17
|
try:
|
|
15
18
|
subprocess.check_call(["pkill", "-TERM", "-P", str(pid)])
|
|
19
|
+
subprocess.check_call(["kill", "-TERM", str(pid)])
|
|
16
20
|
except subprocess.CalledProcessError:
|
|
17
21
|
pass
|
|
18
22
|
|
|
@@ -20,6 +24,7 @@ def kill_process_and_descendants(pid, termination_timeout):
|
|
|
20
24
|
|
|
21
25
|
try:
|
|
22
26
|
subprocess.check_call(["pkill", "-KILL", "-P", str(pid)])
|
|
27
|
+
subprocess.check_call(["kill", "-KILL", str(pid)])
|
|
23
28
|
except subprocess.CalledProcessError:
|
|
24
29
|
pass
|
|
25
30
|
|
|
@@ -436,13 +441,13 @@ class CommandManager(object):
|
|
|
436
441
|
if self.run_called:
|
|
437
442
|
shutil.rmtree(self.temp_dir, ignore_errors=True)
|
|
438
443
|
|
|
439
|
-
async def kill(self, termination_timeout: float =
|
|
444
|
+
async def kill(self, termination_timeout: float = 5):
|
|
440
445
|
"""
|
|
441
446
|
Kill the subprocess and its descendants.
|
|
442
447
|
|
|
443
448
|
Parameters
|
|
444
449
|
----------
|
|
445
|
-
termination_timeout : float, default
|
|
450
|
+
termination_timeout : float, default 5
|
|
446
451
|
The time to wait after sending a SIGTERM to the process and its descendants
|
|
447
452
|
before sending a SIGKILL.
|
|
448
453
|
"""
|
metaflow/runner/utils.py
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import ast
|
|
3
3
|
import time
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
from subprocess import CalledProcessError
|
|
6
|
+
from typing import Dict, TYPE_CHECKING
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from .subprocess_manager import CommandManager
|
|
5
10
|
|
|
6
11
|
|
|
7
12
|
def get_current_cell(ipython):
|
|
@@ -35,11 +40,23 @@ def clear_and_set_os_environ(env: Dict):
|
|
|
35
40
|
os.environ.update(env)
|
|
36
41
|
|
|
37
42
|
|
|
38
|
-
def read_from_file_when_ready(
|
|
43
|
+
def read_from_file_when_ready(
|
|
44
|
+
file_path: str, command_obj: "CommandManager", timeout: float = 5
|
|
45
|
+
):
|
|
39
46
|
start_time = time.time()
|
|
40
47
|
with open(file_path, "r", encoding="utf-8") as file_pointer:
|
|
41
48
|
content = file_pointer.read()
|
|
42
49
|
while not content:
|
|
50
|
+
if command_obj.process.poll() is not None:
|
|
51
|
+
# Check to make sure the file hasn't been read yet to avoid a race
|
|
52
|
+
# where the file is written between the end of this while loop and the
|
|
53
|
+
# poll call above.
|
|
54
|
+
content = file_pointer.read()
|
|
55
|
+
if content:
|
|
56
|
+
break
|
|
57
|
+
raise CalledProcessError(
|
|
58
|
+
command_obj.process.returncode, command_obj.command
|
|
59
|
+
)
|
|
43
60
|
if time.time() - start_time > timeout:
|
|
44
61
|
raise TimeoutError(
|
|
45
62
|
"Timeout while waiting for file content from '%s'" % file_path
|
metaflow/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
metaflow_version = "2.12.
|
|
1
|
+
metaflow_version = "2.12.22.1"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ob-metaflow
|
|
3
|
-
Version: 2.12.
|
|
3
|
+
Version: 2.12.22.1
|
|
4
4
|
Summary: Metaflow: More Data Science, Less Engineering
|
|
5
5
|
Author: Netflix, Outerbounds & the Metaflow Community
|
|
6
6
|
Author-email: help@outerbounds.co
|
|
@@ -12,7 +12,7 @@ Requires-Dist: boto3
|
|
|
12
12
|
Requires-Dist: pylint
|
|
13
13
|
Requires-Dist: kubernetes
|
|
14
14
|
Provides-Extra: stubs
|
|
15
|
-
Requires-Dist: metaflow-stubs==2.12.
|
|
15
|
+
Requires-Dist: metaflow-stubs==2.12.22.1; extra == "stubs"
|
|
16
16
|
|
|
17
17
|

|
|
18
18
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
metaflow/R.py,sha256=CqVfIatvmjciuICNnoyyNGrwE7Va9iXfLdFbQa52hwA,3958
|
|
2
|
-
metaflow/__init__.py,sha256=
|
|
2
|
+
metaflow/__init__.py,sha256=mrvSL4mgwJOGkNWmk0cdSJSFz1aIhF5K4mdLgOfQbME,6010
|
|
3
3
|
metaflow/cards.py,sha256=tP1_RrtmqdFh741pqE4t98S7SA0MtGRlGvRICRZF1Mg,426
|
|
4
4
|
metaflow/cli.py,sha256=fa6dx6F2PKtq0oeMxRM2efA9LyE108jGZQvYCtiUS94,34274
|
|
5
5
|
metaflow/cli_args.py,sha256=lcgBGNTvfaiPxiUnejAe60Upt9swG6lRy1_3OqbU6MY,2616
|
|
@@ -10,20 +10,21 @@ metaflow/decorators.py,sha256=hbJwRlZuLbl6t7fOsTiH7Sux4Lx6zgEEpldIXoM5TQc,21540
|
|
|
10
10
|
metaflow/event_logger.py,sha256=joTVRqZPL87nvah4ZOwtqWX8NeraM_CXKXXGVpKGD8o,780
|
|
11
11
|
metaflow/events.py,sha256=ahjzkSbSnRCK9RZ-9vTfUviz_6gMvSO9DGkJ86X80-k,5300
|
|
12
12
|
metaflow/exception.py,sha256=KC1LHJQzzYkWib0DeQ4l_A2r8VaudywsSqIQuq1RDZU,4954
|
|
13
|
-
metaflow/flowspec.py,sha256=
|
|
13
|
+
metaflow/flowspec.py,sha256=4w7Hm1aFSmVBOq0x9-LtFAq4eDjFb5F6Rdyh_NW41BQ,27270
|
|
14
14
|
metaflow/graph.py,sha256=HFJ7V_bPSht_NHIm8BejrSqOX2fyBQpVOczRCliRw08,11975
|
|
15
15
|
metaflow/includefile.py,sha256=yHczcZ_U0SrasxSNhZb3DIBzx8UZnrJCl3FzvpEQLOA,19753
|
|
16
|
+
metaflow/info_file.py,sha256=wtf2_F0M6dgiUu74AFImM8lfy5RrUw5Yj7Rgs2swKRY,686
|
|
16
17
|
metaflow/integrations.py,sha256=LlsaoePRg03DjENnmLxZDYto3NwWc9z_PtU6nJxLldg,1480
|
|
17
18
|
metaflow/lint.py,sha256=5rj1MlpluxyPTSINjtMoJ7viotyNzfjtBJSAihlAwMU,10870
|
|
18
|
-
metaflow/metaflow_config.py,sha256=
|
|
19
|
+
metaflow/metaflow_config.py,sha256=J11vmCjjffr2Koddo1OuymZFheW-0UaTD6rec2Hp0Gk,23017
|
|
19
20
|
metaflow/metaflow_config_funcs.py,sha256=5GlvoafV6SxykwfL8D12WXSfwjBN_NsyuKE_Q3gjGVE,6738
|
|
20
|
-
metaflow/metaflow_current.py,sha256=
|
|
21
|
-
metaflow/metaflow_environment.py,sha256=
|
|
21
|
+
metaflow/metaflow_current.py,sha256=pC-EMnAsnvBLvLd61W6MvfiCKcboryeui9f6r8z_sg8,7161
|
|
22
|
+
metaflow/metaflow_environment.py,sha256=rojFyGdyY56sN1HaEb1-0XX53Q3XPNnl0SaH-8xXZ8w,7987
|
|
22
23
|
metaflow/metaflow_profile.py,sha256=jKPEW-hmAQO-htSxb9hXaeloLacAh41A35rMZH6G8pA,418
|
|
23
|
-
metaflow/metaflow_version.py,sha256=
|
|
24
|
+
metaflow/metaflow_version.py,sha256=lOsrhMfHdKXBPS-673sZb48dK2FJhr34rIwLqMFeG9I,7291
|
|
24
25
|
metaflow/monitor.py,sha256=T0NMaBPvXynlJAO_avKtk8OIIRMyEuMAyF8bIp79aZU,5323
|
|
25
26
|
metaflow/multicore_utils.py,sha256=vdTNgczVLODifscUbbveJbuSDOl3Y9pAxhr7sqYiNf4,4760
|
|
26
|
-
metaflow/package.py,sha256=
|
|
27
|
+
metaflow/package.py,sha256=QutDP6WzjwGk1UCKXqBfXa9F10Q--FlRr0J7fwlple0,7399
|
|
27
28
|
metaflow/parameters.py,sha256=l8qnhBG9C4wf_FkXWjq5sapUA6npLdR7pyB0PPQ-KF0,15712
|
|
28
29
|
metaflow/procpoll.py,sha256=U2tE4iK_Mwj2WDyVTx_Uglh6xZ-jixQOo4wrM9OOhxg,2859
|
|
29
30
|
metaflow/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -35,7 +36,7 @@ metaflow/tuple_util.py,sha256=_G5YIEhuugwJ_f6rrZoelMFak3DqAR2tt_5CapS1XTY,830
|
|
|
35
36
|
metaflow/unbounded_foreach.py,sha256=p184WMbrMJ3xKYHwewj27ZhRUsSj_kw1jlye5gA9xJk,387
|
|
36
37
|
metaflow/util.py,sha256=olAvJK3y1it_k99MhLulTaAJo7OFVt5rnrD-ulIFLCU,13616
|
|
37
38
|
metaflow/vendor.py,sha256=FchtA9tH22JM-eEtJ2c9FpUdMn8sSb1VHuQS56EcdZk,5139
|
|
38
|
-
metaflow/version.py,sha256=
|
|
39
|
+
metaflow/version.py,sha256=MeZM-8MzkvMaKzlO6Il3_BkQ6liKzbdGUDS7Zf9ygEI,31
|
|
39
40
|
metaflow/_vendor/__init__.py,sha256=y_CiwUD3l4eAKvTVDZeqgVujMy31cAM1qjAB-HfI-9s,353
|
|
40
41
|
metaflow/_vendor/typing_extensions.py,sha256=0nUs5p1A_UrZigrAVBoOEM6TxU37zzPDUtiij1ZwpNc,110417
|
|
41
42
|
metaflow/_vendor/zipp.py,sha256=ajztOH-9I7KA_4wqDYygtHa6xUBVZgFpmZ8FE74HHHI,8425
|
|
@@ -110,11 +111,11 @@ metaflow/_vendor/v3_6/importlib_metadata/_meta.py,sha256=_F48Hu_jFxkfKWz5wcYS8vO
|
|
|
110
111
|
metaflow/_vendor/v3_6/importlib_metadata/_text.py,sha256=HCsFksZpJLeTP3NEk_ngrAeXVRRtTrtyh9eOABoRP4A,2166
|
|
111
112
|
metaflow/_vendor/v3_6/importlib_metadata/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
112
113
|
metaflow/client/__init__.py,sha256=1GtQB4Y_CBkzaxg32L1syNQSlfj762wmLrfrDxGi1b8,226
|
|
113
|
-
metaflow/client/core.py,sha256=
|
|
114
|
+
metaflow/client/core.py,sha256=jnFTP_XLTLJCHRqaxGKYDn1ZwB_v6a1AAkULlLmJGOk,74171
|
|
114
115
|
metaflow/client/filecache.py,sha256=Wy0yhhCqC1JZgebqi7z52GCwXYnkAqMZHTtxThvwBgM,15229
|
|
115
116
|
metaflow/cmd/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
116
117
|
metaflow/cmd/configure_cmd.py,sha256=o-DKnUf2FBo_HiMVyoyzQaGBSMtpbEPEdFTQZ0hkU-k,33396
|
|
117
|
-
metaflow/cmd/main_cli.py,sha256=
|
|
118
|
+
metaflow/cmd/main_cli.py,sha256=E546zT_jYQKysmjwfpEgzZd5QMsyirs28M2s0OPU93E,2966
|
|
118
119
|
metaflow/cmd/tutorials_cmd.py,sha256=8FdlKkicTOhCIDKcBR5b0Oz6giDvS-EMY3o9skIrRqw,5156
|
|
119
120
|
metaflow/cmd/util.py,sha256=jS_0rUjOnGGzPT65fzRLdGjrYAOOLA4jU2S0HJLV0oc,406
|
|
120
121
|
metaflow/cmd/develop/__init__.py,sha256=p1Sy8yU1MEKSrH5ttOWOZvNcI1qYu6J6jghdTHwPgOw,689
|
|
@@ -128,7 +129,7 @@ metaflow/datastore/exceptions.py,sha256=r7Ab5FvHIzyFh6kwiptA1lO5nLqWg0xRBoeYGefv
|
|
|
128
129
|
metaflow/datastore/flow_datastore.py,sha256=kbJcOLYnvPHgJfZ_WWkD9LJSX1PHI1K6f9oVUu08A9U,10235
|
|
129
130
|
metaflow/datastore/inputs.py,sha256=i43dXr2xvgtsgKMO9allgCR18bk80GeayeQFyUTH36w,449
|
|
130
131
|
metaflow/datastore/task_datastore.py,sha256=-aDvRUUEaWq0chiGzCCSYmsTP8T-gjs0eowvy2Xyaug,36167
|
|
131
|
-
metaflow/extension_support/__init__.py,sha256=
|
|
132
|
+
metaflow/extension_support/__init__.py,sha256=2z0c4R8zsVmEFOMGT2Jujsl6xveDVa9KLll7moL58NE,52984
|
|
132
133
|
metaflow/extension_support/_empty_file.py,sha256=HENjnM4uAfeNygxMB_feCCWORFoSat9n_QwzSx2oXPw,109
|
|
133
134
|
metaflow/extension_support/cmd.py,sha256=hk8iBUUINqvKCDxInKgWpum8ThiRZtHSJP7qBASHzl8,5711
|
|
134
135
|
metaflow/extension_support/integrations.py,sha256=AWAh-AZ-vo9IxuAVEjGw3s8p_NMm2DKHYx10oC51gPU,5506
|
|
@@ -150,7 +151,7 @@ metaflow/plugins/environment_decorator.py,sha256=6m9j2B77d-Ja_l_9CTJ__0O6aB2a8Qt
|
|
|
150
151
|
metaflow/plugins/events_decorator.py,sha256=c2GcH6Mspbey3wBkjM5lqxaNByFOzYDQdllLpXzRNv8,18283
|
|
151
152
|
metaflow/plugins/logs_cli.py,sha256=77W5UNagU2mOKSMMvrQxQmBLRzvmjK-c8dWxd-Ygbqs,11410
|
|
152
153
|
metaflow/plugins/package_cli.py,sha256=-J6D4cupHfWSZ4GEFo2yy9Je9oL3owRWm5pEJwaiqd4,1649
|
|
153
|
-
metaflow/plugins/parallel_decorator.py,sha256=
|
|
154
|
+
metaflow/plugins/parallel_decorator.py,sha256=hRYTdw3iJjxBEws2rtrZaCHojOaDoO0Pu08ckl-Z5bU,8876
|
|
154
155
|
metaflow/plugins/project_decorator.py,sha256=eJOe0Ea7CbUCReEhR_XQvRkhV6jyRqDxM72oZI7EMCk,5336
|
|
155
156
|
metaflow/plugins/resources_decorator.py,sha256=3MMZ7uptDf99795_RcSOq4h0N3OFlKpd3ahIEsozBBs,1333
|
|
156
157
|
metaflow/plugins/retry_decorator.py,sha256=tz_2Tq6GLg3vjDBZp0KKVTk3ADlCvqaWTSf7blmFdUw,1548
|
|
@@ -174,12 +175,11 @@ metaflow/plugins/airflow/sensors/s3_sensor.py,sha256=iDReG-7FKnumrtQg-HY6cCUAAqN
|
|
|
174
175
|
metaflow/plugins/argo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
175
176
|
metaflow/plugins/argo/argo_client.py,sha256=MKKhMCbWOPzf6z5zQQiyDRHHkAXcO7ipboDZDqAAvOk,15849
|
|
176
177
|
metaflow/plugins/argo/argo_events.py,sha256=_C1KWztVqgi3zuH57pInaE9OzABc2NnncC-zdwOMZ-w,5909
|
|
177
|
-
metaflow/plugins/argo/argo_workflows.py,sha256=
|
|
178
|
-
metaflow/plugins/argo/argo_workflows_cli.py,sha256=
|
|
178
|
+
metaflow/plugins/argo/argo_workflows.py,sha256=HFCebPkWZA4zhWlRJ37cfsSvjOgVwmzsRFgw8UJ3Rg0,172892
|
|
179
|
+
metaflow/plugins/argo/argo_workflows_cli.py,sha256=E_PyhOtxuS2F8DwhBANsRZCMxpeZ5rfID8eksfSOPm8,37231
|
|
179
180
|
metaflow/plugins/argo/argo_workflows_decorator.py,sha256=yprszMdbE3rBTcEA9VR0IEnPjTprUauZBc4SBb-Q7sA,7878
|
|
180
181
|
metaflow/plugins/argo/argo_workflows_deployer.py,sha256=wSSZtThn_VPvE_Wu6NB1L0Q86LmBJh9g009v_lpvBPM,8125
|
|
181
182
|
metaflow/plugins/argo/capture_error.py,sha256=Ys9dscGrTpW-ZCirLBU0gD9qBM0BjxyxGlUMKcwewQc,1852
|
|
182
|
-
metaflow/plugins/argo/daemon.py,sha256=dJOS_UUISXBYffi3oGVKPwq4Pa4P_nGBGL15piPaPto,1776
|
|
183
183
|
metaflow/plugins/argo/generate_input_paths.py,sha256=loYsI6RFX9LlFsHb7Fe-mzlTTtRdySoOu7sYDy-uXK0,881
|
|
184
184
|
metaflow/plugins/argo/jobset_input_paths.py,sha256=_JhZWngA6p9Q_O2fx3pdzKI0WE-HPRHz_zFvY2pHPTQ,525
|
|
185
185
|
metaflow/plugins/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -188,7 +188,7 @@ metaflow/plugins/aws/aws_utils.py,sha256=Y9C1asbn6C3WuFaOCOka_hNAy__HQYx1tXjCTiW
|
|
|
188
188
|
metaflow/plugins/aws/batch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
189
189
|
metaflow/plugins/aws/batch/batch.py,sha256=e9ssahWM18GnipPK2sqYB-ztx9w7Eoo7YtWyEtufYxs,17787
|
|
190
190
|
metaflow/plugins/aws/batch/batch_cli.py,sha256=6PTbyajRgdy0XmjyJLBTdKdiOB84dcovQQ8sFXlJqko,11749
|
|
191
|
-
metaflow/plugins/aws/batch/batch_client.py,sha256=
|
|
191
|
+
metaflow/plugins/aws/batch/batch_client.py,sha256=ddlGG0Vk1mkO7tcvJjDvNAVsVLOlqddF7MA1kKfHSqM,28830
|
|
192
192
|
metaflow/plugins/aws/batch/batch_decorator.py,sha256=dyC3xl_iB0BQT6mzWSa3oRBH3YE734XpIhxKue38KcU,17526
|
|
193
193
|
metaflow/plugins/aws/secrets_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
194
194
|
metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py,sha256=JtFUVu00Cg0FzAizgrPLXmrMqsT7YeQMkQlgeivUxcE,7986
|
|
@@ -279,18 +279,19 @@ metaflow/plugins/gcp/gs_tail.py,sha256=Jl_wvnzU7dub07A-DOAuP5FeccNIrPM-CeL1xKFs1
|
|
|
279
279
|
metaflow/plugins/gcp/gs_utils.py,sha256=ZmIGFse1qYyvAVrwga23PQUzF6dXEDLLsZ2F-YRmvow,2030
|
|
280
280
|
metaflow/plugins/gcp/includefile_support.py,sha256=vIDeR-MiJuUh-2S2pV7Z7FBkhIWwtHXaRrj76MWGRiY,3869
|
|
281
281
|
metaflow/plugins/kubernetes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
282
|
-
metaflow/plugins/kubernetes/
|
|
283
|
-
metaflow/plugins/kubernetes/
|
|
284
|
-
metaflow/plugins/kubernetes/
|
|
285
|
-
metaflow/plugins/kubernetes/
|
|
282
|
+
metaflow/plugins/kubernetes/kube_utils.py,sha256=fYDlvqi8jYPsWijDwT6Z2qhQswyFqv7tiwtic_I80Vg,749
|
|
283
|
+
metaflow/plugins/kubernetes/kubernetes.py,sha256=bKBqgZXnIDkoa4xKtKoV6InPtYQy4CujfvcbQ3Pvsbc,31305
|
|
284
|
+
metaflow/plugins/kubernetes/kubernetes_cli.py,sha256=sFZ9Zrjef85vCO0MGpUF-em8Pw3dePFb3hbX3PtAH4I,13463
|
|
285
|
+
metaflow/plugins/kubernetes/kubernetes_client.py,sha256=LuKX9rejRySIajnfmDoNkQ6HrOMjwIMbHAOT7wgF9i8,6362
|
|
286
|
+
metaflow/plugins/kubernetes/kubernetes_decorator.py,sha256=_RnMafj_oV2uh3qzib0qC3U7YqqP0bo-u2CHi0FbroI,26511
|
|
286
287
|
metaflow/plugins/kubernetes/kubernetes_job.py,sha256=Cfkee8LbXC17jSXWoeNdomQRvF_8YSeXNg1gvxm6E_M,31806
|
|
287
288
|
metaflow/plugins/kubernetes/kubernetes_jobsets.py,sha256=sCVuy-PRN60s5HWpnRvFmnljS41k70sBoPO3nOtl2ZE,40800
|
|
288
289
|
metaflow/plugins/metadata/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
289
290
|
metaflow/plugins/metadata/local.py,sha256=YhLJC5zjVJrvQFIyQ92ZBByiUmhCC762RUX7ITX12O8,22428
|
|
290
291
|
metaflow/plugins/metadata/service.py,sha256=ihq5F7KQZlxvYwzH_-jyP2aWN_I96i2vp92j_d697s8,20204
|
|
291
292
|
metaflow/plugins/pypi/__init__.py,sha256=0YFZpXvX7HCkyBFglatual7XGifdA1RwC3U4kcizyak,1037
|
|
292
|
-
metaflow/plugins/pypi/bootstrap.py,sha256=
|
|
293
|
-
metaflow/plugins/pypi/conda_decorator.py,sha256=
|
|
293
|
+
metaflow/plugins/pypi/bootstrap.py,sha256=LSRjpDhtpvYqCC0lDPIWvZsrHW7PXx626NDzdYjFeVM,5224
|
|
294
|
+
metaflow/plugins/pypi/conda_decorator.py,sha256=fPeXxvmg51oSFTnlguNlcWUIdXHA9OuMnp9ElaxQPFo,15695
|
|
294
295
|
metaflow/plugins/pypi/conda_environment.py,sha256=NSBcN4oD_RZONOUrnubLh-ur8EfS0h9PM4r7GNZczyc,19685
|
|
295
296
|
metaflow/plugins/pypi/micromamba.py,sha256=67FiIZZz0Kig9EcN7bZLObsE6Z1MFyo4Dp93fd3Grcc,12178
|
|
296
297
|
metaflow/plugins/pypi/pip.py,sha256=7B06mPOs5MvY33xbzPVYZlBr1iKMYaN-n8uulL9zSVg,13649
|
|
@@ -301,13 +302,13 @@ metaflow/plugins/secrets/__init__.py,sha256=mhJaN2eMS_ZZVewAMR2E-JdP5i0t3v9e6Dcw
|
|
|
301
302
|
metaflow/plugins/secrets/inline_secrets_provider.py,sha256=EChmoBGA1i7qM3jtYwPpLZDBybXLergiDlN63E0u3x8,294
|
|
302
303
|
metaflow/plugins/secrets/secrets_decorator.py,sha256=s-sFzPWOjahhpr5fMj-ZEaHkDYAPTO0isYXGvaUwlG8,11273
|
|
303
304
|
metaflow/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
304
|
-
metaflow/runner/click_api.py,sha256=
|
|
305
|
-
metaflow/runner/deployer.py,sha256=
|
|
306
|
-
metaflow/runner/metaflow_runner.py,sha256=
|
|
305
|
+
metaflow/runner/click_api.py,sha256=Qfg4BOz5K2LaXTYBsi1y4zTfNIsGGHBVF3UkorX_-o8,13878
|
|
306
|
+
metaflow/runner/deployer.py,sha256=ddYv2UFE7lOFD3EPg4REzMdeLqg5WQhAXkdgMD5bUY8,13920
|
|
307
|
+
metaflow/runner/metaflow_runner.py,sha256=zRlnM2j5QLBh9OboPUuaQ4_WpwFaqrCedKBOpjjtxDw,15449
|
|
307
308
|
metaflow/runner/nbdeploy.py,sha256=fP1s_5MeiDyT_igP82pB5EUqX9rOy2s06Hyc-OUbOvQ,4115
|
|
308
309
|
metaflow/runner/nbrun.py,sha256=lmvhzMCz7iC9LSPGRijifW1wMXxa4RW_jVmpdjQi22E,7261
|
|
309
|
-
metaflow/runner/subprocess_manager.py,sha256=
|
|
310
|
-
metaflow/runner/utils.py,sha256=
|
|
310
|
+
metaflow/runner/subprocess_manager.py,sha256=FJh2C6wJlNnvwE00wyK6zxjf8R49PRRHeVcnPvlO4-0,19839
|
|
311
|
+
metaflow/runner/utils.py,sha256=jFlQf9fVvNRd4c6VKv0KwQ8kez_re7kC2VCRgHVMSsM,2051
|
|
311
312
|
metaflow/sidecar/__init__.py,sha256=1mmNpmQ5puZCpRmmYlCOeieZ4108Su9XQ4_EqF1FGOU,131
|
|
312
313
|
metaflow/sidecar/sidecar.py,sha256=EspKXvPPNiyRToaUZ51PS5TT_PzrBNAurn_wbFnmGr0,1334
|
|
313
314
|
metaflow/sidecar/sidecar_messages.py,sha256=zPsCoYgDIcDkkvdC9MEpJTJ3y6TSGm2JWkRc4vxjbFA,1071
|
|
@@ -344,9 +345,9 @@ metaflow/tutorials/07-worldview/README.md,sha256=5vQTrFqulJ7rWN6r20dhot9lI2sVj9W
|
|
|
344
345
|
metaflow/tutorials/07-worldview/worldview.ipynb,sha256=ztPZPI9BXxvW1QdS2Tfe7LBuVzvFvv0AToDnsDJhLdE,2237
|
|
345
346
|
metaflow/tutorials/08-autopilot/README.md,sha256=GnePFp_q76jPs991lMUqfIIh5zSorIeWznyiUxzeUVE,1039
|
|
346
347
|
metaflow/tutorials/08-autopilot/autopilot.ipynb,sha256=DQoJlILV7Mq9vfPBGW-QV_kNhWPjS5n6SJLqePjFYLY,3191
|
|
347
|
-
ob_metaflow-2.12.
|
|
348
|
-
ob_metaflow-2.12.
|
|
349
|
-
ob_metaflow-2.12.
|
|
350
|
-
ob_metaflow-2.12.
|
|
351
|
-
ob_metaflow-2.12.
|
|
352
|
-
ob_metaflow-2.12.
|
|
348
|
+
ob_metaflow-2.12.22.1.dist-info/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
|
|
349
|
+
ob_metaflow-2.12.22.1.dist-info/METADATA,sha256=zA1Cn4lel8UBUz2u78BMzN2CI9h1NvEVc58S43IUAVM,5143
|
|
350
|
+
ob_metaflow-2.12.22.1.dist-info/WHEEL,sha256=AHX6tWk3qWuce7vKLrj7lnulVHEdWoltgauo8bgCXgU,109
|
|
351
|
+
ob_metaflow-2.12.22.1.dist-info/entry_points.txt,sha256=IKwTN1T3I5eJL3uo_vnkyxVffcgnRdFbKwlghZfn27k,57
|
|
352
|
+
ob_metaflow-2.12.22.1.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
|
|
353
|
+
ob_metaflow-2.12.22.1.dist-info/RECORD,,
|
metaflow/plugins/argo/daemon.py
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
from collections import namedtuple
|
|
2
|
-
from time import sleep
|
|
3
|
-
from metaflow.metaflow_config import DEFAULT_METADATA
|
|
4
|
-
from metaflow.metaflow_environment import MetaflowEnvironment
|
|
5
|
-
from metaflow.plugins import METADATA_PROVIDERS
|
|
6
|
-
from metaflow._vendor import click
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class CliState:
|
|
10
|
-
pass
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
@click.group()
|
|
14
|
-
@click.option("--flow_name", required=True)
|
|
15
|
-
@click.option("--run_id", required=True)
|
|
16
|
-
@click.option(
|
|
17
|
-
"--tag",
|
|
18
|
-
"tags",
|
|
19
|
-
multiple=True,
|
|
20
|
-
default=None,
|
|
21
|
-
help="Annotate all objects produced by Argo Workflows runs "
|
|
22
|
-
"with the given tag. You can specify this option multiple "
|
|
23
|
-
"times to attach multiple tags.",
|
|
24
|
-
)
|
|
25
|
-
@click.pass_context
|
|
26
|
-
def cli(ctx, flow_name, run_id, tags=None):
|
|
27
|
-
ctx.obj = CliState()
|
|
28
|
-
ctx.obj.flow_name = flow_name
|
|
29
|
-
ctx.obj.run_id = run_id
|
|
30
|
-
ctx.obj.tags = tags
|
|
31
|
-
# Use a dummy flow to initialize the environment and metadata service,
|
|
32
|
-
# as we only need a name for the flow object.
|
|
33
|
-
flow = namedtuple("DummyFlow", "name")
|
|
34
|
-
dummyflow = flow(flow_name)
|
|
35
|
-
|
|
36
|
-
# Initialize a proper metadata service instance
|
|
37
|
-
environment = MetaflowEnvironment(dummyflow)
|
|
38
|
-
|
|
39
|
-
ctx.obj.metadata = [m for m in METADATA_PROVIDERS if m.TYPE == DEFAULT_METADATA][0](
|
|
40
|
-
environment, dummyflow, None, None
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
@cli.command(help="start heartbeat process for a run")
|
|
45
|
-
@click.pass_obj
|
|
46
|
-
def heartbeat(obj):
|
|
47
|
-
# Try to register a run in case the start task has not taken care of it yet.
|
|
48
|
-
obj.metadata.register_run_id(obj.run_id, obj.tags)
|
|
49
|
-
# Start run heartbeat
|
|
50
|
-
obj.metadata.start_run_heartbeat(obj.flow_name, obj.run_id)
|
|
51
|
-
# Keepalive loop
|
|
52
|
-
while True:
|
|
53
|
-
# Do not pollute daemon logs with anything unnecessary,
|
|
54
|
-
# as they might be extremely long running.
|
|
55
|
-
sleep(10)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
if __name__ == "__main__":
|
|
59
|
-
cli()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|