metaflow 2.12.21__py2.py3-none-any.whl → 2.12.22__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.
@@ -455,11 +455,17 @@ class ArgoWorkflows(object):
455
455
  )
456
456
  seen.add(norm)
457
457
 
458
- if param.kwargs.get("type") == JSONType or isinstance(
459
- param.kwargs.get("type"), FilePathClass
460
- ):
461
- # Special-case this to avoid touching core
458
+ extra_attrs = {}
459
+ if param.kwargs.get("type") == JSONType:
460
+ param_type = str(param.kwargs.get("type").name)
461
+ elif isinstance(param.kwargs.get("type"), FilePathClass):
462
462
  param_type = str(param.kwargs.get("type").name)
463
+ extra_attrs["is_text"] = getattr(
464
+ param.kwargs.get("type"), "_is_text", True
465
+ )
466
+ extra_attrs["encoding"] = getattr(
467
+ param.kwargs.get("type"), "_encoding", "utf-8"
468
+ )
463
469
  else:
464
470
  param_type = str(param.kwargs.get("type").__name__)
465
471
 
@@ -487,6 +493,7 @@ class ArgoWorkflows(object):
487
493
  type=param_type,
488
494
  description=param.kwargs.get("help"),
489
495
  is_required=is_required,
496
+ **extra_attrs
490
497
  )
491
498
  return parameters
492
499
 
@@ -2515,10 +2522,29 @@ class ArgoWorkflows(object):
2515
2522
  # Use all the affordances available to _parameters task
2516
2523
  executable = self.environment.executable("_parameters")
2517
2524
  run_id = "argo-{{workflow.name}}"
2518
- entrypoint = [executable, "-m metaflow.plugins.argo.daemon"]
2519
- heartbeat_cmds = "{entrypoint} --flow_name {flow_name} --run_id {run_id} {tags} heartbeat".format(
2525
+ script_name = os.path.basename(sys.argv[0])
2526
+ entrypoint = [executable, script_name]
2527
+ # FlowDecorators can define their own top-level options. These might affect run level information
2528
+ # so it is important to pass these to the heartbeat process as well, as it might be the first task to register a run.
2529
+ top_opts_dict = {}
2530
+ for deco in flow_decorators(self.flow):
2531
+ top_opts_dict.update(deco.get_top_level_options())
2532
+
2533
+ top_level = list(dict_to_cli_options(top_opts_dict)) + [
2534
+ "--quiet",
2535
+ "--metadata=%s" % self.metadata.TYPE,
2536
+ "--environment=%s" % self.environment.TYPE,
2537
+ "--datastore=%s" % self.flow_datastore.TYPE,
2538
+ "--datastore-root=%s" % self.flow_datastore.datastore_root,
2539
+ "--event-logger=%s" % self.event_logger.TYPE,
2540
+ "--monitor=%s" % self.monitor.TYPE,
2541
+ "--no-pylint",
2542
+ "--with=argo_workflows_internal:auto-emit-argo-events=%i"
2543
+ % self.auto_emit_argo_events,
2544
+ ]
2545
+ heartbeat_cmds = "{entrypoint} {top_level} argo-workflows heartbeat --run_id {run_id} {tags}".format(
2520
2546
  entrypoint=" ".join(entrypoint),
2521
- flow_name=self.flow.name,
2547
+ top_level=" ".join(top_level) if top_level else "",
2522
2548
  run_id=run_id,
2523
2549
  tags=" ".join(["--tag %s" % t for t in self.tags]) if self.tags else "",
2524
2550
  )
@@ -2569,12 +2595,16 @@ class ArgoWorkflows(object):
2569
2595
  "METAFLOW_SERVICE_URL": SERVICE_INTERNAL_URL,
2570
2596
  "METAFLOW_SERVICE_HEADERS": json.dumps(SERVICE_HEADERS),
2571
2597
  "METAFLOW_USER": "argo-workflows",
2598
+ "METAFLOW_DATASTORE_SYSROOT_S3": DATASTORE_SYSROOT_S3,
2599
+ "METAFLOW_DATATOOLS_S3ROOT": DATATOOLS_S3ROOT,
2572
2600
  "METAFLOW_DEFAULT_DATASTORE": self.flow_datastore.TYPE,
2573
2601
  "METAFLOW_DEFAULT_METADATA": DEFAULT_METADATA,
2602
+ "METAFLOW_CARD_S3ROOT": CARD_S3ROOT,
2574
2603
  "METAFLOW_KUBERNETES_WORKLOAD": 1,
2604
+ "METAFLOW_KUBERNETES_FETCH_EC2_METADATA": KUBERNETES_FETCH_EC2_METADATA,
2575
2605
  "METAFLOW_RUNTIME_ENVIRONMENT": "kubernetes",
2576
2606
  "METAFLOW_OWNER": self.username,
2577
- "METAFLOW_PRODUCTION_TOKEN": self.production_token,
2607
+ "METAFLOW_PRODUCTION_TOKEN": self.production_token, # Used in identity resolving. This affects system tags.
2578
2608
  }
