ob-metaflow 2.12.20.1__py2.py3-none-any.whl → 2.12.23.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.
- metaflow/__init__.py +11 -21
- metaflow/cli.py +24 -19
- metaflow/client/core.py +2 -2
- metaflow/cmd/develop/stub_generator.py +17 -0
- metaflow/cmd/develop/stubs.py +3 -3
- 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_environment.py +1 -7
- metaflow/metaflow_version.py +133 -64
- metaflow/package.py +2 -1
- metaflow/plugins/argo/argo_client.py +2 -0
- metaflow/plugins/argo/argo_workflows.py +93 -51
- metaflow/plugins/argo/argo_workflows_cli.py +26 -0
- metaflow/plugins/kubernetes/kubernetes_client.py +7 -1
- metaflow/plugins/kubernetes/kubernetes_decorator.py +5 -1
- metaflow/plugins/kubernetes/kubernetes_jobsets.py +7 -1
- metaflow/plugins/pypi/bootstrap.py +1 -1
- metaflow/plugins/pypi/conda_decorator.py +1 -1
- metaflow/plugins/pypi/micromamba.py +26 -0
- metaflow/runner/deployer.py +4 -49
- metaflow/runner/metaflow_runner.py +22 -25
- metaflow/runner/subprocess_manager.py +33 -17
- metaflow/runner/utils.py +53 -1
- metaflow/version.py +1 -1
- {ob_metaflow-2.12.20.1.dist-info → ob_metaflow-2.12.23.1.dist-info}/METADATA +2 -2
- {ob_metaflow-2.12.20.1.dist-info → ob_metaflow-2.12.23.1.dist-info}/RECORD +33 -33
- metaflow/plugins/argo/daemon.py +0 -59
- {ob_metaflow-2.12.20.1.dist-info → ob_metaflow-2.12.23.1.dist-info}/LICENSE +0 -0
- {ob_metaflow-2.12.20.1.dist-info → ob_metaflow-2.12.23.1.dist-info}/WHEEL +0 -0
- {ob_metaflow-2.12.20.1.dist-info → ob_metaflow-2.12.23.1.dist-info}/entry_points.txt +0 -0
- {ob_metaflow-2.12.20.1.dist-info → ob_metaflow-2.12.23.1.dist-info}/top_level.txt +0 -0
metaflow/runner/deployer.py
CHANGED
|
@@ -6,56 +6,11 @@ import importlib
|
|
|
6
6
|
import functools
|
|
7
7
|
import tempfile
|
|
8
8
|
|
|
9
|
-
from subprocess import CalledProcessError
|
|
10
9
|
from typing import Optional, Dict, ClassVar
|
|
11
10
|
|
|
12
11
|
from metaflow.exception import MetaflowNotFound
|
|
13
|
-
from metaflow.runner.subprocess_manager import
|
|
14
|
-
from metaflow.runner.utils import
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def handle_timeout(
|
|
18
|
-
tfp_runner_attribute, command_obj: CommandManager, file_read_timeout: int
|
|
19
|
-
):
|
|
20
|
-
"""
|
|
21
|
-
Handle the timeout for a running subprocess command that reads a file
|
|
22
|
-
and raises an error with appropriate logs if a TimeoutError occurs.
|
|
23
|
-
|
|
24
|
-
Parameters
|
|
25
|
-
----------
|
|
26
|
-
tfp_runner_attribute : NamedTemporaryFile
|
|
27
|
-
Temporary file that stores runner attribute data.
|
|
28
|
-
command_obj : CommandManager
|
|
29
|
-
Command manager object that encapsulates the running command details.
|
|
30
|
-
file_read_timeout : int
|
|
31
|
-
Timeout for reading the file.
|
|
32
|
-
|
|
33
|
-
Returns
|
|
34
|
-
-------
|
|
35
|
-
str
|
|
36
|
-
Content read from the temporary file.
|
|
37
|
-
|
|
38
|
-
Raises
|
|
39
|
-
------
|
|
40
|
-
RuntimeError
|
|
41
|
-
If a TimeoutError occurs, it raises a RuntimeError with the command's
|
|
42
|
-
stdout and stderr logs.
|
|
43
|
-
"""
|
|
44
|
-
try:
|
|
45
|
-
content = read_from_file_when_ready(
|
|
46
|
-
tfp_runner_attribute.name, command_obj, timeout=file_read_timeout
|
|
47
|
-
)
|
|
48
|
-
return content
|
|
49
|
-
except (CalledProcessError, TimeoutError) as e:
|
|
50
|
-
stdout_log = open(command_obj.log_files["stdout"]).read()
|
|
51
|
-
stderr_log = open(command_obj.log_files["stderr"]).read()
|
|
52
|
-
command = " ".join(command_obj.command)
|
|
53
|
-
error_message = "Error executing: '%s':\n" % command
|
|
54
|
-
if stdout_log.strip():
|
|
55
|
-
error_message += "\nStdout:\n%s\n" % stdout_log
|
|
56
|
-
if stderr_log.strip():
|
|
57
|
-
error_message += "\nStderr:\n%s\n" % stderr_log
|
|
58
|
-
raise RuntimeError(error_message) from e
|
|
12
|
+
from metaflow.runner.subprocess_manager import SubprocessManager
|
|
13
|
+
from metaflow.runner.utils import handle_timeout
|
|
59
14
|
|
|
60
15
|
|
|
61
16
|
def get_lower_level_group(
|
|
@@ -209,7 +164,7 @@ class TriggeredRun(object):
|
|
|
209
164
|
elif callable(v):
|
|
210
165
|
setattr(self, k, functools.partial(v, self))
|
|
211
166
|
else:
|
|
212
|
-
setattr(self
|
|
167
|
+
setattr(self, k, v)
|
|
213
168
|
|
|
214
169
|
def wait_for_run(self, timeout=None):
|
|
215
170
|
"""
|
|
@@ -287,7 +242,7 @@ class DeployedFlow(object):
|
|
|
287
242
|
elif callable(v):
|
|
288
243
|
setattr(self, k, functools.partial(v, self))
|
|
289
244
|
else:
|
|
290
|
-
setattr(self
|
|
245
|
+
setattr(self, k, v)
|
|
291
246
|
|
|
292
247
|
|
|
293
248
|
class DeployerImpl(object):
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import importlib
|
|
2
2
|
import os
|
|
3
3
|
import sys
|
|
4
|
+
import json
|
|
4
5
|
import tempfile
|
|
5
6
|
|
|
6
|
-
from subprocess import CalledProcessError
|
|
7
7
|
from typing import Dict, Iterator, Optional, Tuple
|
|
8
8
|
|
|
9
9
|
from metaflow import Run, metadata
|
|
10
10
|
|
|
11
|
-
from .utils import
|
|
11
|
+
from .utils import handle_timeout, clear_and_set_os_environ
|
|
12
12
|
from .subprocess_manager import CommandManager, SubprocessManager
|
|
13
13
|
|
|
14
14
|
|
|
@@ -102,16 +102,19 @@ class ExecutingRun(object):
|
|
|
102
102
|
for executing the run.
|
|
103
103
|
|
|
104
104
|
The return value is one of the following strings:
|
|
105
|
+
- `timeout` indicates that the run timed out.
|
|
105
106
|
- `running` indicates a currently executing run.
|
|
106
107
|
- `failed` indicates a failed run.
|
|
107
|
-
- `successful` a successful run.
|
|
108
|
+
- `successful` indicates a successful run.
|
|
108
109
|
|
|
109
110
|
Returns
|
|
110
111
|
-------
|
|
111
112
|
str
|
|
112
113
|
The current status of the run.
|
|
113
114
|
"""
|
|
114
|
-
if self.command_obj.
|
|
115
|
+
if self.command_obj.timeout:
|
|
116
|
+
return "timeout"
|
|
117
|
+
elif self.command_obj.process.returncode is None:
|
|
115
118
|
return "running"
|
|
116
119
|
elif self.command_obj.process.returncode != 0:
|
|
117
120
|
return "failed"
|
|
@@ -271,28 +274,22 @@ class Runner(object):
|
|
|
271
274
|
|
|
272
275
|
# It is thus necessary to set them to correct values before we return
|
|
273
276
|
# the Run object.
|
|
274
|
-
try:
|
|
275
|
-
# Set the environment variables to what they were before the run executed.
|
|
276
|
-
clear_and_set_os_environ(self.old_env)
|
|
277
277
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
if stderr_log.strip():
|
|
294
|
-
error_message += "\nStderr:\n%s\n" % stderr_log
|
|
295
|
-
raise RuntimeError(error_message) from e
|
|
278
|
+
content = handle_timeout(
|
|
279
|
+
tfp_runner_attribute, command_obj, self.file_read_timeout
|
|
280
|
+
)
|
|
281
|
+
content = json.loads(content)
|
|
282
|
+
pathspec = "%s/%s" % (content.get("flow_name"), content.get("run_id"))
|
|
283
|
+
|
|
284
|
+
# Set the environment variables to what they were before the run executed.
|
|
285
|
+
clear_and_set_os_environ(self.old_env)
|
|
286
|
+
|
|
287
|
+
# Set the correct metadata from the runner_attribute file corresponding to this run.
|
|
288
|
+
metadata_for_flow = content.get("metadata")
|
|
289
|
+
metadata(metadata_for_flow)
|
|
290
|
+
|
|
291
|
+
run_object = Run(pathspec, _namespace_check=False)
|
|
292
|
+
return ExecutingRun(self, command_obj, run_object)
|
|
296
293
|
|
|
297
294
|
def run(self, **kwargs) -> ExecutingRun:
|
|
298
295
|
"""
|
|
@@ -42,6 +42,19 @@ class SubprocessManager(object):
|
|
|
42
42
|
def __init__(self):
|
|
43
43
|
self.commands: Dict[int, CommandManager] = {}
|
|
44
44
|
|
|
45
|
+
try:
|
|
46
|
+
loop = asyncio.get_running_loop()
|
|
47
|
+
loop.add_signal_handler(
|
|
48
|
+
signal.SIGINT,
|
|
49
|
+
lambda: self._handle_sigint(signum=signal.SIGINT, frame=None),
|
|
50
|
+
)
|
|
51
|
+
except RuntimeError:
|
|
52
|
+
signal.signal(signal.SIGINT, self._handle_sigint)
|
|
53
|
+
|
|
54
|
+
def _handle_sigint(self, signum, frame):
|
|
55
|
+
for each_command in self.commands.values():
|
|
56
|
+
each_command.kill(termination_timeout=2)
|
|
57
|
+
|
|
45
58
|
async def __aenter__(self) -> "SubprocessManager":
|
|
46
59
|
return self
|
|
47
60
|
|
|
@@ -83,6 +96,7 @@ class SubprocessManager(object):
|
|
|
83
96
|
command_obj = CommandManager(command, env, cwd)
|
|
84
97
|
pid = command_obj.run(show_output=show_output)
|
|
85
98
|
self.commands[pid] = command_obj
|
|
99
|
+
command_obj.sync_wait()
|
|
86
100
|
return pid
|
|
87
101
|
|
|
88
102
|
async def async_run_command(
|
|
@@ -169,11 +183,12 @@ class CommandManager(object):
|
|
|
169
183
|
self.cwd = cwd if cwd is not None else os.getcwd()
|
|
170
184
|
|
|
171
185
|
self.process = None
|
|
186
|
+
self.stdout_thread = None
|
|
187
|
+
self.stderr_thread = None
|
|
172
188
|
self.run_called: bool = False
|
|
189
|
+
self.timeout: bool = False
|
|
173
190
|
self.log_files: Dict[str, str] = {}
|
|
174
191
|
|
|
175
|
-
signal.signal(signal.SIGINT, self._handle_sigint)
|
|
176
|
-
|
|
177
192
|
async def __aenter__(self) -> "CommandManager":
|
|
178
193
|
return self
|
|
179
194
|
|
|
@@ -214,13 +229,22 @@ class CommandManager(object):
|
|
|
214
229
|
else:
|
|
215
230
|
await asyncio.wait_for(self.emit_logs(stream), timeout)
|
|
216
231
|
except asyncio.TimeoutError:
|
|
232
|
+
self.timeout = True
|
|
217
233
|
command_string = " ".join(self.command)
|
|
218
|
-
|
|
234
|
+
self.kill(termination_timeout=2)
|
|
219
235
|
print(
|
|
220
236
|
"Timeout: The process (PID %d; command: '%s') did not complete "
|
|
221
237
|
"within %s seconds." % (self.process.pid, command_string, timeout)
|
|
222
238
|
)
|
|
223
239
|
|
|
240
|
+
def sync_wait(self):
|
|
241
|
+
if not self.run_called:
|
|
242
|
+
raise RuntimeError("No command run yet to wait for...")
|
|
243
|
+
|
|
244
|
+
self.process.wait()
|
|
245
|
+
self.stdout_thread.join()
|
|
246
|
+
self.stderr_thread.join()
|
|
247
|
+
|
|
224
248
|
def run(self, show_output: bool = False):
|
|
225
249
|
"""
|
|
226
250
|
Run the subprocess synchronously. This can only be called once.
|
|
@@ -265,22 +289,17 @@ class CommandManager(object):
|
|
|
265
289
|
|
|
266
290
|
self.run_called = True
|
|
267
291
|
|
|
268
|
-
stdout_thread = threading.Thread(
|
|
292
|
+
self.stdout_thread = threading.Thread(
|
|
269
293
|
target=stream_to_stdout_and_file,
|
|
270
294
|
args=(self.process.stdout, stdout_logfile),
|
|
271
295
|
)
|
|
272
|
-
stderr_thread = threading.Thread(
|
|
296
|
+
self.stderr_thread = threading.Thread(
|
|
273
297
|
target=stream_to_stdout_and_file,
|
|
274
298
|
args=(self.process.stderr, stderr_logfile),
|
|
275
299
|
)
|
|
276
300
|
|
|
277
|
-
stdout_thread.start()
|
|
278
|
-
stderr_thread.start()
|
|
279
|
-
|
|
280
|
-
self.process.wait()
|
|
281
|
-
|
|
282
|
-
stdout_thread.join()
|
|
283
|
-
stderr_thread.join()
|
|
301
|
+
self.stdout_thread.start()
|
|
302
|
+
self.stderr_thread.start()
|
|
284
303
|
|
|
285
304
|
return self.process.pid
|
|
286
305
|
except Exception as e:
|
|
@@ -441,13 +460,13 @@ class CommandManager(object):
|
|
|
441
460
|
if self.run_called:
|
|
442
461
|
shutil.rmtree(self.temp_dir, ignore_errors=True)
|
|
443
462
|
|
|
444
|
-
|
|
463
|
+
def kill(self, termination_timeout: float = 2):
|
|
445
464
|
"""
|
|
446
465
|
Kill the subprocess and its descendants.
|
|
447
466
|
|
|
448
467
|
Parameters
|
|
449
468
|
----------
|
|
450
|
-
termination_timeout : float, default
|
|
469
|
+
termination_timeout : float, default 2
|
|
451
470
|
The time to wait after sending a SIGTERM to the process and its descendants
|
|
452
471
|
before sending a SIGKILL.
|
|
453
472
|
"""
|
|
@@ -457,9 +476,6 @@ class CommandManager(object):
|
|
|
457
476
|
else:
|
|
458
477
|
print("No process to kill.")
|
|
459
478
|
|
|
460
|
-
def _handle_sigint(self, signum, frame):
|
|
461
|
-
asyncio.create_task(self.kill())
|
|
462
|
-
|
|
463
479
|
|
|
464
480
|
async def main():
|
|
465
481
|
flow_file = "../try.py"
|
metaflow/runner/utils.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import ast
|
|
3
3
|
import time
|
|
4
|
+
import asyncio
|
|
4
5
|
|
|
5
6
|
from subprocess import CalledProcessError
|
|
6
7
|
from typing import Dict, TYPE_CHECKING
|
|
@@ -40,6 +41,13 @@ def clear_and_set_os_environ(env: Dict):
|
|
|
40
41
|
os.environ.update(env)
|
|
41
42
|
|
|
42
43
|
|
|
44
|
+
def check_process_status(command_obj: "CommandManager"):
|
|
45
|
+
if isinstance(command_obj.process, asyncio.subprocess.Process):
|
|
46
|
+
return command_obj.process.returncode is not None
|
|
47
|
+
else:
|
|
48
|
+
return command_obj.process.poll() is not None
|
|
49
|
+
|
|
50
|
+
|
|
43
51
|
def read_from_file_when_ready(
|
|
44
52
|
file_path: str, command_obj: "CommandManager", timeout: float = 5
|
|
45
53
|
):
|
|
@@ -47,7 +55,7 @@ def read_from_file_when_ready(
|
|
|
47
55
|
with open(file_path, "r", encoding="utf-8") as file_pointer:
|
|
48
56
|
content = file_pointer.read()
|
|
49
57
|
while not content:
|
|
50
|
-
if command_obj
|
|
58
|
+
if check_process_status(command_obj):
|
|
51
59
|
# Check to make sure the file hasn't been read yet to avoid a race
|
|
52
60
|
# where the file is written between the end of this while loop and the
|
|
53
61
|
# poll call above.
|
|
@@ -64,3 +72,47 @@ def read_from_file_when_ready(
|
|
|
64
72
|
time.sleep(0.1)
|
|
65
73
|
content = file_pointer.read()
|
|
66
74
|
return content
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def handle_timeout(
|
|
78
|
+
tfp_runner_attribute, command_obj: "CommandManager", file_read_timeout: int
|
|
79
|
+
):
|
|
80
|
+
"""
|
|
81
|
+
Handle the timeout for a running subprocess command that reads a file
|
|
82
|
+
and raises an error with appropriate logs if a TimeoutError occurs.
|
|
83
|
+
|
|
84
|
+
Parameters
|
|
85
|
+
----------
|
|
86
|
+
tfp_runner_attribute : NamedTemporaryFile
|
|
87
|
+
Temporary file that stores runner attribute data.
|
|
88
|
+
command_obj : CommandManager
|
|
89
|
+
Command manager object that encapsulates the running command details.
|
|
90
|
+
file_read_timeout : int
|
|
91
|
+
Timeout for reading the file.
|
|
92
|
+
|
|
93
|
+
Returns
|
|
94
|
+
-------
|
|
95
|
+
str
|
|
96
|
+
Content read from the temporary file.
|
|
97
|
+
|
|
98
|
+
Raises
|
|
99
|
+
------
|
|
100
|
+
RuntimeError
|
|
101
|
+
If a TimeoutError occurs, it raises a RuntimeError with the command's
|
|
102
|
+
stdout and stderr logs.
|
|
103
|
+
"""
|
|
104
|
+
try:
|
|
105
|
+
content = read_from_file_when_ready(
|
|
106
|
+
tfp_runner_attribute.name, command_obj, timeout=file_read_timeout
|
|
107
|
+
)
|
|
108
|
+
return content
|
|
109
|
+
except (CalledProcessError, TimeoutError) as e:
|
|
110
|
+
stdout_log = open(command_obj.log_files["stdout"]).read()
|
|
111
|
+
stderr_log = open(command_obj.log_files["stderr"]).read()
|
|
112
|
+
command = " ".join(command_obj.command)
|
|
113
|
+
error_message = "Error executing: '%s':\n" % command
|
|
114
|
+
if stdout_log.strip():
|
|
115
|
+
error_message += "\nStdout:\n%s\n" % stdout_log
|
|
116
|
+
if stderr_log.strip():
|
|
117
|
+
error_message += "\nStderr:\n%s\n" % stderr_log
|
|
118
|
+
raise RuntimeError(error_message) from e
|
metaflow/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
metaflow_version = "2.12.
|
|
1
|
+
metaflow_version = "2.12.23.1"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ob-metaflow
|
|
3
|
-
Version: 2.12.
|
|
3
|
+
Version: 2.12.23.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.23.1; extra == "stubs"
|
|
16
16
|
|
|
17
17
|

|
|
18
18
|
|
|
@@ -1,7 +1,7 @@
|
|
|
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
|
-
metaflow/cli.py,sha256=
|
|
4
|
+
metaflow/cli.py,sha256=vz8flftUkmRBdjHHwWREsFecfNqlFF0YoAKSzexE30w,34494
|
|
5
5
|
metaflow/cli_args.py,sha256=lcgBGNTvfaiPxiUnejAe60Upt9swG6lRy1_3OqbU6MY,2616
|
|
6
6
|
metaflow/clone_util.py,sha256=XfUX0vssu_hPlyZfhFl1AOnKkLqvt33Qp8xNrmdocGg,2057
|
|
7
7
|
metaflow/cmd_with_io.py,sha256=kl53HkAIyv0ecpItv08wZYczv7u3msD1VCcciqigqf0,588
|
|
@@ -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
21
|
metaflow/metaflow_current.py,sha256=pC-EMnAsnvBLvLd61W6MvfiCKcboryeui9f6r8z_sg8,7161
|
|
21
|
-
metaflow/metaflow_environment.py,sha256=
|
|
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=duhIzfKZtcxMVMs2uiBqBvUarSHJqyWDwMhaBOQd_g0,7491
|
|
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=05uFYfkjTqeZGmqF8PVV-sZGW8rNNdsGp_jJnwXcr4I,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,16 +111,16 @@ 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=vDRmLhoRXOfFiIplY2Xp3Go5lnn-CKeJdPqtOjWIX4Y,74173
|
|
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
|
|
121
|
-
metaflow/cmd/develop/stub_generator.py,sha256
|
|
122
|
-
metaflow/cmd/develop/stubs.py,sha256=
|
|
122
|
+
metaflow/cmd/develop/stub_generator.py,sha256=_P_80CRFxyYjoMFynwg0IhAiexL9Wh2WqsnagiaVYVw,48050
|
|
123
|
+
metaflow/cmd/develop/stubs.py,sha256=JX2qNZDvG0upvPueAcLhoR_zyLtRranZMwY05tLdpRQ,11884
|
|
123
124
|
metaflow/datastore/__init__.py,sha256=VxP6ddJt3rwiCkpiSfAhyVkUCOe1pgZZsytVEJzFmSQ,155
|
|
124
125
|
metaflow/datastore/content_addressed_store.py,sha256=6T7tNqL29kpmecyMLHF35RhoSBOb-OZcExnsB65AvnI,7641
|
|
125
126
|
metaflow/datastore/datastore_set.py,sha256=R5pwnxg1DD8kBY9vElvd2eMknrvwTyiSwvQs67_z9bc,2361
|
|
@@ -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
|
|
@@ -172,14 +173,13 @@ metaflow/plugins/airflow/sensors/base_sensor.py,sha256=s-OQBfPWZ_T3wn96Ua59CCEj1
|
|
|
172
173
|
metaflow/plugins/airflow/sensors/external_task_sensor.py,sha256=zhYlrZnXT20KW8-fVk0fCNtTyNiKJB5PMVASacu30r0,6034
|
|
173
174
|
metaflow/plugins/airflow/sensors/s3_sensor.py,sha256=iDReG-7FKnumrtQg-HY6cCUAAqNA90nARrjjjEEk_x4,3275
|
|
174
175
|
metaflow/plugins/argo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
175
|
-
metaflow/plugins/argo/argo_client.py,sha256=
|
|
176
|
+
metaflow/plugins/argo/argo_client.py,sha256=KTUpP0DmnmNsMp4tbdNyKX_zOdTFRVpUkrf7Vv79d-o,16011
|
|
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=dbqZsqn6aHO7HCy23vLkN_a2g2TTzjMv8aMTNAkeDtE,173506
|
|
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
|
|
@@ -282,18 +282,18 @@ metaflow/plugins/kubernetes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
|
|
|
282
282
|
metaflow/plugins/kubernetes/kube_utils.py,sha256=fYDlvqi8jYPsWijDwT6Z2qhQswyFqv7tiwtic_I80Vg,749
|
|
283
283
|
metaflow/plugins/kubernetes/kubernetes.py,sha256=bKBqgZXnIDkoa4xKtKoV6InPtYQy4CujfvcbQ3Pvsbc,31305
|
|
284
284
|
metaflow/plugins/kubernetes/kubernetes_cli.py,sha256=sFZ9Zrjef85vCO0MGpUF-em8Pw3dePFb3hbX3PtAH4I,13463
|
|
285
|
-
metaflow/plugins/kubernetes/kubernetes_client.py,sha256=
|
|
286
|
-
metaflow/plugins/kubernetes/kubernetes_decorator.py,sha256=
|
|
285
|
+
metaflow/plugins/kubernetes/kubernetes_client.py,sha256=y_CswSO_OdDW8eC56lwKwC69JqIfo9tYVw0njXc_sj8,6519
|
|
286
|
+
metaflow/plugins/kubernetes/kubernetes_decorator.py,sha256=Pr4nzigafYyHgZK4gPnQaQuyxViHozp_idl-AWY3cgk,26871
|
|
287
287
|
metaflow/plugins/kubernetes/kubernetes_job.py,sha256=Cfkee8LbXC17jSXWoeNdomQRvF_8YSeXNg1gvxm6E_M,31806
|
|
288
|
-
metaflow/plugins/kubernetes/kubernetes_jobsets.py,sha256=
|
|
288
|
+
metaflow/plugins/kubernetes/kubernetes_jobsets.py,sha256=wb0sK1OxW7pRbKdj6bWB4JsskXDsoKKqjyUWo4N9Y6E,41196
|
|
289
289
|
metaflow/plugins/metadata/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
290
290
|
metaflow/plugins/metadata/local.py,sha256=YhLJC5zjVJrvQFIyQ92ZBByiUmhCC762RUX7ITX12O8,22428
|
|
291
291
|
metaflow/plugins/metadata/service.py,sha256=ihq5F7KQZlxvYwzH_-jyP2aWN_I96i2vp92j_d697s8,20204
|
|
292
292
|
metaflow/plugins/pypi/__init__.py,sha256=0YFZpXvX7HCkyBFglatual7XGifdA1RwC3U4kcizyak,1037
|
|
293
|
-
metaflow/plugins/pypi/bootstrap.py,sha256=
|
|
294
|
-
metaflow/plugins/pypi/conda_decorator.py,sha256=
|
|
293
|
+
metaflow/plugins/pypi/bootstrap.py,sha256=FI-itExqIz7DUzLnnkGwoB60rFBviygpIFThUtqk_4E,5227
|
|
294
|
+
metaflow/plugins/pypi/conda_decorator.py,sha256=fPeXxvmg51oSFTnlguNlcWUIdXHA9OuMnp9ElaxQPFo,15695
|
|
295
295
|
metaflow/plugins/pypi/conda_environment.py,sha256=NSBcN4oD_RZONOUrnubLh-ur8EfS0h9PM4r7GNZczyc,19685
|
|
296
|
-
metaflow/plugins/pypi/micromamba.py,sha256=
|
|
296
|
+
metaflow/plugins/pypi/micromamba.py,sha256=HQIxsixkLjqs0ukWGTlATNu5DrbisReOr39Qd21_GZo,13737
|
|
297
297
|
metaflow/plugins/pypi/pip.py,sha256=7B06mPOs5MvY33xbzPVYZlBr1iKMYaN-n8uulL9zSVg,13649
|
|
298
298
|
metaflow/plugins/pypi/pypi_decorator.py,sha256=rDMbHl7r81Ye7-TuIlKAVJ_CDnfjl9jV44ZPws-UsTY,7229
|
|
299
299
|
metaflow/plugins/pypi/pypi_environment.py,sha256=FYMg8kF3lXqcLfRYWD83a9zpVjcoo_TARqMGZ763rRk,230
|
|
@@ -303,12 +303,12 @@ metaflow/plugins/secrets/inline_secrets_provider.py,sha256=EChmoBGA1i7qM3jtYwPpL
|
|
|
303
303
|
metaflow/plugins/secrets/secrets_decorator.py,sha256=s-sFzPWOjahhpr5fMj-ZEaHkDYAPTO0isYXGvaUwlG8,11273
|
|
304
304
|
metaflow/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
305
305
|
metaflow/runner/click_api.py,sha256=Qfg4BOz5K2LaXTYBsi1y4zTfNIsGGHBVF3UkorX_-o8,13878
|
|
306
|
-
metaflow/runner/deployer.py,sha256=
|
|
307
|
-
metaflow/runner/metaflow_runner.py,sha256=
|
|
306
|
+
metaflow/runner/deployer.py,sha256=xNqxFIezWz3AcVqR4jeL-JnInGtefwEYMbXttxgB_I8,12276
|
|
307
|
+
metaflow/runner/metaflow_runner.py,sha256=I7Ao0GHHfP55nUCE8g6CpTPGjuWgXedSc9EZX-tIE2c,15001
|
|
308
308
|
metaflow/runner/nbdeploy.py,sha256=fP1s_5MeiDyT_igP82pB5EUqX9rOy2s06Hyc-OUbOvQ,4115
|
|
309
309
|
metaflow/runner/nbrun.py,sha256=lmvhzMCz7iC9LSPGRijifW1wMXxa4RW_jVmpdjQi22E,7261
|
|
310
|
-
metaflow/runner/subprocess_manager.py,sha256=
|
|
311
|
-
metaflow/runner/utils.py,sha256=
|
|
310
|
+
metaflow/runner/subprocess_manager.py,sha256=jC_PIYIeAp_G__lf6WHZF3Lxzpp-WAQleMrRZq9j7nc,20467
|
|
311
|
+
metaflow/runner/utils.py,sha256=aQ6WiNz9b-pqWWE14PdcAqti7_Zh_MIPlEA8zXJ6tXo,3807
|
|
312
312
|
metaflow/sidecar/__init__.py,sha256=1mmNpmQ5puZCpRmmYlCOeieZ4108Su9XQ4_EqF1FGOU,131
|
|
313
313
|
metaflow/sidecar/sidecar.py,sha256=EspKXvPPNiyRToaUZ51PS5TT_PzrBNAurn_wbFnmGr0,1334
|
|
314
314
|
metaflow/sidecar/sidecar_messages.py,sha256=zPsCoYgDIcDkkvdC9MEpJTJ3y6TSGm2JWkRc4vxjbFA,1071
|
|
@@ -345,9 +345,9 @@ metaflow/tutorials/07-worldview/README.md,sha256=5vQTrFqulJ7rWN6r20dhot9lI2sVj9W
|
|
|
345
345
|
metaflow/tutorials/07-worldview/worldview.ipynb,sha256=ztPZPI9BXxvW1QdS2Tfe7LBuVzvFvv0AToDnsDJhLdE,2237
|
|
346
346
|
metaflow/tutorials/08-autopilot/README.md,sha256=GnePFp_q76jPs991lMUqfIIh5zSorIeWznyiUxzeUVE,1039
|
|
347
347
|
metaflow/tutorials/08-autopilot/autopilot.ipynb,sha256=DQoJlILV7Mq9vfPBGW-QV_kNhWPjS5n6SJLqePjFYLY,3191
|
|
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.
|
|
353
|
-
ob_metaflow-2.12.
|
|
348
|
+
ob_metaflow-2.12.23.1.dist-info/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
|
|
349
|
+
ob_metaflow-2.12.23.1.dist-info/METADATA,sha256=81s4jcZ3L8Ugru9il9sH2Yv-FFvbxBrpA_WUvLP4MG8,5143
|
|
350
|
+
ob_metaflow-2.12.23.1.dist-info/WHEEL,sha256=AHX6tWk3qWuce7vKLrj7lnulVHEdWoltgauo8bgCXgU,109
|
|
351
|
+
ob_metaflow-2.12.23.1.dist-info/entry_points.txt,sha256=IKwTN1T3I5eJL3uo_vnkyxVffcgnRdFbKwlghZfn27k,57
|
|
352
|
+
ob_metaflow-2.12.23.1.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
|
|
353
|
+
ob_metaflow-2.12.23.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
|
|
File without changes
|