ob-metaflow 2.15.21.3__py2.py3-none-any.whl → 2.15.21.4__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.

@@ -58,21 +58,38 @@ class ArgoClient(object):
58
58
  json.loads(e.body)["message"] if e.body is not None else e.reason
59
59
  )
60
60
 
61
- def get_workflow_templates(self):
61
+ def get_workflow_templates(self, page_size=100):
62
62
  client = self._client.get()
63
- try:
64
- return client.CustomObjectsApi().list_namespaced_custom_object(
65
- group=self._group,
66
- version=self._version,
67
- namespace=self._namespace,
68
- plural="workflowtemplates",
69
- )["items"]
70
- except client.rest.ApiException as e:
71
- if e.status == 404:
72
- return None
73
- raise ArgoClientException(
74
- json.loads(e.body)["message"] if e.body is not None else e.reason
75
- )
63
+ continue_token = None
64
+
65
+ while True:
66
+ try:
67
+ params = {"limit": page_size}
68
+ if continue_token:
69
+ params["_continue"] = continue_token
70
+
71
+ response = client.CustomObjectsApi().list_namespaced_custom_object(
72
+ group=self._group,
73
+ version=self._version,
74
+ namespace=self._namespace,
75
+ plural="workflowtemplates",
76
+ **params,
77
+ )
78
+
79
+ for item in response.get("items", []):
80
+ yield item
81
+
82
+ metadata = response.get("metadata", {})
83
+ continue_token = metadata.get("continue")
84
+
85
+ if not continue_token:
86
+ break
87
+ except client.rest.ApiException as e:
88
+ if e.status == 404:
89
+ return None
90
+ raise ArgoClientException(
91
+ json.loads(e.body)["message"] if e.body is not None else e.reason
92
+ )
76
93
 
77
94
  def register_workflow_template(self, name, workflow_template):
78
95
  # Unfortunately, Kubernetes client does not handle optimistic
@@ -214,23 +214,14 @@ class ArgoWorkflows(object):
214
214
  return name.replace(".", "-")
215
215
 
216
216
  @staticmethod
217
- def list_templates(flow_name, all=False):
217
+ def list_templates(flow_name, all=False, page_size=100):
218
218
  client = ArgoClient(namespace=KUBERNETES_NAMESPACE)
219
219
 
220
- templates = client.get_workflow_templates()
221
- if templates is None:
222
- return []
223
-
224
- template_names = [
225
- template["metadata"]["name"]
226
- for template in templates
227
- if all
228
- or flow_name
229
- == template["metadata"]
230
- .get("annotations", {})
231
- .get("metaflow/flow_name", None)
232
- ]
233
- return template_names
220
+ for template in client.get_workflow_templates(page_size=page_size):
221
+ if all or flow_name == template["metadata"].get("annotations", {}).get(
222
+ "metaflow/flow_name", None
223
+ ):
224
+ yield template["metadata"]["name"]
234
225
 
235
226
  @staticmethod
236
227
  def delete(name):
@@ -998,8 +998,7 @@ def terminate(obj, run_id, authorize=None):
998
998
  )
999
999
  @click.pass_obj
1000
1000
  def list_workflow_templates(obj, all=None):
1001
- templates = ArgoWorkflows.list_templates(obj.flow.name, all)
1002
- for template_name in templates:
1001
+ for template_name in ArgoWorkflows.list_templates(obj.flow.name, all):
1003
1002
  obj.echo_always(template_name)
1004
1003
 
1005
1004
 
@@ -203,6 +203,38 @@ class ArgoWorkflowsDeployedFlow(DeployedFlow):
203
203
 
204
204
  TYPE: ClassVar[Optional[str]] = "argo-workflows"
205
205
 
206
+ @classmethod
207
+ def list_deployed_flows(cls, flow_name: Optional[str] = None):
208
+ """
209
+ List all deployed Argo Workflow templates.
210
+
211
+ Parameters
212
+ ----------
213
+ flow_name : str, optional, default None
214
+ If specified, only list deployed flows for this specific flow name.
215
+ If None, list all deployed flows.
216
+
217
+ Yields
218
+ ------
219
+ ArgoWorkflowsDeployedFlow
220
+ `ArgoWorkflowsDeployedFlow` objects representing deployed
221
+ workflow templates on Argo Workflows.
222
+ """
223
+ from metaflow.plugins.argo.argo_workflows import ArgoWorkflows
224
+
225
+ # When flow_name is None, use all=True to get all templates
226
+ # When flow_name is specified, use all=False to filter by flow_name
227
+ all_templates = flow_name is None
228
+ for template_name in ArgoWorkflows.list_templates(
229
+ flow_name=flow_name, all=all_templates
230
+ ):
231
+ try:
232
+ deployed_flow = cls.from_deployment(template_name)
233
+ yield deployed_flow
234
+ except Exception:
235
+ # Skip templates that can't be converted to DeployedFlow objects
236
+ continue
237
+
206
238
  @classmethod
