ob-metaflow 2.12.22.1__tar.gz → 2.12.24.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.
- {ob_metaflow-2.12.22.1/ob_metaflow.egg-info → ob_metaflow-2.12.24.1}/PKG-INFO +2 -2
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/cli.py +24 -19
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/client/core.py +1 -1
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/cmd/develop/stub_generator.py +17 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/cmd/develop/stubs.py +3 -3
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/metaflow_version.py +8 -5
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/argo/argo_client.py +2 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/argo/argo_workflows.py +90 -44
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/argo/argo_workflows_cli.py +1 -1
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/kubernetes/kubernetes.py +17 -1
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/kubernetes/kubernetes_client.py +4 -1
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/kubernetes/kubernetes_decorator.py +5 -1
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/kubernetes/kubernetes_job.py +22 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +7 -1
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/pypi/bootstrap.py +1 -1
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/pypi/micromamba.py +26 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/runner/deployer.py +4 -49
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/runner/metaflow_runner.py +22 -25
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/runner/subprocess_manager.py +33 -17
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/runner/utils.py +53 -1
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/task.py +7 -0
- ob_metaflow-2.12.24.1/metaflow/version.py +1 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1/ob_metaflow.egg-info}/PKG-INFO +2 -2
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/ob_metaflow.egg-info/requires.txt +1 -1
- ob_metaflow-2.12.22.1/metaflow/version.py +0 -1
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/LICENSE +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/MANIFEST.in +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/README.md +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/R.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/click/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/click/_bashcomplete.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/click/_compat.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/click/_termui_impl.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/click/_textwrap.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/click/_unicodefun.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/click/_winconsole.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/click/core.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/click/decorators.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/click/exceptions.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/click/formatting.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/click/globals.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/click/parser.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/click/termui.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/click/testing.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/click/types.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/click/utils.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/packaging/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/packaging/_elffile.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/packaging/_manylinux.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/packaging/_musllinux.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/packaging/_parser.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/packaging/_structures.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/packaging/markers.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/packaging/py.typed +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/packaging/requirements.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/packaging/specifiers.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/packaging/tags.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/packaging/utils.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/packaging/version.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/typeguard/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/typeguard/_checkers.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/typeguard/_config.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/typeguard/_decorators.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/typeguard/_functions.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/typeguard/_importhook.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/typeguard/_memo.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/typeguard/_suppression.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/typeguard/_transformer.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/typeguard/_utils.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/typeguard/py.typed +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/typing_extensions.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/v3_5/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/v3_5/zipp.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/v3_6/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/v3_6/zipp.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/_vendor/zipp.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/cards.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/cli_args.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/client/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/client/filecache.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/clone_util.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/cmd/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/cmd/configure_cmd.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/cmd/develop/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/cmd/main_cli.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/cmd/tutorials_cmd.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/cmd/util.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/cmd_with_io.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/datastore/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/datastore/content_addressed_store.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/datastore/datastore_set.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/datastore/datastore_storage.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/datastore/exceptions.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/datastore/flow_datastore.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/datastore/inputs.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/datastore/task_datastore.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/debug.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/decorators.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/event_logger.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/events.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/exception.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/extension_support/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/extension_support/_empty_file.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/extension_support/cmd.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/extension_support/integrations.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/extension_support/plugins.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/flowspec.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/graph.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/includefile.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/info_file.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/integrations.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/lint.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/metadata/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/metadata/heartbeat.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/metadata/metadata.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/metadata/util.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/metaflow_config.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/metaflow_config_funcs.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/metaflow_current.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/metaflow_environment.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/metaflow_profile.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/mflog/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/mflog/mflog.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/mflog/save_logs.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/mflog/save_logs_periodically.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/mflog/tee.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/monitor.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/multicore_utils.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/package.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/parameters.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/airflow/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/airflow/airflow.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/airflow/airflow_cli.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/airflow/airflow_utils.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/airflow/dag.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/airflow/exception.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/argo/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/argo/argo_events.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/argo/capture_error.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/argo/generate_input_paths.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/aws_client.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/aws_utils.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/batch/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/batch/batch.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/batch/batch_client.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/azure/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/azure/azure_credential.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/azure/azure_exceptions.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/azure/azure_tail.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/azure/azure_utils.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/azure/includefile_support.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_cli.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_client.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_creator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_datastore.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_modules/base.html +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_modules/basic.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_modules/card.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_modules/components.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_modules/main.js +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_resolver.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_server.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/component_serializer.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/cards/exception.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/catch_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/datastores/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/datastores/azure_storage.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/datastores/gs_storage.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/datastores/local_storage.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/datastores/s3_storage.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/datatools/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/datatools/local.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/datatools/s3/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/datatools/s3/s3.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/datatools/s3/s3op.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/datatools/s3/s3util.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/debug_logger.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/debug_monitor.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/client.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/client_modules.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/communication/channel.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/communication/utils.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/consts.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/data_transferer.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/override_decorators.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/server.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/stub.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/env_escape/utils.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/environment_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/events_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/frameworks/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/frameworks/pytorch.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/gcp/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/gcp/gs_tail.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/gcp/gs_utils.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/gcp/includefile_support.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/kubernetes/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/kubernetes/kubernetes_cli.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/logs_cli.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/metadata/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/metadata/local.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/metadata/service.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/package_cli.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/parallel_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/project_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/pypi/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/pypi/conda_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/pypi/conda_environment.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/pypi/pip.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/pypi/pypi_environment.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/pypi/utils.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/resources_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/retry_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/secrets/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/storage_executor.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/tag_cli.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/timeout_decorator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/procpoll.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/py.typed +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/pylint_wrapper.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/runner/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/runner/click_api.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/runner/nbdeploy.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/runner/nbrun.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/runtime.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/sidecar/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/sidecar/sidecar.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/sidecar/sidecar_messages.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/sidecar/sidecar_subprocess.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/sidecar/sidecar_worker.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/system/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/system/system_logger.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/system/system_monitor.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/system/system_utils.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tagging_util.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tracing/__init__.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tracing/propagator.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tracing/span_exporter.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tracing/tracing_modules.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tuple_util.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/00-helloworld/README.md +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/01-playlist/README.md +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/01-playlist/movies.csv +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/01-playlist/playlist.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/02-statistics/README.md +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/02-statistics/movies.csv +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/02-statistics/stats.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/07-worldview/README.md +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/08-autopilot/README.md +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/unbounded_foreach.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/util.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/vendor.py +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/ob_metaflow.egg-info/SOURCES.txt +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/ob_metaflow.egg-info/dependency_links.txt +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/ob_metaflow.egg-info/entry_points.txt +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/ob_metaflow.egg-info/top_level.txt +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/setup.cfg +0 -0
- {ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ob-metaflow
|
|
3
|
-
Version: 2.12.
|
|
3
|
+
Version: 2.12.24.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.12.
|
|
15
|
+
Requires-Dist: metaflow-stubs==2.12.24.1; extra == "stubs"
|
|
16
16
|
|
|
17
17
|

|
|
18
18
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import inspect
|
|
2
|
-
import
|
|
2
|
+
import json
|
|
3
3
|
import sys
|
|
4
4
|
import traceback
|
|
5
5
|
from datetime import datetime
|
|
@@ -7,6 +7,7 @@ from functools import wraps
|
|
|
7
7
|
|
|
8
8
|
import metaflow.tracing as tracing
|
|
9
9
|
from metaflow._vendor import click
|
|
10
|
+
from metaflow.client.core import get_metadata
|
|
10
11
|
|
|
11
12
|
from . import decorators, lint, metaflow_version, namespace, parameters, plugins
|
|
12
13
|
from .cli_args import cli_args
|
|
@@ -698,15 +699,17 @@ def resume(
|
|
|
698
699
|
runtime.print_workflow_info()
|
|
699
700
|
|
|
700
701
|
runtime.persist_constants()
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
"
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
702
|
+
|
|
703
|
+
if runner_attribute_file:
|
|
704
|
+
with open(runner_attribute_file, "w") as f:
|
|
705
|
+
json.dump(
|
|
706
|
+
{
|
|
707
|
+
"run_id": runtime.run_id,
|
|
708
|
+
"flow_name": obj.flow.name,
|
|
709
|
+
"metadata": get_metadata(),
|
|
710
|
+
},
|
|
711
|
+
f,
|
|
712
|
+
)
|
|
710
713
|
|
|
711
714
|
# We may skip clone-only resume if this is not a resume leader,
|
|
712
715
|
# and clone is already complete.
|
|
@@ -774,15 +777,17 @@ def run(
|
|
|
774
777
|
obj.flow._set_constants(obj.graph, kwargs)
|
|
775
778
|
runtime.print_workflow_info()
|
|
776
779
|
runtime.persist_constants()
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
"
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
780
|
+
|
|
781
|
+
if runner_attribute_file:
|
|
782
|
+
with open(runner_attribute_file, "w") as f:
|
|
783
|
+
json.dump(
|
|
784
|
+
{
|
|
785
|
+
"run_id": runtime.run_id,
|
|
786
|
+
"flow_name": obj.flow.name,
|
|
787
|
+
"metadata": get_metadata(),
|
|
788
|
+
},
|
|
789
|
+
f,
|
|
790
|
+
)
|
|
786
791
|
runtime.execute()
|
|
787
792
|
|
|
788
793
|
|
|
@@ -115,6 +115,11 @@ class StubGenerator:
|
|
|
115
115
|
:type members_from_other_modules: List[str]
|
|
116
116
|
"""
|
|
117
117
|
|
|
118
|
+
# Let metaflow know we are in stubgen mode. This is sometimes useful to skip
|
|
119
|
+
# some processing like loading libraries, etc. It is used in Metaflow extensions
|
|
120
|
+
# so do not remove even if you do not see a use for it directly in the code.
|
|
121
|
+
os.environ["METAFLOW_STUBGEN"] = "1"
|
|
122
|
+
|
|
118
123
|
self._write_generated_for = include_generated_for
|
|
119
124
|
self._pending_modules = ["metaflow"] # type: List[str]
|
|
120
125
|
self._pending_modules.extend(get_aliased_modules())
|
|
@@ -398,6 +403,18 @@ class StubGenerator:
|
|
|
398
403
|
name_with_module = self._get_element_name_with_module(clazz.__class__)
|
|
399
404
|
buff.write("metaclass=" + name_with_module + "):\n")
|
|
400
405
|
|
|
406
|
+
# Add class docstring
|
|
407
|
+
if clazz.__doc__:
|
|
408
|
+
buff.write('%s"""\n' % TAB)
|
|
409
|
+
my_doc = cast(str, deindent_docstring(clazz.__doc__))
|
|
410
|
+
init_blank = True
|
|
411
|
+
for line in my_doc.split("\n"):
|
|
412
|
+
if init_blank and len(line.strip()) == 0:
|
|
413
|
+
continue
|
|
414
|
+
init_blank = False
|
|
415
|
+
buff.write("%s%s\n" % (TAB, line.rstrip()))
|
|
416
|
+
buff.write('%s"""\n' % TAB)
|
|
417
|
+
|
|
401
418
|
# For NamedTuple, we have __annotations__ but no __init__. In that case,
|
|
402
419
|
# we are going to "create" a __init__ function with the annotations
|
|
403
420
|
# to show what the class takes.
|
|
@@ -170,7 +170,7 @@ def install(ctx: Any, force: bool):
|
|
|
170
170
|
"Metaflow stubs are already installed and valid -- use --force to reinstall"
|
|
171
171
|
)
|
|
172
172
|
return
|
|
173
|
-
mf_version, _ = get_mf_version()
|
|
173
|
+
mf_version, _ = get_mf_version(True)
|
|
174
174
|
with tempfile.TemporaryDirectory() as tmp_dir:
|
|
175
175
|
with open(os.path.join(tmp_dir, "setup.py"), "w") as f:
|
|
176
176
|
f.write(
|
|
@@ -261,10 +261,10 @@ def split_version(vers: str) -> Tuple[str, Optional[str]]:
|
|
|
261
261
|
return vers_split[0], vers_split[1]
|
|
262
262
|
|
|
263
263
|
|
|
264
|
-
def get_mf_version() -> Tuple[str, Optional[str]]:
|
|
264
|
+
def get_mf_version(public: bool = False) -> Tuple[str, Optional[str]]:
|
|
265
265
|
from metaflow.metaflow_version import get_version
|
|
266
266
|
|
|
267
|
-
return split_version(get_version())
|
|
267
|
+
return split_version(get_version(public))
|
|
268
268
|
|
|
269
269
|
|
|
270
270
|
def get_stubs_version(stubs_root_path: Optional[str]) -> Tuple[str, Optional[str]]:
|
|
@@ -195,11 +195,14 @@ def get_version(public=False):
|
|
|
195
195
|
if ext_version is None:
|
|
196
196
|
ext_version = getattr(extension_module, "__version__", "<unk>")
|
|
197
197
|
# Update the package information about reported version for the extension
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
198
|
+
# (only for the full info which is called at least once -- if we update more
|
|
199
|
+
# it will error out since we can only update_package_info once)
|
|
200
|
+
if not public:
|
|
201
|
+
update_package_info(
|
|
202
|
+
package_name=pkg_name,
|
|
203
|
+
extension_name=ext_name,
|
|
204
|
+
package_version=ext_version,
|
|
205
|
+
)
|
|
203
206
|
ext_versions.append("%s(%s)" % (ext_name, ext_version))
|
|
204
207
|
|
|
205
208
|
# We now have all the information about extensions so we can form the final string
|
|
@@ -295,6 +295,8 @@ class ArgoClient(object):
|
|
|
295
295
|
"suspend": schedule is None,
|
|
296
296
|
"schedule": schedule,
|
|
297
297
|
"timezone": timezone,
|
|
298
|
+
"failedJobsHistoryLimit": 10000, # default is unfortunately 1
|
|
299
|
+
"successfulJobsHistoryLimit": 10000, # default is unfortunately 3
|
|
298
300
|
"workflowSpec": {"workflowTemplateRef": {"name": name}},
|
|
299
301
|
},
|
|
300
302
|
}
|
|
@@ -51,7 +51,7 @@ from metaflow.metaflow_config import (
|
|
|
51
51
|
UI_URL,
|
|
52
52
|
PAGERDUTY_TEMPLATE_URL,
|
|
53
53
|
)
|
|
54
|
-
from metaflow.metaflow_config_funcs import config_values
|
|
54
|
+
from metaflow.metaflow_config_funcs import config_values, init_config
|
|
55
55
|
from metaflow.mflog import BASH_SAVE_LOGS, bash_capture_logs, export_mflog_env_vars
|
|
56
56
|
from metaflow.parameters import deploy_time_eval
|
|
57
57
|
from metaflow.plugins.kubernetes.kubernetes import (
|
|
@@ -1491,7 +1491,11 @@ class ArgoWorkflows(object):
|
|
|
1491
1491
|
# {{foo.bar['param_name']}}.
|
|
1492
1492
|
# https://argoproj.github.io/argo-events/tutorials/02-parameterization/
|
|
1493
1493
|
# http://masterminds.github.io/sprig/strings.html
|
|
1494
|
-
|
|
1494
|
+
(
|
|
1495
|
+
"--%s='{{workflow.parameters.%s}}'"
|
|
1496
|
+
if parameter["type"] == "JSON"
|
|
1497
|
+
else "--%s={{workflow.parameters.%s}}"
|
|
1498
|
+
)
|
|
1495
1499
|
% (parameter["name"], parameter["name"])
|
|
1496
1500
|
for parameter in self.parameters.values()
|
|
1497
1501
|
]
|
|
@@ -1818,6 +1822,21 @@ class ArgoWorkflows(object):
|
|
|
1818
1822
|
and k not in set(ARGO_WORKFLOWS_ENV_VARS_TO_SKIP.split(","))
|
|
1819
1823
|
}
|
|
1820
1824
|
|
|
1825
|
+
# get initial configs
|
|
1826
|
+
initial_configs = init_config()
|
|
1827
|
+
for entry in ["OBP_PERIMETER", "OBP_INTEGRATIONS_SECRETS_METADATA_URL"]:
|
|
1828
|
+
if entry not in initial_configs:
|
|
1829
|
+
raise ArgoWorkflowsException(
|
|
1830
|
+
f"{entry} was not found in metaflow config. Please make sure to run `outerbounds configure <...>` command which can be found on the Ourebounds UI or reach out to your Outerbounds support team."
|
|
1831
|
+
)
|
|
1832
|
+
|
|
1833
|
+
additional_obp_configs = {
|
|
1834
|
+
"OBP_PERIMETER": initial_configs["OBP_PERIMETER"],
|
|
1835
|
+
"OBP_INTEGRATIONS_SECRETS_METADATA_URL": initial_configs[
|
|
1836
|
+
"OBP_INTEGRATIONS_SECRETS_METADATA_URL"
|
|
1837
|
+
],
|
|
1838
|
+
}
|
|
1839
|
+
|
|
1821
1840
|
# Tmpfs variables
|
|
1822
1841
|
use_tmpfs = resources["use_tmpfs"]
|
|
1823
1842
|
tmpfs_size = resources["tmpfs_size"]
|
|
@@ -2079,6 +2098,13 @@ class ArgoWorkflows(object):
|
|
|
2079
2098
|
"METAFLOW_KUBERNETES_SERVICE_ACCOUNT_NAME": "spec.serviceAccountName",
|
|
2080
2099
|
"METAFLOW_KUBERNETES_NODE_IP": "status.hostIP",
|
|
2081
2100
|
}.items()
|
|
2101
|
+
]
|
|
2102
|
+
+ [
|
|
2103
|
+
kubernetes_sdk.V1EnvVar(
|
|
2104
|
+
name=k,
|
|
2105
|
+
value=v,
|
|
2106
|
+
)
|
|
2107
|
+
for k, v in additional_obp_configs.items()
|
|
2082
2108
|
],
|
|
2083
2109
|
image=resources["image"],
|
|
2084
2110
|
image_pull_policy=resources["image_pull_policy"],
|
|
@@ -2636,50 +2662,57 @@ class ArgoWorkflows(object):
|
|
|
2636
2662
|
)
|
|
2637
2663
|
from kubernetes import client as kubernetes_sdk
|
|
2638
2664
|
|
|
2639
|
-
return
|
|
2640
|
-
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
|
|
2647
|
-
|
|
2648
|
-
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2665
|
+
return (
|
|
2666
|
+
DaemonTemplate("heartbeat-daemon")
|
|
2667
|
+
# NOTE: Even though a retry strategy does not work for Argo daemon containers,
|
|
2668
|
+
# this has the side-effect of protecting the exit hooks of the workflow from failing in case the daemon container errors out.
|
|
2669
|
+
.retry_strategy(10, 1)
|
|
2670
|
+
.service_account_name(resources["service_account"])
|
|
2671
|
+
.container(
|
|
2672
|
+
to_camelcase(
|
|
2673
|
+
kubernetes_sdk.V1Container(
|
|
2674
|
+
name="main",
|
|
2675
|
+
# TODO: Make the image configurable
|
|
2676
|
+
image=resources["image"],
|
|
2677
|
+
command=cmds,
|
|
2678
|
+
env=[
|
|
2679
|
+
kubernetes_sdk.V1EnvVar(name=k, value=str(v))
|
|
2680
|
+
for k, v in env.items()
|
|
2681
|
+
],
|
|
2682
|
+
env_from=[
|
|
2683
|
+
kubernetes_sdk.V1EnvFromSource(
|
|
2684
|
+
secret_ref=kubernetes_sdk.V1SecretEnvSource(
|
|
2685
|
+
name=str(k),
|
|
2686
|
+
# optional=True
|
|
2687
|
+
)
|
|
2655
2688
|
)
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
|
|
2689
|
+
for k in list(
|
|
2690
|
+
[]
|
|
2691
|
+
if not resources.get("secrets")
|
|
2692
|
+
else (
|
|
2693
|
+
[resources.get("secrets")]
|
|
2694
|
+
if isinstance(resources.get("secrets"), str)
|
|
2695
|
+
else resources.get("secrets")
|
|
2696
|
+
)
|
|
2664
2697
|
)
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
|
|
2668
|
-
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
|
|
2672
|
-
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
|
|
2681
|
-
|
|
2682
|
-
)
|
|
2698
|
+
+ KUBERNETES_SECRETS.split(",")
|
|
2699
|
+
+ ARGO_WORKFLOWS_KUBERNETES_SECRETS.split(",")
|
|
2700
|
+
if k
|
|
2701
|
+
],
|
|
2702
|
+
resources=kubernetes_sdk.V1ResourceRequirements(
|
|
2703
|
+
# NOTE: base resources for this are kept to a minimum to save on running costs.
|
|
2704
|
+
# This has an adverse effect on startup time for the daemon, which can be completely
|
|
2705
|
+
# alleviated by using a base image that has the required dependencies pre-installed
|
|
2706
|
+
requests={
|
|
2707
|
+
"cpu": "200m",
|
|
2708
|
+
"memory": "100Mi",
|
|
2709
|
+
},
|
|
2710
|
+
limits={
|
|
2711
|
+
"cpu": "200m",
|
|
2712
|
+
"memory": "100Mi",
|
|
2713
|
+
},
|
|
2714
|
+
),
|
|
2715
|
+
)
|
|
2683
2716
|
)
|
|
2684
2717
|
)
|
|
2685
2718
|
)
|
|
@@ -3301,6 +3334,19 @@ class DaemonTemplate(object):
|
|
|
3301
3334
|
self.payload["container"] = container
|
|
3302
3335
|
return self
|
|
3303
3336
|
|
|
3337
|
+
def service_account_name(self, service_account_name):
|
|
3338
|
+
self.payload["serviceAccountName"] = service_account_name
|
|
3339
|
+
return self
|
|
3340
|
+
|
|
3341
|
+
def retry_strategy(self, times, minutes_between_retries):
|
|
3342
|
+
if times > 0:
|
|
3343
|
+
self.payload["retryStrategy"] = {
|
|
3344
|
+
"retryPolicy": "Always",
|
|
3345
|
+
"limit": times,
|
|
3346
|
+
"backoff": {"duration": "%sm" % minutes_between_retries},
|
|
3347
|
+
}
|
|
3348
|
+
return self
|
|
3349
|
+
|
|
3304
3350
|
def to_json(self):
|
|
3305
3351
|
return self.payload
|
|
3306
3352
|
|
|
@@ -45,7 +45,7 @@ from metaflow.metaflow_config import (
|
|
|
45
45
|
SERVICE_INTERNAL_URL,
|
|
46
46
|
)
|
|
47
47
|
from metaflow.unbounded_foreach import UBF_CONTROL, UBF_TASK
|
|
48
|
-
from metaflow.metaflow_config_funcs import config_values
|
|
48
|
+
from metaflow.metaflow_config_funcs import config_values, init_config
|
|
49
49
|
from metaflow.mflog import (
|
|
50
50
|
BASH_SAVE_LOGS,
|
|
51
51
|
bash_capture_logs,
|
|
@@ -311,6 +311,22 @@ class Kubernetes(object):
|
|
|
311
311
|
) + KUBERNETES_SECRETS.split(","):
|
|
312
312
|
jobset.secret(k)
|
|
313
313
|
|
|
314
|
+
initial_configs = init_config()
|
|
315
|
+
for entry in ["OBP_PERIMETER", "OBP_INTEGRATIONS_SECRETS_METADATA_URL"]:
|
|
316
|
+
if entry not in initial_configs:
|
|
317
|
+
raise KubernetesException(
|
|
318
|
+
f"{entry} was not found in metaflow config. Please make sure to run `outerbounds configure <...>` command which can be found on the Ourebounds UI or reach out to your Outerbounds support team."
|
|
319
|
+
)
|
|
320
|
+
|
|
321
|
+
additional_obp_configs = {
|
|
322
|
+
"OBP_PERIMETER": initial_configs["OBP_PERIMETER"],
|
|
323
|
+
"OBP_INTEGRATIONS_SECRETS_METADATA_URL": initial_configs[
|
|
324
|
+
"OBP_INTEGRATIONS_SECRETS_METADATA_URL"
|
|
325
|
+
],
|
|
326
|
+
}
|
|
327
|
+
for k, v in additional_obp_configs.items():
|
|
328
|
+
jobset.environment_variable(k, v)
|
|
329
|
+
|
|
314
330
|
jobset.environment_variables_from_selectors(
|
|
315
331
|
{
|
|
316
332
|
"METAFLOW_KUBERNETES_NAMESPACE": "metadata.namespace",
|
{ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/kubernetes/kubernetes_client.py
RENAMED
|
@@ -155,7 +155,10 @@ class KubernetesClient(object):
|
|
|
155
155
|
echo("failed to kill pod %s - %s" % (pod.metadata.name, str(e)))
|
|
156
156
|
|
|
157
157
|
with ThreadPoolExecutor() as executor:
|
|
158
|
-
executor.map(_kill_pod,
|
|
158
|
+
operated_pods = list(executor.map(_kill_pod, pods))
|
|
159
|
+
|
|
160
|
+
if not operated_pods:
|
|
161
|
+
echo("No active Kubernetes pods found for run *%s*" % run_id)
|
|
159
162
|
|
|
160
163
|
def jobset(self, **kwargs):
|
|
161
164
|
return KubernetesJobSet(self, **kwargs)
|
{ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/kubernetes/kubernetes_decorator.py
RENAMED
|
@@ -558,7 +558,11 @@ class KubernetesDecorator(StepDecorator):
|
|
|
558
558
|
|
|
559
559
|
# TODO: Unify this method with the multi-node setup in @batch
|
|
560
560
|
def _setup_multinode_environment():
|
|
561
|
-
# FIXME
|
|
561
|
+
# TODO [FIXME SOON]
|
|
562
|
+
# Even if Kubernetes may deploy control pods before worker pods, there is always a
|
|
563
|
+
# possibility that the worker pods may start before the control. In the case that this happens,
|
|
564
|
+
# the worker pods will not be able to resolve the control pod's IP address and this will cause
|
|
565
|
+
# the worker pods to fail. This function should account for this in the near future.
|
|
562
566
|
import socket
|
|
563
567
|
|
|
564
568
|
try:
|
{ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/kubernetes/kubernetes_job.py
RENAMED
|
@@ -9,6 +9,7 @@ from metaflow.exception import MetaflowException
|
|
|
9
9
|
from metaflow.metaflow_config import KUBERNETES_SECRETS
|
|
10
10
|
from metaflow.tracing import inject_tracing_vars
|
|
11
11
|
from metaflow.unbounded_foreach import UBF_CONTROL, UBF_TASK
|
|
12
|
+
from metaflow.metaflow_config_funcs import init_config
|
|
12
13
|
|
|
13
14
|
CLIENT_REFRESH_INTERVAL_SECONDS = 300
|
|
14
15
|
from .kubernetes_jobsets import (
|
|
@@ -74,6 +75,20 @@ class KubernetesJob(object):
|
|
|
74
75
|
if self._kwargs["shared_memory"]
|
|
75
76
|
else None
|
|
76
77
|
)
|
|
78
|
+
initial_configs = init_config()
|
|
79
|
+
for entry in ["OBP_PERIMETER", "OBP_INTEGRATIONS_SECRETS_METADATA_URL"]:
|
|
80
|
+
if entry not in initial_configs:
|
|
81
|
+
raise KubernetesJobException(
|
|
82
|
+
f"{entry} was not found in metaflow config. Please make sure to run `outerbounds configure <...>` command which can be found on the Ourebounds UI or reach out to your Outerbounds support team."
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
additional_obp_configs = {
|
|
86
|
+
"OBP_PERIMETER": initial_configs["OBP_PERIMETER"],
|
|
87
|
+
"OBP_INTEGRATIONS_SECRETS_METADATA_URL": initial_configs[
|
|
88
|
+
"OBP_INTEGRATIONS_SECRETS_METADATA_URL"
|
|
89
|
+
],
|
|
90
|
+
}
|
|
91
|
+
|
|
77
92
|
return client.V1JobSpec(
|
|
78
93
|
# Retries are handled by Metaflow when it is responsible for
|
|
79
94
|
# executing the flow. The responsibility is moved to Kubernetes
|
|
@@ -135,6 +150,13 @@ class KubernetesJob(object):
|
|
|
135
150
|
"METAFLOW_KUBERNETES_NODE_IP": "status.hostIP",
|
|
136
151
|
}.items()
|
|
137
152
|
]
|
|
153
|
+
+ [
|
|
154
|
+
client.V1EnvVar(
|
|
155
|
+
name=k,
|
|
156
|
+
value=v,
|
|
157
|
+
)
|
|
158
|
+
for k, v in additional_obp_configs.items()
|
|
159
|
+
]
|
|
138
160
|
+ [
|
|
139
161
|
client.V1EnvVar(name=k, value=str(v))
|
|
140
162
|
for k, v in inject_tracing_vars({}).items()
|
{ob_metaflow-2.12.22.1 → ob_metaflow-2.12.24.1}/metaflow/plugins/kubernetes/kubernetes_jobsets.py
RENAMED
|
@@ -866,7 +866,13 @@ class KubernetesJobSet(object):
|
|
|
866
866
|
spec=dict(
|
|
867
867
|
replicatedJobs=[self.control.dump(), self.worker.dump()],
|
|
868
868
|
suspend=False,
|
|
869
|
-
startupPolicy=
|
|
869
|
+
startupPolicy=dict(
|
|
870
|
+
# We explicitly set an InOrder Startup policy so that
|
|
871
|
+
# we can ensure that the control pod starts before the worker pods.
|
|
872
|
+
# This is required so that when worker pods try to access the control's IP
|
|
873
|
+
# we are able to resolve the control's IP address.
|
|
874
|
+
startupPolicyOrder="InOrder"
|
|
875
|
+
),
|
|
870
876
|
successPolicy=None,
|
|
871
877
|
# The Failure Policy helps setting the number of retries for the jobset.
|
|
872
878
|
# but we don't rely on it and instead rely on either the local scheduler
|
|
@@ -89,7 +89,7 @@ if __name__ == "__main__":
|
|
|
89
89
|
# TODO: micromamba installation can be pawned off to micromamba.py
|
|
90
90
|
f"""set -e;
|
|
91
91
|
if ! command -v micromamba >/dev/null 2>&1; then
|
|
92
|
-
mkdir micromamba;
|
|
92
|
+
mkdir -p micromamba;
|
|
93
93
|
python -c "import requests, bz2, sys; data = requests.get('https://micro.mamba.pm/api/micromamba/{architecture}/1.5.7').content; sys.stdout.buffer.write(bz2.decompress(data))" | tar -xv -C $(pwd)/micromamba bin/micromamba --strip-components 1;
|
|
94
94
|
export PATH=$PATH:$(pwd)/micromamba;
|
|
95
95
|
if ! command -v micromamba >/dev/null 2>&1; then
|
|
@@ -253,7 +253,33 @@ class Micromamba(object):
|
|
|
253
253
|
try:
|
|
254
254
|
output = json.loads(e.output)
|
|
255
255
|
err = []
|
|
256
|
+
v_pkgs = ["__cuda", "__glibc"]
|
|
256
257
|
for error in output.get("solver_problems", []):
|
|
258
|
+
# raise a specific error message for virtual package related errors
|
|
259
|
+
match = next((p for p in v_pkgs if p in error), None)
|
|
260
|
+
if match is not None:
|
|
261
|
+
vpkg_name = match[2:]
|
|
262
|
+
# try to strip version from error msg which are of the format:
|
|
263
|
+
# nothing provides <__vpkg> >=2.17,<3.0.a0 needed by <pkg_name>
|
|
264
|
+
try:
|
|
265
|
+
vpkg_version = error[
|
|
266
|
+
len("nothing provides %s " % match) : error.index(
|
|
267
|
+
" needed by"
|
|
268
|
+
)
|
|
269
|
+
]
|
|
270
|
+
except ValueError:
|
|
271
|
+
vpkg_version = None
|
|
272
|
+
raise MicromambaException(
|
|
273
|
+
"Please set the environment variable CONDA_OVERRIDE_{var} to a specific version{version} of {name}.\n"
|
|
274
|
+
"Here is an example of supplying environment variables through the command line -\n\n"
|
|
275
|
+
"CONDA_OVERRIDE_{var}=<{name}-version> python flow.py <args>".format(
|
|
276
|
+
var=vpkg_name.upper(),
|
|
277
|
+
version=(
|
|
278
|
+
"" if not vpkg_version else (" (%s)" % vpkg_version)
|
|
279
|
+
),
|
|
280
|
+
name=vpkg_name,
|
|
281
|
+
),
|
|
282
|
+
)
|
|
257
283
|
err.append(error)
|
|
258
284
|
raise MicromambaException(
|
|
259
285
|
msg.format(
|
|
@@ -6,56 +6,11 @@ import importlib
|
|
|
6
6
|
import functools
|
|
7
7
|
import tempfile
|
|
8
8
|
|
|
9
|
-
from subprocess import CalledProcessError
|
|
10
9
|
from typing import Optional, Dict, ClassVar
|
|
11
10
|
|
|
12
11
|
from metaflow.exception import MetaflowNotFound
|
|
13
|
-
from metaflow.runner.subprocess_manager import
|
|
14
|
-
from metaflow.runner.utils import
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def handle_timeout(
|
|
18
|
-
tfp_runner_attribute, command_obj: CommandManager, file_read_timeout: int
|
|
19
|
-
):
|
|
20
|
-
"""
|
|
21
|
-
Handle the timeout for a running subprocess command that reads a file
|
|
22
|
-
and raises an error with appropriate logs if a TimeoutError occurs.
|
|
23
|
-
|
|
24
|
-
Parameters
|
|
25
|
-
----------
|
|
26
|
-
tfp_runner_attribute : NamedTemporaryFile
|
|
27
|
-
Temporary file that stores runner attribute data.
|
|
28
|
-
command_obj : CommandManager
|
|
29
|
-
Command manager object that encapsulates the running command details.
|
|
30
|
-
file_read_timeout : int
|
|
31
|
-
Timeout for reading the file.
|
|
32
|
-
|
|
33
|
-
Returns
|
|
34
|
-
-------
|
|
35
|
-
str
|
|
36
|
-
Content read from the temporary file.
|
|
37
|
-
|
|
38
|
-
Raises
|
|
39
|
-
------
|
|
40
|
-
RuntimeError
|
|
41
|
-
If a TimeoutError occurs, it raises a RuntimeError with the command's
|
|
42
|
-
stdout and stderr logs.
|
|
43
|
-
"""
|
|
44
|
-
try:
|
|
45
|
-
content = read_from_file_when_ready(
|
|
46
|
-
tfp_runner_attribute.name, command_obj, timeout=file_read_timeout
|
|
47
|
-
)
|
|
48
|
-
return content
|
|
49
|
-
except (CalledProcessError, TimeoutError) as e:
|
|
50
|
-
stdout_log = open(command_obj.log_files["stdout"]).read()
|
|
51
|
-
stderr_log = open(command_obj.log_files["stderr"]).read()
|
|
52
|
-
command = " ".join(command_obj.command)
|
|
53
|
-
error_message = "Error executing: '%s':\n" % command
|
|
54
|
-
if stdout_log.strip():
|
|
55
|
-
error_message += "\nStdout:\n%s\n" % stdout_log
|
|
56
|
-
if stderr_log.strip():
|
|
57
|
-
error_message += "\nStderr:\n%s\n" % stderr_log
|
|
58
|
-
raise RuntimeError(error_message) from e
|
|
12
|
+
from metaflow.runner.subprocess_manager import SubprocessManager
|
|
13
|
+
from metaflow.runner.utils import handle_timeout
|
|
59
14
|
|
|
60
15
|
|
|
61
16
|
def get_lower_level_group(
|
|
@@ -209,7 +164,7 @@ class TriggeredRun(object):
|
|
|
209
164
|
elif callable(v):
|
|
210
165
|
setattr(self, k, functools.partial(v, self))
|
|
211
166
|
else:
|
|
212
|
-
setattr(self
|
|
167
|
+
setattr(self, k, v)
|
|
213
168
|
|
|
214
169
|
def wait_for_run(self, timeout=None):
|
|
215
170
|
"""
|
|
@@ -287,7 +242,7 @@ class DeployedFlow(object):
|
|
|
287
242
|
elif callable(v):
|
|
288
243
|
setattr(self, k, functools.partial(v, self))
|
|
289
244
|
else:
|
|
290
|
-
setattr(self
|
|
245
|
+
setattr(self, k, v)
|
|
291
246
|
|
|
292
247
|
|
|
293
248
|
class DeployerImpl(object):
|