parsl 2024.4.22__tar.gz → 2024.4.29__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.4.22/parsl.egg-info → parsl-2024.4.29}/PKG-INFO +2 -2
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/config.py +10 -1
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/data_provider/zip.py +32 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/dataflow/dflow.py +33 -23
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/high_throughput/executor.py +7 -1
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/kubernetes/kube.py +20 -1
- parsl-2024.4.29/parsl/tests/configs/local_threads_checkpoint_periodic.py +11 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/conftest.py +12 -1
- parsl-2024.4.29/parsl/tests/test_bash_apps/test_std_uri.py +128 -0
- parsl-2024.4.29/parsl/tests/test_checkpointing/test_periodic.py +53 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_htex/test_basic.py +2 -2
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_htex/test_missing_worker.py +0 -4
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_mpi_apps/test_resource_spec.py +2 -8
- parsl-2024.4.29/parsl/tests/test_staging/test_zip_in.py +42 -0
- parsl-2024.4.29/parsl/tests/test_staging/test_zip_to_zip.py +44 -0
- parsl-2024.4.29/parsl/tests/unit/test_file.py +99 -0
- parsl-2024.4.29/parsl/usage_tracking/__init__.py +0 -0
- parsl-2024.4.29/parsl/usage_tracking/api.py +66 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/usage_tracking/usage.py +39 -26
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/version.py +1 -1
- {parsl-2024.4.22 → parsl-2024.4.29/parsl.egg-info}/PKG-INFO +2 -2
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl.egg-info/SOURCES.txt +6 -0
- parsl-2024.4.22/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -13
- parsl-2024.4.22/parsl/tests/test_checkpointing/test_periodic.py +0 -66
- {parsl-2024.4.22 → parsl-2024.4.29}/LICENSE +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/MANIFEST.in +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/README.rst +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/addresses.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/app/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/app/app.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/app/bash.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/app/errors.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/app/futures.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/app/python.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/benchmark/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/benchmark/perf.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/channels/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/channels/base.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/channels/errors.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/channels/local/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/channels/local/local.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/channels/oauth_ssh/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/channels/oauth_ssh/oauth_ssh.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/channels/ssh/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/channels/ssh/ssh.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/channels/ssh_il/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/channels/ssh_il/ssh_il.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/concurrent/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/ASPIRE1.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/Azure.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/ad_hoc.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/bridges.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/cc_in2p3.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/ec2.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/expanse.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/frontera.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/htex_local.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/illinoiscluster.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/kubernetes.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/local_threads.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/midway.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/osg.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/polaris.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/stampede2.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/summit.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/toss3_llnl.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/vineex_local.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/configs/wqex_local.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/curvezmq.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/data_provider/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/data_provider/data_manager.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/data_provider/file_noop.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/data_provider/files.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/data_provider/ftp.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/data_provider/globus.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/data_provider/http.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/data_provider/rsync.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/data_provider/staging.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/dataflow/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/dataflow/errors.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/dataflow/futures.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/dataflow/memoization.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/dataflow/rundirs.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/dataflow/states.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/dataflow/taskrecord.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/errors.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/base.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/errors.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/flux/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/flux/execute_parsl_task.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/flux/executor.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/flux/flux_instance_manager.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/high_throughput/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/high_throughput/errors.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/high_throughput/interchange.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/high_throughput/manager_record.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/high_throughput/monitoring_info.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/high_throughput/probe.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/radical/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/radical/executor.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/radical/rpex_master.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/radical/rpex_resources.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/radical/rpex_worker.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/status_handling.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/taskvine/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/taskvine/errors.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/taskvine/executor.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/taskvine/factory.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/taskvine/factory_config.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/taskvine/manager.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/taskvine/manager_config.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/taskvine/utils.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/threads.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/workqueue/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/workqueue/errors.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/workqueue/executor.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/jobs/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/jobs/error_handlers.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/jobs/errors.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/jobs/job_status_poller.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/jobs/states.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/jobs/strategy.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/launchers/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/launchers/base.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/launchers/errors.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/launchers/launchers.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/log_utils.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/db_manager.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/message_type.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/monitoring.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/queries/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/queries/pandas.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/radios.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/remote.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/router.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/types.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/app.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/models.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/plots/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/templates/app.html +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/templates/dag.html +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/templates/error.html +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/templates/layout.html +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/templates/task.html +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/templates/workflow.html +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/utils.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/version.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/monitoring/visualization/views.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/multiprocessing.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/process_loggers.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/ad_hoc/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/ad_hoc/ad_hoc.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/aws/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/aws/aws.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/aws/template.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/azure/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/azure/azure.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/azure/template.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/base.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/cluster_provider.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/cobalt/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/cobalt/cobalt.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/cobalt/template.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/condor/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/condor/condor.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/condor/template.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/errors.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/googlecloud/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/googlecloud/googlecloud.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/grid_engine/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/grid_engine/grid_engine.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/grid_engine/template.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/kubernetes/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/kubernetes/template.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/local/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/local/local.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/lsf/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/lsf/lsf.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/lsf/template.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/pbspro/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/pbspro/pbspro.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/pbspro/template.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/slurm/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/slurm/slurm.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/slurm/template.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/torque/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/torque/template.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/providers/torque/torque.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/py.typed +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/serialize/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/serialize/base.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/serialize/concretes.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/serialize/errors.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/serialize/facade.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/serialize/proxystore.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/callables_helper.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/ad_hoc_cluster_htex.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/azure_single_node.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/bluewaters.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/bridges.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/cc_in2p3.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/comet.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/cooley_htex.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/ec2_single_node.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/ec2_spot.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/frontera.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/htex_ad_hoc_cluster.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/htex_local.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/htex_local_alternate.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/local_adhoc.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/local_radical.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/local_radical_mpi.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/local_threads.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/local_threads_globus.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/local_threads_monitoring.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/local_threads_no_cache.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/midway.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/nscc_singapore.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/osg_htex.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/petrelkube.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/summit.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/swan_htex.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/taskvine_ex.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/theta.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/user_opts.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/configs/workqueue_ex.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/integration/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/integration/latency.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/integration/test_apps/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/integration/test_channels/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/integration/test_channels/test_channels.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/integration/test_channels/test_local_channel.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/integration/test_channels/test_scp_1.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/integration/test_channels/test_ssh_1.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/integration/test_channels/test_ssh_errors.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/integration/test_stress/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/manual_tests/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/manual_tests/htex_local.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/manual_tests/test_ad_hoc_htex.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/manual_tests/test_basic.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/manual_tests/test_log_filter.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/manual_tests/test_oauth_ssh.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/manual_tests/test_regression_220.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/manual_tests/test_worker_count.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/scaling_tests/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/scaling_tests/htex_local.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/scaling_tests/local_threads.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/scaling_tests/test_scale.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/scaling_tests/vineex_local.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/scaling_tests/wqex_local.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/site_tests/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/site_tests/site_config_selector.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/site_tests/test_provider.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/site_tests/test_site.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/sites/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/sites/test_affinity.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/sites/test_concurrent.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/sites/test_dynamic_executor.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/sites/test_ec2.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/sites/test_launchers.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/sites/test_local_adhoc.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/sites/test_mpi/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/sites/test_worker_info.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_aalst_patterns.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_bash_apps/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_bash_apps/test_basic.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_callables.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_channels/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_channels/test_large_output.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_checkpointing/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_curvezmq.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_docs/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_docs/test_from_slides.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_docs/test_kwargs.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_docs/test_workflow1.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_docs/test_workflow2.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_docs/test_workflow4.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_error_handling/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_error_handling/test_fail.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_error_handling/test_retries.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_flowcontrol/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_flux.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_htex/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_htex/test_drain.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_htex/test_htex.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_htex/test_manager_failure.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_htex/test_worker_failure.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_monitoring/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_monitoring/test_app_names.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_monitoring/test_basic.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_mpi_apps/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_providers/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_providers/test_cobalt_deprecation_warning.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_providers/test_local_provider.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_providers/test_slurm_template.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_basic.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_fail.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_futures.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_join.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_lifted.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_mapred.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_outputs.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_overview.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_simple.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_timeout.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_python_apps/test_type5.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_radical/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_regression/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_regression/test_1480.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_regression/test_1653.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_regression/test_221.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_regression/test_226.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_regression/test_2652.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_regression/test_69a.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_regression/test_854.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_regression/test_98.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_scaling/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_scaling/test_scale_down.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_serialization/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_serialization/test_basic.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_shutdown/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_staging/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_staging/staging_provider.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_staging/test_1316.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_staging/test_docs_1.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_staging/test_docs_2.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_staging/test_file.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_staging/test_file_apps.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_staging/test_file_staging.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_staging/test_staging_globus.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_staging/test_staging_https.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_staging/test_zip_out.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_summary.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_thread_parallelism.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_threads/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_threads/test_configs.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_utils/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
- {parsl-2024.4.22/parsl/usage_tracking → parsl-2024.4.29/parsl/tests/unit}/__init__.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/tests/utils.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl/utils.py +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl.egg-info/dependency_links.txt +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl.egg-info/entry_points.txt +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl.egg-info/requires.txt +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/parsl.egg-info/top_level.txt +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/requirements.txt +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/setup.cfg +0 -0
- {parsl-2024.4.22 → parsl-2024.4.29}/setup.py +0 -0
@@ -1,9 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: parsl
|
3
|
-
Version: 2024.4.
|
3
|
+
Version: 2024.4.29
|
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.04.
|
6
|
+
Download-URL: https://github.com/Parsl/parsl/archive/2024.04.29.tar.gz
|
7
7
|
Author: The Parsl Team
|
8
8
|
Author-email: parsl@googlegroups.com
|
9
9
|
License: Apache 2.0
|
@@ -10,11 +10,12 @@ from parsl.executors.threads import ThreadPoolExecutor
|
|
10
10
|
from parsl.errors import ConfigurationError
|
11
11
|
from parsl.dataflow.taskrecord import TaskRecord
|
12
12
|
from parsl.monitoring import MonitoringHub
|
13
|
+
from parsl.usage_tracking.api import UsageInformation
|
13
14
|
|
14
15
|
logger = logging.getLogger(__name__)
|
15
16
|
|
16
17
|
|
17
|
-
class Config(RepresentationMixin):
|
18
|
+
class Config(RepresentationMixin, UsageInformation):
|
18
19
|
"""
|
19
20
|
Specification of Parsl configuration options.
|
20
21
|
|
@@ -50,6 +51,9 @@ class Config(RepresentationMixin):
|
|
50
51
|
of 1.
|
51
52
|
run_dir : str, optional
|
52
53
|
Path to run directory. Default is 'runinfo'.
|
54
|
+
std_autopath : function, optional
|
55
|
+
Sets the function used to generate stdout/stderr specifications when parsl.AUTO_LOGPATH is used. If no function
|
56
|
+
is specified, generates paths that look like: ``rundir/NNN/task_logs/X/task_{id}_{name}{label}.{out/err}``
|
53
57
|
strategy : str, optional
|
54
58
|
Strategy to use for scaling blocks according to workflow needs. Can be 'simple', 'htex_auto_scale', 'none'
|
55
59
|
or `None`.
|
@@ -89,6 +93,7 @@ class Config(RepresentationMixin):
|
|
89
93
|
retries: int = 0,
|
90
94
|
retry_handler: Optional[Callable[[Exception, TaskRecord], float]] = None,
|
91
95
|
run_dir: str = 'runinfo',
|
96
|
+
std_autopath: Optional[Callable] = None,
|
92
97
|
strategy: Optional[str] = 'simple',
|
93
98
|
strategy_period: Union[float, int] = 5,
|
94
99
|
max_idletime: float = 120.0,
|
@@ -129,6 +134,7 @@ class Config(RepresentationMixin):
|
|
129
134
|
self.usage_tracking = usage_tracking
|
130
135
|
self.initialize_logging = initialize_logging
|
131
136
|
self.monitoring = monitoring
|
137
|
+
self.std_autopath: Optional[Callable] = std_autopath
|
132
138
|
|
133
139
|
@property
|
134
140
|
def executors(self) -> Sequence[ParslExecutor]:
|
@@ -144,3 +150,6 @@ class Config(RepresentationMixin):
|
|
144
150
|
if len(duplicates) > 0:
|
145
151
|
raise ConfigurationError('Executors must have unique labels ({})'.format(
|
146
152
|
', '.join(['label={}'.format(repr(d)) for d in duplicates])))
|
153
|
+
|
154
|
+
def get_usage_information(self):
|
155
|
+
return {"executors_len": len(self.executors)}
|
@@ -42,6 +42,12 @@ class ZipFileStaging(Staging):
|
|
42
42
|
"""
|
43
43
|
|
44
44
|
def can_stage_out(self, file: File) -> bool:
|
45
|
+
return self.is_zip_url(file)
|
46
|
+
|
47
|
+
def can_stage_in(self, file: File) -> bool:
|
48
|
+
return self.is_zip_url(file)
|
49
|
+
|
50
|
+
def is_zip_url(self, file: File) -> bool:
|
45
51
|
logger.debug("archive provider checking File {}".format(repr(file)))
|
46
52
|
|
47
53
|
# First check if this is the scheme we care about
|
@@ -76,6 +82,20 @@ class ZipFileStaging(Staging):
|
|
76
82
|
app_fut = stage_out_app(zip_path, inside_path, working_dir, inputs=[file], _parsl_staging_inhibit=True, parent_fut=parent_fut)
|
77
83
|
return app_fut
|
78
84
|
|
85
|
+
def stage_in(self, dm, executor, file, parent_fut):
|
86
|
+
assert file.scheme == 'zip'
|
87
|
+
|
88
|
+
zip_path, inside_path = zip_path_split(file.path)
|
89
|
+
|
90
|
+
working_dir = dm.dfk.executors[executor].working_dir
|
91
|
+
|
92
|
+
if working_dir:
|
93
|
+
file.local_path = os.path.join(working_dir, inside_path)
|
94
|
+
|
95
|
+
stage_in_app = _zip_stage_in_app(dm)
|
96
|
+
app_fut = stage_in_app(zip_path, inside_path, working_dir, outputs=[file], _parsl_staging_inhibit=True, parent_fut=parent_fut)
|
97
|
+
return app_fut._outputs[0]
|
98
|
+
|
79
99
|
|
80
100
|
def _zip_stage_out(zip_file, inside_path, working_dir, parent_fut=None, inputs=[], _parsl_staging_inhibit=True):
|
81
101
|
file = inputs[0]
|
@@ -93,6 +113,18 @@ def _zip_stage_out_app(dm):
|
|
93
113
|
return parsl.python_app(executors=['_parsl_internal'], data_flow_kernel=dm.dfk)(_zip_stage_out)
|
94
114
|
|
95
115
|
|
116
|
+
def _zip_stage_in(zip_file, inside_path, working_dir, *, parent_fut, outputs, _parsl_staging_inhibit=True):
|
117
|
+
with filelock.FileLock(zip_file + ".lock"):
|
118
|
+
with zipfile.ZipFile(zip_file, mode='r') as z:
|
119
|
+
content = z.read(inside_path)
|
120
|
+
with open(outputs[0], "wb") as of:
|
121
|
+
of.write(content)
|
122
|
+
|
123
|
+
|
124
|
+
def _zip_stage_in_app(dm):
|
125
|
+
return parsl.python_app(executors=['_parsl_internal'], data_flow_kernel=dm.dfk)(_zip_stage_in)
|
126
|
+
|
127
|
+
|
96
128
|
def zip_path_split(path: str) -> Tuple[str, str]:
|
97
129
|
"""Split zip: path into a zipfile name and a contained-file name.
|
98
130
|
"""
|
@@ -798,7 +798,6 @@ class DataFlowKernel:
|
|
798
798
|
# be the original function wrapped with an in-task stageout wrapper), a
|
799
799
|
# rewritten File object to be passed to task to be executed
|
800
800
|
|
801
|
-
@typechecked
|
802
801
|
def stageout_one_file(file: File, rewritable_func: Callable):
|
803
802
|
if not self.check_staging_inhibited(kwargs):
|
804
803
|
# replace a File with a DataFuture - either completing when the stageout
|
@@ -996,32 +995,16 @@ class DataFlowKernel:
|
|
996
995
|
executor = random.choice(choices)
|
997
996
|
logger.debug("Task {} will be sent to executor {}".format(task_id, executor))
|
998
997
|
|
999
|
-
# The below uses func.__name__ before it has been wrapped by any staging code.
|
1000
|
-
|
1001
|
-
label = app_kwargs.get('label')
|
1002
|
-
for kw in ['stdout', 'stderr']:
|
1003
|
-
if kw in app_kwargs:
|
1004
|
-
if app_kwargs[kw] == parsl.AUTO_LOGNAME:
|
1005
|
-
if kw not in ignore_for_cache:
|
1006
|
-
ignore_for_cache += [kw]
|
1007
|
-
app_kwargs[kw] = os.path.join(
|
1008
|
-
self.run_dir,
|
1009
|
-
'task_logs',
|
1010
|
-
str(int(task_id / 10000)).zfill(4), # limit logs to 10k entries per directory
|
1011
|
-
'task_{}_{}{}.{}'.format(
|
1012
|
-
str(task_id).zfill(4),
|
1013
|
-
func.__name__,
|
1014
|
-
'' if label is None else '_{}'.format(label),
|
1015
|
-
kw)
|
1016
|
-
)
|
1017
|
-
|
1018
998
|
resource_specification = app_kwargs.get('parsl_resource_specification', {})
|
1019
999
|
|
1020
1000
|
task_record: TaskRecord
|
1021
|
-
task_record = {'
|
1001
|
+
task_record = {'args': app_args,
|
1002
|
+
'depends': [],
|
1022
1003
|
'dfk': self,
|
1023
1004
|
'executor': executor,
|
1005
|
+
'func': func,
|
1024
1006
|
'func_name': func.__name__,
|
1007
|
+
'kwargs': app_kwargs,
|
1025
1008
|
'memoize': cache,
|
1026
1009
|
'hashsum': None,
|
1027
1010
|
'exec_fu': None,
|
@@ -1043,18 +1026,30 @@ class DataFlowKernel:
|
|
1043
1026
|
|
1044
1027
|
self.update_task_state(task_record, States.unsched)
|
1045
1028
|
|
1029
|
+
for kw in ['stdout', 'stderr']:
|
1030
|
+
if kw in app_kwargs:
|
1031
|
+
if app_kwargs[kw] == parsl.AUTO_LOGNAME:
|
1032
|
+
if kw not in ignore_for_cache:
|
1033
|
+
ignore_for_cache += [kw]
|
1034
|
+
if self.config.std_autopath is None:
|
1035
|
+
app_kwargs[kw] = self.default_std_autopath(task_record, kw)
|
1036
|
+
else:
|
1037
|
+
app_kwargs[kw] = self.config.std_autopath(task_record, kw)
|
1038
|
+
|
1046
1039
|
app_fu = AppFuture(task_record)
|
1040
|
+
task_record['app_fu'] = app_fu
|
1047
1041
|
|
1048
1042
|
# Transform remote input files to data futures
|
1049
1043
|
app_args, app_kwargs, func = self._add_input_deps(executor, app_args, app_kwargs, func)
|
1050
1044
|
|
1051
1045
|
func = self._add_output_deps(executor, app_args, app_kwargs, app_fu, func)
|
1052
1046
|
|
1047
|
+
# Replace the function invocation in the TaskRecord with whatever file-staging
|
1048
|
+
# substitutions have been made.
|
1053
1049
|
task_record.update({
|
1054
1050
|
'args': app_args,
|
1055
1051
|
'func': func,
|
1056
|
-
'kwargs': app_kwargs
|
1057
|
-
'app_fu': app_fu})
|
1052
|
+
'kwargs': app_kwargs})
|
1058
1053
|
|
1059
1054
|
assert task_id not in self.tasks
|
1060
1055
|
|
@@ -1245,8 +1240,10 @@ class DataFlowKernel:
|
|
1245
1240
|
self._checkpoint_timer.close()
|
1246
1241
|
|
1247
1242
|
# Send final stats
|
1243
|
+
logger.info("Sending end message for usage tracking")
|
1248
1244
|
self.usage_tracker.send_end_message()
|
1249
1245
|
self.usage_tracker.close()
|
1246
|
+
logger.info("Closed usage tracking")
|
1250
1247
|
|
1251
1248
|
logger.info("Closing job status poller")
|
1252
1249
|
self.job_status_poller.close()
|
@@ -1440,6 +1437,19 @@ class DataFlowKernel:
|
|
1440
1437
|
log_std_stream("Standard out", task_record['app_fu'].stdout)
|
1441
1438
|
log_std_stream("Standard error", task_record['app_fu'].stderr)
|
1442
1439
|
|
1440
|
+
def default_std_autopath(self, taskrecord, kw):
|
1441
|
+
label = taskrecord['kwargs'].get('label')
|
1442
|
+
task_id = taskrecord['id']
|
1443
|
+
return os.path.join(
|
1444
|
+
self.run_dir,
|
1445
|
+
'task_logs',
|
1446
|
+
str(int(task_id / 10000)).zfill(4), # limit logs to 10k entries per directory
|
1447
|
+
'task_{}_{}{}.{}'.format(
|
1448
|
+
str(task_id).zfill(4),
|
1449
|
+
taskrecord['func_name'],
|
1450
|
+
'' if label is None else '_{}'.format(label),
|
1451
|
+
kw))
|
1452
|
+
|
1443
1453
|
|
1444
1454
|
class DataFlowKernelLoader:
|
1445
1455
|
"""Manage which DataFlowKernel is active.
|
@@ -14,6 +14,7 @@ import math
|
|
14
14
|
import warnings
|
15
15
|
|
16
16
|
import parsl.launchers
|
17
|
+
from parsl.usage_tracking.api import UsageInformation
|
17
18
|
from parsl.serialize import pack_res_spec_apply_message, deserialize
|
18
19
|
from parsl.serialize.errors import SerializationError, DeserializationError
|
19
20
|
from parsl.app.errors import RemoteExceptionWrapper
|
@@ -62,7 +63,7 @@ DEFAULT_LAUNCH_CMD = ("process_worker_pool.py {debug} {max_workers_per_node} "
|
|
62
63
|
"--available-accelerators {accelerators}")
|
63
64
|
|
64
65
|
|
65
|
-
class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
|
66
|
+
class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageInformation):
|
66
67
|
"""Executor designed for cluster-scale
|
67
68
|
|
68
69
|
The HighThroughputExecutor system has the following components:
|
@@ -818,4 +819,9 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
|
|
818
819
|
logger.info("Unable to terminate Interchange process; sending SIGKILL")
|
819
820
|
self.interchange_proc.kill()
|
820
821
|
|
822
|
+
self.interchange_proc.close()
|
823
|
+
|
821
824
|
logger.info("Finished HighThroughputExecutor shutdown attempt")
|
825
|
+
|
826
|
+
def get_usage_information(self):
|
827
|
+
return {"mpi": self.enable_mpi_mode}
|
@@ -105,7 +105,26 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
|
|
105
105
|
if not _kubernetes_enabled:
|
106
106
|
raise OptionalModuleMissing(['kubernetes'],
|
107
107
|
"Kubernetes provider requires kubernetes module and config.")
|
108
|
-
|
108
|
+
try:
|
109
|
+
config.load_kube_config()
|
110
|
+
except config.config_exception.ConfigException:
|
111
|
+
# `load_kube_config` assumes a local kube-config file, and fails if not
|
112
|
+
# present, raising:
|
113
|
+
#
|
114
|
+
# kubernetes.config.config_exception.ConfigException: Invalid
|
115
|
+
# kube-config file. No configuration found.
|
116
|
+
#
|
117
|
+
# Since running a parsl driver script on a kubernetes cluster is a common
|
118
|
+
# pattern to enable worker-interchange communication, this enables an
|
119
|
+
# in-cluster config to be loaded if a kube-config file isn't found.
|
120
|
+
#
|
121
|
+
# Based on: https://github.com/kubernetes-client/python/issues/1005
|
122
|
+
try:
|
123
|
+
config.load_incluster_config()
|
124
|
+
except config.config_exception.ConfigException:
|
125
|
+
raise config.config_exception.ConfigException(
|
126
|
+
"Failed to load both kube-config file and in-cluster configuration."
|
127
|
+
)
|
109
128
|
|
110
129
|
self.namespace = namespace
|
111
130
|
self.image = image
|
@@ -0,0 +1,11 @@
|
|
1
|
+
from parsl.config import Config
|
2
|
+
from parsl.executors.threads import ThreadPoolExecutor
|
3
|
+
|
4
|
+
|
5
|
+
def fresh_config():
|
6
|
+
tpe = ThreadPoolExecutor(label='local_threads_checkpoint_periodic', max_threads=1)
|
7
|
+
return Config(
|
8
|
+
executors=[tpe],
|
9
|
+
checkpoint_mode='periodic',
|
10
|
+
checkpoint_period='00:00:02'
|
11
|
+
)
|
@@ -3,8 +3,10 @@ import itertools
|
|
3
3
|
import logging
|
4
4
|
import os
|
5
5
|
import pathlib
|
6
|
+
import random
|
6
7
|
import re
|
7
8
|
import shutil
|
9
|
+
import string
|
8
10
|
import time
|
9
11
|
import types
|
10
12
|
import signal
|
@@ -139,7 +141,7 @@ def pytest_configure(config):
|
|
139
141
|
)
|
140
142
|
config.addinivalue_line(
|
141
143
|
'markers',
|
142
|
-
'staging_required: Marks tests that require a staging provider, when there is no sharedFS
|
144
|
+
'staging_required: Marks tests that require a staging provider, when there is no sharedFS'
|
143
145
|
)
|
144
146
|
config.addinivalue_line(
|
145
147
|
'markers',
|
@@ -245,6 +247,7 @@ def load_dfk_local_module(request, pytestconfig, tmpd_cwd_session):
|
|
245
247
|
|
246
248
|
if callable(local_teardown):
|
247
249
|
local_teardown()
|
250
|
+
assert DataFlowKernelLoader._dfk is None, "Expected teardown to clear DFK"
|
248
251
|
|
249
252
|
if local_config:
|
250
253
|
if parsl.dfk() != dfk:
|
@@ -421,3 +424,11 @@ def try_assert():
|
|
421
424
|
raise AssertionError("Bad assert call: no attempts or timeout period")
|
422
425
|
|
423
426
|
yield _impl
|
427
|
+
|
428
|
+
|
429
|
+
@pytest.fixture
|
430
|
+
def randomstring():
|
431
|
+
def func(length=5, alphabet=string.ascii_letters):
|
432
|
+
return "".join(random.choice(alphabet) for _ in range(length))
|
433
|
+
|
434
|
+
return func
|
@@ -0,0 +1,128 @@
|
|
1
|
+
import logging
|
2
|
+
import parsl
|
3
|
+
import pytest
|
4
|
+
import zipfile
|
5
|
+
|
6
|
+
from functools import partial
|
7
|
+
from parsl.app.futures import DataFuture
|
8
|
+
from parsl.data_provider.files import File
|
9
|
+
from parsl.executors import ThreadPoolExecutor
|
10
|
+
|
11
|
+
|
12
|
+
@parsl.bash_app
|
13
|
+
def app_stdout(stdout=parsl.AUTO_LOGNAME):
|
14
|
+
return "echo hello"
|
15
|
+
|
16
|
+
|
17
|
+
def const_str(cpath, task_record, err_or_out):
|
18
|
+
return cpath
|
19
|
+
|
20
|
+
|
21
|
+
def const_with_cpath(autopath_specifier, content_path, caplog):
|
22
|
+
with parsl.load(parsl.Config(std_autopath=partial(const_str, autopath_specifier))):
|
23
|
+
fut = app_stdout()
|
24
|
+
|
25
|
+
# we don't have to wait for a result to check this attributes
|
26
|
+
assert fut.stdout is autopath_specifier
|
27
|
+
|
28
|
+
# there is no DataFuture to wait for in the str case: the model is that
|
29
|
+
# the stdout will be immediately available on task completion.
|
30
|
+
fut.result()
|
31
|
+
|
32
|
+
with open(content_path, "r") as file:
|
33
|
+
assert file.readlines() == ["hello\n"]
|
34
|
+
|
35
|
+
for record in caplog.records:
|
36
|
+
assert record.levelno < logging.ERROR
|
37
|
+
|
38
|
+
parsl.clear()
|
39
|
+
|
40
|
+
|
41
|
+
@pytest.mark.local
|
42
|
+
def test_std_autopath_const_str(caplog, tmpd_cwd):
|
43
|
+
"""Tests str and tuple mode autopaths with constant autopath, which should
|
44
|
+
all be passed through unmodified.
|
45
|
+
"""
|
46
|
+
cpath = str(tmpd_cwd / "CONST")
|
47
|
+
const_with_cpath(cpath, cpath, caplog)
|
48
|
+
|
49
|
+
|
50
|
+
@pytest.mark.local
|
51
|
+
def test_std_autopath_const_pathlike(caplog, tmpd_cwd):
|
52
|
+
cpath = tmpd_cwd / "CONST"
|
53
|
+
const_with_cpath(cpath, cpath, caplog)
|
54
|
+
|
55
|
+
|
56
|
+
@pytest.mark.local
|
57
|
+
def test_std_autopath_const_tuples(caplog, tmpd_cwd):
|
58
|
+
file = tmpd_cwd / "CONST"
|
59
|
+
cpath = (file, "w")
|
60
|
+
const_with_cpath(cpath, file, caplog)
|
61
|
+
|
62
|
+
|
63
|
+
class URIFailError(Exception):
|
64
|
+
pass
|
65
|
+
|
66
|
+
|
67
|
+
def fail_uri(task_record, err_or_out):
|
68
|
+
raise URIFailError("Deliberate failure in std stream filename generation")
|
69
|
+
|
70
|
+
|
71
|
+
@pytest.mark.local
|
72
|
+
def test_std_autopath_fail(caplog):
|
73
|
+
with parsl.load(parsl.Config(std_autopath=fail_uri)):
|
74
|
+
with pytest.raises(URIFailError):
|
75
|
+
app_stdout()
|
76
|
+
|
77
|
+
parsl.clear()
|
78
|
+
|
79
|
+
|
80
|
+
@parsl.bash_app
|
81
|
+
def app_both(stdout=parsl.AUTO_LOGNAME, stderr=parsl.AUTO_LOGNAME):
|
82
|
+
return "echo hello; echo goodbye >&2"
|
83
|
+
|
84
|
+
|
85
|
+
def zip_uri(base, task_record, err_or_out):
|
86
|
+
"""Should generate Files in base.zip like app_both.0.out or app_both.123.err"""
|
87
|
+
zip_path = base / "base.zip"
|
88
|
+
file = f"{task_record['func_name']}.{task_record['id']}.{task_record['try_id']}.{err_or_out}"
|
89
|
+
return File(f"zip:{zip_path}/{file}")
|
90
|
+
|
91
|
+
|
92
|
+
@pytest.mark.local
|
93
|
+
def test_std_autopath_zip(caplog, tmpd_cwd):
|
94
|
+
with parsl.load(parsl.Config(run_dir=str(tmpd_cwd),
|
95
|
+
executors=[ThreadPoolExecutor(working_dir=str(tmpd_cwd))],
|
96
|
+
std_autopath=partial(zip_uri, tmpd_cwd))):
|
97
|
+
futs = []
|
98
|
+
|
99
|
+
for _ in range(10):
|
100
|
+
fut = app_both()
|
101
|
+
|
102
|
+
# assertions that should hold after submission
|
103
|
+
assert isinstance(fut.stdout, DataFuture)
|
104
|
+
assert fut.stdout.file_obj.url.startswith("zip")
|
105
|
+
|
106
|
+
futs.append(fut)
|
107
|
+
|
108
|
+
# Barrier for all the stageouts to complete so that we can
|
109
|
+
# poke at the zip file.
|
110
|
+
[(fut.stdout.result(), fut.stderr.result()) for fut in futs]
|
111
|
+
|
112
|
+
with zipfile.ZipFile(tmpd_cwd / "base.zip") as z:
|
113
|
+
for fut in futs:
|
114
|
+
|
115
|
+
assert fut.done(), "AppFuture should be done if stageout is done"
|
116
|
+
|
117
|
+
stdout_relative_path = f"app_both.{fut.tid}.0.stdout"
|
118
|
+
with z.open(stdout_relative_path) as f:
|
119
|
+
assert f.readlines() == [b'hello\n']
|
120
|
+
|
121
|
+
stderr_relative_path = f"app_both.{fut.tid}.0.stderr"
|
122
|
+
with z.open(stderr_relative_path) as f:
|
123
|
+
assert f.readlines()[-1] == b'goodbye\n'
|
124
|
+
|
125
|
+
for record in caplog.records:
|
126
|
+
assert record.levelno < logging.ERROR
|
127
|
+
|
128
|
+
parsl.clear()
|
@@ -0,0 +1,53 @@
|
|
1
|
+
import pytest
|
2
|
+
|
3
|
+
import parsl
|
4
|
+
from parsl.app.app import python_app
|
5
|
+
from parsl.tests.configs.local_threads_checkpoint_periodic import fresh_config
|
6
|
+
|
7
|
+
|
8
|
+
def local_setup():
|
9
|
+
parsl.load(fresh_config())
|
10
|
+
|
11
|
+
|
12
|
+
def local_teardown():
|
13
|
+
# explicit clear without dfk.cleanup here, because the
|
14
|
+
# test does that already
|
15
|
+
parsl.clear()
|
16
|
+
|
17
|
+
|
18
|
+
@python_app(cache=True)
|
19
|
+
def slow_double(x, sleep_dur=1):
|
20
|
+
import time
|
21
|
+
time.sleep(sleep_dur)
|
22
|
+
return x * 2
|
23
|
+
|
24
|
+
|
25
|
+
def tstamp_to_seconds(line):
|
26
|
+
f = line.partition(" ")[0]
|
27
|
+
return float(f)
|
28
|
+
|
29
|
+
|
30
|
+
@pytest.mark.local
|
31
|
+
def test_periodic():
|
32
|
+
"""Test checkpointing with task_periodic behavior
|
33
|
+
"""
|
34
|
+
h, m, s = map(int, parsl.dfk().config.checkpoint_period.split(":"))
|
35
|
+
assert h == 0, "Verify test setup"
|
36
|
+
assert m == 0, "Verify test setup"
|
37
|
+
assert s > 0, "Verify test setup"
|
38
|
+
sleep_for = s + 1
|
39
|
+
with parsl.dfk():
|
40
|
+
futs = [slow_double(sleep_for) for _ in range(4)]
|
41
|
+
[f.result() for f in futs]
|
42
|
+
|
43
|
+
# Here we will check if the loglines came back with 5 seconds deltas
|
44
|
+
with open("{}/parsl.log".format(parsl.dfk().run_dir)) as f:
|
45
|
+
log_lines = f.readlines()
|
46
|
+
expected_msg = " Done checkpointing"
|
47
|
+
expected_msg2 = " No tasks checkpointed in this pass"
|
48
|
+
|
49
|
+
lines = [line for line in log_lines if expected_msg in line or expected_msg2 in line]
|
50
|
+
assert len(lines) >= 3, "Insufficient checkpoint lines in logfile"
|
51
|
+
deltas = [tstamp_to_seconds(line) for line in lines]
|
52
|
+
assert deltas[1] - deltas[0] < 5.5, "Delta between checkpoints exceeded period"
|
53
|
+
assert deltas[2] - deltas[1] < 5.5, "Delta between checkpoints exceeded period"
|
@@ -37,7 +37,3 @@ def test_that_it_fails():
|
|
37
37
|
raise Exception("The app somehow ran without a valid worker")
|
38
38
|
|
39
39
|
assert parsl.dfk().config.executors[0]._executor_bad_state.is_set()
|
40
|
-
|
41
|
-
# htex needs shutting down explicitly because dfk.cleanup() will not
|
42
|
-
# do that, as it is in bad state
|
43
|
-
parsl.dfk().config.executors[0].shutdown()
|
@@ -25,17 +25,11 @@ from parsl.executors.high_throughput.mpi_prefix_composer import (
|
|
25
25
|
EXECUTOR_LABEL = "MPI_TEST"
|
26
26
|
|
27
27
|
|
28
|
-
def
|
28
|
+
def local_config():
|
29
29
|
config = fresh_config()
|
30
30
|
config.executors[0].label = EXECUTOR_LABEL
|
31
31
|
config.executors[0].max_workers_per_node = 1
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
def local_teardown():
|
36
|
-
logging.warning("Exiting")
|
37
|
-
parsl.dfk().cleanup()
|
38
|
-
parsl.clear()
|
32
|
+
return config
|
39
33
|
|
40
34
|
|
41
35
|
@python_app
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import parsl
|
2
|
+
import pytest
|
3
|
+
import random
|
4
|
+
import zipfile
|
5
|
+
|
6
|
+
from parsl.data_provider.files import File
|
7
|
+
from parsl.data_provider.zip import ZipAuthorityError, ZipFileStaging
|
8
|
+
|
9
|
+
from parsl.providers import LocalProvider
|
10
|
+
from parsl.channels import LocalChannel
|
11
|
+
from parsl.launchers import SimpleLauncher
|
12
|
+
|
13
|
+
from parsl.config import Config
|
14
|
+
from parsl.executors import HighThroughputExecutor
|
15
|
+
|
16
|
+
from parsl.tests.configs.htex_local import fresh_config as local_config
|
17
|
+
|
18
|
+
|
19
|
+
@parsl.python_app
|
20
|
+
def count_lines(file):
|
21
|
+
with open(file, "r") as f:
|
22
|
+
return len(f.readlines())
|
23
|
+
|
24
|
+
|
25
|
+
@pytest.mark.local
|
26
|
+
def test_zip_in(tmpd_cwd):
|
27
|
+
# basic test of zip file stage-in
|
28
|
+
zip_path = tmpd_cwd / "container.zip"
|
29
|
+
file_base = "data.txt"
|
30
|
+
zip_file = File(f"zip:{zip_path / file_base}")
|
31
|
+
|
32
|
+
# create a zip file containing one file with some abitrary number of lines
|
33
|
+
n_lines = random.randint(0, 1000)
|
34
|
+
|
35
|
+
with zipfile.ZipFile(zip_path, mode='w') as z:
|
36
|
+
with z.open(file_base, mode='w') as f:
|
37
|
+
for _ in range(n_lines):
|
38
|
+
f.write(b'someline\n')
|
39
|
+
|
40
|
+
app_future = count_lines(zip_file)
|
41
|
+
|
42
|
+
assert app_future.result() == n_lines
|
@@ -0,0 +1,44 @@
|
|
1
|
+
import parsl
|
2
|
+
import pytest
|
3
|
+
import random
|
4
|
+
import zipfile
|
5
|
+
|
6
|
+
from parsl.data_provider.files import File
|
7
|
+
from parsl.data_provider.zip import ZipAuthorityError, ZipFileStaging
|
8
|
+
|
9
|
+
from parsl.providers import LocalProvider
|
10
|
+
from parsl.channels import LocalChannel
|
11
|
+
from parsl.launchers import SimpleLauncher
|
12
|
+
|
13
|
+
from parsl.config import Config
|
14
|
+
from parsl.executors import HighThroughputExecutor
|
15
|
+
|
16
|
+
from parsl.tests.configs.htex_local import fresh_config as local_config
|
17
|
+
|
18
|
+
|
19
|
+
@parsl.python_app
|
20
|
+
def generate_lines(n: int, *, outputs):
|
21
|
+
with open(outputs[0], "w") as f:
|
22
|
+
for x in range(n):
|
23
|
+
# write numbered lines
|
24
|
+
f.write(str(x) + "\n")
|
25
|
+
|
26
|
+
|
27
|
+
@parsl.python_app
|
28
|
+
def count_lines(file):
|
29
|
+
with open(file, "r") as f:
|
30
|
+
return len(f.readlines())
|
31
|
+
|
32
|
+
|
33
|
+
@pytest.mark.local
|
34
|
+
def test_zip_pipeline(tmpd_cwd):
|
35
|
+
# basic test of zip file stage-in
|
36
|
+
zip_path = tmpd_cwd / "container.zip"
|
37
|
+
file_base = "data.txt"
|
38
|
+
zip_file = File(f"zip:{zip_path / file_base}")
|
39
|
+
|
40
|
+
n_lines = random.randint(0, 1000)
|
41
|
+
generate_fut = generate_lines(n_lines, outputs=[zip_file])
|
42
|
+
n_lines_out = count_lines(generate_fut.outputs[0]).result()
|
43
|
+
|
44
|
+
assert n_lines == n_lines_out
|