ob-metaflow 2.13.4.1__tar.gz → 2.13.6.1__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 (375) hide show
  1. {ob_metaflow-2.13.4.1/ob_metaflow.egg-info → ob_metaflow-2.13.6.1}/PKG-INFO +2 -2
  2. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/__init__.py +5 -0
  3. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_workflows.py +24 -8
  4. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/events_decorator.py +79 -142
  5. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes.py +0 -9
  6. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes_cli.py +1 -1
  7. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes_decorator.py +8 -0
  8. ob_metaflow-2.13.6.1/metaflow/plugins/kubernetes/spot_metadata_cli.py +69 -0
  9. ob_metaflow-2.13.6.1/metaflow/plugins/kubernetes/spot_monitor_sidecar.py +109 -0
  10. ob_metaflow-2.13.6.1/metaflow/version.py +1 -0
  11. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1/ob_metaflow.egg-info}/PKG-INFO +2 -2
  12. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/ob_metaflow.egg-info/SOURCES.txt +2 -0
  13. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/ob_metaflow.egg-info/requires.txt +1 -1
  14. ob_metaflow-2.13.4.1/metaflow/version.py +0 -1
  15. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/LICENSE +0 -0
  16. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/MANIFEST.in +0 -0
  17. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/README.md +0 -0
  18. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/R.py +0 -0
  19. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/__init__.py +0 -0
  20. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/__init__.py +0 -0
  21. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/__init__.py +0 -0
  22. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  23. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_compat.py +0 -0
  24. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_termui_impl.py +0 -0
  25. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_textwrap.py +0 -0
  26. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_unicodefun.py +0 -0
  27. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_winconsole.py +0 -0
  28. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/core.py +0 -0
  29. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/decorators.py +0 -0
  30. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/exceptions.py +0 -0
  31. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/formatting.py +0 -0
  32. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/globals.py +0 -0
  33. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/parser.py +0 -0
  34. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/termui.py +0 -0
  35. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/testing.py +0 -0
  36. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/types.py +0 -0
  37. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/utils.py +0 -0
  38. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
  39. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
  40. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
  41. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
  42. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
  43. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
  44. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
  45. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
  46. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
  47. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/__init__.py +0 -0
  48. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_elffile.py +0 -0
  49. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  50. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  51. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_parser.py +0 -0
  52. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_structures.py +0 -0
  53. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  54. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/markers.py +0 -0
  55. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/py.typed +0 -0
  56. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/requirements.py +0 -0
  57. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/specifiers.py +0 -0
  58. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/tags.py +0 -0
  59. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/utils.py +0 -0
  60. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/version.py +0 -0
  61. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/__init__.py +0 -0
  62. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_checkers.py +0 -0
  63. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_config.py +0 -0
  64. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_decorators.py +0 -0
  65. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
  66. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_functions.py +0 -0
  67. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_importhook.py +0 -0
  68. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_memo.py +0 -0
  69. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
  70. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_suppression.py +0 -0
  71. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_transformer.py +0 -0
  72. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
  73. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_utils.py +0 -0
  74. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/py.typed +0 -0
  75. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typing_extensions.py +0 -0
  76. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_5/__init__.py +0 -0
  77. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
  78. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
  79. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_5/zipp.py +0 -0
  80. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/__init__.py +0 -0
  81. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  82. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  83. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  84. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  85. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  86. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  87. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  88. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  89. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  90. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  91. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/zipp.py +0 -0
  92. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/zipp.py +0 -0
  93. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cards.py +0 -0
  94. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cli.py +0 -0
  95. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cli_args.py +0 -0
  96. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/__init__.py +0 -0
  97. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/dump_cmd.py +0 -0
  98. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/init_cmd.py +0 -0
  99. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/run_cmds.py +0 -0
  100. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/step_cmd.py +0 -0
  101. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/utils.py +0 -0
  102. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/client/__init__.py +0 -0
  103. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/client/core.py +0 -0
  104. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/client/filecache.py +0 -0
  105. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/clone_util.py +0 -0
  106. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/__init__.py +0 -0
  107. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/configure_cmd.py +0 -0
  108. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/develop/__init__.py +0 -0
  109. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/develop/stub_generator.py +0 -0
  110. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/develop/stubs.py +0 -0
  111. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/main_cli.py +0 -0
  112. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/tutorials_cmd.py +0 -0
  113. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/util.py +0 -0
  114. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/cmd_with_io.py +0 -0
  115. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/__init__.py +0 -0
  116. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/content_addressed_store.py +0 -0
  117. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/datastore_set.py +0 -0
  118. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/datastore_storage.py +0 -0
  119. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/exceptions.py +0 -0
  120. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/flow_datastore.py +0 -0
  121. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/inputs.py +0 -0
  122. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/task_datastore.py +0 -0
  123. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/debug.py +0 -0
  124. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/decorators.py +0 -0
  125. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/event_logger.py +0 -0
  126. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/events.py +0 -0
  127. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/exception.py +0 -0
  128. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/extension_support/__init__.py +0 -0
  129. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/extension_support/_empty_file.py +0 -0
  130. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/extension_support/cmd.py +0 -0
  131. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/extension_support/integrations.py +0 -0
  132. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/extension_support/plugins.py +0 -0
  133. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/flowspec.py +0 -0
  134. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/graph.py +0 -0
  135. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/includefile.py +0 -0
  136. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/info_file.py +0 -0
  137. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/integrations.py +0 -0
  138. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/lint.py +0 -0
  139. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/metadata_provider/__init__.py +0 -0
  140. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/metadata_provider/heartbeat.py +0 -0
  141. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/metadata_provider/metadata.py +0 -0
  142. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/metadata_provider/util.py +0 -0
  143. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_config.py +0 -0
  144. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_config_funcs.py +0 -0
  145. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_current.py +0 -0
  146. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_environment.py +0 -0
  147. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_profile.py +0 -0
  148. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_version.py +0 -0
  149. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/mflog/__init__.py +0 -0
  150. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/mflog/mflog.py +0 -0
  151. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/mflog/save_logs.py +0 -0
  152. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/mflog/save_logs_periodically.py +0 -0
  153. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/mflog/tee.py +0 -0
  154. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/monitor.py +0 -0
  155. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/multicore_utils.py +0 -0
  156. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/package.py +0 -0
  157. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/parameters.py +0 -0
  158. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/__init__.py +0 -0
  159. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/airflow.py +0 -0
  160. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  161. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  162. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  163. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/dag.py +0 -0
  164. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/exception.py +0 -0
  165. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  166. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  167. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  168. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
  169. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
  170. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
  171. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/__init__.py +0 -0
  172. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_client.py +0 -0
  173. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_events.py +0 -0
  174. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_workflows_cli.py +0 -0
  175. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  176. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
  177. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_workflows_deployer_objects.py +0 -0
  178. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/capture_error.py +0 -0
  179. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/generate_input_paths.py +0 -0
  180. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
  181. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/__init__.py +0 -0
  182. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/aws_client.py +0 -0
  183. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/aws_utils.py +0 -0
  184. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/batch/__init__.py +0 -0
  185. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/batch/batch.py +0 -0
  186. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  187. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  188. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
  189. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  190. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  191. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  192. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  193. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  194. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  195. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  196. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  197. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
  198. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
  199. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  200. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  201. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
  202. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +0 -0
  203. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/__init__.py +0 -0
  204. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/azure_credential.py +0 -0
  205. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  206. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
  207. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/azure_tail.py +0 -0
  208. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/azure_utils.py +0 -0
  209. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  210. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/includefile_support.py +0 -0
  211. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/__init__.py +0 -0
  212. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_cli.py +0 -0
  213. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_client.py +0 -0
  214. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_creator.py +0 -0
  215. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_datastore.py +0 -0
  216. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_decorator.py +0 -0
  217. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  218. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/base.html +0 -0
  219. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/basic.py +0 -0
  220. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
  221. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/card.py +0 -0
  222. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  223. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  224. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  225. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  226. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  227. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/components.py +0 -0
  228. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  229. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/main.js +0 -0
  230. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  231. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  232. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_resolver.py +0 -0
  233. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_server.py +0 -0
  234. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
  235. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/component_serializer.py +0 -0
  236. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/exception.py +0 -0
  237. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/catch_decorator.py +0 -0
  238. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datastores/__init__.py +0 -0
  239. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datastores/azure_storage.py +0 -0
  240. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datastores/gs_storage.py +0 -0
  241. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datastores/local_storage.py +0 -0
  242. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datastores/s3_storage.py +0 -0
  243. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/__init__.py +0 -0
  244. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/local.py +0 -0
  245. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  246. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/s3/s3.py +0 -0
  247. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/s3/s3op.py +0 -0
  248. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  249. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  250. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/debug_logger.py +0 -0
  251. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/debug_monitor.py +0 -0
  252. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/__init__.py +0 -0
  253. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/client.py +0 -0
  254. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/client_modules.py +0 -0
  255. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  256. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  257. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  258. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  259. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  260. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  261. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  262. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  263. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  264. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  265. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/consts.py +0 -0
  266. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  267. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  268. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  269. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/server.py +0 -0
  270. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/stub.py +0 -0
  271. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/utils.py +0 -0
  272. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/environment_decorator.py +0 -0
  273. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/frameworks/__init__.py +0 -0
  274. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/frameworks/pytorch.py +0 -0
  275. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/__init__.py +0 -0
  276. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
  277. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  278. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  279. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/gs_tail.py +0 -0
  280. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/gs_utils.py +0 -0
  281. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/includefile_support.py +0 -0
  282. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/__init__.py +0 -0
  283. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
  284. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
  285. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes_job.py +0 -0
  286. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +0 -0
  287. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/logs_cli.py +0 -0
  288. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/metadata_providers/__init__.py +0 -0
  289. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/metadata_providers/local.py +0 -0
  290. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/metadata_providers/service.py +0 -0
  291. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/package_cli.py +0 -0
  292. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/parallel_decorator.py +0 -0
  293. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/project_decorator.py +0 -0
  294. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/__init__.py +0 -0
  295. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/bootstrap.py +0 -0
  296. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/conda_decorator.py +0 -0
  297. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/conda_environment.py +0 -0
  298. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/micromamba.py +0 -0
  299. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/pip.py +0 -0
  300. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
  301. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  302. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/utils.py +0 -0
  303. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/resources_decorator.py +0 -0
  304. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/retry_decorator.py +0 -0
  305. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/secrets/__init__.py +0 -0
  306. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  307. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  308. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/storage_executor.py +0 -0
  309. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/tag_cli.py +0 -0
  310. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  311. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/timeout_decorator.py +0 -0
  312. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/procpoll.py +0 -0
  313. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/py.typed +0 -0
  314. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/pylint_wrapper.py +0 -0
  315. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/runner/__init__.py +0 -0
  316. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/runner/click_api.py +0 -0
  317. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/runner/deployer.py +0 -0
  318. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/runner/deployer_impl.py +0 -0
  319. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/runner/metaflow_runner.py +0 -0
  320. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/runner/nbdeploy.py +0 -0
  321. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/runner/nbrun.py +0 -0
  322. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/runner/subprocess_manager.py +0 -0
  323. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/runner/utils.py +0 -0
  324. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/runtime.py +0 -0
  325. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/sidecar/__init__.py +0 -0
  326. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/sidecar/sidecar.py +0 -0
  327. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/sidecar/sidecar_messages.py +0 -0
  328. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  329. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/sidecar/sidecar_worker.py +0 -0
  330. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/system/__init__.py +0 -0
  331. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/system/system_logger.py +0 -0
  332. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/system/system_monitor.py +0 -0
  333. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/system/system_utils.py +0 -0
  334. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tagging_util.py +0 -0
  335. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/task.py +0 -0
  336. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tracing/__init__.py +0 -0
  337. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tracing/propagator.py +0 -0
  338. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tracing/span_exporter.py +0 -0
  339. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tracing/tracing_modules.py +0 -0
  340. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tuple_util.py +0 -0
  341. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/00-helloworld/README.md +0 -0
  342. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  343. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/01-playlist/README.md +0 -0
  344. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  345. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  346. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  347. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/02-statistics/README.md +0 -0
  348. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  349. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  350. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/02-statistics/stats.py +0 -0
  351. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  352. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  353. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  354. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  355. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  356. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  357. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  358. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  359. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  360. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/07-worldview/README.md +0 -0
  361. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  362. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/08-autopilot/README.md +0 -0
  363. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  364. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/unbounded_foreach.py +0 -0
  365. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/user_configs/__init__.py +0 -0
  366. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/user_configs/config_decorators.py +0 -0
  367. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/user_configs/config_options.py +0 -0
  368. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/user_configs/config_parameters.py +0 -0
  369. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/util.py +0 -0
  370. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/metaflow/vendor.py +0 -0
  371. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/ob_metaflow.egg-info/dependency_links.txt +0 -0
  372. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/ob_metaflow.egg-info/entry_points.txt +0 -0
  373. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/ob_metaflow.egg-info/top_level.txt +0 -0
  374. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/setup.cfg +0 -0
  375. {ob_metaflow-2.13.4.1 → ob_metaflow-2.13.6.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ob-metaflow
3
- Version: 2.13.4.1
3
+ Version: 2.13.6.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.13.4.1; extra == "stubs"
15
+ Requires-Dist: metaflow-stubs==2.13.6.1; extra == "stubs"
16
16
  Dynamic: author
17
17
  Dynamic: author-email
18
18
  Dynamic: description
@@ -16,6 +16,7 @@ CLIS_DESC = [
16
16
  ("argo-workflows", ".argo.argo_workflows_cli.cli"),
17
17
  ("card", ".cards.card_cli.cli"),
18
18
  ("tag", ".tag_cli.cli"),
19
+ ("spot-metadata", ".kubernetes.spot_metadata_cli.cli"),
19
20
  ("logs", ".logs_cli.cli"),
20
21
  ]
21
22
 
@@ -104,6 +105,10 @@ SIDECARS_DESC = [
104
105
  "save_logs_periodically",
105
106
  "..mflog.save_logs_periodically.SaveLogsPeriodicallySidecar",
106
107
  ),
108
+ (
109
+ "spot_termination_monitor",
110
+ ".kubernetes.spot_monitor_sidecar.SpotTerminationMonitorSidecar",
111
+ ),
107
112
  ("heartbeat", "metaflow.metadata_provider.heartbeat.MetadataHeartBeat"),
108
113
  ]
