parsl 2024.5.20__py3-none-any.whl → 2024.6.3__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 +12 -6
- 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/dependency_resolvers.py +115 -0
- parsl/dataflow/dflow.py +65 -54
- 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/errors.py +10 -0
- parsl/executors/high_throughput/executor.py +31 -36
- parsl/executors/high_throughput/interchange.py +16 -18
- 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 +6 -3
- parsl/executors/high_throughput/mpi_prefix_composer.py +19 -3
- 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 +63 -15
- parsl/executors/radical/executor.py +15 -15
- parsl/executors/radical/rpex_master.py +1 -2
- parsl/executors/radical/rpex_resources.py +4 -9
- 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 +5 -3
- 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 +5 -5
- 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/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 +6 -6
- 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 -4
- 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 -9
- parsl/tests/test_callables.py +2 -2
- parsl/tests/test_checkpointing/test_periodic.py +2 -7
- parsl/tests/test_checkpointing/test_python_checkpoint_1.py +1 -0
- parsl/tests/test_checkpointing/test_python_checkpoint_2.py +2 -2
- parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -1
- parsl/tests/test_checkpointing/test_regression_239.py +1 -1
- parsl/tests/test_checkpointing/test_task_exit.py +1 -2
- 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_basic.py +0 -1
- parsl/tests/test_htex/test_command_client_timeout.py +66 -0
- parsl/tests/test_htex/test_connected_blocks.py +3 -2
- parsl/tests/test_htex/test_cpu_affinity_explicit.py +6 -10
- 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_manager_failure.py +0 -1
- parsl/tests/test_htex/test_managers_command.py +5 -9
- parsl/tests/test_htex/test_missing_worker.py +2 -8
- parsl/tests/test_htex/test_multiple_disconnected_blocks.py +6 -4
- parsl/tests/test_monitoring/test_app_names.py +3 -3
- parsl/tests/test_monitoring/test_basic.py +4 -6
- parsl/tests/test_monitoring/test_db_locks.py +6 -4
- parsl/tests/test_monitoring/test_fuzz_zmq.py +6 -4
- parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +5 -7
- parsl/tests/test_monitoring/test_incomplete_futures.py +5 -4
- parsl/tests/test_monitoring/test_memoization_representation.py +4 -2
- parsl/tests/test_monitoring/test_stdouterr.py +4 -6
- 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 +4 -7
- parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +15 -4
- 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 +21 -17
- 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 +5 -12
- parsl/tests/test_python_apps/test_dep_standard_futures.py +2 -1
- 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 +11 -7
- parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +1 -0
- parsl/tests/test_python_apps/test_pluggable_future_resolution.py +161 -0
- parsl/tests/test_radical/test_mpi_funcs.py +1 -1
- 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_regression_1621.py +0 -2
- 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 -4
- 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 -6
- parsl/tests/test_serialization/test_proxystore_impl.py +5 -3
- parsl/tests/test_shutdown/test_kill_monitoring.py +3 -4
- parsl/tests/test_staging/staging_provider.py +2 -2
- parsl/tests/test_staging/test_1316.py +3 -4
- 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 -3
- 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 -2
- parsl/tests/test_thread_parallelism.py +0 -1
- parsl/tests/test_threads/test_configs.py +1 -2
- parsl/tests/test_threads/test_lazy_errors.py +2 -2
- parsl/usage_tracking/api.py +2 -3
- parsl/usage_tracking/usage.py +8 -18
- parsl/utils.py +13 -2
- parsl/version.py +1 -1
- {parsl-2024.5.20.data → parsl-2024.6.3.data}/scripts/exec_parsl_function.py +5 -4
- {parsl-2024.5.20.data → parsl-2024.6.3.data}/scripts/process_worker_pool.py +31 -20
- {parsl-2024.5.20.dist-info → parsl-2024.6.3.dist-info}/METADATA +6 -6
- parsl-2024.6.3.dist-info/RECORD +471 -0
- parsl-2024.5.20.dist-info/RECORD +0 -468
- {parsl-2024.5.20.data → parsl-2024.6.3.data}/scripts/parsl_coprocess.py +1 -1
- {parsl-2024.5.20.dist-info → parsl-2024.6.3.dist-info}/LICENSE +0 -0
- {parsl-2024.5.20.dist-info → parsl-2024.6.3.dist-info}/WHEEL +0 -0
- {parsl-2024.5.20.dist-info → parsl-2024.6.3.dist-info}/entry_points.txt +0 -0
- {parsl-2024.5.20.dist-info → parsl-2024.6.3.dist-info}/top_level.txt +0 -0
@@ -5,8 +5,8 @@ import pytest
|
|
5
5
|
|
6
6
|
import parsl
|
7
7
|
from parsl.app.app import python_app
|
8
|
-
from parsl.utils import time_limited_open
|
9
8
|
from parsl.tests.configs.local_threads_checkpoint_task_exit import config
|
9
|
+
from parsl.utils import time_limited_open
|
10
10
|
|
11
11
|
|
12
12
|
def local_setup():
|
@@ -16,7 +16,6 @@ def local_setup():
|
|
16
16
|
|
17
17
|
def local_teardown():
|
18
18
|
parsl.dfk().cleanup()
|
19
|
-
parsl.clear()
|
20
19
|
|
21
20
|
|
22
21
|
@python_app(cache=True)
|
@@ -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
@@ -0,0 +1,66 @@
|
|
1
|
+
import threading
|
2
|
+
import time
|
3
|
+
|
4
|
+
import pytest
|
5
|
+
import zmq
|
6
|
+
|
7
|
+
from parsl import curvezmq
|
8
|
+
from parsl.executors.high_throughput.errors import (
|
9
|
+
CommandClientBadError,
|
10
|
+
CommandClientTimeoutError,
|
11
|
+
)
|
12
|
+
from parsl.executors.high_throughput.zmq_pipes import CommandClient
|
13
|
+
|
14
|
+
# Time constant used for timeout tests: various delays and
|
15
|
+
# timeouts will be appropriate multiples of this, but the
|
16
|
+
# value of T itself should not matter too much as long as
|
17
|
+
# it is big enough for zmq connections to happen successfully.
|
18
|
+
T = 0.25
|
19
|
+
|
20
|
+
|
21
|
+
@pytest.mark.local
|
22
|
+
def test_command_not_sent() -> None:
|
23
|
+
"""Tests timeout on command send.
|
24
|
+
"""
|
25
|
+
# RFC6335 ephemeral port range
|
26
|
+
cc = CommandClient("127.0.0.1", (49152, 65535))
|
27
|
+
|
28
|
+
# cc will now wait for a connection, but we won't do anything to make the
|
29
|
+
# other side of the connection exist, so any command given to cc should
|
30
|
+
# timeout.
|
31
|
+
|
32
|
+
with pytest.raises(CommandClientTimeoutError):
|
33
|
+
cc.run("SOMECOMMAND", timeout_s=T)
|
34
|
+
|
35
|
+
cc.close()
|
36
|
+
|
37
|
+
|
38
|
+
@pytest.mark.local
|
39
|
+
def test_command_ignored() -> None:
|
40
|
+
"""Tests timeout on command response.
|
41
|
+
Tests that we timeout after a response and that the command client
|
42
|
+
sets itself into a bad state.
|
43
|
+
|
44
|
+
This only tests sequential access to the command client, even though
|
45
|
+
htex makes multithreaded use of the command client: see issue #3376 about
|
46
|
+
that lack of thread safety.
|
47
|
+
"""
|
48
|
+
# RFC6335 ephemeral port range
|
49
|
+
cc = CommandClient("127.0.0.1", (49152, 65535))
|
50
|
+
|
51
|
+
ic_ctx = curvezmq.ServerContext(None)
|
52
|
+
ic_channel = ic_ctx.socket(zmq.REP)
|
53
|
+
ic_channel.connect(f"tcp://127.0.0.1:{cc.port}")
|
54
|
+
|
55
|
+
with pytest.raises(CommandClientTimeoutError):
|
56
|
+
cc.run("SLOW_COMMAND", timeout_s=T)
|
57
|
+
|
58
|
+
req = ic_channel.recv_pyobj()
|
59
|
+
assert req == "SLOW_COMMAND", "Should have received command on interchange side"
|
60
|
+
assert not cc.ok, "CommandClient should have set itself to bad"
|
61
|
+
|
62
|
+
with pytest.raises(CommandClientBadError):
|
63
|
+
cc.run("ANOTHER_COMMAND")
|
64
|
+
|
65
|
+
cc.close()
|
66
|
+
ic_channel.close()
|
@@ -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
|
|
@@ -37,16 +40,9 @@ def test_cpu_affinity_explicit():
|
|
37
40
|
config.executors[0].max_workers_per_node = 1
|
38
41
|
|
39
42
|
logger.debug(f"config: {config}")
|
40
|
-
# TODO: is there a `with` style for this, to properly deal with exceptions?
|
41
|
-
|
42
|
-
parsl.load(config)
|
43
|
-
try:
|
44
43
|
|
44
|
+
with parsl.load(config):
|
45
45
|
worker_affinity = my_affinity().result()
|
46
46
|
logger.debug(f"worker reported this affinity: {worker_affinity}")
|
47
47
|
assert len(worker_affinity) == 1
|
48
48
|
assert worker_affinity == set((single_core,))
|
49
|
-
|
50
|
-
finally:
|
51
|
-
parsl.dfk().cleanup()
|
52
|
-
parsl.clear()
|
@@ -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,22 +1,18 @@
|
|
1
|
-
import pytest
|
2
1
|
import logging
|
3
|
-
|
4
2
|
import sys
|
3
|
+
|
4
|
+
import pytest
|
5
|
+
|
5
6
|
import parsl
|
6
7
|
from parsl.app.app import python_app
|
7
8
|
from parsl.tests.configs.htex_local import fresh_config
|
8
9
|
|
9
10
|
|
10
|
-
def
|
11
|
+
def local_config():
|
11
12
|
config = fresh_config()
|
12
13
|
config.executors[0].poll_period = 1
|
13
14
|
config.executors[0].max_workers_per_node = 1
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
def local_teardown():
|
18
|
-
parsl.dfk().cleanup()
|
19
|
-
parsl.clear()
|
15
|
+
return config
|
20
16
|
|
21
17
|
|
22
18
|
@python_app
|
@@ -5,18 +5,12 @@ from parsl.app.app import python_app
|
|
5
5
|
from parsl.tests.configs.htex_local import fresh_config
|
6
6
|
|
7
7
|
|
8
|
-
def
|
8
|
+
def local_config():
|
9
9
|
config = fresh_config()
|
10
10
|
config.executors[0].poll_period = 1
|
11
11
|
config.executors[0].max_workers_per_node = 1
|
12
12
|
config.executors[0].launch_cmd = "executable_that_hopefully_does_not_exist_1030509.py"
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
def local_teardown():
|
17
|
-
|
18
|
-
parsl.dfk().cleanup()
|
19
|
-
parsl.clear()
|
13
|
+
return config
|
20
14
|
|
21
15
|
|
22
16
|
@python_app
|
@@ -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():
|
@@ -2,10 +2,11 @@
|
|
2
2
|
"""
|
3
3
|
|
4
4
|
import os
|
5
|
-
import parsl
|
6
|
-
import pytest
|
7
5
|
import time
|
8
6
|
|
7
|
+
import pytest
|
8
|
+
|
9
|
+
import parsl
|
9
10
|
from parsl.tests.configs.htex_local_alternate import fresh_config
|
10
11
|
|
11
12
|
|
@@ -61,7 +62,6 @@ def test_app_name(get_app, expected_name, expected_result, tmpd_cwd):
|
|
61
62
|
assert app().result() == expected_result
|
62
63
|
|
63
64
|
parsl.dfk().cleanup()
|
64
|
-
parsl.clear()
|
65
65
|
|
66
66
|
engine = sqlalchemy.create_engine(c.monitoring.logging_endpoint)
|
67
67
|
with engine.begin() as connection:
|
@@ -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
|
|
@@ -66,8 +66,6 @@ def test_row_counts(tmpd_cwd, fresh_config):
|
|
66
66
|
with parsl.load(config):
|
67
67
|
assert this_app().result() == 5
|
68
68
|
|
69
|
-
parsl.clear()
|
70
|
-
|
71
69
|
# at this point, we should find one row in the monitoring database.
|
72
70
|
|
73
71
|
engine = sqlalchemy.create_engine(db_url)
|
@@ -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")
|
@@ -63,7 +66,6 @@ def test_row_counts():
|
|
63
66
|
|
64
67
|
logger.info("cleaning up parsl")
|
65
68
|
parsl.dfk().cleanup()
|
66
|
-
parsl.clear()
|
67
69
|
|
68
70
|
# at this point, we should find data consistent with executing one
|
69
71
|
# task in the database.
|
@@ -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")
|
@@ -83,7 +86,6 @@ def test_row_counts():
|
|
83
86
|
|
84
87
|
logger.info("cleaning up parsl")
|
85
88
|
parsl.dfk().cleanup()
|
86
|
-
parsl.clear()
|
87
89
|
|
88
90
|
# at this point, we should find one row in the monitoring database.
|
89
91
|
|
@@ -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):
|
@@ -65,8 +65,6 @@ def test_row_counts(tmpd_cwd, strategy):
|
|
65
65
|
|
66
66
|
this_app().result()
|
67
67
|
|
68
|
-
parsl.clear()
|
69
|
-
|
70
68
|
engine = sqlalchemy.create_engine(db_url)
|
71
69
|
with engine.begin() as connection:
|
72
70
|
|
@@ -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")
|
@@ -52,7 +54,6 @@ def test_future_representation(tmpd_cwd):
|
|
52
54
|
# seconds, with the assumption "data will arrive in the DB within
|
53
55
|
# 30 seconds, but probably much sooner".
|
54
56
|
parsl.dfk().cleanup()
|
55
|
-
parsl.clear()
|
56
57
|
|
57
58
|
engine = sqlalchemy.create_engine(monitoring_url)
|
58
59
|
with engine.begin() as connection:
|
@@ -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"):
|
@@ -47,7 +50,6 @@ def test_hashsum():
|
|
47
50
|
|
48
51
|
logger.info("cleaning up parsl")
|
49
52
|
parsl.dfk().cleanup()
|
50
|
-
parsl.clear()
|
51
53
|
|
52
54
|
# at this point, we should find one row in the monitoring database.
|
53
55
|
|
@@ -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
|
@@ -103,8 +103,6 @@ def test_stdstream_to_monitoring(stdx, expected_stdx, stream, tmpd_cwd, caplog):
|
|
103
103
|
kwargs = {stream: stdx}
|
104
104
|
stdapp(**kwargs).result()
|
105
105
|
|
106
|
-
parsl.clear()
|
107
|
-
|
108
106
|
engine = sqlalchemy.create_engine(c.monitoring.logging_endpoint)
|
109
107
|
with engine.begin() as connection:
|
110
108
|
|