2579
2609
  # support Metaflow sandboxes
2580
2610
  env["METAFLOW_INIT_SCRIPT"] = KUBERNETES_SANDBOX_INIT_SCRIPT
@@ -4,6 +4,7 @@ import platform
4
4
  import re
5
5
  import sys
6
6
  from hashlib import sha1
7
+ from time import sleep
7
8
 
8
9
  from metaflow import JSONType, Run, current, decorators, parameters
9
10
  from metaflow._vendor import click
@@ -959,6 +960,31 @@ def list_workflow_templates(obj, all=None):
959
960
  obj.echo_always(template_name)
960
961
 
961
962
 
963
+ # Internal CLI command to run a heartbeat daemon in an Argo Workflows Daemon container.
964
+ @argo_workflows.command(hidden=True, help="start heartbeat process for a run")
965
+ @click.option("--run_id", required=True)
966
+ @click.option(
967
+ "--tag",
968
+ "tags",
969
+ multiple=True,
970
+ default=None,
971
+ help="Annotate all objects produced by Argo Workflows runs "
972
+ "with the given tag. You can specify this option multiple "
973
+ "times to attach multiple tags.",
974
+ )
975
+ @click.pass_obj
976
+ def heartbeat(obj, run_id, tags=None):
977
+ # Try to register a run in case the start task has not taken care of it yet.
978
+ obj.metadata.register_run_id(run_id, tags)
979
+ # Start run heartbeat
980
+ obj.metadata.start_run_heartbeat(obj.flow.name, run_id)
981
+ # Keepalive loop
982
+ while True:
983
+ # Do not pollute daemon logs with anything unnecessary,
984
+ # as they might be extremely long running.
985
+ sleep(10)
986
+
987
+
962
988
  def validate_run_id(
963
989
  workflow_name, token_prefix, authorize, run_id, instructions_fn=None
964
990
  ):
metaflow/version.py CHANGED
@@ -1 +1 @@
1
- metaflow_version = "2.12.21"
1
+ metaflow_version = "2.12.22"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: metaflow
3
- Version: 2.12.21
3
+ Version: 2.12.22
4
4
  Summary: Metaflow: More Data Science, Less Engineering
5
5
  Author: Metaflow Developers
6
6
  Author-email: help@metaflow.org
@@ -26,7 +26,7 @@ License-File: LICENSE
26
26
  Requires-Dist: requests
27
27
  Requires-Dist: boto3
28
28
  Provides-Extra: stubs
29
- Requires-Dist: metaflow-stubs==2.12.21; extra == "stubs"
29
+ Requires-Dist: metaflow-stubs==2.12.22; extra == "stubs"
30
30
 