109
114
 
@@ -625,6 +625,16 @@ class ArgoWorkflows(object):
625
625
  for event in trigger_on_finish_deco.triggers:
626
626
  # Actual filters are deduced here since we don't have access to
627
627
  # the current object in the @trigger_on_finish decorator.
628
+ project_name = event.get("project") or current.get("project_name")
629
+ branch_name = event.get("branch") or current.get("branch_name")
630
+ # validate that we have complete project info for an event name
631
+ if project_name or branch_name:
632
+ if not (project_name and branch_name):
633
+ # if one of the two is missing, we would end up listening to an event that will never be broadcast.
634
+ raise ArgoWorkflowsException(
635
+ "Incomplete project info. Please specify both 'project' and 'project_branch' or use the @project decorator"
636
+ )
637
+
628
638
  triggers.append(
629
639
  {
630
640
  # Make sure this remains consistent with the event name format
@@ -633,18 +643,16 @@ class ArgoWorkflows(object):
633
643
  % ".".join(
634
644
  v
635
645
  for v in [
636
- event.get("project") or current.get("project_name"),
637
- event.get("branch") or current.get("branch_name"),
646
+ project_name,
647
+ branch_name,
638
648
  event["flow"],
639
649
  ]
640
650
  if v
641
651
  ),
642
652
  "filters": {
643
653
  "auto-generated-by-metaflow": True,
644
- "project_name": event.get("project")
645
- or current.get("project_name"),
646
- "branch_name": event.get("branch")
647
- or current.get("branch_name"),
654
+ "project_name": project_name,
655
+ "branch_name": branch_name,
648
656
  # TODO: Add a time filters to guard against cached events
649
657
  },
650
658
  "type": "run",
@@ -842,8 +850,15 @@ class ArgoWorkflows(object):
842
850
  Metadata()
843
851
  .labels(self._base_labels)
844
852
  .label("app.kubernetes.io/name", "metaflow-task")
845
- .annotations(annotations)
846
- .annotations(self._base_annotations)
853
+ .annotations(
854
+ {
855
+ **annotations,
856
+ **self._base_annotations,
857
+ **{
858
+ "metaflow/run_id": "argo-{{workflow.name}}"
859
+ }, # we want pods of the workflow to have the run_id as an annotation as well
860
+ }
861
+ )
847
862
  )
848
863
  # Set the entrypoint to flow name
849
864
  .entrypoint(self.flow.name)
@@ -1706,6 +1721,7 @@ class ArgoWorkflows(object):
1706
1721
  },
