ob-metaflow 2.13.10.1__py2.py3-none-any.whl → 2.14.0.2rc0__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.

@@ -1966,6 +1966,11 @@ class ArgoWorkflows(object):
1966
1966
  resources["disk"],
1967
1967
  )
1968
1968
 
1969
+ extended_resources = resources.get("extended_resources", {})
1970
+
1971
+ qos_requests = {**qos_requests, **extended_resources}
1972
+ qos_limits = {**qos_limits, **extended_resources}
1973
+
1969
1974
  # Create a ContainerTemplate for this node. Ideally, we would have
1970
1975
  # liked to inline this ContainerTemplate and avoid scanning the workflow
1971
1976
  # twice, but due to issues with variable substitution, we will have to
@@ -2022,6 +2027,7 @@ class ArgoWorkflows(object):
2022
2027
  shared_memory=shared_memory,
2023
2028
  port=port,
2024
2029
  qos=resources["qos"],
2030
+ extended_resources=extended_resources,
2025
2031
  )
2026
2032
 
2027
2033
  for k, v in env.items():
@@ -194,6 +194,7 @@ class Kubernetes(object):
194
194
  port=None,
195
195
  num_parallel=None,
196
196
  qos=None,
197
+ extended_resources=None,
197
198
  ):
198
199
  name = "js-%s" % str(uuid4())[:6]
199
200
  jobset = (
@@ -227,6 +228,7 @@ class Kubernetes(object):
227
228
  port=port,
228
229
  num_parallel=num_parallel,
229
230
  qos=qos,
231
+ extended_resources=extended_resources,
230
232
  )
231
233
  .environment_variable("METAFLOW_CODE_SHA", code_package_sha)
232
234
  .environment_variable("METAFLOW_CODE_URL", code_package_url)
@@ -504,6 +506,7 @@ class Kubernetes(object):
504
506
  name_pattern=None,
505
507
  qos=None,
506
508
  annotations=None,
509
+ extended_resources=None,
507
510
  ):
508
511
  if env is None:
509
512
  env = {}
@@ -546,6 +549,7 @@ class Kubernetes(object):
546
549
  shared_memory=shared_memory,
547
550
  port=port,
548
551
  qos=qos,
552
+ extended_resources=extended_resources,
549
553
  )
550
554
  .environment_variable("METAFLOW_CODE_SHA", code_package_sha)
551
555
  .environment_variable("METAFLOW_CODE_URL", code_package_url)
@@ -145,6 +145,12 @@ def kubernetes():
145
145
  type=JSONTypeClass(),
146
146
  multiple=False,
147
147
  )
148
+ @click.option(
149
+ "--extended-resources",
150
+ default=None,
151
+ type=JSONTypeClass(),
152
+ multiple=False,
153
+ )
148
154
  @click.pass_context