31
31
  ![Metaflow_Logo_Horizontal_FullColor_Ribbon_Dark_RGB](https://user-images.githubusercontent.com/763451/89453116-96a57e00-d713-11ea-9fa6-82b29d4d6eff.png)
32
32
 
@@ -36,7 +36,7 @@ metaflow/tuple_util.py,sha256=_G5YIEhuugwJ_f6rrZoelMFak3DqAR2tt_5CapS1XTY,830
36
36
  metaflow/unbounded_foreach.py,sha256=p184WMbrMJ3xKYHwewj27ZhRUsSj_kw1jlye5gA9xJk,387
37
37
  metaflow/util.py,sha256=olAvJK3y1it_k99MhLulTaAJo7OFVt5rnrD-ulIFLCU,13616
38
38
  metaflow/vendor.py,sha256=FchtA9tH22JM-eEtJ2c9FpUdMn8sSb1VHuQS56EcdZk,5139
39
- metaflow/version.py,sha256=-0We4urba1UC7-H1mYhm1sD_smCQ3Vn5btzNTU06WJU,29
39
+ metaflow/version.py,sha256=rnbTumj_lXNCrZgYvwtVWNwWj0XG3M0qQhmivZyGWG4,29
40
40
  metaflow/_vendor/__init__.py,sha256=y_CiwUD3l4eAKvTVDZeqgVujMy31cAM1qjAB-HfI-9s,353
41
41
  metaflow/_vendor/typing_extensions.py,sha256=0nUs5p1A_UrZigrAVBoOEM6TxU37zzPDUtiij1ZwpNc,110417
42
42
  metaflow/_vendor/zipp.py,sha256=ajztOH-9I7KA_4wqDYygtHa6xUBVZgFpmZ8FE74HHHI,8425
@@ -175,12 +175,11 @@ metaflow/plugins/airflow/sensors/s3_sensor.py,sha256=iDReG-7FKnumrtQg-HY6cCUAAqN
175
175
  metaflow/plugins/argo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
176
176
  metaflow/plugins/argo/argo_client.py,sha256=MKKhMCbWOPzf6z5zQQiyDRHHkAXcO7ipboDZDqAAvOk,15849
177
177
  metaflow/plugins/argo/argo_events.py,sha256=_C1KWztVqgi3zuH57pInaE9OzABc2NnncC-zdwOMZ-w,5909
178
- metaflow/plugins/argo/argo_workflows.py,sha256=8YajGVnvBjGC22L308p8zMXzvfJP0fI9RsxGl46nO1k,170748
179
- metaflow/plugins/argo/argo_workflows_cli.py,sha256=X2j_F0xF8-K30ebM4dSLOTteDKXbr-jMN18oMpl5S6Y,36313
178
+ metaflow/plugins/argo/argo_workflows.py,sha256=W8lrMrtJQUCvJbzNyGcT3UVc1CJyMfGw1mrIm7U5ec4,172389
179
+ metaflow/plugins/argo/argo_workflows_cli.py,sha256=E_PyhOtxuS2F8DwhBANsRZCMxpeZ5rfID8eksfSOPm8,37231
180
180
  metaflow/plugins/argo/argo_workflows_decorator.py,sha256=yprszMdbE3rBTcEA9VR0IEnPjTprUauZBc4SBb-Q7sA,7878
181
181
  metaflow/plugins/argo/argo_workflows_deployer.py,sha256=wSSZtThn_VPvE_Wu6NB1L0Q86LmBJh9g009v_lpvBPM,8125
182
182
  metaflow/plugins/argo/capture_error.py,sha256=Ys9dscGrTpW-ZCirLBU0gD9qBM0BjxyxGlUMKcwewQc,1852
183
- metaflow/plugins/argo/daemon.py,sha256=dJOS_UUISXBYffi3oGVKPwq4Pa4P_nGBGL15piPaPto,1776
184
183
  metaflow/plugins/argo/generate_input_paths.py,sha256=loYsI6RFX9LlFsHb7Fe-mzlTTtRdySoOu7sYDy-uXK0,881
185
184
  metaflow/plugins/argo/jobset_input_paths.py,sha256=_JhZWngA6p9Q_O2fx3pdzKI0WE-HPRHz_zFvY2pHPTQ,525
186
185
  metaflow/plugins/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -346,9 +345,9 @@ metaflow/tutorials/07-worldview/README.md,sha256=5vQTrFqulJ7rWN6r20dhot9lI2sVj9W
346
345
  metaflow/tutorials/07-worldview/worldview.ipynb,sha256=ztPZPI9BXxvW1QdS2Tfe7LBuVzvFvv0AToDnsDJhLdE,2237
347
346
  metaflow/tutorials/08-autopilot/README.md,sha256=GnePFp_q76jPs991lMUqfIIh5zSorIeWznyiUxzeUVE,1039
348
347
  metaflow/tutorials/08-autopilot/autopilot.ipynb,sha256=DQoJlILV7Mq9vfPBGW-QV_kNhWPjS5n6SJLqePjFYLY,3191
349
- metaflow-2.12.21.dist-info/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
350
- metaflow-2.12.21.dist-info/METADATA,sha256=LjqXVil716Z6tVFMNHC8OOr1CZ4FeBarzBRiZdPlpzM,5906
351
- metaflow-2.12.21.dist-info/WHEEL,sha256=AHX6tWk3qWuce7vKLrj7lnulVHEdWoltgauo8bgCXgU,109
352
- metaflow-2.12.21.dist-info/entry_points.txt,sha256=IKwTN1T3I5eJL3uo_vnkyxVffcgnRdFbKwlghZfn27k,57
353
- metaflow-2.12.21.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
354
- metaflow-2.12.21.dist-info/RECORD,,
348
+ metaflow-2.12.22.dist-info/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
349
+ metaflow-2.12.22.dist-info/METADATA,sha256=XI-AUDFfekPRYdOciqofewvcuPCSZx7a5lZd58nU2Rw,5906
350
+ metaflow-2.12.22.dist-info/WHEEL,sha256=AHX6tWk3qWuce7vKLrj7lnulVHEdWoltgauo8bgCXgU,109
351
+ metaflow-2.12.22.dist-info/entry_points.txt,sha256=IKwTN1T3I5eJL3uo_vnkyxVffcgnRdFbKwlghZfn27k,57
352
+ metaflow-2.12.22.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
353
+ metaflow-2.12.22.dist-info/RECORD,,
@@ -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()