parsl 2024.5.27__py3-none-any.whl → 2024.6.10__py3-none-any.whl
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/__init__.py +9 -10
- parsl/addresses.py +6 -4
- parsl/app/app.py +3 -6
- parsl/app/bash.py +4 -4
- parsl/app/errors.py +5 -3
- parsl/app/futures.py +3 -3
- parsl/app/python.py +2 -1
- parsl/benchmark/perf.py +2 -1
- parsl/channels/__init__.py +2 -2
- parsl/channels/base.py +0 -1
- parsl/channels/errors.py +2 -1
- parsl/channels/oauth_ssh/oauth_ssh.py +4 -3
- parsl/channels/ssh/ssh.py +9 -1
- parsl/channels/ssh_il/ssh_il.py +1 -0
- parsl/concurrent/__init__.py +2 -2
- parsl/config.py +32 -9
- parsl/configs/ASPIRE1.py +3 -3
- parsl/configs/Azure.py +6 -7
- parsl/configs/ad_hoc.py +4 -3
- parsl/configs/bridges.py +3 -3
- parsl/configs/cc_in2p3.py +2 -2
- parsl/configs/ec2.py +1 -1
- parsl/configs/expanse.py +1 -2
- parsl/configs/frontera.py +2 -3
- parsl/configs/htex_local.py +1 -2
- parsl/configs/illinoiscluster.py +1 -1
- parsl/configs/kubernetes.py +1 -2
- parsl/configs/midway.py +3 -3
- parsl/configs/osg.py +1 -1
- parsl/configs/polaris.py +1 -1
- parsl/configs/stampede2.py +4 -5
- parsl/configs/summit.py +1 -3
- parsl/configs/toss3_llnl.py +1 -2
- parsl/configs/vineex_local.py +3 -3
- parsl/configs/wqex_local.py +2 -2
- parsl/data_provider/data_manager.py +3 -3
- parsl/data_provider/file_noop.py +1 -2
- parsl/data_provider/files.py +3 -3
- parsl/data_provider/ftp.py +1 -3
- parsl/data_provider/globus.py +7 -6
- parsl/data_provider/http.py +2 -2
- parsl/data_provider/rsync.py +1 -1
- parsl/data_provider/staging.py +2 -2
- parsl/data_provider/zip.py +4 -5
- parsl/dataflow/dflow.py +57 -26
- parsl/dataflow/errors.py +2 -1
- parsl/dataflow/futures.py +1 -2
- parsl/dataflow/memoization.py +5 -5
- parsl/dataflow/rundirs.py +1 -1
- parsl/dataflow/taskrecord.py +4 -5
- parsl/executors/__init__.py +3 -3
- parsl/executors/base.py +1 -0
- parsl/executors/flux/execute_parsl_task.py +2 -2
- parsl/executors/flux/executor.py +11 -12
- parsl/executors/flux/flux_instance_manager.py +3 -3
- parsl/executors/high_throughput/executor.py +31 -36
- parsl/executors/high_throughput/interchange.py +37 -38
- parsl/executors/high_throughput/manager_record.py +1 -0
- parsl/executors/high_throughput/monitoring_info.py +2 -1
- parsl/executors/high_throughput/mpi_executor.py +5 -2
- parsl/executors/high_throughput/mpi_prefix_composer.py +1 -1
- parsl/executors/high_throughput/mpi_resource_management.py +1 -2
- parsl/executors/high_throughput/probe.py +6 -4
- parsl/executors/high_throughput/process_worker_pool.py +31 -20
- parsl/executors/high_throughput/zmq_pipes.py +28 -14
- parsl/executors/radical/executor.py +15 -15
- parsl/executors/radical/rpex_master.py +1 -2
- parsl/executors/radical/rpex_resources.py +1 -2
- parsl/executors/radical/rpex_worker.py +2 -1
- parsl/executors/status_handling.py +5 -4
- parsl/executors/taskvine/__init__.py +1 -1
- parsl/executors/taskvine/errors.py +1 -1
- parsl/executors/taskvine/exec_parsl_function.py +2 -2
- parsl/executors/taskvine/executor.py +23 -24
- parsl/executors/taskvine/factory.py +1 -1
- parsl/executors/taskvine/manager.py +11 -13
- parsl/executors/threads.py +4 -5
- parsl/executors/workqueue/errors.py +1 -1
- parsl/executors/workqueue/exec_parsl_function.py +5 -4
- parsl/executors/workqueue/executor.py +26 -27
- parsl/executors/workqueue/parsl_coprocess.py +1 -1
- parsl/jobs/error_handlers.py +1 -1
- parsl/jobs/job_status_poller.py +2 -5
- parsl/jobs/states.py +1 -1
- parsl/jobs/strategy.py +2 -2
- parsl/launchers/__init__.py +12 -3
- parsl/launchers/errors.py +1 -1
- parsl/log_utils.py +1 -2
- parsl/monitoring/db_manager.py +16 -10
- parsl/monitoring/monitoring.py +11 -15
- parsl/monitoring/queries/pandas.py +1 -2
- parsl/monitoring/radios.py +2 -4
- parsl/monitoring/remote.py +13 -8
- parsl/monitoring/router.py +8 -11
- parsl/monitoring/types.py +2 -0
- parsl/monitoring/visualization/app.py +4 -2
- parsl/monitoring/visualization/models.py +0 -1
- parsl/monitoring/visualization/plots/default/workflow_plots.py +8 -4
- parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +1 -0
- parsl/monitoring/visualization/utils.py +0 -1
- parsl/monitoring/visualization/views.py +16 -9
- parsl/multiprocessing.py +0 -1
- parsl/process_loggers.py +1 -2
- parsl/providers/__init__.py +9 -12
- parsl/providers/ad_hoc/ad_hoc.py +1 -1
- parsl/providers/aws/aws.py +2 -3
- parsl/providers/azure/azure.py +4 -5
- parsl/providers/base.py +1 -1
- parsl/providers/cluster_provider.py +1 -1
- parsl/providers/cobalt/cobalt.py +3 -3
- parsl/providers/condor/condor.py +4 -2
- parsl/providers/errors.py +2 -2
- parsl/providers/googlecloud/googlecloud.py +2 -1
- parsl/providers/grid_engine/grid_engine.py +2 -2
- parsl/providers/kubernetes/kube.py +24 -9
- parsl/providers/local/local.py +5 -1
- parsl/providers/lsf/lsf.py +2 -2
- parsl/providers/pbspro/pbspro.py +1 -1
- parsl/providers/slurm/slurm.py +36 -27
- parsl/providers/torque/torque.py +1 -1
- parsl/serialize/__init__.py +8 -3
- parsl/serialize/base.py +1 -2
- parsl/serialize/concretes.py +5 -4
- parsl/serialize/proxystore.py +3 -2
- parsl/tests/__init__.py +1 -1
- parsl/tests/configs/ad_hoc_cluster_htex.py +4 -4
- parsl/tests/configs/azure_single_node.py +4 -5
- parsl/tests/configs/bridges.py +3 -2
- parsl/tests/configs/cc_in2p3.py +2 -2
- parsl/tests/configs/comet.py +2 -1
- parsl/tests/configs/ec2_single_node.py +1 -2
- parsl/tests/configs/ec2_spot.py +1 -2
- parsl/tests/configs/flux_local.py +11 -0
- parsl/tests/configs/frontera.py +3 -2
- parsl/tests/configs/htex_ad_hoc_cluster.py +2 -4
- parsl/tests/configs/htex_local.py +2 -3
- parsl/tests/configs/htex_local_alternate.py +8 -11
- parsl/tests/configs/htex_local_intask_staging.py +5 -7
- parsl/tests/configs/htex_local_rsync_staging.py +4 -6
- parsl/tests/configs/local_adhoc.py +1 -1
- parsl/tests/configs/local_radical.py +1 -3
- parsl/tests/configs/local_radical_mpi.py +2 -2
- parsl/tests/configs/midway.py +2 -2
- parsl/tests/configs/nscc_singapore.py +3 -3
- parsl/tests/configs/osg_htex.py +1 -1
- parsl/tests/configs/petrelkube.py +3 -2
- parsl/tests/configs/summit.py +1 -0
- parsl/tests/configs/swan_htex.py +2 -2
- parsl/tests/configs/taskvine_ex.py +3 -5
- parsl/tests/configs/theta.py +2 -2
- parsl/tests/configs/workqueue_ex.py +3 -4
- parsl/tests/conftest.py +8 -4
- parsl/tests/integration/test_channels/test_ssh_errors.py +1 -1
- parsl/tests/integration/test_stress/test_python_simple.py +3 -4
- parsl/tests/integration/test_stress/test_python_threads.py +3 -5
- parsl/tests/manual_tests/htex_local.py +4 -4
- parsl/tests/manual_tests/test_ad_hoc_htex.py +2 -1
- parsl/tests/manual_tests/test_basic.py +1 -0
- parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +4 -4
- parsl/tests/manual_tests/test_log_filter.py +3 -1
- parsl/tests/manual_tests/test_memory_limits.py +6 -6
- parsl/tests/manual_tests/test_regression_220.py +2 -1
- parsl/tests/manual_tests/test_udp_simple.py +4 -3
- parsl/tests/manual_tests/test_worker_count.py +3 -2
- parsl/tests/scaling_tests/htex_local.py +2 -2
- parsl/tests/scaling_tests/test_scale.py +0 -9
- parsl/tests/scaling_tests/vineex_condor.py +1 -2
- parsl/tests/scaling_tests/vineex_local.py +1 -2
- parsl/tests/site_tests/test_provider.py +3 -1
- parsl/tests/site_tests/test_site.py +2 -0
- parsl/tests/sites/test_affinity.py +7 -5
- parsl/tests/sites/test_dynamic_executor.py +3 -3
- parsl/tests/sites/test_ec2.py +3 -2
- parsl/tests/sites/test_local_adhoc.py +2 -1
- parsl/tests/sites/test_worker_info.py +4 -3
- parsl/tests/test_aalst_patterns.py +0 -1
- parsl/tests/test_bash_apps/test_apptimeout.py +2 -2
- parsl/tests/test_bash_apps/test_error_codes.py +1 -4
- parsl/tests/test_bash_apps/test_memoize_ignore_args.py +1 -0
- parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +2 -2
- parsl/tests/test_bash_apps/test_pipeline.py +1 -1
- parsl/tests/test_bash_apps/test_std_uri.py +4 -3
- parsl/tests/test_bash_apps/test_stdout.py +20 -2
- parsl/tests/test_callables.py +2 -2
- parsl/tests/test_checkpointing/test_python_checkpoint_1.py +1 -0
- parsl/tests/test_checkpointing/test_python_checkpoint_2.py +2 -1
- parsl/tests/test_checkpointing/test_regression_239.py +1 -1
- parsl/tests/test_checkpointing/test_task_exit.py +1 -1
- parsl/tests/test_docs/test_from_slides.py +2 -2
- parsl/tests/test_docs/test_kwargs.py +1 -1
- parsl/tests/test_docs/test_tutorial_1.py +1 -2
- parsl/tests/test_docs/test_workflow1.py +2 -2
- parsl/tests/test_docs/test_workflow2.py +0 -1
- parsl/tests/test_error_handling/test_rand_fail.py +2 -2
- parsl/tests/test_error_handling/test_resource_spec.py +4 -2
- parsl/tests/test_error_handling/test_retries.py +2 -1
- parsl/tests/test_error_handling/test_retry_handler.py +1 -0
- parsl/tests/test_error_handling/test_retry_handler_failure.py +2 -1
- parsl/tests/test_error_handling/test_serialization_fail.py +1 -1
- parsl/tests/test_error_handling/test_wrap_with_logs.py +1 -0
- parsl/tests/test_flux.py +1 -1
- parsl/tests/test_htex/test_command_client_timeout.py +9 -12
- parsl/tests/test_htex/test_connected_blocks.py +3 -2
- parsl/tests/test_htex/test_cpu_affinity_explicit.py +5 -2
- parsl/tests/test_htex/test_disconnected_blocks.py +6 -4
- parsl/tests/test_htex/test_drain.py +5 -5
- parsl/tests/test_htex/test_htex.py +1 -2
- parsl/tests/test_htex/test_managers_command.py +3 -2
- parsl/tests/test_htex/test_multiple_disconnected_blocks.py +6 -4
- parsl/tests/test_htex/test_zmq_binding.py +22 -6
- parsl/tests/test_monitoring/test_app_names.py +3 -2
- parsl/tests/test_monitoring/test_basic.py +4 -4
- parsl/tests/test_monitoring/test_db_locks.py +6 -3
- parsl/tests/test_monitoring/test_fuzz_zmq.py +6 -3
- parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +5 -5
- parsl/tests/test_monitoring/test_incomplete_futures.py +5 -3
- parsl/tests/test_monitoring/test_memoization_representation.py +4 -1
- parsl/tests/test_monitoring/test_stdouterr.py +4 -4
- parsl/tests/test_monitoring/test_viz_colouring.py +1 -0
- parsl/tests/test_mpi_apps/test_bad_mpi_config.py +1 -1
- parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py +2 -0
- parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +7 -5
- parsl/tests/test_mpi_apps/test_mpi_prefix.py +4 -4
- parsl/tests/test_mpi_apps/test_mpi_scheduler.py +7 -2
- parsl/tests/test_mpi_apps/test_mpiex.py +4 -3
- parsl/tests/test_mpi_apps/test_resource_spec.py +9 -10
- parsl/tests/test_providers/test_cobalt_deprecation_warning.py +2 -0
- parsl/tests/test_providers/test_local_provider.py +2 -1
- parsl/tests/test_providers/test_pbspro_template.py +1 -1
- parsl/tests/test_providers/test_slurm_template.py +1 -1
- parsl/tests/test_providers/test_submiterror_deprecation.py +2 -1
- parsl/tests/test_python_apps/test_context_manager.py +99 -3
- parsl/tests/test_python_apps/test_dep_standard_futures.py +2 -1
- parsl/tests/test_python_apps/test_dependencies_deep.py +59 -0
- parsl/tests/test_python_apps/test_futures.py +2 -1
- parsl/tests/test_python_apps/test_join.py +0 -1
- parsl/tests/test_python_apps/test_lifted.py +3 -3
- parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +1 -0
- parsl/tests/test_python_apps/test_pluggable_future_resolution.py +1 -1
- parsl/tests/test_radical/test_mpi_funcs.py +1 -2
- parsl/tests/test_regression/test_1480.py +2 -1
- parsl/tests/test_regression/test_1653.py +2 -1
- parsl/tests/test_regression/test_2652.py +1 -0
- parsl/tests/test_regression/test_69a.py +0 -1
- parsl/tests/test_regression/test_854.py +4 -2
- parsl/tests/test_regression/test_97_parallelism_0.py +1 -2
- parsl/tests/test_regression/test_98.py +0 -1
- parsl/tests/test_scaling/test_block_error_handler.py +9 -4
- parsl/tests/test_scaling/test_scale_down.py +2 -3
- parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +4 -5
- parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +3 -4
- parsl/tests/test_scaling/test_shutdown_scalein.py +1 -2
- parsl/tests/test_serialization/test_2555_caching_deserializer.py +1 -1
- parsl/tests/test_serialization/test_basic.py +2 -1
- parsl/tests/test_serialization/test_htex_code_cache.py +3 -4
- parsl/tests/test_serialization/test_pack_resource_spec.py +2 -1
- parsl/tests/test_serialization/test_proxystore_configured.py +10 -5
- parsl/tests/test_serialization/test_proxystore_impl.py +5 -3
- parsl/tests/test_shutdown/test_kill_monitoring.py +3 -2
- parsl/tests/test_staging/staging_provider.py +2 -2
- parsl/tests/test_staging/test_1316.py +3 -2
- parsl/tests/test_staging/test_docs_1.py +1 -1
- parsl/tests/test_staging/test_docs_2.py +2 -1
- parsl/tests/test_staging/test_elaborate_noop_file.py +2 -2
- parsl/tests/test_staging/test_staging_https.py +2 -2
- parsl/tests/test_staging/test_staging_stdout.py +4 -3
- parsl/tests/test_staging/test_zip_in.py +6 -8
- parsl/tests/test_staging/test_zip_out.py +7 -9
- parsl/tests/test_staging/test_zip_to_zip.py +6 -8
- parsl/tests/test_summary.py +2 -1
- parsl/tests/test_thread_parallelism.py +0 -1
- parsl/tests/test_threads/test_configs.py +1 -1
- parsl/tests/test_threads/test_lazy_errors.py +2 -1
- parsl/tests/unit/test_usage_tracking.py +45 -0
- parsl/usage_tracking/api.py +2 -3
- parsl/usage_tracking/levels.py +6 -0
- parsl/usage_tracking/usage.py +60 -39
- parsl/utils.py +13 -2
- parsl/version.py +1 -1
- {parsl-2024.5.27.data → parsl-2024.6.10.data}/scripts/exec_parsl_function.py +5 -4
- {parsl-2024.5.27.data → parsl-2024.6.10.data}/scripts/process_worker_pool.py +31 -20
- {parsl-2024.5.27.dist-info → parsl-2024.6.10.dist-info}/METADATA +2 -2
- parsl-2024.6.10.dist-info/RECORD +475 -0
- parsl-2024.5.27.dist-info/RECORD +0 -471
- {parsl-2024.5.27.data → parsl-2024.6.10.data}/scripts/parsl_coprocess.py +1 -1
- {parsl-2024.5.27.dist-info → parsl-2024.6.10.dist-info}/LICENSE +0 -0
- {parsl-2024.5.27.dist-info → parsl-2024.6.10.dist-info}/WHEEL +0 -0
- {parsl-2024.5.27.dist-info → parsl-2024.6.10.dist-info}/entry_points.txt +0 -0
- {parsl-2024.5.27.dist-info → parsl-2024.6.10.dist-info}/top_level.txt +0 -0
@@ -1,12 +1,12 @@
|
|
1
1
|
import os
|
2
|
+
|
2
3
|
import pytest
|
3
|
-
import parsl
|
4
4
|
|
5
|
+
import parsl
|
5
6
|
from parsl.app.app import bash_app, python_app
|
6
7
|
from parsl.data_provider.files import File
|
7
8
|
from parsl.tests.configs.local_threads import config
|
8
9
|
|
9
|
-
|
10
10
|
# parsl.set_stream_logger()
|
11
11
|
|
12
12
|
|
@@ -15,8 +15,8 @@ def local_config():
|
|
15
15
|
|
16
16
|
@python_app
|
17
17
|
def sleep_fail(sleep_dur, sleep_rand_max, fail_prob, inputs=[]):
|
18
|
-
import time
|
19
18
|
import random
|
19
|
+
import time
|
20
20
|
|
21
21
|
s = sleep_dur + random.randint(-sleep_rand_max, sleep_rand_max)
|
22
22
|
|
@@ -144,8 +144,8 @@ def test_deps(numtasks=10):
|
|
144
144
|
|
145
145
|
@python_app
|
146
146
|
def sleep_then_fail(sleep_dur=0.1):
|
147
|
-
import time
|
148
147
|
import math
|
148
|
+
import time
|
149
149
|
time.sleep(sleep_dur)
|
150
150
|
math.ceil("Trigger TypeError")
|
151
151
|
return 0
|
@@ -1,9 +1,11 @@
|
|
1
1
|
import parsl
|
2
2
|
from parsl.app.app import python_app
|
3
|
-
from parsl.executors.errors import UnsupportedFeatureError, ExecutorError
|
4
3
|
from parsl.executors import WorkQueueExecutor
|
5
|
-
from parsl.executors.
|
4
|
+
from parsl.executors.errors import ExecutorError, UnsupportedFeatureError
|
6
5
|
from parsl.executors.high_throughput.executor import HighThroughputExecutor
|
6
|
+
from parsl.executors.high_throughput.mpi_prefix_composer import (
|
7
|
+
InvalidResourceSpecification,
|
8
|
+
)
|
7
9
|
|
8
10
|
|
9
11
|
@python_app
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import argparse
|
2
2
|
import os
|
3
|
+
|
3
4
|
import pytest
|
4
5
|
|
5
6
|
import parsl
|
@@ -15,8 +16,8 @@ def local_config():
|
|
15
16
|
|
16
17
|
@python_app
|
17
18
|
def sleep_then_fail(inputs=[], sleep_dur=0.1):
|
18
|
-
import time
|
19
19
|
import math
|
20
|
+
import time
|
20
21
|
time.sleep(sleep_dur)
|
21
22
|
math.ceil("Trigger TypeError")
|
22
23
|
return 0
|
parsl/tests/test_flux.py
CHANGED
@@ -1,11 +1,15 @@
|
|
1
|
-
import pytest
|
2
1
|
import threading
|
3
2
|
import time
|
3
|
+
|
4
|
+
import pytest
|
4
5
|
import zmq
|
6
|
+
|
5
7
|
from parsl import curvezmq
|
8
|
+
from parsl.executors.high_throughput.errors import (
|
9
|
+
CommandClientBadError,
|
10
|
+
CommandClientTimeoutError,
|
11
|
+
)
|
6
12
|
from parsl.executors.high_throughput.zmq_pipes import CommandClient
|
7
|
-
from parsl.executors.high_throughput.errors import CommandClientTimeoutError, CommandClientBadError
|
8
|
-
|
9
13
|
|
10
14
|
# Time constant used for timeout tests: various delays and
|
11
15
|
# timeouts will be appropriate multiples of this, but the
|
@@ -18,10 +22,8 @@ T = 0.25
|
|
18
22
|
def test_command_not_sent() -> None:
|
19
23
|
"""Tests timeout on command send.
|
20
24
|
"""
|
21
|
-
ctx = curvezmq.ClientContext(None)
|
22
|
-
|
23
25
|
# RFC6335 ephemeral port range
|
24
|
-
cc = CommandClient(
|
26
|
+
cc = CommandClient("127.0.0.1", (49152, 65535))
|
25
27
|
|
26
28
|
# cc will now wait for a connection, but we won't do anything to make the
|
27
29
|
# other side of the connection exist, so any command given to cc should
|
@@ -43,10 +45,8 @@ def test_command_ignored() -> None:
|
|
43
45
|
htex makes multithreaded use of the command client: see issue #3376 about
|
44
46
|
that lack of thread safety.
|
45
47
|
"""
|
46
|
-
ctx = curvezmq.ClientContext(None)
|
47
|
-
|
48
48
|
# RFC6335 ephemeral port range
|
49
|
-
cc = CommandClient(
|
49
|
+
cc = CommandClient("127.0.0.1", (49152, 65535))
|
50
50
|
|
51
51
|
ic_ctx = curvezmq.ServerContext(None)
|
52
52
|
ic_channel = ic_ctx.socket(zmq.REP)
|
@@ -63,7 +63,4 @@ def test_command_ignored() -> None:
|
|
63
63
|
cc.run("ANOTHER_COMMAND")
|
64
64
|
|
65
65
|
cc.close()
|
66
|
-
ctx.term()
|
67
|
-
|
68
66
|
ic_channel.close()
|
69
|
-
ic_ctx.term()
|
@@ -1,8 +1,10 @@
|
|
1
1
|
import logging
|
2
2
|
import os
|
3
|
-
import parsl
|
4
|
-
import pytest
|
5
3
|
import random
|
4
|
+
|
5
|
+
import pytest
|
6
|
+
|
7
|
+
import parsl
|
6
8
|
from parsl.tests.configs.htex_local import fresh_config
|
7
9
|
|
8
10
|
logger = logging.getLogger(__name__)
|
@@ -18,6 +20,7 @@ def my_affinity():
|
|
18
20
|
|
19
21
|
@pytest.mark.local
|
20
22
|
@pytest.mark.multiple_cores_required
|
23
|
+
@pytest.mark.skipif('sched_getaffinity' not in dir(os), reason='System does not support sched_setaffinity')
|
21
24
|
def test_cpu_affinity_explicit():
|
22
25
|
available_cores = os.sched_getaffinity(0)
|
23
26
|
|
@@ -1,11 +1,13 @@
|
|
1
1
|
import logging
|
2
|
-
|
2
|
+
|
3
3
|
import pytest
|
4
|
-
|
4
|
+
|
5
|
+
import parsl
|
5
6
|
from parsl import Config
|
6
|
-
from parsl.
|
7
|
+
from parsl.executors import HighThroughputExecutor
|
7
8
|
from parsl.executors.errors import BadStateException
|
8
|
-
from parsl.jobs.states import
|
9
|
+
from parsl.jobs.states import JobState, JobStatus
|
10
|
+
from parsl.providers import LocalProvider
|
9
11
|
|
10
12
|
|
11
13
|
def local_config():
|
@@ -1,13 +1,13 @@
|
|
1
|
-
import parsl
|
2
|
-
import pytest
|
3
1
|
import time
|
4
2
|
|
5
|
-
|
6
|
-
from parsl.channels import LocalChannel
|
7
|
-
from parsl.launchers import SimpleLauncher
|
3
|
+
import pytest
|
8
4
|
|
5
|
+
import parsl
|
6
|
+
from parsl.channels import LocalChannel
|
9
7
|
from parsl.config import Config
|
10
8
|
from parsl.executors import HighThroughputExecutor
|
9
|
+
from parsl.launchers import SimpleLauncher
|
10
|
+
from parsl.providers import LocalProvider
|
11
11
|
|
12
12
|
# this constant is used to scale some durations that happen
|
13
13
|
# based around the expected drain period: the drain period
|
@@ -4,8 +4,7 @@ from unittest import mock
|
|
4
4
|
|
5
5
|
import pytest
|
6
6
|
|
7
|
-
from parsl import curvezmq
|
8
|
-
from parsl import HighThroughputExecutor
|
7
|
+
from parsl import HighThroughputExecutor, curvezmq
|
9
8
|
from parsl.multiprocessing import ForkProcess
|
10
9
|
|
11
10
|
_MOCK_BASE = "parsl.executors.high_throughput.executor"
|
@@ -1,11 +1,13 @@
|
|
1
1
|
import logging
|
2
|
-
|
2
|
+
|
3
3
|
import pytest
|
4
|
-
|
4
|
+
|
5
|
+
import parsl
|
5
6
|
from parsl import Config
|
6
|
-
from parsl.
|
7
|
+
from parsl.executors import HighThroughputExecutor
|
7
8
|
from parsl.executors.errors import BadStateException
|
8
|
-
from parsl.jobs.states import
|
9
|
+
from parsl.jobs.states import JobState, JobStatus
|
10
|
+
from parsl.providers import LocalProvider
|
9
11
|
|
10
12
|
|
11
13
|
def local_config():
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import logging
|
1
2
|
import pathlib
|
2
3
|
from typing import Optional
|
3
4
|
from unittest import mock
|
@@ -10,6 +11,21 @@ from parsl import curvezmq
|
|
10
11
|
from parsl.executors.high_throughput.interchange import Interchange
|
11
12
|
|
12
13
|
|
14
|
+
def make_interchange(*, interchange_address: Optional[str], cert_dir: Optional[str]) -> Interchange:
|
15
|
+
return Interchange(interchange_address=interchange_address,
|
16
|
+
cert_dir=cert_dir,
|
17
|
+
client_address="127.0.0.1",
|
18
|
+
client_ports=(50055, 50056, 50057),
|
19
|
+
worker_ports=None,
|
20
|
+
worker_port_range=(54000, 55000),
|
21
|
+
hub_address=None,
|
22
|
+
hub_zmq_port=None,
|
23
|
+
heartbeat_threshold=60,
|
24
|
+
logdir=".",
|
25
|
+
logging_level=logging.INFO,
|
26
|
+
poll_period=10)
|
27
|
+
|
28
|
+
|
13
29
|
@pytest.fixture
|
14
30
|
def encrypted(request: pytest.FixtureRequest):
|
15
31
|
if hasattr(request, "param"):
|
@@ -31,7 +47,7 @@ def test_interchange_curvezmq_sockets(
|
|
31
47
|
mock_socket: mock.MagicMock, cert_dir: Optional[str], encrypted: bool
|
32
48
|
):
|
33
49
|
address = "127.0.0.1"
|
34
|
-
ix =
|
50
|
+
ix = make_interchange(interchange_address=address, cert_dir=cert_dir)
|
35
51
|
assert isinstance(ix.zmq_context, curvezmq.ServerContext)
|
36
52
|
assert ix.zmq_context.encrypted is encrypted
|
37
53
|
assert mock_socket.call_count == 5
|
@@ -40,7 +56,7 @@ def test_interchange_curvezmq_sockets(
|
|
40
56
|
@pytest.mark.local
|
41
57
|
@pytest.mark.parametrize("encrypted", (True, False), indirect=True)
|
42
58
|
def test_interchange_binding_no_address(cert_dir: Optional[str]):
|
43
|
-
ix =
|
59
|
+
ix = make_interchange(interchange_address=None, cert_dir=cert_dir)
|
44
60
|
assert ix.interchange_address == "*"
|
45
61
|
|
46
62
|
|
@@ -49,7 +65,7 @@ def test_interchange_binding_no_address(cert_dir: Optional[str]):
|
|
49
65
|
def test_interchange_binding_with_address(cert_dir: Optional[str]):
|
50
66
|
# Using loopback address
|
51
67
|
address = "127.0.0.1"
|
52
|
-
ix =
|
68
|
+
ix = make_interchange(interchange_address=address, cert_dir=cert_dir)
|
53
69
|
assert ix.interchange_address == address
|
54
70
|
|
55
71
|
|
@@ -60,7 +76,7 @@ def test_interchange_binding_with_non_ipv4_address(cert_dir: Optional[str]):
|
|
60
76
|
# Confirm that a ipv4 address is required
|
61
77
|
address = "localhost"
|
62
78
|
with pytest.raises(zmq.error.ZMQError):
|
63
|
-
|
79
|
+
make_interchange(interchange_address=address, cert_dir=cert_dir)
|
64
80
|
|
65
81
|
|
66
82
|
@pytest.mark.local
|
@@ -69,7 +85,7 @@ def test_interchange_binding_bad_address(cert_dir: Optional[str]):
|
|
69
85
|
"""Confirm that we raise a ZMQError when a bad address is supplied"""
|
70
86
|
address = "550.0.0.0"
|
71
87
|
with pytest.raises(zmq.error.ZMQError):
|
72
|
-
|
88
|
+
make_interchange(interchange_address=address, cert_dir=cert_dir)
|
73
89
|
|
74
90
|
|
75
91
|
@pytest.mark.local
|
@@ -77,7 +93,7 @@ def test_interchange_binding_bad_address(cert_dir: Optional[str]):
|
|
77
93
|
def test_limited_interface_binding(cert_dir: Optional[str]):
|
78
94
|
"""When address is specified the worker_port would be bound to it rather than to 0.0.0.0"""
|
79
95
|
address = "127.0.0.1"
|
80
|
-
ix =
|
96
|
+
ix = make_interchange(interchange_address=address, cert_dir=cert_dir)
|
81
97
|
ix.worker_result_port
|
82
98
|
proc = psutil.Process()
|
83
99
|
conns = proc.connections(kind="tcp")
|
@@ -1,12 +1,12 @@
|
|
1
1
|
import os
|
2
|
-
import parsl
|
3
|
-
import pytest
|
4
2
|
import time
|
5
3
|
|
4
|
+
import pytest
|
5
|
+
|
6
|
+
import parsl
|
6
7
|
from parsl import HighThroughputExecutor
|
7
8
|
from parsl.config import Config
|
8
|
-
from parsl.executors.taskvine import TaskVineExecutor
|
9
|
-
from parsl.executors.taskvine import TaskVineManagerConfig
|
9
|
+
from parsl.executors.taskvine import TaskVineExecutor, TaskVineManagerConfig
|
10
10
|
from parsl.monitoring import MonitoringHub
|
11
11
|
|
12
12
|
|
@@ -1,9 +1,11 @@
|
|
1
1
|
import logging
|
2
2
|
import os
|
3
|
-
import parsl
|
4
|
-
import pytest
|
5
3
|
import time
|
6
4
|
|
5
|
+
import pytest
|
6
|
+
|
7
|
+
import parsl
|
8
|
+
|
7
9
|
logger = logging.getLogger(__name__)
|
8
10
|
|
9
11
|
|
@@ -14,9 +16,10 @@ def this_app():
|
|
14
16
|
|
15
17
|
@pytest.mark.local
|
16
18
|
def test_row_counts():
|
17
|
-
from parsl.tests.configs.htex_local_alternate import fresh_config
|
18
19
|
import sqlalchemy
|
19
20
|
from sqlalchemy import text
|
21
|
+
|
22
|
+
from parsl.tests.configs.htex_local_alternate import fresh_config
|
20
23
|
if os.path.exists("runinfo/monitoring.db"):
|
21
24
|
logger.info("Monitoring database already exists - deleting")
|
22
25
|
os.remove("runinfo/monitoring.db")
|
@@ -1,11 +1,13 @@
|
|
1
1
|
import logging
|
2
2
|
import os
|
3
|
-
import parsl
|
4
|
-
import pytest
|
5
3
|
import socket
|
6
4
|
import time
|
5
|
+
|
6
|
+
import pytest
|
7
7
|
import zmq
|
8
8
|
|
9
|
+
import parsl
|
10
|
+
|
9
11
|
logger = logging.getLogger(__name__)
|
10
12
|
|
11
13
|
|
@@ -16,10 +18,11 @@ def this_app():
|
|
16
18
|
|
17
19
|
@pytest.mark.local
|
18
20
|
def test_row_counts():
|
19
|
-
from parsl.tests.configs.htex_local_alternate import fresh_config
|
20
21
|
import sqlalchemy
|
21
22
|
from sqlalchemy import text
|
22
23
|
|
24
|
+
from parsl.tests.configs.htex_local_alternate import fresh_config
|
25
|
+
|
23
26
|
if os.path.exists("runinfo/monitoring.db"):
|
24
27
|
logger.info("Monitoring database already exists - deleting")
|
25
28
|
os.remove("runinfo/monitoring.db")
|
@@ -1,16 +1,16 @@
|
|
1
1
|
import logging
|
2
2
|
import os
|
3
|
-
import parsl
|
4
|
-
import pytest
|
5
3
|
import time
|
6
4
|
|
7
|
-
|
8
|
-
from parsl.channels import LocalChannel
|
9
|
-
from parsl.launchers import SimpleLauncher
|
5
|
+
import pytest
|
10
6
|
|
7
|
+
import parsl
|
8
|
+
from parsl.channels import LocalChannel
|
11
9
|
from parsl.config import Config
|
12
10
|
from parsl.executors import HighThroughputExecutor
|
11
|
+
from parsl.launchers import SimpleLauncher
|
13
12
|
from parsl.monitoring import MonitoringHub
|
13
|
+
from parsl.providers import LocalProvider
|
14
14
|
|
15
15
|
|
16
16
|
def fresh_config(run_dir, strategy, db_url):
|
@@ -1,11 +1,12 @@
|
|
1
1
|
import logging
|
2
2
|
import os
|
3
|
-
import parsl
|
4
|
-
import pytest
|
5
3
|
import random
|
6
|
-
|
7
4
|
from concurrent.futures import Future
|
8
5
|
|
6
|
+
import pytest
|
7
|
+
|
8
|
+
import parsl
|
9
|
+
|
9
10
|
|
10
11
|
@parsl.python_app
|
11
12
|
def this_app(inputs=()):
|
@@ -16,6 +17,7 @@ def this_app(inputs=()):
|
|
16
17
|
def test_future_representation(tmpd_cwd):
|
17
18
|
import sqlalchemy
|
18
19
|
from sqlalchemy import text
|
20
|
+
|
19
21
|
from parsl.tests.configs.htex_local_alternate import fresh_config
|
20
22
|
|
21
23
|
monitoring_db = str(tmpd_cwd / "monitoring.db")
|
@@ -1,9 +1,11 @@
|
|
1
1
|
|
2
2
|
import logging
|
3
3
|
import os
|
4
|
-
|
4
|
+
|
5
5
|
import pytest
|
6
6
|
|
7
|
+
import parsl
|
8
|
+
|
7
9
|
logger = logging.getLogger(__name__)
|
8
10
|
|
9
11
|
|
@@ -16,6 +18,7 @@ def this_app(x):
|
|
16
18
|
def test_hashsum():
|
17
19
|
import sqlalchemy
|
18
20
|
from sqlalchemy import text
|
21
|
+
|
19
22
|
from parsl.tests.configs.htex_local_alternate import fresh_config
|
20
23
|
|
21
24
|
if os.path.exists("runinfo/monitoring.db"):
|
@@ -3,16 +3,16 @@
|
|
3
3
|
|
4
4
|
import logging
|
5
5
|
import os
|
6
|
-
import parsl
|
7
|
-
import pytest
|
8
6
|
import re
|
9
7
|
import time
|
10
|
-
|
11
8
|
from typing import Union
|
12
9
|
|
10
|
+
import pytest
|
11
|
+
|
12
|
+
import parsl
|
13
13
|
from parsl.config import Config
|
14
|
-
from parsl.data_provider.files import File
|
15
14
|
from parsl.data_provider.data_manager import default_staging
|
15
|
+
from parsl.data_provider.files import File
|
16
16
|
from parsl.data_provider.staging import Staging
|
17
17
|
from parsl.executors import HighThroughputExecutor
|
18
18
|
from parsl.monitoring import MonitoringHub
|
@@ -2,7 +2,7 @@ import pytest
|
|
2
2
|
|
3
3
|
from parsl import Config
|
4
4
|
from parsl.executors import HighThroughputExecutor
|
5
|
-
from parsl.launchers import
|
5
|
+
from parsl.launchers import AprunLauncher, SimpleLauncher, SrunLauncher
|
6
6
|
from parsl.providers import SlurmProvider
|
7
7
|
|
8
8
|
|
@@ -1,15 +1,17 @@
|
|
1
1
|
import logging
|
2
|
+
import os
|
2
3
|
import random
|
3
4
|
from typing import Dict
|
5
|
+
|
4
6
|
import pytest
|
7
|
+
|
5
8
|
import parsl
|
6
|
-
from parsl import
|
9
|
+
from parsl import bash_app, python_app
|
10
|
+
from parsl.executors.high_throughput.mpi_prefix_composer import (
|
11
|
+
MissingResourceSpecification,
|
12
|
+
)
|
7
13
|
from parsl.tests.configs.htex_local import fresh_config
|
8
14
|
|
9
|
-
from parsl.executors.high_throughput.mpi_prefix_composer import MissingResourceSpecification
|
10
|
-
|
11
|
-
import os
|
12
|
-
|
13
15
|
EXECUTOR_LABEL = "MPI_TEST"
|
14
16
|
|
15
17
|
|
@@ -1,14 +1,14 @@
|
|
1
1
|
import logging
|
2
|
+
|
2
3
|
import pytest
|
3
4
|
|
4
|
-
from parsl.executors.high_throughput.mpi_resource_management import Scheduler
|
5
5
|
from parsl.executors.high_throughput.mpi_prefix_composer import (
|
6
|
-
|
6
|
+
compose_all,
|
7
7
|
compose_aprun_launch_cmd,
|
8
8
|
compose_mpiexec_launch_cmd,
|
9
|
-
|
9
|
+
compose_srun_launch_cmd,
|
10
10
|
)
|
11
|
-
|
11
|
+
from parsl.executors.high_throughput.mpi_resource_management import Scheduler
|
12
12
|
|
13
13
|
resource_spec = {"num_nodes": 2,
|
14
14
|
"num_ranks": 8,
|
@@ -1,9 +1,14 @@
|
|
1
1
|
import logging
|
2
2
|
import os
|
3
|
+
import pickle
|
3
4
|
from unittest import mock
|
5
|
+
|
4
6
|
import pytest
|
5
|
-
|
6
|
-
from parsl.executors.high_throughput.mpi_resource_management import
|
7
|
+
|
8
|
+
from parsl.executors.high_throughput.mpi_resource_management import (
|
9
|
+
MPITaskScheduler,
|
10
|
+
TaskScheduler,
|
11
|
+
)
|
7
12
|
from parsl.multiprocessing import SpawnContext
|
8
13
|
from parsl.serialize import pack_res_spec_apply_message, unpack_res_spec_apply_message
|
9
14
|
|
@@ -5,11 +5,12 @@ from pathlib import Path
|
|
5
5
|
import pytest
|
6
6
|
|
7
7
|
import parsl
|
8
|
-
from
|
9
|
-
from parsl import
|
8
|
+
from parsl import Config, HighThroughputExecutor
|
9
|
+
from parsl.executors.high_throughput.mpi_executor import MPIExecutor
|
10
10
|
from parsl.launchers import SimpleLauncher
|
11
11
|
from parsl.providers import LocalProvider
|
12
|
-
|
12
|
+
|
13
|
+
from .test_mpi_mode_enabled import get_env_vars
|
13
14
|
|
14
15
|
cwd = Path(__file__).parent.absolute()
|
15
16
|
pbs_nodefile = cwd.joinpath("mocks", "pbs_nodefile")
|