ob-metaflow 2.10.9.1__tar.gz → 2.10.9.2__tar.gz

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.

Files changed (310) hide show
  1. {ob-metaflow-2.10.9.1/ob_metaflow.egg-info → ob-metaflow-2.10.9.2}/PKG-INFO +1 -1
  2. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/metaflow_config.py +2 -0
  3. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/argo/argo_workflows.py +5 -0
  4. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/kubernetes/kubernetes.py +43 -6
  5. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/kubernetes/kubernetes_cli.py +40 -1
  6. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/kubernetes/kubernetes_decorator.py +73 -6
  7. ob-metaflow-2.10.9.2/metaflow/plugins/kubernetes/kubernetes_job.py +1097 -0
  8. ob-metaflow-2.10.9.2/metaflow/version.py +1 -0
  9. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2/ob_metaflow.egg-info}/PKG-INFO +1 -1
  10. ob-metaflow-2.10.9.1/metaflow/plugins/kubernetes/kubernetes_job.py +0 -722
  11. ob-metaflow-2.10.9.1/metaflow/version.py +0 -1
  12. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/LICENSE +0 -0
  13. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/MANIFEST.in +0 -0
  14. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/README.md +0 -0
  15. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/R.py +0 -0
  16. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/__init__.py +0 -0
  17. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/__init__.py +0 -0
  18. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/click/__init__.py +0 -0
  19. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  20. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/click/_compat.py +0 -0
  21. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/click/_termui_impl.py +0 -0
  22. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/click/_textwrap.py +0 -0
  23. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/click/_unicodefun.py +0 -0
  24. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/click/_winconsole.py +0 -0
  25. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/click/core.py +0 -0
  26. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/click/decorators.py +0 -0
  27. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/click/exceptions.py +0 -0
  28. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/click/formatting.py +0 -0
  29. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/click/globals.py +0 -0
  30. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/click/parser.py +0 -0
  31. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/click/termui.py +0 -0
  32. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/click/testing.py +0 -0
  33. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/click/types.py +0 -0
  34. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/click/utils.py +0 -0
  35. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/packaging/__init__.py +0 -0
  36. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/packaging/_elffile.py +0 -0
  37. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  38. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  39. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/packaging/_parser.py +0 -0
  40. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/packaging/_structures.py +0 -0
  41. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  42. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/packaging/markers.py +0 -0
  43. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/packaging/py.typed +0 -0
  44. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/packaging/requirements.py +0 -0
  45. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/packaging/specifiers.py +0 -0
  46. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/packaging/tags.py +0 -0
  47. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/packaging/utils.py +0 -0
  48. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/packaging/version.py +0 -0
  49. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_5/__init__.py +0 -0
  50. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
  51. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
  52. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_5/zipp.py +0 -0
  53. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_6/__init__.py +0 -0
  54. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  55. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  56. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  57. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  58. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  59. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  60. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  61. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  62. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  63. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  64. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_6/zipp.py +0 -0
  65. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_7/__init__.py +0 -0
  66. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/_vendor/v3_7/zipp.py +0 -0
  67. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/cards.py +0 -0
  68. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/cli.py +0 -0
  69. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/cli_args.py +0 -0
  70. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/client/__init__.py +0 -0
  71. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/client/core.py +0 -0
  72. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/client/filecache.py +0 -0
  73. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/cmd/__init__.py +0 -0
  74. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/cmd/configure_cmd.py +0 -0
  75. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/cmd/main_cli.py +0 -0
  76. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/cmd/tutorials_cmd.py +0 -0
  77. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/cmd/util.py +0 -0
  78. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/cmd_with_io.py +0 -0
  79. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/current.py +0 -0
  80. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/datastore/__init__.py +0 -0
  81. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/datastore/content_addressed_store.py +0 -0
  82. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/datastore/datastore_set.py +0 -0
  83. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/datastore/datastore_storage.py +0 -0
  84. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/datastore/exceptions.py +0 -0
  85. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/datastore/flow_datastore.py +0 -0
  86. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/datastore/inputs.py +0 -0
  87. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/datastore/task_datastore.py +0 -0
  88. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/debug.py +0 -0
  89. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/decorators.py +0 -0
  90. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/event_logger.py +0 -0
  91. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/events.py +0 -0
  92. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/exception.py +0 -0
  93. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/extension_support/__init__.py +0 -0
  94. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/extension_support/_empty_file.py +0 -0
  95. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/extension_support/cmd.py +0 -0
  96. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/extension_support/integrations.py +0 -0
  97. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/extension_support/plugins.py +0 -0
  98. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/flowspec.py +0 -0
  99. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/graph.py +0 -0
  100. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/includefile.py +0 -0
  101. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/integrations.py +0 -0
  102. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/lint.py +0 -0
  103. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/metadata/__init__.py +0 -0
  104. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/metadata/heartbeat.py +0 -0
  105. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/metadata/metadata.py +0 -0
  106. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/metadata/util.py +0 -0
  107. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/metaflow_config_funcs.py +0 -0
  108. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/metaflow_environment.py +0 -0
  109. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/metaflow_profile.py +0 -0
  110. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/metaflow_version.py +0 -0
  111. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/mflog/__init__.py +0 -0
  112. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/mflog/mflog.py +0 -0
  113. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/mflog/save_logs.py +0 -0
  114. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/mflog/save_logs_periodically.py +0 -0
  115. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/mflog/tee.py +0 -0
  116. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/monitor.py +0 -0
  117. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/multicore_utils.py +0 -0
  118. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/package.py +0 -0
  119. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/parameters.py +0 -0
  120. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/__init__.py +0 -0
  121. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/airflow/__init__.py +0 -0
  122. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/airflow/airflow.py +0 -0
  123. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  124. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  125. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  126. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/airflow/dag.py +0 -0
  127. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/airflow/exception.py +0 -0
  128. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  129. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  130. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  131. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
  132. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
  133. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
  134. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/argo/__init__.py +0 -0
  135. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/argo/argo_client.py +0 -0
  136. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/argo/argo_events.py +0 -0
  137. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/argo/argo_workflows_cli.py +0 -0
  138. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  139. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/argo/process_input_paths.py +0 -0
  140. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/__init__.py +0 -0
  141. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/aws_client.py +0 -0
  142. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/aws_utils.py +0 -0
  143. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/batch/__init__.py +0 -0
  144. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/batch/batch.py +0 -0
  145. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  146. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  147. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
  148. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  149. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  150. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  151. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  152. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  153. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  154. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  155. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  156. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
  157. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
  158. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  159. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  160. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/azure/__init__.py +0 -0
  161. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/azure/azure_credential.py +0 -0
  162. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  163. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/azure/azure_tail.py +0 -0
  164. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/azure/azure_utils.py +0 -0
  165. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  166. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/azure/includefile_support.py +0 -0
  167. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/__init__.py +0 -0
  168. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_cli.py +0 -0
  169. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_client.py +0 -0
  170. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_creator.py +0 -0
  171. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_datastore.py +0 -0
  172. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_decorator.py +0 -0
  173. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  174. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_modules/base.html +0 -0
  175. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_modules/basic.py +0 -0
  176. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
  177. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_modules/card.py +0 -0
  178. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  179. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  180. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  181. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  182. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  183. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_modules/components.py +0 -0
  184. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  185. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_modules/main.js +0 -0
  186. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  187. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  188. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_resolver.py +0 -0
  189. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/card_server.py +0 -0
  190. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/component_serializer.py +0 -0
  191. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/cards/exception.py +0 -0
  192. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/catch_decorator.py +0 -0
  193. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/datastores/__init__.py +0 -0
  194. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/datastores/azure_storage.py +0 -0
  195. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/datastores/gs_storage.py +0 -0
  196. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/datastores/local_storage.py +0 -0
  197. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/datastores/s3_storage.py +0 -0
  198. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/datatools/__init__.py +0 -0
  199. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/datatools/local.py +0 -0
  200. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  201. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/datatools/s3/s3.py +0 -0
  202. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/datatools/s3/s3op.py +0 -0
  203. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  204. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  205. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/debug_logger.py +0 -0
  206. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/debug_monitor.py +0 -0
  207. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/__init__.py +0 -0
  208. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/client.py +0 -0
  209. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/client_modules.py +0 -0
  210. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  211. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  212. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  213. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  214. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  215. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  216. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  217. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  218. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  219. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  220. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/consts.py +0 -0
  221. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  222. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  223. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  224. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/server.py +0 -0
  225. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/stub.py +0 -0
  226. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/env_escape/utils.py +0 -0
  227. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/environment_decorator.py +0 -0
  228. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/events_decorator.py +0 -0
  229. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/frameworks/__init__.py +0 -0
  230. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/frameworks/pytorch.py +0 -0
  231. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/gcp/__init__.py +0 -0
  232. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  233. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  234. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/gcp/gs_tail.py +0 -0
  235. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/gcp/gs_utils.py +0 -0
  236. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/gcp/includefile_support.py +0 -0
  237. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/kubernetes/__init__.py +0 -0
  238. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
  239. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/metadata/__init__.py +0 -0
  240. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/metadata/local.py +0 -0
  241. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/metadata/service.py +0 -0
  242. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/package_cli.py +0 -0
  243. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/parallel_decorator.py +0 -0
  244. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/project_decorator.py +0 -0
  245. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/pypi/__init__.py +0 -0
  246. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/pypi/bootstrap.py +0 -0
  247. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/pypi/conda_decorator.py +0 -0
  248. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/pypi/conda_environment.py +0 -0
  249. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/pypi/micromamba.py +0 -0
  250. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/pypi/pip.py +0 -0
  251. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
  252. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  253. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/pypi/utils.py +0 -0
  254. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/resources_decorator.py +0 -0
  255. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/retry_decorator.py +0 -0
  256. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/secrets/__init__.py +0 -0
  257. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  258. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  259. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/storage_executor.py +0 -0
  260. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/tag_cli.py +0 -0
  261. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  262. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/plugins/timeout_decorator.py +0 -0
  263. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/procpoll.py +0 -0
  264. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/py.typed +0 -0
  265. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/pylint_wrapper.py +0 -0
  266. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/runtime.py +0 -0
  267. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/sidecar/__init__.py +0 -0
  268. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/sidecar/sidecar.py +0 -0
  269. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/sidecar/sidecar_messages.py +0 -0
  270. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  271. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/sidecar/sidecar_worker.py +0 -0
  272. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tagging_util.py +0 -0
  273. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/task.py +0 -0
  274. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tracing/__init__.py +0 -0
  275. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tracing/propagator.py +0 -0
  276. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tracing/span_exporter.py +0 -0
  277. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tracing/tracing_modules.py +0 -0
  278. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/00-helloworld/README.md +0 -0
  279. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  280. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/01-playlist/README.md +0 -0
  281. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  282. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  283. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  284. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/02-statistics/README.md +0 -0
  285. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  286. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  287. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/02-statistics/stats.py +0 -0
  288. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  289. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  290. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  291. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  292. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  293. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  294. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  295. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  296. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  297. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/07-worldview/README.md +0 -0
  298. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  299. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/08-autopilot/README.md +0 -0
  300. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  301. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/unbounded_foreach.py +0 -0
  302. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/util.py +0 -0
  303. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/metaflow/vendor.py +0 -0
  304. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/ob_metaflow.egg-info/SOURCES.txt +0 -0
  305. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/ob_metaflow.egg-info/dependency_links.txt +0 -0
  306. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/ob_metaflow.egg-info/entry_points.txt +0 -0
  307. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/ob_metaflow.egg-info/requires.txt +0 -0
  308. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/ob_metaflow.egg-info/top_level.txt +0 -0
  309. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/setup.cfg +0 -0
  310. {ob-metaflow-2.10.9.1 → ob-metaflow-2.10.9.2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ob-metaflow
3
- Version: 2.10.9.1
3
+ Version: 2.10.9.2
4
4
  Summary: Metaflow: More Data Science, Less Engineering
5
5
  Author: Netflix, Outerbounds & the Metaflow Community
6
6
  Author-email: help@outerbounds.co
@@ -296,6 +296,8 @@ KUBERNETES_CONTAINER_REGISTRY = from_conf(
296
296
  )
297
297
  # Toggle for trying to fetch EC2 instance metadata
298
298
  KUBERNETES_FETCH_EC2_METADATA = from_conf("KUBERNETES_FETCH_EC2_METADATA", False)
299
+ # Default port number to open on the pods
300
+ KUBERNETES_PORT = from_conf("KUBERNETES_PORT", None)
299
301
 
300
302
  ARGO_WORKFLOWS_KUBERNETES_SECRETS = from_conf("ARGO_WORKFLOWS_KUBERNETES_SECRETS", "")
301
303
  ARGO_WORKFLOWS_ENV_VARS_TO_SKIP = from_conf("ARGO_WORKFLOWS_ENV_VARS_TO_SKIP", "")
@@ -836,6 +836,11 @@ class ArgoWorkflows(object):
836
836
  # Visit every node and yield the uber DAGTemplate(s).
837
837
  def _dag_templates(self):
838
838
  def _visit(node, exit_node=None, templates=None, dag_tasks=None):
839
+ if node.parallel_foreach:
840
+ raise ArgoWorkflowsException(
841
+ "Deploying flows with @parallel decorator(s) "
842
+ "as Argo Workflows is not supported currently."
843
+ )
839
844
  # Every for-each node results in a separate subDAG and an equivalent
840
845
  # DAGTemplate rooted at the child of the for-each node. Each DAGTemplate
841
846
  # has a unique name - the top-level DAGTemplate is named as the name of
@@ -4,6 +4,7 @@ import os
4
4
  import re
5
5
  import shlex
6
6
  import time
7
+ import copy
7
8
  from typing import Dict, List, Optional
8
9
  import uuid
9
10
  from uuid import uuid4
@@ -174,6 +175,10 @@ class Kubernetes(object):
174
175
  persistent_volume_claims=None,
175
176
  tolerations=None,
176
177
  labels=None,
178
+ annotations=None,
179
+ num_parallel=0,
180
+ attrs={},
181
+ port=None,
177
182
  ):