149
155
  def step(
150
156
  ctx,
@@ -176,6 +182,7 @@ def step(
176
182
  qos=None,
177
183
  labels=None,
178
184
  annotations=None,
185
+ extended_resources=None,
179
186
  **kwargs
180
187
  ):
181
188
  def echo(msg, stream="stderr", job_id=None, **kwargs):
@@ -319,6 +326,7 @@ def step(
319
326
  qos=qos,
320
327
  labels=labels,
321
328
  annotations=annotations,
329
+ extended_resources=extended_resources,
322
330
  )
323
331
  except Exception:
324
332
  traceback.print_exc(chain=False)
@@ -123,6 +123,9 @@ class KubernetesDecorator(StepDecorator):
123
123
  Only applicable when @parallel is used.
124
124
  qos: str, default: Burstable
125
125
  Quality of Service class to assign to the pod. Supported values are: Guaranteed, Burstable, BestEffort
126
+ extended_resources: Dict[str, str], optional, default None
127
+ Extended resources to be requested for the pod.
128
+ https://kubernetes.io/docs/tasks/administer-cluster/extended-resource-node/
126
129
  """
127
130
 
128
131
  name = "kubernetes"
@@ -153,6 +156,7 @@ class KubernetesDecorator(StepDecorator):
153
156
  "executable": None,
154
157
  "hostname_resolution_timeout": 10 * 60,
155
158
  "qos": KUBERNETES_QOS,
159
+ "extended_resources": {},
156
160
  }
157
161
  package_url = None
158
162
  package_sha = None
@@ -488,6 +492,7 @@ class KubernetesDecorator(StepDecorator):
488
492
  "persistent_volume_claims",
489
493
  "labels",
490
494
  "annotations",
495
+ "extended_resources",
491
496
  ]:
492
497
  cli_args.command_options[k] = json.dumps(v)
493
498
  else:
@@ -89,10 +89,11 @@ class KubernetesJob(object):
89
89
 
90
90
  additional_obp_configs = {
91
91
  "OBP_PERIMETER": initial_configs["OBP_PERIMETER"],
92
- "OBP_INTEGRATIONS_URL": initial_configs[
93
- "OBP_INTEGRATIONS_URL"
94
- ],
92
+ "OBP_INTEGRATIONS_URL": initial_configs["OBP_INTEGRATIONS_URL"],
95
93
  }
94
+ extended_resources = self._kwargs.get("extended_resources", {})
95
+ qos_requests = {**qos_requests, **extended_resources}
96
+ qos_limits = {**qos_limits, **extended_resources}
96
97
 
97
98
  return client.V1JobSpec(
98
99
  # Retries are handled by Metaflow when it is responsible for
@@ -118,6 +119,7 @@ class KubernetesJob(object):
118
119
  containers=[
119
120
  client.V1Container(
120
121
  command=self._kwargs["command"],
122
+ security_context=client.V1SecurityContext(privileged=True),
121
123
  termination_message_policy="FallbackToLogsOnError",
122
124
  ports=(
123
125
  []
@@ -560,6 +560,11 @@ class JobSetSpec(object):
560
560
  self._kwargs["memory"],
561
561
  self._kwargs["disk"],
562
562
  )
563
+
564
+ extended_resources = self._kwargs.get("extended_resources", {})
565
+ qos_requests = {**qos_requests, **extended_resources}
566
+ qos_limits = {**qos_limits, **extended_resources}
567
+
563
568
  return dict(
564
569
  name=self.name,
565
570
  template=client.api_client.ApiClient().sanitize_for_serialization(
@@ -611,6 +616,9 @@ class JobSetSpec(object):
611
616
  )
612
617
  ]
613
618
  ),
619
+ security_context=client.V1SecurityContext(
620
+ privileged=True
621
+ ),
614
622
  env=[
615
623
  client.V1EnvVar(name=k, value=str(v))
616
624
  for k, v in self._kwargs.get(
@@ -1,23 +1,18 @@
1
1
  import os
2
2
  import random
3
+ import time
3
4
 
4
5
  import requests
5
- import time
6
6
 
7
7
  from metaflow.exception import (
8
8
  MetaflowException,
9
- MetaflowTaggingError,
10
9
  MetaflowInternalError,
11
- )
12
- from metaflow.metaflow_config import (
13
- SERVICE_RETRY_COUNT,
14
- SERVICE_HEADERS,
15
- SERVICE_URL,
10
+ MetaflowTaggingError,
16
11
  )
17
12
  from metaflow.metadata_provider import MetadataProvider
18
13
  from metaflow.metadata_provider.heartbeat import HB_URL_KEY
14
+ from metaflow.metaflow_config import SERVICE_HEADERS, SERVICE_RETRY_COUNT, SERVICE_URL
19
15
  from metaflow.sidecar import Message, MessageTypes, Sidecar
20
-
21
16
  from metaflow.util import version_parse
22
17
 
23
18
 
@@ -39,6 +34,23 @@ class ServiceException(MetaflowException):
39
34
  class ServiceMetadataProvider(MetadataProvider):
40
35
  TYPE = "service"
41
36
 
37
+ _session = requests.Session()
38
+ _session.mount(
39
+ "http://",
40
+ requests.adapters.HTTPAdapter(
41
+ pool_connections=20,
42
+ pool_maxsize=20,
43
+ max_retries=0, # Handle retries explicitly
44
+ pool_block=False,
45
+ ),
46
+ )
47
+ _session.mount(
48
+ "https://",
49
+ requests.adapters.HTTPAdapter(
50
+ pool_connections=20, pool_maxsize=20, max_retries=0, pool_block=False
51
+ ),
52
+ )
53
+
42
54
  _supports_attempt_gets = None
43
55
  _supports_tag_mutation = None
44
56
 
@@ -59,7 +71,9 @@ class ServiceMetadataProvider(MetadataProvider):
59
71
  def compute_info(cls, val):
60
72
  v = val.rstrip("/")
61
73
  try:
62
- resp = requests.get(os.path.join(v, "ping"), headers=SERVICE_HEADERS.copy())
74
+ resp = cls._session.get(
75
+ os.path.join(v, "ping"), headers=SERVICE_HEADERS.copy()
76
+ )
63
77
  resp.raise_for_status()
64
78
  except: # noqa E722
65
79
  raise ValueError("Metaflow service [%s] unreachable." % v)
@@ -412,27 +426,27 @@ class ServiceMetadataProvider(MetadataProvider):
412
426
  if method == "GET":
413
427
  if monitor:
414
428
  with monitor.measure("metaflow.service_metadata.get"):
415
- resp = requests.get(url, headers=SERVICE_HEADERS.copy())
429
+ resp = cls._session.get(url, headers=SERVICE_HEADERS.copy())
416
430
  else:
417
- resp = requests.get(url, headers=SERVICE_HEADERS.copy())
431
+ resp = cls._session.get(url, headers=SERVICE_HEADERS.copy())
418
432
  elif method == "POST":
419
433
  if monitor:
420
434
  with monitor.measure("metaflow.service_metadata.post"):
421
- resp = requests.post(
435
+ resp = cls._session.post(
422
436
  url, headers=SERVICE_HEADERS.copy(), json=data
423
437
  )
424
438
  else:
425
- resp = requests.post(
439
+ resp = cls._session.post(
426
440
  url, headers=SERVICE_HEADERS.copy(), json=data
427
441
  )
428
442
  elif method == "PATCH":
429
443
  if monitor:
430
444
  with monitor.measure("metaflow.service_metadata.patch"):
431
- resp = requests.patch(
445
+ resp = cls._session.patch(
432
446
  url, headers=SERVICE_HEADERS.copy(), json=data
433
447
  )
434
448
  else:
435
- resp = requests.patch(
449
+ resp = cls._session.patch(
436
450
  url, headers=SERVICE_HEADERS.copy(), json=data
437
451
  )
438
452
  else:
@@ -475,7 +489,6 @@ class ServiceMetadataProvider(MetadataProvider):
475
489
  resp.text,
476
490
  )
477
491
  time.sleep(2**i)
478
-
479
492
  if resp:
480
493
  raise ServiceException(
481
494
  "Metadata request (%s) failed (code %s): %s"
@@ -499,9 +512,9 @@ class ServiceMetadataProvider(MetadataProvider):
499
512
  try:
500
513
  if monitor:
501
514
  with monitor.measure("metaflow.service_metadata.get"):
502
- resp = requests.get(url, headers=SERVICE_HEADERS.copy())
515
+ resp = cls._session.get(url, headers=SERVICE_HEADERS.copy())
503
516
  else:
504
- resp = requests.get(url, headers=SERVICE_HEADERS.copy())
517
+ resp = cls._session.get(url, headers=SERVICE_HEADERS.copy())
505
518
  except:
506
519
  if monitor:
507
520
  with monitor.count("metaflow.service_metadata.failed_request"):
@@ -527,12 +527,6 @@ def extract_all_params(cmd_obj: Union[click.Command, click.Group]):
527
527
  )
528
528
  arg_parameters[each_param.name] = each_param
529
529
  elif isinstance(each_param, click.Option):
530
- if each_param.hidden:
531
- # Skip hidden options because users should not be setting those.
532
- # These are typically internal only options (used by the Runner in part
533
- # for example to pass state files or configs to pass local-config-file).
534
- continue
535
-
536
530
  opt_params_sigs[each_param.name], annotations[each_param.name] = (
537
531
  get_inspect_param_obj(each_param, inspect.Parameter.KEYWORD_ONLY)
538
532
  )
metaflow/version.py CHANGED
@@ -1 +1 @@
1
- metaflow_version = "2.13.10.1"
1
+ metaflow_version = "2.14.0.2rc0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ob-metaflow
3
- Version: 2.13.10.1
3
+ Version: 2.14.0.2rc0
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.13.10.1; extra == "stubs"
15
+ Requires-Dist: metaflow-stubs==2.14.0.2rc0; extra == "stubs"
16
16
  Dynamic: author
17
17
  Dynamic: author-email
18
18
  Dynamic: description
@@ -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=mJBkV5tShIyCsLDeM1zygQGeciQVMrVPm_qI8Oi33G0,14656
38
38
  metaflow/vendor.py,sha256=FchtA9tH22JM-eEtJ2c9FpUdMn8sSb1VHuQS56EcdZk,5139
39
- metaflow/version.py,sha256=nEqMd26PFOk16IDyKeu-GgwaKxcoub6bcMATTlr6Rmg,31
39
+ metaflow/version.py,sha256=oiICSOwc_b5wi5EFZxih7ogG7-vIVMe9j_VgVtch29E,33
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
@@ -181,7 +181,7 @@ metaflow/plugins/airflow/sensors/s3_sensor.py,sha256=iDReG-7FKnumrtQg-HY6cCUAAqN
181
181
  metaflow/plugins/argo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
182
182
  metaflow/plugins/argo/argo_client.py,sha256=PS_cYGnPw9h4X7TP_plObDH3clMw4reOsBLkkGPTd0Y,16282
183
183
  metaflow/plugins/argo/argo_events.py,sha256=_C1KWztVqgi3zuH57pInaE9OzABc2NnncC-zdwOMZ-w,5909
184
- metaflow/plugins/argo/argo_workflows.py,sha256=zx5aVyLLwnBzjhu7d9-DotQaw6WgHEoWmZ0KqRNdJCo,183449
184
+ metaflow/plugins/argo/argo_workflows.py,sha256=yWyDlFRQX6A7pwI08Z1MGqY-gbFTnvSp5WJwg66ZdlM,183711
185
185
  metaflow/plugins/argo/argo_workflows_cli.py,sha256=kzZF2XRr5If9t135wMXXDTpIRupnWCK7mtDpvZ6K8P0,38424
186
186
  metaflow/plugins/argo/argo_workflows_decorator.py,sha256=ogCSBmwsC2C3eusydrgjuAJd4qK18f1sI4jJwA4Fd-o,7800
187
187
  metaflow/plugins/argo/argo_workflows_deployer.py,sha256=6kHxEnYXJwzNCM9swI8-0AckxtPWqwhZLerYkX8fxUM,4444
@@ -288,17 +288,17 @@ metaflow/plugins/gcp/gs_utils.py,sha256=ZmIGFse1qYyvAVrwga23PQUzF6dXEDLLsZ2F-YRm
288
288
  metaflow/plugins/gcp/includefile_support.py,sha256=OQO0IVWv4ObboL0VqEZwcDOyj9ORLdur66JToxQ84vU,3887
289
289
  metaflow/plugins/kubernetes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
290
290
  metaflow/plugins/kubernetes/kube_utils.py,sha256=jdFMGbEmIow-oli26v31W9CmbZXigx06b3D_xIobpk0,4140
291
- metaflow/plugins/kubernetes/kubernetes.py,sha256=4WHVs421w5JfFSRAdpiZ6X9w7xEK8UPYGNcc9e0JOFc,30420
292
- metaflow/plugins/kubernetes/kubernetes_cli.py,sha256=o_o0BDEJFpTuga7txRmkvZH8OIuTb5kI4UaG6xbzf84,13929
291
+ metaflow/plugins/kubernetes/kubernetes.py,sha256=JngFWhz9l6sYORMX9-6mdrq0e_FWN5BP9QHUVW75wzI,30596
292
+ metaflow/plugins/kubernetes/kubernetes_cli.py,sha256=fGCzz9_MT6KTKWAlpjzjFtYCSy3WctqJXhNIfTg8z5Y,14122
293
293
  metaflow/plugins/kubernetes/kubernetes_client.py,sha256=tuvXP-QKpdeSmzVolB2R_TaacOr5DIb0j642eKcjsiM,6491
294
- metaflow/plugins/kubernetes/kubernetes_decorator.py,sha256=Spz1vkIurf9Z9mENZEdXk2tLS3v2jqVJIF5wyYyqbJ4,31684
295
- metaflow/plugins/kubernetes/kubernetes_job.py,sha256=0PjcVgJkmSqjBNEkibk8y0xxBrgu99D8ar9RsXnzCeY,32833
296
- metaflow/plugins/kubernetes/kubernetes_jobsets.py,sha256=9kU43eE5IvIa7y-POzBdxnJOazWsedKhwQ51Tu1HN_A,42471
294
+ metaflow/plugins/kubernetes/kubernetes_decorator.py,sha256=cy7nr7HlJS1se3WszOLEdE2i4VfpSOFxkiGcp__MX1M,31963
295
+ metaflow/plugins/kubernetes/kubernetes_job.py,sha256=eU_c8YAY9IPygBo0MIqYA6xGvmXEBo_0AmV38S811TM,33083
296
+ metaflow/plugins/kubernetes/kubernetes_jobsets.py,sha256=0ebS4H5Lnehq0-CXxqh30ZunukuYJ5gD_9mSTaRcXx4,42851
297
297
  metaflow/plugins/kubernetes/spot_metadata_cli.py,sha256=an0nWCxgflmqIPBCBrlb4m3DereDFFJBLt-KKhqcHc8,1670
298
298
  metaflow/plugins/kubernetes/spot_monitor_sidecar.py,sha256=zrWU-smQwPnL6MBHmzTxWyEA00R6iKKQbhhy50xFwQ8,3832
299
299
  metaflow/plugins/metadata_providers/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
300
300
  metaflow/plugins/metadata_providers/local.py,sha256=9UAxe9caN6kU1lkSlIoJbRGgTqsMa62cBTnyMwhqiaA,22446
301
- metaflow/plugins/metadata_providers/service.py,sha256=NKZfFMamx6upP6aFRJfXlfYIhySgFNzz6kbp1yPD7LA,20222
301
+ metaflow/plugins/metadata_providers/service.py,sha256=XhXarANcgkQ4D5q8qhywvd8BjPN274DLGLVx1KtxWF0,20725
302
302
  metaflow/plugins/pypi/__init__.py,sha256=0YFZpXvX7HCkyBFglatual7XGifdA1RwC3U4kcizyak,1037
303
303
  metaflow/plugins/pypi/bootstrap.py,sha256=oRfJkAp99R338nYX2wq4FrV0Ax5h4QqqifNmAXrM3CY,14892
304
304
  metaflow/plugins/pypi/conda_decorator.py,sha256=piFcE4uGmWhhbGlxMK0GHd7BGEyqy6r9BFy8Mjoi80Q,15937
@@ -312,7 +312,7 @@ metaflow/plugins/secrets/__init__.py,sha256=mhJaN2eMS_ZZVewAMR2E-JdP5i0t3v9e6Dcw
312
312
  metaflow/plugins/secrets/inline_secrets_provider.py,sha256=EChmoBGA1i7qM3jtYwPpLZDBybXLergiDlN63E0u3x8,294
313
313
  metaflow/plugins/secrets/secrets_decorator.py,sha256=s-sFzPWOjahhpr5fMj-ZEaHkDYAPTO0isYXGvaUwlG8,11273
314
314
  metaflow/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
315
- metaflow/runner/click_api.py,sha256=dKTrom8j7yvBQfFNl4JH9WJcyBBHy39ROtVpilUdqkw,23429
315
+ metaflow/runner/click_api.py,sha256=truFw2mbtnEKWVhfY5haIxJEyyoB6-cipoY5-ZWXFXo,23111
316
316
  metaflow/runner/deployer.py,sha256=Yas_SZCss3kfJw3hLC8_IyzgiytUFGoEGHz-l-rBBKk,8980
317
317
  metaflow/runner/deployer_impl.py,sha256=Kab9rLoA3EiBJDtTTulhPCeKzqiljW366nx2Tm0LYy0,6143
318
318
  metaflow/runner/metaflow_runner.py,sha256=L302ew_BPBPs-NnW8n92dqqbqmHwrwGL5D6kTZvl5vY,16074
@@ -360,9 +360,9 @@ metaflow/user_configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
360
360
  metaflow/user_configs/config_decorators.py,sha256=qCKVAvd0NKgaCxQ2OThes5-DYHXq6A1HqURubYNeFdw,20481
361
361
  metaflow/user_configs/config_options.py,sha256=m6jccSpzI4qUJ7vyYkYBIf8G3V0Caunxg_k7zg4Zlqg,21067
362
362
  metaflow/user_configs/config_parameters.py,sha256=oeJGVKu1ao_YQX6Lg6P2FEv5k5-_F4sARLlVpTW9ezM,15502
363
- ob_metaflow-2.13.10.1.dist-info/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
364
- ob_metaflow-2.13.10.1.dist-info/METADATA,sha256=DsnOlL1LI7oDUS-wnH7RHGzoiHmFHveNkCon-aOcFUA,5318
365
- ob_metaflow-2.13.10.1.dist-info/WHEEL,sha256=9Hm2OB-j1QcCUq9Jguht7ayGIIZBRTdOXD1qg9cCgPM,109
366
- ob_metaflow-2.13.10.1.dist-info/entry_points.txt,sha256=IKwTN1T3I5eJL3uo_vnkyxVffcgnRdFbKwlghZfn27k,57
367
- ob_metaflow-2.13.10.1.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
368
- ob_metaflow-2.13.10.1.dist-info/RECORD,,
363
+ ob_metaflow-2.14.0.2rc0.dist-info/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
364
+ ob_metaflow-2.14.0.2rc0.dist-info/METADATA,sha256=EGri-n8c5GqNu91Vf_PHyq4pz4ZCwHqhimXpMJJYKQQ,5322
365
+ ob_metaflow-2.14.0.2rc0.dist-info/WHEEL,sha256=9Hm2OB-j1QcCUq9Jguht7ayGIIZBRTdOXD1qg9cCgPM,109
366
+ ob_metaflow-2.14.0.2rc0.dist-info/entry_points.txt,sha256=IKwTN1T3I5eJL3uo_vnkyxVffcgnRdFbKwlghZfn27k,57
367
+ ob_metaflow-2.14.0.2rc0.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
368
+ ob_metaflow-2.14.0.2rc0.dist-info/RECORD,,