parsl 2024.10.7__tar.gz → 2024.10.21__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.
- {parsl-2024.10.7/parsl.egg-info → parsl-2024.10.21}/PKG-INFO +3 -4
- {parsl-2024.10.7 → parsl-2024.10.21}/README.rst +1 -1
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/errors.py +13 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/executor.py +23 -17
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/interchange.py +1 -19
- parsl-2024.10.21/parsl/executors/high_throughput/manager_selector.py +55 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/mpi_prefix_composer.py +5 -23
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/process_worker_pool.py +1 -1
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/threads.py +3 -2
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/workqueue/executor.py +6 -5
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/kubernetes/kube.py +35 -28
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/conftest.py +1 -1
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_resource_spec.py +10 -14
- parsl-2024.10.21/parsl/tests/test_htex/test_block_manager_selector_unit.py +20 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_drain.py +6 -4
- parsl-2024.10.21/parsl/tests/test_htex/test_manager_selector_by_block.py +53 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_resource_spec_validation.py +8 -3
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +2 -4
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_mpi_apps/test_resource_spec.py +2 -5
- parsl-2024.10.21/parsl/tests/test_providers/test_kubernetes_provider.py +102 -0
- parsl-2024.10.21/parsl/tests/test_utils/test_sanitize_dns.py +76 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/utils.py +78 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/version.py +1 -1
- {parsl-2024.10.7 → parsl-2024.10.21/parsl.egg-info}/PKG-INFO +3 -4
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl.egg-info/SOURCES.txt +4 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/setup.py +1 -2
- parsl-2024.10.7/parsl/executors/high_throughput/manager_selector.py +0 -25
- {parsl-2024.10.7 → parsl-2024.10.21}/LICENSE +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/MANIFEST.in +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/addresses.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/app/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/app/app.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/app/bash.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/app/errors.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/app/futures.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/app/python.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/benchmark/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/benchmark/perf.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/base.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/errors.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/local/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/local/local.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/oauth_ssh/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/oauth_ssh/oauth_ssh.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/ssh/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/ssh/ssh.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/ssh_il/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/ssh_il/ssh_il.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/concurrent/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/config.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/ASPIRE1.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/Azure.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/bridges.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/cc_in2p3.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/ec2.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/expanse.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/frontera.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/htex_local.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/illinoiscluster.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/improv.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/kubernetes.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/local_threads.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/midway.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/osg.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/polaris.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/stampede2.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/summit.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/toss3_llnl.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/vineex_local.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/wqex_local.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/curvezmq.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/data_manager.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/file_noop.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/files.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/ftp.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/globus.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/http.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/rsync.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/staging.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/zip.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/dependency_resolvers.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/dflow.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/errors.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/futures.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/memoization.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/rundirs.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/states.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/taskrecord.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/errors.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/base.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/flux/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/flux/execute_parsl_task.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/flux/executor.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/flux/flux_instance_manager.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/errors.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/manager_record.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/monitoring_info.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/mpi_executor.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/probe.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/radical/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/radical/executor.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/radical/rpex_resources.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/radical/rpex_worker.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/status_handling.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/errors.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/executor.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/factory.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/factory_config.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/manager.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/manager_config.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/utils.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/workqueue/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/workqueue/errors.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/jobs/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/jobs/error_handlers.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/jobs/errors.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/jobs/job_status_poller.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/jobs/states.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/jobs/strategy.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/launchers/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/launchers/base.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/launchers/errors.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/launchers/launchers.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/log_utils.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/db_manager.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/errors.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/message_type.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/monitoring.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/queries/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/queries/pandas.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/radios.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/remote.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/router.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/types.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/app.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/models.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/plots/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/templates/app.html +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/templates/dag.html +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/templates/error.html +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/templates/layout.html +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/templates/task.html +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/templates/workflow.html +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/utils.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/version.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/views.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/multiprocessing.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/process_loggers.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/ad_hoc/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/ad_hoc/ad_hoc.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/aws/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/aws/aws.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/aws/template.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/azure/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/azure/azure.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/azure/template.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/base.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/cluster_provider.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/cobalt/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/cobalt/cobalt.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/cobalt/template.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/condor/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/condor/condor.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/condor/template.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/errors.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/googlecloud/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/googlecloud/googlecloud.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/grid_engine/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/grid_engine/grid_engine.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/grid_engine/template.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/kubernetes/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/kubernetes/template.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/local/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/local/local.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/lsf/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/lsf/lsf.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/lsf/template.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/pbspro/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/pbspro/pbspro.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/pbspro/template.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/slurm/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/slurm/slurm.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/slurm/template.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/torque/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/torque/template.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/torque/torque.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/py.typed +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/serialize/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/serialize/base.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/serialize/concretes.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/serialize/errors.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/serialize/facade.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/serialize/proxystore.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/callables_helper.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/azure_single_node.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/bluewaters.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/bridges.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/cc_in2p3.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/comet.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/cooley_htex.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/ec2_single_node.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/ec2_spot.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/flux_local.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/frontera.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/htex_local.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/htex_local_alternate.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_adhoc.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_radical.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_radical_mpi.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_globus.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_monitoring.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_no_cache.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/midway.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/nscc_singapore.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/osg_htex.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/petrelkube.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/slurm_local.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/summit.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/taskvine_ex.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/theta.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/user_opts.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/workqueue_ex.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/latency.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/test_apps/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/test_channels/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/test_channels/test_channels.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/test_channels/test_local_channel.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/test_stress/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/htex_local.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/test_basic.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/test_log_filter.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/test_regression_220.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/test_worker_count.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/scaling_tests/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/scaling_tests/htex_local.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/scaling_tests/local_threads.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/scaling_tests/test_scale.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/scaling_tests/vineex_local.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/scaling_tests/wqex_local.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/site_tests/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/site_tests/site_config_selector.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/site_tests/test_provider.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/site_tests/test_site.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/test_affinity.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/test_concurrent.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/test_dynamic_executor.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/test_ec2.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/test_launchers.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/test_local_adhoc.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/test_mpi/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/test_worker_info.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_aalst_patterns.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_basic.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_callables.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_channels/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_channels/test_dfk_close.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_channels/test_large_output.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_curvezmq.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_docs/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_docs/test_from_slides.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_docs/test_kwargs.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_docs/test_workflow1.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_docs/test_workflow2.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_docs/test_workflow4.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_fail.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_retries.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_flowcontrol/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_flux.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_basic.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_htex.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_manager_failure.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_managers_command.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_missing_worker.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_worker_failure.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_app_names.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_basic.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_mpi_apps/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_providers/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_providers/test_cobalt_deprecation_warning.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_providers/test_local_provider.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_providers/test_slurm_template.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_basic.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_fail.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_futures.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_join.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_lifted.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_mapred.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_outputs.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_overview.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_simple.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_timeout.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_type5.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_radical/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_1480.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_1653.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_221.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_226.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_2652.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_69a.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_854.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_98.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_scaling/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_scaling/test_scale_down.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_serialization/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_serialization/test_basic.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_shutdown/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/staging_provider.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_1316.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_docs_1.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_docs_2.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_file.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_file_apps.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_file_staging.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_staging_globus.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_staging_https.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_zip_in.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_zip_out.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_summary.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_thread_parallelism.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_threads/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_threads/test_configs.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_utils/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/unit/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/unit/test_file.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/unit/test_usage_tracking.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/utils.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/usage_tracking/__init__.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/usage_tracking/api.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/usage_tracking/levels.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl/usage_tracking/usage.py +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl.egg-info/dependency_links.txt +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl.egg-info/entry_points.txt +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl.egg-info/requires.txt +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/parsl.egg-info/top_level.txt +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/requirements.txt +0 -0
- {parsl-2024.10.7 → parsl-2024.10.21}/setup.cfg +0 -0
@@ -1,9 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: parsl
|
3
|
-
Version: 2024.10.
|
3
|
+
Version: 2024.10.21
|
4
4
|
Summary: Simple data dependent workflows in Python
|
5
5
|
Home-page: https://github.com/Parsl/parsl
|
6
|
-
Download-URL: https://github.com/Parsl/parsl/archive/2024.10.
|
6
|
+
Download-URL: https://github.com/Parsl/parsl/archive/2024.10.21.tar.gz
|
7
7
|
Author: The Parsl Team
|
8
8
|
Author-email: parsl@googlegroups.com
|
9
9
|
License: Apache 2.0
|
@@ -11,12 +11,11 @@ Keywords: Workflows,Scientific computing
|
|
11
11
|
Classifier: Development Status :: 5 - Production/Stable
|
12
12
|
Classifier: Intended Audience :: Developers
|
13
13
|
Classifier: License :: OSI Approved :: Apache Software License
|
14
|
-
Classifier: Programming Language :: Python :: 3.8
|
15
14
|
Classifier: Programming Language :: Python :: 3.9
|
16
15
|
Classifier: Programming Language :: Python :: 3.10
|
17
16
|
Classifier: Programming Language :: Python :: 3.11
|
18
17
|
Classifier: Programming Language :: Python :: 3.12
|
19
|
-
Requires-Python: >=3.
|
18
|
+
Requires-Python: >=3.9.0
|
20
19
|
Provides-Extra: monitoring
|
21
20
|
Provides-Extra: visualization
|
22
21
|
Provides-Extra: aws
|
@@ -117,7 +117,7 @@ For Developers
|
|
117
117
|
Requirements
|
118
118
|
============
|
119
119
|
|
120
|
-
Parsl is supported in Python 3.
|
120
|
+
Parsl is supported in Python 3.9+. Requirements can be found `here <requirements.txt>`_. Requirements for running tests can be found `here <test-requirements.txt>`_.
|
121
121
|
|
122
122
|
Code of Conduct
|
123
123
|
===============
|
@@ -1,4 +1,6 @@
|
|
1
1
|
"""Exceptions raise by Executors."""
|
2
|
+
from typing import Set
|
3
|
+
|
2
4
|
from parsl.errors import ParslError
|
3
5
|
from parsl.executors.base import ParslExecutor
|
4
6
|
|
@@ -44,6 +46,17 @@ class UnsupportedFeatureError(ExecutorError):
|
|
44
46
|
self.current_executor)
|
45
47
|
|
46
48
|
|
49
|
+
class InvalidResourceSpecification(ExecutorError):
|
50
|
+
"""Error raised when Invalid input is supplied via resource Specification"""
|
51
|
+
|
52
|
+
def __init__(self, invalid_keys: Set[str], message: str = ''):
|
53
|
+
self.invalid_keys = invalid_keys
|
54
|
+
self.message = message
|
55
|
+
|
56
|
+
def __str__(self):
|
57
|
+
return f"Invalid Resource Specification Supplied: {self.invalid_keys}. {self.message}"
|
58
|
+
|
59
|
+
|
47
60
|
class ScalingFailed(ExecutorError):
|
48
61
|
"""Scaling failed due to error in Execution provider."""
|
49
62
|
|
@@ -16,16 +16,17 @@ from parsl import curvezmq
|
|
16
16
|
from parsl.addresses import get_all_addresses
|
17
17
|
from parsl.app.errors import RemoteExceptionWrapper
|
18
18
|
from parsl.data_provider.staging import Staging
|
19
|
-
from parsl.executors.errors import
|
19
|
+
from parsl.executors.errors import (
|
20
|
+
BadMessage,
|
21
|
+
InvalidResourceSpecification,
|
22
|
+
ScalingFailed,
|
23
|
+
)
|
20
24
|
from parsl.executors.high_throughput import zmq_pipes
|
21
25
|
from parsl.executors.high_throughput.errors import CommandClientTimeoutError
|
22
26
|
from parsl.executors.high_throughput.manager_selector import (
|
23
27
|
ManagerSelector,
|
24
28
|
RandomManagerSelector,
|
25
29
|
)
|
26
|
-
from parsl.executors.high_throughput.mpi_prefix_composer import (
|
27
|
-
InvalidResourceSpecification,
|
28
|
-
)
|
29
30
|
from parsl.executors.status_handling import BlockProviderExecutor
|
30
31
|
from parsl.jobs.states import TERMINAL_STATES, JobState, JobStatus
|
31
32
|
from parsl.process_loggers import wrap_with_logs
|
@@ -145,6 +146,11 @@ GENERAL_HTEX_PARAM_DOCS = """provider : :class:`~parsl.providers.base.ExecutionP
|
|
145
146
|
|
146
147
|
encrypted : bool
|
147
148
|
Flag to enable/disable encryption (CurveZMQ). Default is False.
|
149
|
+
|
150
|
+
manager_selector: ManagerSelector
|
151
|
+
Determines what strategy the interchange uses to select managers during task distribution.
|
152
|
+
See API reference under "Manager Selectors" regarding the various manager selectors.
|
153
|
+
Default: 'RandomManagerSelector'
|
148
154
|
""" # Documentation for params used by both HTEx and MPIEx
|
149
155
|
|
150
156
|
|
@@ -340,15 +346,17 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
340
346
|
return self.logdir
|
341
347
|
|
342
348
|
def validate_resource_spec(self, resource_specification: dict):
|
343
|
-
"""HTEX
|
344
|
-
|
349
|
+
"""HTEX supports the following *Optional* resource specifications:
|
350
|
+
priority: lower value is higher priority"""
|
345
351
|
if resource_specification:
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
+
acceptable_fields = {'priority'}
|
353
|
+
keys = set(resource_specification.keys())
|
354
|
+
invalid_keys = keys - acceptable_fields
|
355
|
+
if invalid_keys:
|
356
|
+
message = "Task resource specification only accepts these types of resources: {}".format(
|
357
|
+
', '.join(acceptable_fields))
|
358
|
+
logger.error(message)
|
359
|
+
raise InvalidResourceSpecification(set(invalid_keys), message)
|
352
360
|
return
|
353
361
|
|
354
362
|
def initialize_scaling(self):
|
@@ -459,9 +467,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
459
467
|
except pickle.UnpicklingError:
|
460
468
|
raise BadMessage("Message received could not be unpickled")
|
461
469
|
|
462
|
-
if msg['type'] == '
|
463
|
-
continue
|
464
|
-
elif msg['type'] == 'result':
|
470
|
+
if msg['type'] == 'result':
|
465
471
|
try:
|
466
472
|
tid = msg['task_id']
|
467
473
|
except Exception:
|
@@ -581,7 +587,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
581
587
|
def outstanding(self) -> int:
|
582
588
|
"""Returns the count of tasks outstanding across the interchange
|
583
589
|
and managers"""
|
584
|
-
return self.
|
590
|
+
return len(self.tasks)
|
585
591
|
|
586
592
|
@property
|
587
593
|
def connected_workers(self) -> int:
|
@@ -658,7 +664,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
658
664
|
except TypeError:
|
659
665
|
raise SerializationError(func.__name__)
|
660
666
|
|
661
|
-
msg = {"task_id": task_id, "buffer": fn_buf}
|
667
|
+
msg = {"task_id": task_id, "resource_spec": resource_specification, "buffer": fn_buf}
|
662
668
|
|
663
669
|
# Post task to the outgoing queue
|
664
670
|
self.outgoing_q.put(msg)
|
@@ -6,7 +6,6 @@ import os
|
|
6
6
|
import pickle
|
7
7
|
import platform
|
8
8
|
import queue
|
9
|
-
import signal
|
10
9
|
import sys
|
11
10
|
import threading
|
12
11
|
import time
|
@@ -252,13 +251,7 @@ class Interchange:
|
|
252
251
|
try:
|
253
252
|
command_req = self.command_channel.recv_pyobj()
|
254
253
|
logger.debug("Received command request: {}".format(command_req))
|
255
|
-
if command_req == "
|
256
|
-
outstanding = self.pending_task_queue.qsize()
|
257
|
-
for manager in self._ready_managers.values():
|
258
|
-
outstanding += len(manager['tasks'])
|
259
|
-
reply = outstanding
|
260
|
-
|
261
|
-
elif command_req == "CONNECTED_BLOCKS":
|
254
|
+
if command_req == "CONNECTED_BLOCKS":
|
262
255
|
reply = self.connected_block_history
|
263
256
|
|
264
257
|
elif command_req == "WORKERS":
|
@@ -319,16 +312,6 @@ class Interchange:
|
|
319
312
|
""" Start the interchange
|
320
313
|
"""
|
321
314
|
|
322
|
-
# If a user workflow has set its own signal handler for sigterm, that
|
323
|
-
# handler will be inherited by the interchange process because it is
|
324
|
-
# launched as a multiprocessing fork process.
|
325
|
-
# That can interfere with the interchange shutdown mechanism, which is
|
326
|
-
# to receive a SIGTERM and exit immediately.
|
327
|
-
# See Parsl issue #2343 (Threads and multiprocessing cannot be
|
328
|
-
# intermingled without deadlocks) which talks about other fork-related
|
329
|
-
# parent-process-inheritance problems.
|
330
|
-
signal.signal(signal.SIGTERM, signal.SIG_DFL)
|
331
|
-
|
332
315
|
logger.info("Starting main interchange method")
|
333
316
|
|
334
317
|
if self.hub_address is not None and self.hub_zmq_port is not None:
|
@@ -549,7 +532,6 @@ class Interchange:
|
|
549
532
|
monitoring_radio.send(r['payload'])
|
550
533
|
elif r['type'] == 'heartbeat':
|
551
534
|
logger.debug("Manager %r sent heartbeat via results connection", manager_id)
|
552
|
-
b_messages.append((p_message, r))
|
553
535
|
else:
|
554
536
|
logger.error("Interchange discarding result_queue message of unknown type: %s", r["type"])
|
555
537
|
|
@@ -0,0 +1,55 @@
|
|
1
|
+
import random
|
2
|
+
from abc import ABCMeta, abstractmethod
|
3
|
+
from typing import Dict, List, Set
|
4
|
+
|
5
|
+
from parsl.executors.high_throughput.manager_record import ManagerRecord
|
6
|
+
|
7
|
+
|
8
|
+
class ManagerSelector(metaclass=ABCMeta):
|
9
|
+
|
10
|
+
@abstractmethod
|
11
|
+
def sort_managers(self, ready_managers: Dict[bytes, ManagerRecord], manager_list: Set[bytes]) -> List[bytes]:
|
12
|
+
""" Sort a given list of managers.
|
13
|
+
|
14
|
+
Any operations pertaining to the sorting and rearrangement of the
|
15
|
+
interesting_managers Set should be performed here.
|
16
|
+
"""
|
17
|
+
pass
|
18
|
+
|
19
|
+
|
20
|
+
class RandomManagerSelector(ManagerSelector):
|
21
|
+
|
22
|
+
"""Returns a shuffled list of interesting_managers
|
23
|
+
|
24
|
+
By default this strategy is used by the interchange. Works well
|
25
|
+
in distributing workloads equally across all availble compute
|
26
|
+
resources. The random workload strategy is not effective in
|
27
|
+
conjunction with elastic scaling behavior as the even task
|
28
|
+
distribution does not allow the scaling down of blocks, leading
|
29
|
+
to wasted resource consumption.
|
30
|
+
"""
|
31
|
+
|
32
|
+
def sort_managers(self, ready_managers: Dict[bytes, ManagerRecord], manager_list: Set[bytes]) -> List[bytes]:
|
33
|
+
c_manager_list = list(manager_list)
|
34
|
+
random.shuffle(c_manager_list)
|
35
|
+
return c_manager_list
|
36
|
+
|
37
|
+
|
38
|
+
class BlockIdManagerSelector(ManagerSelector):
|
39
|
+
|
40
|
+
"""Returns an interesting_managers list sorted by block ID
|
41
|
+
|
42
|
+
Observations:
|
43
|
+
1. BlockID manager selector helps with workloads that see a varying
|
44
|
+
amount of tasks over time. New blocks are prioritized with the
|
45
|
+
blockID manager selector, when used with 'htex_auto_scaling', results
|
46
|
+
in compute cost savings.
|
47
|
+
|
48
|
+
2. Doesn't really work with bag-of-tasks workloads. When all the tasks
|
49
|
+
are put into the queue upfront, all blocks operate at near full
|
50
|
+
utilization for the majority of the workload, which task goes where
|
51
|
+
doesn't really matter.
|
52
|
+
"""
|
53
|
+
|
54
|
+
def sort_managers(self, ready_managers: Dict[bytes, ManagerRecord], manager_list: Set[bytes]) -> List[bytes]:
|
55
|
+
return sorted(manager_list, key=lambda x: (ready_managers[x]['block_id'] is not None, ready_managers[x]['block_id']))
|
@@ -1,5 +1,7 @@
|
|
1
1
|
import logging
|
2
|
-
from typing import Dict, List,
|
2
|
+
from typing import Dict, List, Tuple
|
3
|
+
|
4
|
+
from parsl.executors.errors import InvalidResourceSpecification
|
3
5
|
|
4
6
|
logger = logging.getLogger(__name__)
|
5
7
|
|
@@ -8,27 +10,6 @@ VALID_LAUNCHERS = ('srun',
|
|
8
10
|
'mpiexec')
|
9
11
|
|
10
12
|
|
11
|
-
class MissingResourceSpecification(Exception):
|
12
|
-
"""Exception raised when input is not supplied a resource specification"""
|
13
|
-
|
14
|
-
def __init__(self, reason: str):
|
15
|
-
self.reason = reason
|
16
|
-
|
17
|
-
def __str__(self):
|
18
|
-
return f"Missing resource specification: {self.reason}"
|
19
|
-
|
20
|
-
|
21
|
-
class InvalidResourceSpecification(Exception):
|
22
|
-
"""Exception raised when Invalid input is supplied via resource specification"""
|
23
|
-
|
24
|
-
def __init__(self, invalid_keys: Set[str], message: str = ''):
|
25
|
-
self.invalid_keys = invalid_keys
|
26
|
-
self.message = message
|
27
|
-
|
28
|
-
def __str__(self):
|
29
|
-
return f"Invalid resource specification options supplied: {self.invalid_keys} {self.message}"
|
30
|
-
|
31
|
-
|
32
13
|
def validate_resource_spec(resource_spec: Dict[str, str]):
|
33
14
|
"""Basic validation of keys in the resource_spec
|
34
15
|
|
@@ -40,7 +21,8 @@ def validate_resource_spec(resource_spec: Dict[str, str]):
|
|
40
21
|
# empty resource_spec when mpi_mode is set causes parsl to hang
|
41
22
|
# ref issue #3427
|
42
23
|
if len(user_keys) == 0:
|
43
|
-
raise
|
24
|
+
raise InvalidResourceSpecification(user_keys,
|
25
|
+
'MPI mode requires optional parsl_resource_specification keyword argument to be configured')
|
44
26
|
|
45
27
|
legal_keys = set(("ranks_per_node",
|
46
28
|
"num_nodes",
|
@@ -362,7 +362,7 @@ class Manager:
|
|
362
362
|
if tasks == HEARTBEAT_CODE:
|
363
363
|
logger.debug("Got heartbeat from interchange")
|
364
364
|
elif tasks == DRAINED_CODE:
|
365
|
-
logger.info("Got
|
365
|
+
logger.info("Got fully drained message from interchange - setting kill flag")
|
366
366
|
kill_event.set()
|
367
367
|
else:
|
368
368
|
task_recv_counter += len(tasks)
|
@@ -6,7 +6,7 @@ import typeguard
|
|
6
6
|
|
7
7
|
from parsl.data_provider.staging import Staging
|
8
8
|
from parsl.executors.base import ParslExecutor
|
9
|
-
from parsl.executors.errors import
|
9
|
+
from parsl.executors.errors import InvalidResourceSpecification
|
10
10
|
from parsl.utils import RepresentationMixin
|
11
11
|
|
12
12
|
logger = logging.getLogger(__name__)
|
@@ -54,7 +54,8 @@ class ThreadPoolExecutor(ParslExecutor, RepresentationMixin):
|
|
54
54
|
if resource_specification:
|
55
55
|
logger.error("Ignoring the resource specification. "
|
56
56
|
"Parsl resource specification is not supported in ThreadPool Executor.")
|
57
|
-
raise
|
57
|
+
raise InvalidResourceSpecification(set(resource_specification.keys()),
|
58
|
+
"Parsl resource specification is not supported in ThreadPool Executor.")
|
58
59
|
|
59
60
|
return self.executor.submit(func, *args, **kwargs)
|
60
61
|
|
@@ -28,7 +28,7 @@ import parsl.utils as putils
|
|
28
28
|
from parsl.data_provider.files import File
|
29
29
|
from parsl.data_provider.staging import Staging
|
30
30
|
from parsl.errors import OptionalModuleMissing
|
31
|
-
from parsl.executors.errors import ExecutorError
|
31
|
+
from parsl.executors.errors import ExecutorError, InvalidResourceSpecification
|
32
32
|
from parsl.executors.status_handling import BlockProviderExecutor
|
33
33
|
from parsl.executors.workqueue import exec_parsl_function
|
34
34
|
from parsl.process_loggers import wrap_with_logs
|
@@ -419,7 +419,7 @@ class WorkQueueExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
419
419
|
message = "Task resource specification only accepts these types of resources: {}".format(
|
420
420
|
', '.join(acceptable_fields))
|
421
421
|
logger.error(message)
|
422
|
-
raise
|
422
|
+
raise InvalidResourceSpecification(keys, message)
|
423
423
|
|
424
424
|
# this checks that either all of the required resource types are specified, or
|
425
425
|
# that none of them are: the `required_resource_types` are not actually required,
|
@@ -430,9 +430,10 @@ class WorkQueueExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
430
430
|
logger.error("Running with `autolabel=False`. In this mode, "
|
431
431
|
"task resource specification requires "
|
432
432
|
"three resources to be specified simultaneously: cores, memory, and disk")
|
433
|
-
raise
|
434
|
-
|
435
|
-
|
433
|
+
raise InvalidResourceSpecification(keys,
|
434
|
+
"Task resource specification requires "
|
435
|
+
"three resources to be specified simultaneously: cores, memory, and disk. "
|
436
|
+
"Try setting autolabel=True if you are unsure of the resource usage")
|
436
437
|
|
437
438
|
for k in keys:
|
438
439
|
if k == 'cores':
|
@@ -1,10 +1,5 @@
|
|
1
1
|
import logging
|
2
|
-
import
|
3
|
-
|
4
|
-
from parsl.providers.kubernetes.template import template_string
|
5
|
-
|
6
|
-
logger = logging.getLogger(__name__)
|
7
|
-
|
2
|
+
import uuid
|
8
3
|
from typing import Any, Dict, List, Optional, Tuple
|
9
4
|
|
10
5
|
import typeguard
|
@@ -12,7 +7,8 @@ import typeguard
|
|
12
7
|
from parsl.errors import OptionalModuleMissing
|
13
8
|
from parsl.jobs.states import JobState, JobStatus
|
14
9
|
from parsl.providers.base import ExecutionProvider
|
15
|
-
from parsl.
|
10
|
+
from parsl.providers.kubernetes.template import template_string
|
11
|
+
from parsl.utils import RepresentationMixin, sanitize_dns_subdomain_rfc1123
|
16
12
|
|
17
13
|
try:
|
18
14
|
from kubernetes import client, config
|
@@ -20,6 +16,8 @@ try:
|
|
20
16
|
except (ImportError, NameError, FileNotFoundError):
|
21
17
|
_kubernetes_enabled = False
|
22
18
|
|
19
|
+
logger = logging.getLogger(__name__)
|
20
|
+
|
23
21
|
translate_table = {
|
24
22
|
'Running': JobState.RUNNING,
|
25
23
|
'Pending': JobState.PENDING,
|
@@ -161,7 +159,7 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
|
|
161
159
|
self.resources: Dict[object, Dict[str, Any]]
|
162
160
|
self.resources = {}
|
163
161
|
|
164
|
-
def submit(self, cmd_string, tasks_per_node, job_name="parsl"):
|
162
|
+
def submit(self, cmd_string: str, tasks_per_node: int, job_name: str = "parsl.kube"):
|
165
163
|
""" Submit a job
|
166
164
|
Args:
|
167
165
|
- cmd_string :(String) - Name of the container to initiate
|
@@ -173,15 +171,19 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
|
|
173
171
|
Returns:
|
174
172
|
- job_id: (string) Identifier for the job
|
175
173
|
"""
|
174
|
+
job_id = uuid.uuid4().hex[:8]
|
176
175
|
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
176
|
+
pod_name = self.pod_name or job_name
|
177
|
+
try:
|
178
|
+
pod_name = sanitize_dns_subdomain_rfc1123(pod_name)
|
179
|
+
except ValueError:
|
180
|
+
logger.warning(
|
181
|
+
f"Invalid pod name '{pod_name}' for job '{job_id}', falling back to 'parsl.kube'"
|
182
|
+
)
|
183
|
+
pod_name = "parsl.kube"
|
184
|
+
pod_name = pod_name[:253 - 1 - len(job_id)] # Leave room for the job ID
|
185
|
+
pod_name = pod_name.rstrip(".-") # Remove trailing dot or hyphen after trim
|
186
|
+
pod_name = f"{pod_name}.{job_id}"
|
185
187
|
|
186
188
|
formatted_cmd = template_string.format(command=cmd_string,
|
187
189
|
worker_init=self.worker_init)
|
@@ -189,14 +191,14 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
|
|
189
191
|
logger.debug("Pod name: %s", pod_name)
|
190
192
|
self._create_pod(image=self.image,
|
191
193
|
pod_name=pod_name,
|
192
|
-
|
194
|
+
job_id=job_id,
|
193
195
|
cmd_string=formatted_cmd,
|
194
196
|
volumes=self.persistent_volumes,
|
195
197
|
service_account_name=self.service_account_name,
|
196
198
|
annotations=self.annotations)
|
197
|
-
self.resources[
|
199
|
+
self.resources[job_id] = {'status': JobStatus(JobState.RUNNING), 'pod_name': pod_name}
|
198
200
|
|
199
|
-
return
|
201
|
+
return job_id
|
200
202
|
|
201
203
|
def status(self, job_ids):
|
202
204
|
""" Get the status of a list of jobs identified by the job identifiers
|
@@ -212,6 +214,9 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
|
|
212
214
|
self._status()
|
213
215
|
return [self.resources[jid]['status'] for jid in job_ids]
|
214
216
|
|
217
|
+
def _get_pod_name(self, job_id: str) -> str:
|
218
|
+
return self.resources[job_id]['pod_name']
|
219
|
+
|
215
220
|
def cancel(self, job_ids):
|
216
221
|
""" Cancels the jobs specified by a list of job ids
|
217
222
|
Args:
|
@@ -221,7 +226,8 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
|
|
221
226
|
"""
|
222
227
|
for job in job_ids:
|
223
228
|
logger.debug("Terminating job/pod: {0}".format(job))
|
224
|
-
self.
|
229
|
+
pod_name = self._get_pod_name(job)
|
230
|
+
self._delete_pod(pod_name)
|
225
231
|
|
226
232
|
self.resources[job]['status'] = JobStatus(JobState.CANCELLED)
|
227
233
|
rets = [True for i in job_ids]
|
@@ -242,7 +248,8 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
|
|
242
248
|
for jid in to_poll_job_ids:
|
243
249
|
phase = None
|
244
250
|
try:
|
245
|
-
|
251
|
+
pod_name = self._get_pod_name(jid)
|
252
|
+
pod = self.kube_client.read_namespaced_pod(name=pod_name, namespace=self.namespace)
|
246
253
|
except Exception:
|
247
254
|
logger.exception("Failed to poll pod {} status, most likely because pod was terminated".format(jid))
|
248
255
|
if self.resources[jid]['status'] is JobStatus(JobState.RUNNING):
|
@@ -257,10 +264,10 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
|
|
257
264
|
self.resources[jid]['status'] = JobStatus(status)
|
258
265
|
|
259
266
|
def _create_pod(self,
|
260
|
-
image,
|
261
|
-
pod_name,
|
262
|
-
|
263
|
-
port=80,
|
267
|
+
image: str,
|
268
|
+
pod_name: str,
|
269
|
+
job_id: str,
|
270
|
+
port: int = 80,
|
264
271
|
cmd_string=None,
|
265
272
|
volumes=[],
|
266
273
|
service_account_name=None,
|
@@ -269,7 +276,7 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
|
|
269
276
|
Args:
|
270
277
|
- image (string) : Docker image to launch
|
271
278
|
- pod_name (string) : Name of the pod
|
272
|
-
-
|
279
|
+
- job_id (string) : Job ID
|
273
280
|
KWargs:
|
274
281
|
- port (integer) : Container port
|
275
282
|
Returns:
|
@@ -299,7 +306,7 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
|
|
299
306
|
)
|
300
307
|
# Configure Pod template container
|
301
308
|
container = client.V1Container(
|
302
|
-
name=
|
309
|
+
name=job_id,
|
303
310
|
image=image,
|
304
311
|
resources=resources,
|
305
312
|
ports=[client.V1ContainerPort(container_port=port)],
|
@@ -322,7 +329,7 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
|
|
322
329
|
claim_name=volume[0])))
|
323
330
|
|
324
331
|
metadata = client.V1ObjectMeta(name=pod_name,
|
325
|
-
labels={"
|
332
|
+
labels={"parsl-job-id": job_id},
|
326
333
|
annotations=annotations)
|
327
334
|
spec = client.V1PodSpec(containers=[container],
|
328
335
|
image_pull_secrets=[secret],
|
@@ -58,7 +58,7 @@ def tmpd_cwd_session(pytestconfig):
|
|
58
58
|
|
59
59
|
config = re.sub(r"[^A-z0-9_-]+", "_", pytestconfig.getoption('config')[0])
|
60
60
|
cwd = pathlib.Path(os.getcwd())
|
61
|
-
pytest_dir = cwd / "
|
61
|
+
pytest_dir = cwd / "pytest-parsl"
|
62
62
|
pytest_dir.mkdir(mode=0o700, parents=True, exist_ok=True)
|
63
63
|
|
64
64
|
test_dir_prefix = "parsltest-"
|
@@ -1,11 +1,9 @@
|
|
1
1
|
import parsl
|
2
2
|
from parsl.app.app import python_app
|
3
3
|
from parsl.executors import WorkQueueExecutor
|
4
|
-
from parsl.executors.errors import
|
4
|
+
from parsl.executors.errors import InvalidResourceSpecification
|
5
5
|
from parsl.executors.high_throughput.executor import HighThroughputExecutor
|
6
|
-
from parsl.executors.
|
7
|
-
InvalidResourceSpecification,
|
8
|
-
)
|
6
|
+
from parsl.executors.threads import ThreadPoolExecutor
|
9
7
|
|
10
8
|
|
11
9
|
@python_app
|
@@ -27,11 +25,10 @@ def test_resource(n=2):
|
|
27
25
|
try:
|
28
26
|
fut.result()
|
29
27
|
except InvalidResourceSpecification:
|
30
|
-
assert
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
assert isinstance(e, ExecutorError)
|
28
|
+
assert (
|
29
|
+
isinstance(executor, HighThroughputExecutor) or
|
30
|
+
isinstance(executor, WorkQueueExecutor) or
|
31
|
+
isinstance(executor, ThreadPoolExecutor))
|
35
32
|
|
36
33
|
# Specify resources with wrong types
|
37
34
|
# 'cpus' is incorrect, should be 'cores'
|
@@ -40,8 +37,7 @@ def test_resource(n=2):
|
|
40
37
|
try:
|
41
38
|
fut.result()
|
42
39
|
except InvalidResourceSpecification:
|
43
|
-
assert
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
assert isinstance(e, ExecutorError)
|
40
|
+
assert (
|
41
|
+
isinstance(executor, HighThroughputExecutor) or
|
42
|
+
isinstance(executor, WorkQueueExecutor) or
|
43
|
+
isinstance(executor, ThreadPoolExecutor))
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import pytest
|
2
|
+
|
3
|
+
from parsl.executors.high_throughput.manager_record import ManagerRecord
|
4
|
+
from parsl.executors.high_throughput.manager_selector import BlockIdManagerSelector
|
5
|
+
|
6
|
+
|
7
|
+
@pytest.mark.local
|
8
|
+
def test_sort_managers():
|
9
|
+
ready_managers = {
|
10
|
+
b'manager1': {'block_id': 1},
|
11
|
+
b'manager2': {'block_id': None},
|
12
|
+
b'manager3': {'block_id': 3},
|
13
|
+
b'manager4': {'block_id': 2}
|
14
|
+
}
|
15
|
+
|
16
|
+
manager_list = {b'manager1', b'manager2', b'manager3', b'manager4'}
|
17
|
+
expected_sorted_list = [b'manager2', b'manager1', b'manager4', b'manager3']
|
18
|
+
manager_selector = BlockIdManagerSelector()
|
19
|
+
sorted_managers = manager_selector.sort_managers(ready_managers, manager_list)
|
20
|
+
assert sorted_managers == expected_sorted_list
|
@@ -13,7 +13,9 @@ from parsl.providers import LocalProvider
|
|
13
13
|
# based around the expected drain period: the drain period
|
14
14
|
# is TIME_CONST seconds, and the single executed task will
|
15
15
|
# last twice that many number of seconds.
|
16
|
-
TIME_CONST =
|
16
|
+
TIME_CONST = 4
|
17
|
+
|
18
|
+
CONNECTED_MANAGERS_POLL_MS = 100
|
17
19
|
|
18
20
|
|
19
21
|
def local_config():
|
@@ -52,7 +54,7 @@ def test_drain(try_assert):
|
|
52
54
|
|
53
55
|
# wait till we have a block running...
|
54
56
|
|
55
|
-
try_assert(lambda: len(htex.connected_managers()) == 1)
|
57
|
+
try_assert(lambda: len(htex.connected_managers()) == 1, check_period_ms=CONNECTED_MANAGERS_POLL_MS)
|
56
58
|
|
57
59
|
managers = htex.connected_managers()
|
58
60
|
assert managers[0]['active'], "The manager should be active"
|
@@ -63,7 +65,7 @@ def test_drain(try_assert):
|
|
63
65
|
time.sleep(TIME_CONST)
|
64
66
|
|
65
67
|
# this assert should happen *very fast* after the above delay...
|
66
|
-
try_assert(lambda: htex.connected_managers()[0]['draining'], timeout_ms=500)
|
68
|
+
try_assert(lambda: htex.connected_managers()[0]['draining'], timeout_ms=500, check_period_ms=CONNECTED_MANAGERS_POLL_MS)
|
67
69
|
|
68
70
|
# and the test task should still be running...
|
69
71
|
assert not fut.done(), "The test task should still be running"
|
@@ -76,4 +78,4 @@ def test_drain(try_assert):
|
|
76
78
|
# connected managers.
|
77
79
|
# As with the above draining assert, this should happen very fast after
|
78
80
|
# the task ends.
|
79
|
-
try_assert(lambda: len(htex.connected_managers()) == 0, timeout_ms=500)
|
81
|
+
try_assert(lambda: len(htex.connected_managers()) == 0, timeout_ms=500, check_period_ms=CONNECTED_MANAGERS_POLL_MS)
|