178
183
  if env is None:
179
184
  env = {}
@@ -213,6 +218,9 @@ class Kubernetes(object):
213
218
  tmpfs_size=tmpfs_size,
214
219
  tmpfs_path=tmpfs_path,
215
220
  persistent_volume_claims=persistent_volume_claims,
221
+ num_parallel=num_parallel,
222
+ attrs=attrs,
223
+ port=port,
216
224
  )
217
225
  .environment_variable("METAFLOW_CODE_SHA", code_package_sha)
218
226
  .environment_variable("METAFLOW_CODE_URL", code_package_url)
@@ -266,6 +274,7 @@ class Kubernetes(object):
266
274
  # see get_datastore_root_from_config in datastore/local.py).
267
275
  )
268
276
 
277
+ self.num_parallel = num_parallel
269
278
  # Temporary passing of *some* environment variables. Do not rely on this
270
279
  # mechanism as it will be removed in the near future
271
280
  for k, v in config_values():
@@ -341,7 +350,7 @@ class Kubernetes(object):
341
350
  sigmoid = 1.0 / (1.0 + math.exp(-0.01 * secs_since_start + 9.0))
342
351
  return 0.5 + sigmoid * 30.0
343
352
 
344
- def wait_for_launch(job):
353
+ def wait_for_launch(job, child_jobs):
345
354
  status = job.status