207
239
  def from_deployment(cls, identifier: str, metadata: Optional[str] = None):
208
240
  """
@@ -56,6 +56,20 @@ class StepFunctionsDeployedFlow(DeployedFlow):
56
56
 
57
57
  TYPE: ClassVar[Optional[str]] = "step-functions"
58
58
 
59
+ @classmethod
60
+ def list_deployed_flows(cls, flow_name: Optional[str] = None):
61
+ """
62
+ This method is not currently implemented for Step Functions.
63
+
64
+ Raises
65
+ ------
66
+ NotImplementedError
67
+ This method is not implemented for Step Functions.
68
+ """
69
+ raise NotImplementedError(
70
+ "list_deployed_flows is not implemented for StepFunctions"
71
+ )
72
+
59
73
  @classmethod
60
74
  def from_deployment(cls, identifier: str, metadata: Optional[str] = None):
61
75
  """
@@ -13,7 +13,9 @@ def generate_fake_flow_file_contents(
13
13
  ):
14
14
  params_code = ""
15
15
  for _, param_details in param_info.items():
16
- param_python_var_name = param_details["python_var_name"]
16
+ param_python_var_name = param_details.get(
17
+ "python_var_name", param_details["name"]
18
+ )
17
19
  param_name = param_details["name"]
18
20
  param_type = param_details["type"]
19
21
  param_help = param_details["description"]
@@ -229,7 +231,7 @@ class DeployedFlowMeta(type):
229
231
  }
230
232
  )
231
233
 