1707
1722
  **{
1708
1723
  # Some optional values for bookkeeping
1724
+ "METAFLOW_FLOW_FILENAME": os.path.basename(sys.argv[0]),
1709
1725
  "METAFLOW_FLOW_NAME": self.flow.name,
1710
1726
  "METAFLOW_STEP_NAME": node.name,
1711
1727
  "METAFLOW_RUN_ID": run_id,
@@ -398,111 +398,23 @@ class TriggerOnFinishDecorator(FlowDecorator):
398
398
  )
399
399
  elif self.attributes["flow"]:
400
400
  # flow supports the format @trigger_on_finish(flow='FooFlow')
401
- if is_stringish(self.attributes["flow"]):
402
- self.triggers.append(
403
- {
404
- "fq_name": self.attributes["flow"],
405
- }
406
- )
407
- elif isinstance(self.attributes["flow"], dict):
408
- if "name" not in self.attributes["flow"]:
409
- raise MetaflowException(
410
- "The *flow* attribute for *@trigger_on_finish* is missing the "
411
- "*name* key."
412
- )
413
- flow_name = self.attributes["flow"]["name"]
414
-
415
- if not is_stringish(flow_name) or "." in flow_name:
416
- raise MetaflowException(
417
- "The *name* attribute of the *flow* is not a valid string"
418
- )
419
- result = {"fq_name": flow_name}
420
- if "project" in self.attributes["flow"]:
421
- if is_stringish(self.attributes["flow"]["project"]):
422
- result["project"] = self.attributes["flow"]["project"]
423
- else:
424
- raise MetaflowException(
425
- "The *project* attribute of the *flow* is not a string"
426
- )
427
- if "project_branch" in self.attributes["flow"]:
428
- if is_stringish(self.attributes["flow"]["project_branch"]):
429
- result["branch"] = self.attributes["flow"]["project_branch"]
430
- else:
431
- raise MetaflowException(
432
- "The *project_branch* attribute of the *flow* is not a string"
433
- )
434
- self.triggers.append(result)
435
- elif callable(self.attributes["flow"]) and not isinstance(
401
+ flow = self.attributes["flow"]
402
+ if callable(flow) and not isinstance(
436
403
  self.attributes["flow"], DeployTimeField
437
404
  ):
438
- trig = DeployTimeField(
439
- "fq_name", [str, dict], None, self.attributes["flow"], False
440
- )
405
+ trig = DeployTimeField("fq_name", [str, dict], None, flow, False)
441
406
  self.triggers.append(trig)
442
407
  else:
443
- raise MetaflowException(
444
- "Incorrect type for *flow* attribute in *@trigger_on_finish* "
445
- " decorator. Supported type is string or Dict[str, str] - \n"
446
- "@trigger_on_finish(flow='FooFlow') or "
447
- "@trigger_on_finish(flow={'name':'FooFlow', 'project_branch': 'branch'})"
448
- )
408
+ self.triggers.extend(self._parse_static_triggers([flow]))
449
409
  elif self.attributes["flows"]:
450
410
  # flows attribute supports the following formats -
451
411
  # 1. flows=['FooFlow', 'BarFlow']
452
- if isinstance(self.attributes["flows"], list):
453
- for flow in self.attributes["flows"]:
454
- if is_stringish(flow):
455
- self.triggers.append(
456
- {
457
- "fq_name": flow,
458
- }
459
- )
460
- elif isinstance(flow, dict):
461
- if "name" not in flow:
462
- raise MetaflowException(
463
- "One or more flows in the *flows* attribute for "
464
- "*@trigger_on_finish* is missing the "
465
- "*name* key."
466
- )
467
- flow_name = flow["name"]
468
-
469
- if not is_stringish(flow_name) or "." in flow_name:
470
- raise MetaflowException(
471
- "The *name* attribute '%s' is not a valid string"
472
- % str(flow_name)
473
- )
474
- result = {"fq_name": flow_name}
475
- if "project" in flow:
476
- if is_stringish(flow["project"]):
477
- result["project"] = flow["project"]
478
- else:
479
- raise MetaflowException(
480
- "The *project* attribute of the *flow* '%s' is not "
481
- "a string" % flow_name
482
- )
483
- if "project_branch" in flow:
484
- if is_stringish(flow["project_branch"]):
485
- result["branch"] = flow["project_branch"]
486
- else:
487
- raise MetaflowException(
488
- "The *project_branch* attribute of the *flow* %s "
489
- "is not a string" % flow_name
490
- )
491
- self.triggers.append(result)
492
- else:
493
- raise MetaflowException(
494
- "One or more flows in *flows* attribute in "
495
- "*@trigger_on_finish* decorator have an incorrect type. "
496
- "Supported type is string or Dict[str, str]- \n"
497
- "@trigger_on_finish(flows=['FooFlow', 'BarFlow']"
498
- )
499
- elif callable(self.attributes["flows"]) and not isinstance(
500
- self.attributes["flows"], DeployTimeField
501
- ):
502
- trig = DeployTimeField(
503
- "flows", list, None, self.attributes["flows"], False
504
- )
412
+ flows = self.attributes["flows"]
413
+ if callable(flows) and not isinstance(flows, DeployTimeField):
414
+ trig = DeployTimeField("flows", list, None, flows, False)
505
415
  self.triggers.append(trig)
416
+ elif isinstance(flows, list):
417
+ self.triggers.extend(self._parse_static_triggers(flows))
506
418
  else:
507
419
  raise MetaflowException(
508
420
  "Incorrect type for *flows* attribute in *@trigger_on_finish* "
@@ -519,26 +431,7 @@ class TriggerOnFinishDecorator(FlowDecorator):
519
431
  for trigger in self.triggers:
520
432
  if isinstance(trigger, DeployTimeField):
521
433
  continue
522
- if trigger["fq_name"].count(".") == 0:
523
- # fully qualified name is just the flow name
524
- trigger["flow"] = trigger["fq_name"]
525
- elif trigger["fq_name"].count(".") >= 2:
526
- # fully qualified name is of the format - project.branch.flow_name
527
- trigger["project"], tail = trigger["fq_name"].split(".", maxsplit=1)
528
- trigger["branch"], trigger["flow"] = tail.rsplit(".", maxsplit=1)
529
- else:
530
- raise MetaflowException(
531
- "Incorrect format for *flow* in *@trigger_on_finish* "
532
- "decorator. Specify either just the *flow_name* or a fully "
533
- "qualified name like *project_name.branch_name.flow_name*."
534
- )
535
- # TODO: Also sanity check project and branch names
536
- if not re.match(r"^[A-Za-z0-9_]+$", trigger["flow"]):
537
- raise MetaflowException(
538
- "Invalid flow name *%s* in *@trigger_on_finish* "
539
- "decorator. Only alphanumeric characters and "
540
- "underscores(_) are allowed." % trigger["flow"]
541
- )
434
+ self._parse_fq_name(trigger)
542
435
 
543
436
  self.options = self.attributes["options"]
544
437
 
@@ -593,9 +486,67 @@ class TriggerOnFinishDecorator(FlowDecorator):
593
486
  run_objs.append(run_obj)
594
487
  current._update_env({"trigger": Trigger.from_runs(run_objs)})
595
488
 
489
+ @staticmethod
490
+ def _parse_static_triggers(flows):
491
+ results = []
492
+ for flow in flows:
493
+ if is_stringish(flow):
494
+ results.append(
495
+ {
496
+ "fq_name": flow,
497
+ }
498
+ )
499
+ elif isinstance(flow, dict):
500
+ if "name" not in flow:
501
+ if len(flows) > 1:
502
+ raise MetaflowException(
503
+ "One or more flows in the *flows* attribute for "
504
+ "*@trigger_on_finish* is missing the "
505
+ "*name* key."
506
+ )
507
+ raise MetaflowException(
508
+ "The *flow* attribute for *@trigger_on_finish* is missing the "
509
+ "*name* key."
510
+ )
511
+ flow_name = flow["name"]
512
+
513
+ if not is_stringish(flow_name) or "." in flow_name:
514
+ raise MetaflowException(
515
+ f"The *name* attribute of the *flow* {flow_name} is not a valid string"
516
+ )
517
+ result = {"fq_name": flow_name}
518
+ if "project" in flow:
519
+ if is_stringish(flow["project"]):
520
+ result["project"] = flow["project"]
521
+ else:
522
+ raise MetaflowException(
523
+ f"The *project* attribute of the *flow* {flow_name} is not a string"
524
+ )
525
+ if "project_branch" in flow:
526
+ if is_stringish(flow["project_branch"]):
527
+ result["branch"] = flow["project_branch"]
528
+ else:
529
+ raise MetaflowException(
530
+ f"The *project_branch* attribute of the *flow* {flow_name} is not a string"
531
+ )
532
+ results.append(result)
533
+ else:
534
+ if len(flows) > 1:
535
+ raise MetaflowException(
536
+ "One or more flows in the *flows* attribute for "
537
+ "*@trigger_on_finish* decorator have an incorrect type. "
538
+ "Supported type is string or Dict[str, str]- \n"
539
+ "@trigger_on_finish(flows=['FooFlow', 'BarFlow']"
540
+ )
541
+ raise MetaflowException(
542
+ "Incorrect type for *flow* attribute in *@trigger_on_finish* "
543
+ " decorator. Supported type is string or Dict[str, str] - \n"
544
+ "@trigger_on_finish(flow='FooFlow') or "
545
+ "@trigger_on_finish(flow={'name':'FooFlow', 'project_branch': 'branch'})"
546
+ )
547
+ return results
548
+
596
549
  def _parse_fq_name(self, trigger):
597
- if isinstance(trigger, DeployTimeField):
598
- trigger["fq_name"] = deploy_time_eval(trigger["fq_name"])
599
550
  if trigger["fq_name"].count(".") == 0:
600
551
  # fully qualified name is just the flow name
601
552
  trigger["flow"] = trigger["fq_name"]
@@ -615,32 +566,18 @@ class TriggerOnFinishDecorator(FlowDecorator):
615
566
  "decorator. Only alphanumeric characters and "
616
567
  "underscores(_) are allowed." % trigger["flow"]
617
568
  )
618
- return trigger
619
569
 
620
570
  def format_deploytime_value(self):
621
- for trigger in self.triggers:
622
- # Case were trigger is a function that returns a list
623
- # Need to do this bc we need to iterate over list and process
624
- if isinstance(trigger, DeployTimeField):
625
- deploy_value = deploy_time_eval(trigger)
626
- if isinstance(deploy_value, list):
627
- self.triggers = deploy_value
571
+ if len(self.triggers) == 1 and isinstance(self.triggers[0], DeployTimeField):
572
+ deploy_value = deploy_time_eval(self.triggers[0])
573
+ if isinstance(deploy_value, list):
574
+ self.triggers = deploy_value
628
575
  else:
629
- break
630
- for trigger in self.triggers:
631
- # Entire trigger is a function (returns either string or dict)
632
- old_trig = trigger
633
- if isinstance(trigger, DeployTimeField):
634
- trigger = deploy_time_eval(trigger)
635
- if isinstance(trigger, dict):
636
- trigger["fq_name"] = trigger.get("name")
637
- trigger["project"] = trigger.get("project")
638
- trigger["branch"] = trigger.get("project_branch")
639
- # We also added this bc it won't be formatted yet
640
- if isinstance(trigger, str):
641
- trigger = {"fq_name": trigger}
642
- trigger = self._parse_fq_name(trigger)
643
- self.triggers[self.triggers.index(old_trig)] = trigger
576
+ self.triggers = [deploy_value]
577
+ triggers = self._parse_static_triggers(self.triggers)
578
+ for trigger in triggers:
579
+ self._parse_fq_name(trigger)
580
+ self.triggers = triggers
644
581
 
645
582
  def get_top_level_options(self):
646
583
  return list(self._option_values.items())
@@ -685,15 +685,6 @@ class Kubernetes(object):
685
685
  for name, value in system_annotations.items():
686
686
  job.annotation(name, value)
687
687
 
688
- (
689
- job.annotation("metaflow/run_id", run_id)
690
- .annotation("metaflow/step_name", step_name)
691
- .annotation("metaflow/task_id", task_id)
692
- .annotation("metaflow/attempt", attempt)
693
- .label("app.kubernetes.io/name", "metaflow-task")
694
- .label("app.kubernetes.io/part-of", "metaflow")
695
- )
696
-
697
688
  return job
698
689
 
699
690
  def create_k8sjob(self, job):
@@ -190,7 +190,7 @@ def step(
190
190
  executable = ctx.obj.environment.executable(step_name, executable)
191
191
 
192
192
  # Set environment
193
- env = {}
193
+ env = {"METAFLOW_FLOW_FILENAME": os.path.basename(sys.argv[0])}
194
194
  env_deco = [deco for deco in node.decorators if deco.name == "environment"]
195
195
  if env_deco:
196
196
  env = env_deco[0].attributes["vars"]
@@ -562,6 +562,13 @@ class KubernetesDecorator(StepDecorator):
562
562
  self._save_logs_sidecar = Sidecar("save_logs_periodically")
563
563
  self._save_logs_sidecar.start()
564
564
 
565
+ # Start spot termination monitor sidecar.
566
+ current._update_env(
567
+ {"spot_termination_notice": "/tmp/spot_termination_notice"}
568
+ )
569
+ self._spot_monitor_sidecar = Sidecar("spot_termination_monitor")
570
+ self._spot_monitor_sidecar.start()
571
+
565
572
  num_parallel = None
566
573
  if hasattr(flow, "_parallel_ubf_iter"):
567
574
  num_parallel = flow._parallel_ubf_iter.num_parallel
@@ -620,6 +627,7 @@ class KubernetesDecorator(StepDecorator):
620
627
 
621
628
  try:
622
629
  self._save_logs_sidecar.terminate()
630
+ self._spot_monitor_sidecar.terminate()
623
631
  except:
624
632
  # Best effort kill
625
633
  pass
@@ -0,0 +1,69 @@
1
+ from metaflow._vendor import click
2
+ from datetime import datetime, timezone
3
+ from metaflow.tagging_util import validate_tags
4
+ from metaflow.metadata_provider import MetaDatum
5
+
6
+
7
+ @click.group()
8
+ def cli():
9
+ pass
10
+
11
+
12
+ @cli.group(help="Commands related to spot metadata.")
13
+ def spot_metadata():
14
+ pass
15
+
16
+
17
+ @spot_metadata.command(help="Record spot termination metadata for a task.")
18
+ @click.option(
19
+ "--run-id",
20
+ required=True,
21
+ help="Run ID for which metadata is to be recorded.",
22
+ )
23
+ @click.option(
24
+ "--step-name",
25
+ required=True,
26
+ help="Step Name for which metadata is to be recorded.",
27
+ )
28
+ @click.option(
29
+ "--task-id",
30
+ required=True,
31
+ help="Task ID for which metadata is to be recorded.",
32
+ )
33
+ @click.option(
34
+ "--termination-notice-time",
35
+ required=True,
36
+ help="Spot termination notice time.",
37
+ )
38
+ @click.option(
39
+ "--tag",
40
+ "tags",
41
+ multiple=True,
42
+ required=False,
43
+ default=None,
44
+ help="List of tags.",
45
+ )
46
+ @click.pass_obj
47
+ def record(obj, run_id, step_name, task_id, termination_notice_time, tags=None):
48
+ validate_tags(tags)
49
+
50
+ tag_list = list(tags) if tags else []
51
+
52
+ entries = [
53
+ MetaDatum(
54
+ field="spot-termination-received-at",
55
+ value=datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
56
+ type="spot-termination-received-at",
57
+ tags=tag_list,
58
+ ),
59
+ MetaDatum(
60
+ field="spot-termination-time",
61
+ value=termination_notice_time,
62
+ type="spot-termination-time",
63
+ tags=tag_list,
64
+ ),
65
+ ]
66
+
67
+ obj.metadata.register_metadata(
68
+ run_id=run_id, step_name=step_name, task_id=task_id, metadata=entries
69
+ )
@@ -0,0 +1,109 @@
1
+ import os
2
+ import sys
3
+ import time
4
+ import signal
5
+ import requests
6
+ import subprocess
7
+ from multiprocessing import Process
8
+ from datetime import datetime, timezone
9
+ from metaflow.sidecar import MessageTypes
10
+
11
+
12
+ class SpotTerminationMonitorSidecar(object):
13
+ EC2_TYPE_URL = "http://169.254.169.254/latest/meta-data/instance-life-cycle"
14
+ METADATA_URL = "http://169.254.169.254/latest/meta-data/spot/termination-time"
15
+ TOKEN_URL = "http://169.254.169.254/latest/api/token"
16
+ POLL_INTERVAL = 5 # seconds
17
+
18
+ def __init__(self):
19
+ self.is_alive = True
20
+ self._process = None
21
+ self._token = None
22
+ self._token_expiry = 0
23
+
24
+ if self._is_aws_spot_instance():
25
+ self._process = Process(target=self._monitor_loop)
26
+ self._process.start()
27
+
28
+ def process_message(self, msg):
29
+ if msg.msg_type == MessageTypes.SHUTDOWN:
30
+ self.is_alive = False
31
+ if self._process:
32
+ self._process.terminate()
33
+
34
+ @classmethod
35
+ def get_worker(cls):
36
+ return cls
37
+
38
+ def _get_imds_token(self):
39
+ current_time = time.time()
40
+ if current_time >= self._token_expiry - 60: # Refresh 60s before expiry
41
+ try:
42
+ response = requests.put(
43
+ url=self.TOKEN_URL,
44
+ headers={"X-aws-ec2-metadata-token-ttl-seconds": "300"},
45
+ timeout=1,
46
+ )
47
+ if response.status_code == 200:
48
+ self._token = response.text
49
+ self._token_expiry = current_time + 240 # Slightly less than TTL
50
+ except requests.exceptions.RequestException:
51
+ pass
52
+ return self._token
53
+
54
+ def _make_ec2_request(self, url, timeout):
55
+ token = self._get_imds_token()
56
+ headers = {"X-aws-ec2-metadata-token": token} if token else {}
57
+ response = requests.get(url=url, headers=headers, timeout=timeout)
58
+ return response
59
+
60
+ def _is_aws_spot_instance(self):
61
+ try:
62
+ response = self._make_ec2_request(url=self.EC2_TYPE_URL, timeout=1)
63
+ return response.status_code == 200 and response.text == "spot"
64
+ except (requests.exceptions.RequestException, requests.exceptions.Timeout):
65
+ return False
66
+
67
+ def _monitor_loop(self):
68
+ while self.is_alive:
69
+ try:
70
+ response = self._make_ec2_request(url=self.METADATA_URL, timeout=1)
71
+ if response.status_code == 200:
72
+ termination_time = response.text
73
+ self._emit_termination_metadata(termination_time)
74
+ os.kill(os.getppid(), signal.SIGTERM)
75
+ break
76
+ except (requests.exceptions.RequestException, requests.exceptions.Timeout):
77
+ pass
78
+ time.sleep(self.POLL_INTERVAL)
79
+
80
+ def _emit_termination_metadata(self, termination_time):
81
+ flow_filename = os.getenv("METAFLOW_FLOW_FILENAME")
82
+ pathspec = os.getenv("MF_PATHSPEC")
83
+ _, run_id, step_name, task_id = pathspec.split("/")
84
+ retry_count = os.getenv("MF_ATTEMPT")
85
+
86
+ with open("/tmp/spot_termination_notice", "w") as fp:
87
+ fp.write(termination_time)
88
+
89
+ command = [
90
+ sys.executable,
91
+ f"/metaflow/{flow_filename}",
92
+ "spot-metadata",
93
+ "record",
94
+ "--run-id",
95
+ run_id,
96
+ "--step-name",
97
+ step_name,
98
+ "--task-id",
99
+ task_id,
100
+ "--termination-notice-time",
101
+ termination_time,
102
+ "--tag",
103
+ "attempt_id:{}".format(retry_count),
104
+ ]
105
+
106
+ result = subprocess.run(command, capture_output=True, text=True)
107
+
108
+ if result.returncode != 0:
109
+ print(f"Failed to record spot termination metadata: {result.stderr}")
@@ -0,0 +1 @@
1
+ metaflow_version = "2.13.6.1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ob-metaflow
3
- Version: 2.13.4.1
3
+ Version: 2.13.6.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.13.4.1; extra == "stubs"
15
+ Requires-Dist: metaflow-stubs==2.13.6.1; extra == "stubs"
16
16
  Dynamic: author
17
17
  Dynamic: author-email
18
18
  Dynamic: description
@@ -299,6 +299,8 @@ metaflow/plugins/kubernetes/kubernetes_client.py
299
299
  metaflow/plugins/kubernetes/kubernetes_decorator.py
300
300
  metaflow/plugins/kubernetes/kubernetes_job.py
301
301
  metaflow/plugins/kubernetes/kubernetes_jobsets.py
302
+ metaflow/plugins/kubernetes/spot_metadata_cli.py
303
+ metaflow/plugins/kubernetes/spot_monitor_sidecar.py
302
304
  metaflow/plugins/metadata_providers/__init__.py
303
305
  metaflow/plugins/metadata_providers/local.py
304
306
  metaflow/plugins/metadata_providers/service.py
@@ -4,4 +4,4 @@ pylint
4
4
  kubernetes
5
5
 
6
6
  [stubs]
7
- metaflow-stubs==2.13.4.1
7
+ metaflow-stubs==2.13.6.1
@@ -1 +0,0 @@
1
- metaflow_version = "2.13.4.1"
File without changes
File without changes