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