232
- def _default_injected_method():
234
+ def _from_deployment_injected_method():
233
235
  def f(
234
236
  cls,
235
237
  identifier: str,
@@ -271,7 +273,7 @@ class DeployedFlowMeta(type):
271
273
  f.__name__ = "from_deployment"
272
274
  return f
273
275
 
274
- def _per_type_injected_method(method_name, impl):
276
+ def _per_type_from_deployment_injected_method(method_name, impl):
275
277
  def f(
276
278
  cls,
277
279
  identifier: str,
@@ -286,14 +288,88 @@ class DeployedFlowMeta(type):
286
288
  f.__name__ = method_name
287
289
  return f
288
290
 
289
- setattr(cls, "from_deployment", classmethod(_default_injected_method()))
291
+ def _list_deployed_flows_injected_method():
292
+ def f(
293
+ cls,
294
+ flow_name: Optional[str] = None,
295
+ impl: str = DEFAULT_FROM_DEPLOYMENT_IMPL.replace("-", "_"),
296
+ ):
297
+ """
298
+ List all deployed flows for the specified implementation.
299
+
300
+ Parameters
301
+ ----------
302
+ flow_name : str, optional, default None
303
+ If specified, only list deployed flows for this specific flow name.
304
+ If None, list all deployed flows.
305
+ impl : str, optional, default given by METAFLOW_DEFAULT_FROM_DEPLOYMENT_IMPL
306
+ The default implementation to use if not specified
307
+
308
+ Yields
309
+ ------
310
+ DeployedFlow
311
+ `DeployedFlow` objects representing deployed flows.
312
+ """
313
+ if impl in allowed_providers:
314
+ return (
315
+ allowed_providers[impl]
316
+ .deployed_flow_type()
317
+ .list_deployed_flows(flow_name)
318
+ )
319
+ else:
320
+ raise ValueError(
321
+ f"No deployer '{impl}' exists; valid deployers are: "
322
+ f"{list(allowed_providers.keys())}"
323
+ )
324
+
325
+ f.__name__ = "list_deployed_flows"
326
+ return f
327
+
328
+ def _per_type_list_deployed_flows_injected_method(method_name, impl):
329
+ def f(
330
+ cls,
331
+ flow_name: Optional[str] = None,
332
+ ):
333
+ return (
334
+ allowed_providers[impl]
335
+ .deployed_flow_type()
336
+ .list_deployed_flows(flow_name)
337
+ )
338
+
339
+ f.__name__ = method_name
340
+ return f
341
+
342
+ setattr(
343
+ cls, "from_deployment", classmethod(_from_deployment_injected_method())
344
+ )
345
+ setattr(
346
+ cls,
347
+ "list_deployed_flows",
348
+ classmethod(_list_deployed_flows_injected_method()),
349
+ )
290
350
 
291
351
  for impl in allowed_providers:
292
- method_name = f"from_{impl}"
352
+ from_deployment_method_name = f"from_{impl}"
353
+ list_deployed_flows_method_name = f"list_{impl}"
354
+
293
355
  setattr(
294
356
  cls,
295
- method_name,
296
- classmethod(_per_type_injected_method(method_name, impl)),
357
+ from_deployment_method_name,
358
+ classmethod(
359
+ _per_type_from_deployment_injected_method(
360
+ from_deployment_method_name, impl
361
+ )
362
+ ),
363
+ )
364
+
365
+ setattr(
366
+ cls,
367
+ list_deployed_flows_method_name,
368
+ classmethod(
369
+ _per_type_list_deployed_flows_injected_method(
370
+ list_deployed_flows_method_name, impl
371
+ )
372
+ ),
297
373
  )
298
374
 
299
375
  return cls
metaflow/version.py CHANGED
@@ -1 +1 @@
1
- metaflow_version = "2.15.21.3"
1
+ metaflow_version = "2.15.21.4"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ob-metaflow
3
- Version: 2.15.21.3
3
+ Version: 2.15.21.4
4
4
  Summary: Metaflow: More AI and ML, 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.15.21.3; extra == "stubs"
15
+ Requires-Dist: metaflow-stubs==2.15.21.4; extra == "stubs"
16
16
  Dynamic: author
17
17
  Dynamic: author-email
18
18
  Dynamic: description
@@ -37,7 +37,7 @@ metaflow/tuple_util.py,sha256=_G5YIEhuugwJ_f6rrZoelMFak3DqAR2tt_5CapS1XTY,830
37
37
  metaflow/unbounded_foreach.py,sha256=p184WMbrMJ3xKYHwewj27ZhRUsSj_kw1jlye5gA9xJk,387
38
38
  metaflow/util.py,sha256=MCXCjcGwpuR7y9euBf1GTNRHPtlh6fCpdPMEtbULefw,14554
39
39
  metaflow/vendor.py,sha256=EDZokNMrx1PU07jNMiWFMFtC7TL03pMXZ1kKn13k-2g,5139
40
- metaflow/version.py,sha256=be-sc_5dofoh8el7z-WGvRCpZomzDz1gk9ZlFh1uoxA,31
40
+ metaflow/version.py,sha256=_6ahaL9ST3eCHwsCdRMSQZvyja51QIOxl5SMPwTZciQ,31
41
41
  metaflow/_vendor/__init__.py,sha256=y_CiwUD3l4eAKvTVDZeqgVujMy31cAM1qjAB-HfI-9s,353
42
42
  metaflow/_vendor/typing_extensions.py,sha256=q9zxWa6p6CzF1zZvSkygSlklduHf_b3K7MCxGz7MJRc,134519
43
43
  metaflow/_vendor/zipp.py,sha256=ajztOH-9I7KA_4wqDYygtHa6xUBVZgFpmZ8FE74HHHI,8425
@@ -205,13 +205,13 @@ metaflow/plugins/airflow/sensors/base_sensor.py,sha256=s-OQBfPWZ_T3wn96Ua59CCEj1
205
205
  metaflow/plugins/airflow/sensors/external_task_sensor.py,sha256=zhYlrZnXT20KW8-fVk0fCNtTyNiKJB5PMVASacu30r0,6034
206
206
  metaflow/plugins/airflow/sensors/s3_sensor.py,sha256=iDReG-7FKnumrtQg-HY6cCUAAqNA90nARrjjjEEk_x4,3275
207
207
  metaflow/plugins/argo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
208
- metaflow/plugins/argo/argo_client.py,sha256=A1kI9rjVjCadDsBscZ2Wk8xRBI6GNgWV6SU7TyrdfrI,16530
208
+ metaflow/plugins/argo/argo_client.py,sha256=jLz0FjCTBvFLZt-8lZcMQhDcInhgEcGdPrU2Gvh67zA,17080
209
209
  metaflow/plugins/argo/argo_events.py,sha256=_C1KWztVqgi3zuH57pInaE9OzABc2NnncC-zdwOMZ-w,5909
210
- metaflow/plugins/argo/argo_workflows.py,sha256=wwB-a-2GtcOB3I3Rh03SwoAkrQlMFDjvKbdNmAN74HU,189319
211
- metaflow/plugins/argo/argo_workflows_cli.py,sha256=1bdG8BQgwyfHooBidyY1Aw52uwjCxq2Edt0bO7qezWM,38375
210
+ metaflow/plugins/argo/argo_workflows.py,sha256=Bw37HHRHf4jqh8c5-WpRKLGr8OR0l46J25LmPn2YlrY,189191
211
+ metaflow/plugins/argo/argo_workflows_cli.py,sha256=aWaGVsf3c2Xvwpbm6F_iTSKsBuJWUALkMOtdgbIqj7Q,38349
212
212
  metaflow/plugins/argo/argo_workflows_decorator.py,sha256=ogCSBmwsC2C3eusydrgjuAJd4qK18f1sI4jJwA4Fd-o,7800
213
213
  metaflow/plugins/argo/argo_workflows_deployer.py,sha256=6kHxEnYXJwzNCM9swI8-0AckxtPWqwhZLerYkX8fxUM,4444
214
- metaflow/plugins/argo/argo_workflows_deployer_objects.py,sha256=7OiapcIM_r-aBkuIobhofgLC5NRJHC-p9bvBmxvhqoM,12500
214
+ metaflow/plugins/argo/argo_workflows_deployer_objects.py,sha256=1qiY69jB2yq0ryIH2SKzFHgUXRYvr0VTXd9TDQWG-s0,13693
215
215
  metaflow/plugins/argo/capture_error.py,sha256=Ys9dscGrTpW-ZCirLBU0gD9qBM0BjxyxGlUMKcwewQc,1852
216
216
  metaflow/plugins/argo/exit_hooks.py,sha256=nh8IEkzAtQnbKVnh3N9CVnVKZB39Bjm3e0LFrACsLz8,6109
217
217
  metaflow/plugins/argo/generate_input_paths.py,sha256=loYsI6RFX9LlFsHb7Fe-mzlTTtRdySoOu7sYDy-uXK0,881
@@ -237,7 +237,7 @@ metaflow/plugins/aws/step_functions/step_functions_cli.py,sha256=VixVaowCRoUIY9u
237
237
  metaflow/plugins/aws/step_functions/step_functions_client.py,sha256=DKpNwAIWElvWjFANs5Ku3rgzjxFoqAD6k-EF8Xhkg3Q,4754
238
238
  metaflow/plugins/aws/step_functions/step_functions_decorator.py,sha256=jzDHYmgU_XvLffZDazR_1viow_1qQFblx9UKyjtoM_0,3788
239
239
  metaflow/plugins/aws/step_functions/step_functions_deployer.py,sha256=JKYtDhKivtXUWPklprZFzkqezh14loGDmk8mNk6QtpI,3714
240
- metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py,sha256=zDWmrOeCEL2_uBbmdmXbVpHVTjswwjEL_rOux6MAcRI,7303
240
+ metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py,sha256=KWIPpE4ebOYyyXlRVtJF6XMnYcyjMFTxdzJWbP0m5PA,7719
241
241
  metaflow/plugins/azure/__init__.py,sha256=GuuhTVC-zSdyAf79a1wiERMq0Zts7fwVT7t9fAf234A,100
242
242
  metaflow/plugins/azure/azure_credential.py,sha256=JmdGEbVzgxy8ucqnQDdTTI_atyMX9WSZUw3qYOo7RhE,2174
243
243
  metaflow/plugins/azure/azure_exceptions.py,sha256=NnbwpUC23bc61HZjJmeXztY0tBNn_Y_VpIpDDuYWIZ0,433
@@ -351,7 +351,7 @@ metaflow/plugins/uv/bootstrap.py,sha256=PJP-lrFsLUUfiXCNse2Uy5uI3b8-X3-ji3Uwf30I
351
351
  metaflow/plugins/uv/uv_environment.py,sha256=6hUaWrTgqHyzS6igGQUXpS6jb_GHv3Wq9ZrWhZgEals,2587
352
352
  metaflow/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
353
353
  metaflow/runner/click_api.py,sha256=u9Y1bu9vN13ektBs-L8lg2oxb5oYvGe1dPJjV2shMAw,23727
354
- metaflow/runner/deployer.py,sha256=U-hwf4gVzwUlXgnkfTW3y1daGXvo5eP4HTQZwb-vS0g,11058
354
+ metaflow/runner/deployer.py,sha256=JwclsNiqnr0RsrA7-8a1-3Z23A4BDz4SNJubqDPxUuU,13955
355
355
  metaflow/runner/deployer_impl.py,sha256=zTING0_fwP44JcGo69DuNrVut5KqdBVzYOM7MYTZgIY,7049
356
356
  metaflow/runner/metaflow_runner.py,sha256=uo3BzcAfZ67VT_f-TPe5ZHiWHn6uuojWusOMGksvX14,18178
357
357
  metaflow/runner/nbdeploy.py,sha256=Sp5w-6nCZwjHaRBHWxi8udya-RYnJOB76KNLjB4L7Gs,4166
@@ -398,12 +398,12 @@ metaflow/user_configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
398
398
  metaflow/user_configs/config_decorators.py,sha256=n4OTbfuaXejPVLHnXXgVlNJNcrSvWrVOdXCMcqvQlik,20512
399
399
  metaflow/user_configs/config_options.py,sha256=yyaiKLB4QWlR5AaTg9I7GoBv-OlffOFdGPe1BL85Llc,21241
400
400
  metaflow/user_configs/config_parameters.py,sha256=Eyiqcz4YV_z4algDHAh2gaejGFgIdHk8Vix9AUdPSh0,20989
401
- ob_metaflow-2.15.21.3.data/data/share/metaflow/devtools/Makefile,sha256=5n89OGIC_kE4wxtEI66VCucN-b-1w5bqvGeZYmeRGz8,13737
402
- ob_metaflow-2.15.21.3.data/data/share/metaflow/devtools/Tiltfile,sha256=I55XTG4RBnrMfDcYRtREXqqS8T9bF8agkZq0DlvdFLk,21404
403
- ob_metaflow-2.15.21.3.data/data/share/metaflow/devtools/pick_services.sh,sha256=DCnrMXwtApfx3B4S-YiZESMyAFHbXa3VuNL0MxPLyiE,2196
404
- ob_metaflow-2.15.21.3.dist-info/licenses/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
405
- ob_metaflow-2.15.21.3.dist-info/METADATA,sha256=97WP9Xq9HbwMUULKSS2ELrw6dXFG4pWXqATGdtc-2r4,5937
406
- ob_metaflow-2.15.21.3.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
407
- ob_metaflow-2.15.21.3.dist-info/entry_points.txt,sha256=RvEq8VFlgGe_FfqGOZi0D7ze1hLD0pAtXeNyGfzc_Yc,103
408
- ob_metaflow-2.15.21.3.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
409
- ob_metaflow-2.15.21.3.dist-info/RECORD,,
401
+ ob_metaflow-2.15.21.4.data/data/share/metaflow/devtools/Makefile,sha256=5n89OGIC_kE4wxtEI66VCucN-b-1w5bqvGeZYmeRGz8,13737
402
+ ob_metaflow-2.15.21.4.data/data/share/metaflow/devtools/Tiltfile,sha256=I55XTG4RBnrMfDcYRtREXqqS8T9bF8agkZq0DlvdFLk,21404
403
+ ob_metaflow-2.15.21.4.data/data/share/metaflow/devtools/pick_services.sh,sha256=DCnrMXwtApfx3B4S-YiZESMyAFHbXa3VuNL0MxPLyiE,2196
404
+ ob_metaflow-2.15.21.4.dist-info/licenses/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
405
+ ob_metaflow-2.15.21.4.dist-info/METADATA,sha256=lblEK6Gow24-pgfLiGy_CP4rHdfdGp2THMmZyZFZYjE,5937
406
+ ob_metaflow-2.15.21.4.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
407
+ ob_metaflow-2.15.21.4.dist-info/entry_points.txt,sha256=RvEq8VFlgGe_FfqGOZi0D7ze1hLD0pAtXeNyGfzc_Yc,103
408
+ ob_metaflow-2.15.21.4.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
409
+ ob_metaflow-2.15.21.4.dist-info/RECORD,,