346
355
  echo(
347
356
  "Task is starting (%s)..." % status,
@@ -351,11 +360,38 @@ class Kubernetes(object):
351
360
  t = time.time()
352
361
  start_time = time.time()
353
362
  while job.is_waiting:
354
- new_status = job.status
355
- if status != new_status or (time.time() - t) > 30:
356
- status = new_status
363
+ # new_status = job.status
364
+ if status != job.status or (time.time() - t) > 30:
365
+ if not child_jobs:
366
+ child_statuses = ""
367
+ else:
368
+ status_keys = set(
369
+ [child_job.status for child_job in child_jobs]
370
+ )
371
+ status_counts = [
372
+ (
373
+ status,
374
+ len(
375
+ [
376
+ child_job.status == status
377
+ for child_job in child_jobs
378
+ ]
379
+ ),
380
+ )
381
+ for status in status_keys
382
+ ]
383
+ child_statuses = " (parallel node status: [{}])".format(
384
+ ", ".join(
385
+ [
386
+ "{}:{}".format(status, num)
387
+ for (status, num) in sorted(status_counts)
388
+ ]
389
+ )
390
+ )
391
+
392
+ status = job.status
357
393
  echo(
358
- "Task is starting (%s)..." % status,
394
+ "Task is starting (status %s)... %s" % (status, child_statuses),
359
395
  "stderr",
360
396
  job_id=job.id,
361
397
  )
@@ -367,8 +403,9 @@ class Kubernetes(object):
367
403
  stdout_tail = get_log_tailer(stdout_location, self._datastore.TYPE)
368
404
  stderr_tail = get_log_tailer(stderr_location, self._datastore.TYPE)
369
405
 
406
+ child_jobs = []
370
407
  # 1) Loop until the job has started
371
- wait_for_launch(self._job)
408
+ wait_for_launch(self._job, child_jobs)
372
409
 
373
410
  # 2) Tail logs until the job has finished
374
411
  tail_logs(
@@ -107,6 +107,26 @@ def kubernetes():
107
107
  type=JSONTypeClass(),
108
108
  multiple=False,
109
109
  )
110
+ @click.option(
111
+ "--labels",
112
+ default=None,
113
+ type=JSONTypeClass(),
114
+ multiple=False,
115
+ )
116
+ @click.option(
117
+ "--annotations",
118
+ default=None,
119
+ type=JSONTypeClass(),
120
+ multiple=False,
121
+ )
122
+ @click.option("--ubf-context", default=None, type=click.Choice([None, "ubf_control"]))
123
+ @click.option(
124
+ "--num-parallel",
125
+ default=0,
126
+ type=int,
127
+ help="Number of parallel nodes to run as a multi-node job.",
128
+ )
129
+ @click.option("--port", default=None, help="port number")
110
130
  @click.pass_context
111
131
  def step(
112
132
  ctx,
@@ -132,6 +152,10 @@ def step(
132
152
  run_time_limit=None,
133
153
  persistent_volume_claims=None,
134
154
  tolerations=None,
155
+ labels=None,
156
+ annotations=None,
157
+ num_parallel=None,
158
+ port=None,
135
159
  **kwargs
136
160
  ):
137
161
  def echo(msg, stream="stderr", job_id=None, **kwargs):
@@ -177,11 +201,17 @@ def step(
177
201
  )
178
202
  time.sleep(minutes_between_retries * 60)
179
203
 
204
+ step_args = " ".join(util.dict_to_cli_options(kwargs))
205
+ num_parallel = num_parallel or 0
206
+ if num_parallel and num_parallel > 1:
207
+ # For multinode, we need to add a placeholder that can be mutated by the caller
208
+ step_args += " [multinode-args]"
209
+
180
210
  step_cli = "{entrypoint} {top_args} step {step} {step_args}".format(
181
211
  entrypoint="%s -u %s" % (executable, os.path.basename(sys.argv[0])),
182
212
  top_args=" ".join(util.dict_to_cli_options(ctx.parent.parent.params)),
183
213
  step=step_name,
184
- step_args=" ".join(util.dict_to_cli_options(kwargs)),
214
+ step_args=step_args,
185
215
  )
186
216
 
187
217
  # Set log tailing.
@@ -207,6 +237,10 @@ def step(
207
237
  ),
208
238
  )
209
239
 
240
+ attrs = {
241
+ "metaflow.task_id": kwargs["task_id"],
242
+ "requires_passwordless_ssh": any([getattr(deco, "requires_passwordless_ssh", False) for deco in node.decorators]),
243
+ }
210
244
  try:
211
245
  kubernetes = Kubernetes(
212
246
  datastore=ctx.obj.flow_datastore,
@@ -245,6 +279,11 @@ def step(
245
279
  env=env,
246
280
  persistent_volume_claims=persistent_volume_claims,
247
281
  tolerations=tolerations,
282
+ labels=labels,
283
+ annotations=annotations,
284
+ num_parallel=num_parallel,
285
+ port=port,
286
+ attrs=attrs,
248
287
  )
249
288
  except Exception as e:
250
289
  traceback.print_exc(chain=False)
@@ -2,6 +2,7 @@ import json
2
2
  import os
3
3
  import platform
4
4
  import sys
5
+ import time
5
6
 
6
7
  from metaflow import current
7
8
  from metaflow.decorators import StepDecorator
@@ -20,10 +21,12 @@ from metaflow.metaflow_config import (
20
21
  KUBERNETES_PERSISTENT_VOLUME_CLAIMS,
21
22
  KUBERNETES_TOLERATIONS,
22
23
  KUBERNETES_SERVICE_ACCOUNT,
24
+ KUBERNETES_PORT,
23
25
  )
24
26
  from metaflow.plugins.resources_decorator import ResourcesDecorator
25
27
  from metaflow.plugins.timeout_decorator import get_run_time_limit_for_task
26
28
  from metaflow.sidecar import Sidecar
29
+ from metaflow.unbounded_foreach import UBF_CONTROL
27
30
 
28
31
  from ..aws.aws_utils import get_docker_registry, get_ec2_instance_metadata
29
32
  from .kubernetes import KubernetesException, parse_kube_keyvalue_list
@@ -88,6 +91,8 @@ class KubernetesDecorator(StepDecorator):
88
91
  persistent_volume_claims: Dict[str, str], optional
89
92
  A map (dictionary) of persistent volumes to be mounted to the pod for this step. The map is from persistent
90
93
  volumes to the path to which the volume is to be mounted, e.g., `{'pvc-name': '/path/to/mount/on'}`.
94
+ port: int, optional
95
+ Number of the port to specify in the Kubernetes job object
91
96
  """
92
97
 
93
98
  name = "kubernetes"
@@ -110,6 +115,7 @@ class KubernetesDecorator(StepDecorator):
110
115
  "tmpfs_size": None,
111
116
  "tmpfs_path": "/metaflow_temp",
112
117
  "persistent_volume_claims": None, # e.g., {"pvc-name": "/mnt/vol", "another-pvc": "/mnt/vol2"}
118
+ "port": None,
113
119
  }
114
120
  package_url = None
115
121
  package_sha = None
@@ -195,6 +201,8 @@ class KubernetesDecorator(StepDecorator):
195
201
  if not self.attributes["tmpfs_size"]:
196
202
  # default tmpfs behavior - https://man7.org/linux/man-pages/man5/tmpfs.5.html
197
203
  self.attributes["tmpfs_size"] = int(self.attributes["memory"]) // 2
204
+ if not self.attributes["port"]:
205
+ self.attributes["port"] = KUBERNETES_PORT
198
206
 
199
207
  # Refer https://github.com/Netflix/metaflow/blob/master/docs/lifecycle.png
200
208
  def step_init(self, flow, graph, step, decos, environment, flow_datastore, logger):
@@ -216,12 +224,6 @@ class KubernetesDecorator(StepDecorator):
216
224
  "Kubernetes. Please use one or the other.".format(step=step)
217
225
  )
218
226
 
219
- for deco in decos:
220
- if getattr(deco, "IS_PARALLEL", False):
221
- raise KubernetesException(
222
- "@kubernetes does not support parallel execution currently."
223
- )
224
-
225
227
  # Set run time limit for the Kubernetes job.
226
228
  self.run_time_limit = get_run_time_limit_for_task(decos)
227
229
  if self.run_time_limit < 60:
@@ -432,6 +434,27 @@ class KubernetesDecorator(StepDecorator):
432
434
  self._save_logs_sidecar = Sidecar("save_logs_periodically")
433
435
  self._save_logs_sidecar.start()
434
436
 
437
+ num_parallel = int(os.environ.get("WORLD_SIZE", 0))
438
+ if num_parallel >= 1:
439
+ if ubf_context == UBF_CONTROL:
440
+ control_task_id = current.task_id
441
+ top_task_id = control_task_id.replace("control-", "")
442
+ mapper_task_ids = [control_task_id] + [
443
+ "%s-node-%d" % (top_task_id, node_idx)
444
+ for node_idx in range(1, num_parallel)
445
+ ]
446
+ flow._control_mapper_tasks = [
447
+ "%s/%s/%s" % (run_id, step_name, mapper_task_id)
448
+ for mapper_task_id in mapper_task_ids
449
+ ]
450
+ flow._control_task_is_mapper_zero = True
451
+ else:
452
+ worker_job_rank = int(os.environ["RANK"])
453
+ os.environ["RANK"] = str(worker_job_rank + 1)
454
+
455
+ if num_parallel >= 1:
456
+ _setup_multinode_environment()
457
+
435
458
  def task_finished(
436
459
  self, step_name, flow, graph, is_task_ok, retry_count, max_retries
437
460
  ):
@@ -459,9 +482,53 @@ class KubernetesDecorator(StepDecorator):
459
482
  # Best effort kill
460
483
  pass
461
484
 
485
+ if is_task_ok and len(getattr(flow, "_control_mapper_tasks", [])) > 1:
486
+ self._wait_for_mapper_tasks(flow, step_name)
487
+
488
+ def _wait_for_mapper_tasks(self, flow, step_name):
489
+ """
490
+ When launching multinode task with UBF, need to wait for the secondary
491
+ tasks to finish cleanly and produce their output before exiting the
492
+ main task. Otherwise, the main task finishing will cause secondary nodes
493
+ to terminate immediately, and possibly prematurely.
494
+ """
495
+ from metaflow import Step # avoid circular dependency
496
+
497
+ TIMEOUT = 600
498
+ last_completion_timeout = time.time() + TIMEOUT
499
+ print("Waiting for batch secondary tasks to finish")
500
+ while last_completion_timeout > time.time():
501
+ time.sleep(2)
502
+ try:
503
+ step_path = "%s/%s/%s" % (flow.name, current.run_id, step_name)
504
+ tasks = [task for task in Step(step_path)]
505
+ if len(tasks) == len(flow._control_mapper_tasks):
506
+ if all(
507
+ task.finished_at is not None for task in tasks
508
+ ): # for some reason task.finished fails
509
+ return True
510
+ else:
511
+ print(
512
+ "Waiting for all parallel tasks to finish. Finished: {}/{}".format(
513
+ len(tasks),
514
+ len(flow._control_mapper_tasks),
515
+ )
516
+ )
517
+ except Exception as e:
518
+ pass
519
+ raise Exception(
520
+ "Batch secondary workers did not finish in %s seconds" % TIMEOUT
521
+ )
522
+
462
523
  @classmethod
463
524
  def _save_package_once(cls, flow_datastore, package):
464
525
  if cls.package_url is None:
465
526
  cls.package_url, cls.package_sha = flow_datastore.save_data(
466
527
  [package.blob], len_hint=1
467
528
  )[0]
529
+
530
+ def _setup_multinode_environment():
531
+ import socket
532
+ os.environ["MF_PARALLEL_MAIN_IP"] = socket.gethostbyname(os.environ["MASTER_ADDR"])
533
+ os.environ["MF_PARALLEL_NUM_NODES"] = os.environ["WORLD_SIZE"]
534
+ os.environ["MF_PARALLEL_NODE_INDEX"] = os.environ["RANK"]