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.
Files changed (291) hide show
  1. parsl/__init__.py +9 -10
  2. parsl/addresses.py +6 -4
  3. parsl/app/app.py +3 -6
  4. parsl/app/bash.py +4 -4
  5. parsl/app/errors.py +5 -3
  6. parsl/app/futures.py +3 -3
  7. parsl/app/python.py +2 -1
  8. parsl/benchmark/perf.py +2 -1
  9. parsl/channels/__init__.py +2 -2
  10. parsl/channels/base.py +0 -1
  11. parsl/channels/errors.py +2 -1
  12. parsl/channels/oauth_ssh/oauth_ssh.py +4 -3
  13. parsl/channels/ssh/ssh.py +9 -1
  14. parsl/channels/ssh_il/ssh_il.py +1 -0
  15. parsl/concurrent/__init__.py +2 -2
  16. parsl/config.py +12 -6
  17. parsl/configs/ASPIRE1.py +3 -3
  18. parsl/configs/Azure.py +6 -7
  19. parsl/configs/ad_hoc.py +4 -3
  20. parsl/configs/bridges.py +3 -3
  21. parsl/configs/cc_in2p3.py +2 -2
  22. parsl/configs/ec2.py +1 -1
  23. parsl/configs/expanse.py +1 -2
  24. parsl/configs/frontera.py +2 -3
  25. parsl/configs/htex_local.py +1 -2
  26. parsl/configs/illinoiscluster.py +1 -1
  27. parsl/configs/kubernetes.py +1 -2
  28. parsl/configs/midway.py +3 -3
  29. parsl/configs/osg.py +1 -1
  30. parsl/configs/polaris.py +1 -1
  31. parsl/configs/stampede2.py +4 -5
  32. parsl/configs/summit.py +1 -3
  33. parsl/configs/toss3_llnl.py +1 -2
  34. parsl/configs/vineex_local.py +3 -3
  35. parsl/configs/wqex_local.py +2 -2
  36. parsl/data_provider/data_manager.py +3 -3
  37. parsl/data_provider/file_noop.py +1 -2
  38. parsl/data_provider/files.py +3 -3
  39. parsl/data_provider/ftp.py +1 -3
  40. parsl/data_provider/globus.py +7 -6
  41. parsl/data_provider/http.py +2 -2
  42. parsl/data_provider/rsync.py +1 -1
  43. parsl/data_provider/staging.py +2 -2
  44. parsl/data_provider/zip.py +4 -5
  45. parsl/dataflow/dependency_resolvers.py +115 -0
  46. parsl/dataflow/dflow.py +65 -54
  47. parsl/dataflow/errors.py +2 -1
  48. parsl/dataflow/futures.py +1 -2
  49. parsl/dataflow/memoization.py +5 -5
  50. parsl/dataflow/rundirs.py +1 -1
  51. parsl/dataflow/taskrecord.py +4 -5
  52. parsl/executors/__init__.py +3 -3
  53. parsl/executors/base.py +1 -0
  54. parsl/executors/flux/execute_parsl_task.py +2 -2
  55. parsl/executors/flux/executor.py +11 -12
  56. parsl/executors/flux/flux_instance_manager.py +3 -3
  57. parsl/executors/high_throughput/errors.py +10 -0
  58. parsl/executors/high_throughput/executor.py +31 -36
  59. parsl/executors/high_throughput/interchange.py +16 -18
  60. parsl/executors/high_throughput/manager_record.py +1 -0
  61. parsl/executors/high_throughput/monitoring_info.py +2 -1
  62. parsl/executors/high_throughput/mpi_executor.py +6 -3
  63. parsl/executors/high_throughput/mpi_prefix_composer.py +19 -3
  64. parsl/executors/high_throughput/mpi_resource_management.py +1 -2
  65. parsl/executors/high_throughput/probe.py +6 -4
  66. parsl/executors/high_throughput/process_worker_pool.py +31 -20
  67. parsl/executors/high_throughput/zmq_pipes.py +63 -15
  68. parsl/executors/radical/executor.py +15 -15
  69. parsl/executors/radical/rpex_master.py +1 -2
  70. parsl/executors/radical/rpex_resources.py +4 -9
  71. parsl/executors/radical/rpex_worker.py +2 -1
  72. parsl/executors/status_handling.py +5 -4
  73. parsl/executors/taskvine/__init__.py +1 -1
  74. parsl/executors/taskvine/errors.py +1 -1
  75. parsl/executors/taskvine/exec_parsl_function.py +2 -2
  76. parsl/executors/taskvine/executor.py +23 -24
  77. parsl/executors/taskvine/factory.py +1 -1
  78. parsl/executors/taskvine/manager.py +11 -13
  79. parsl/executors/threads.py +4 -5
  80. parsl/executors/workqueue/errors.py +1 -1
  81. parsl/executors/workqueue/exec_parsl_function.py +5 -4
  82. parsl/executors/workqueue/executor.py +26 -27
  83. parsl/executors/workqueue/parsl_coprocess.py +1 -1
  84. parsl/jobs/error_handlers.py +1 -1
  85. parsl/jobs/job_status_poller.py +2 -5
  86. parsl/jobs/states.py +1 -1
  87. parsl/jobs/strategy.py +2 -2
  88. parsl/launchers/__init__.py +12 -3
  89. parsl/launchers/errors.py +1 -1
  90. parsl/log_utils.py +1 -2
  91. parsl/monitoring/db_manager.py +16 -10
  92. parsl/monitoring/monitoring.py +11 -15
  93. parsl/monitoring/queries/pandas.py +1 -2
  94. parsl/monitoring/radios.py +2 -4
  95. parsl/monitoring/remote.py +13 -8
  96. parsl/monitoring/router.py +8 -11
  97. parsl/monitoring/types.py +2 -0
  98. parsl/monitoring/visualization/app.py +4 -2
  99. parsl/monitoring/visualization/models.py +0 -1
  100. parsl/monitoring/visualization/plots/default/workflow_plots.py +8 -4
  101. parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +1 -0
  102. parsl/monitoring/visualization/utils.py +0 -1
  103. parsl/monitoring/visualization/views.py +16 -9
  104. parsl/multiprocessing.py +0 -1
  105. parsl/process_loggers.py +1 -2
  106. parsl/providers/__init__.py +9 -12
  107. parsl/providers/ad_hoc/ad_hoc.py +1 -1
  108. parsl/providers/aws/aws.py +2 -3
  109. parsl/providers/azure/azure.py +4 -5
  110. parsl/providers/base.py +1 -1
  111. parsl/providers/cluster_provider.py +1 -1
  112. parsl/providers/cobalt/cobalt.py +3 -3
  113. parsl/providers/condor/condor.py +4 -2
  114. parsl/providers/errors.py +2 -2
  115. parsl/providers/googlecloud/googlecloud.py +2 -1
  116. parsl/providers/grid_engine/grid_engine.py +2 -2
  117. parsl/providers/kubernetes/kube.py +5 -3
  118. parsl/providers/local/local.py +5 -1
  119. parsl/providers/lsf/lsf.py +2 -2
  120. parsl/providers/pbspro/pbspro.py +1 -1
  121. parsl/providers/slurm/slurm.py +5 -5
  122. parsl/providers/torque/torque.py +1 -1
  123. parsl/serialize/__init__.py +8 -3
  124. parsl/serialize/base.py +1 -2
  125. parsl/serialize/concretes.py +5 -4
  126. parsl/serialize/proxystore.py +3 -2
  127. parsl/tests/__init__.py +1 -1
  128. parsl/tests/configs/ad_hoc_cluster_htex.py +4 -4
  129. parsl/tests/configs/azure_single_node.py +4 -5
  130. parsl/tests/configs/bridges.py +3 -2
  131. parsl/tests/configs/cc_in2p3.py +2 -2
  132. parsl/tests/configs/comet.py +2 -1
  133. parsl/tests/configs/ec2_single_node.py +1 -2
  134. parsl/tests/configs/ec2_spot.py +1 -2
  135. parsl/tests/configs/frontera.py +3 -2
  136. parsl/tests/configs/htex_ad_hoc_cluster.py +2 -4
  137. parsl/tests/configs/htex_local.py +2 -3
  138. parsl/tests/configs/htex_local_alternate.py +8 -11
  139. parsl/tests/configs/htex_local_intask_staging.py +5 -7
  140. parsl/tests/configs/htex_local_rsync_staging.py +4 -6
  141. parsl/tests/configs/local_adhoc.py +1 -1
  142. parsl/tests/configs/local_radical.py +1 -3
  143. parsl/tests/configs/local_radical_mpi.py +2 -2
  144. parsl/tests/configs/midway.py +2 -2
  145. parsl/tests/configs/nscc_singapore.py +3 -3
  146. parsl/tests/configs/osg_htex.py +1 -1
  147. parsl/tests/configs/petrelkube.py +3 -2
  148. parsl/tests/configs/summit.py +1 -0
  149. parsl/tests/configs/swan_htex.py +2 -2
  150. parsl/tests/configs/taskvine_ex.py +3 -5
  151. parsl/tests/configs/theta.py +2 -2
  152. parsl/tests/configs/workqueue_ex.py +3 -4
  153. parsl/tests/conftest.py +6 -6
  154. parsl/tests/integration/test_channels/test_ssh_errors.py +1 -1
  155. parsl/tests/integration/test_stress/test_python_simple.py +3 -4
  156. parsl/tests/integration/test_stress/test_python_threads.py +3 -5
  157. parsl/tests/manual_tests/htex_local.py +4 -4
  158. parsl/tests/manual_tests/test_ad_hoc_htex.py +2 -1
  159. parsl/tests/manual_tests/test_basic.py +1 -0
  160. parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +4 -4
  161. parsl/tests/manual_tests/test_log_filter.py +3 -1
  162. parsl/tests/manual_tests/test_memory_limits.py +6 -6
  163. parsl/tests/manual_tests/test_regression_220.py +2 -1
  164. parsl/tests/manual_tests/test_udp_simple.py +4 -3
  165. parsl/tests/manual_tests/test_worker_count.py +3 -2
  166. parsl/tests/scaling_tests/htex_local.py +2 -2
  167. parsl/tests/scaling_tests/test_scale.py +0 -9
  168. parsl/tests/scaling_tests/vineex_condor.py +1 -2
  169. parsl/tests/scaling_tests/vineex_local.py +1 -2
  170. parsl/tests/site_tests/test_provider.py +3 -1
  171. parsl/tests/site_tests/test_site.py +2 -0
  172. parsl/tests/sites/test_affinity.py +7 -5
  173. parsl/tests/sites/test_dynamic_executor.py +3 -4
  174. parsl/tests/sites/test_ec2.py +3 -2
  175. parsl/tests/sites/test_local_adhoc.py +2 -1
  176. parsl/tests/sites/test_worker_info.py +4 -3
  177. parsl/tests/test_aalst_patterns.py +0 -1
  178. parsl/tests/test_bash_apps/test_apptimeout.py +2 -2
  179. parsl/tests/test_bash_apps/test_error_codes.py +1 -4
  180. parsl/tests/test_bash_apps/test_memoize_ignore_args.py +1 -0
  181. parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +2 -2
  182. parsl/tests/test_bash_apps/test_pipeline.py +1 -1
  183. parsl/tests/test_bash_apps/test_std_uri.py +4 -9
  184. parsl/tests/test_callables.py +2 -2
  185. parsl/tests/test_checkpointing/test_periodic.py +2 -7
  186. parsl/tests/test_checkpointing/test_python_checkpoint_1.py +1 -0
  187. parsl/tests/test_checkpointing/test_python_checkpoint_2.py +2 -2
  188. parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -1
  189. parsl/tests/test_checkpointing/test_regression_239.py +1 -1
  190. parsl/tests/test_checkpointing/test_task_exit.py +1 -2
  191. parsl/tests/test_docs/test_from_slides.py +2 -2
  192. parsl/tests/test_docs/test_kwargs.py +1 -1
  193. parsl/tests/test_docs/test_tutorial_1.py +1 -2
  194. parsl/tests/test_docs/test_workflow1.py +2 -2
  195. parsl/tests/test_docs/test_workflow2.py +0 -1
  196. parsl/tests/test_error_handling/test_rand_fail.py +2 -2
  197. parsl/tests/test_error_handling/test_resource_spec.py +4 -2
  198. parsl/tests/test_error_handling/test_retries.py +2 -1
  199. parsl/tests/test_error_handling/test_retry_handler.py +1 -0
  200. parsl/tests/test_error_handling/test_retry_handler_failure.py +2 -1
  201. parsl/tests/test_error_handling/test_serialization_fail.py +1 -1
  202. parsl/tests/test_error_handling/test_wrap_with_logs.py +1 -0
  203. parsl/tests/test_flux.py +1 -1
  204. parsl/tests/test_htex/test_basic.py +0 -1
  205. parsl/tests/test_htex/test_command_client_timeout.py +66 -0
  206. parsl/tests/test_htex/test_connected_blocks.py +3 -2
  207. parsl/tests/test_htex/test_cpu_affinity_explicit.py +6 -10
  208. parsl/tests/test_htex/test_disconnected_blocks.py +6 -4
  209. parsl/tests/test_htex/test_drain.py +5 -5
  210. parsl/tests/test_htex/test_htex.py +1 -2
  211. parsl/tests/test_htex/test_manager_failure.py +0 -1
  212. parsl/tests/test_htex/test_managers_command.py +5 -9
  213. parsl/tests/test_htex/test_missing_worker.py +2 -8
  214. parsl/tests/test_htex/test_multiple_disconnected_blocks.py +6 -4
  215. parsl/tests/test_monitoring/test_app_names.py +3 -3
  216. parsl/tests/test_monitoring/test_basic.py +4 -6
  217. parsl/tests/test_monitoring/test_db_locks.py +6 -4
  218. parsl/tests/test_monitoring/test_fuzz_zmq.py +6 -4
  219. parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +5 -7
  220. parsl/tests/test_monitoring/test_incomplete_futures.py +5 -4
  221. parsl/tests/test_monitoring/test_memoization_representation.py +4 -2
  222. parsl/tests/test_monitoring/test_stdouterr.py +4 -6
  223. parsl/tests/test_monitoring/test_viz_colouring.py +1 -0
  224. parsl/tests/test_mpi_apps/test_bad_mpi_config.py +1 -1
  225. parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py +4 -7
  226. parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +15 -4
  227. parsl/tests/test_mpi_apps/test_mpi_prefix.py +4 -4
  228. parsl/tests/test_mpi_apps/test_mpi_scheduler.py +7 -2
  229. parsl/tests/test_mpi_apps/test_mpiex.py +4 -3
  230. parsl/tests/test_mpi_apps/test_resource_spec.py +21 -17
  231. parsl/tests/test_providers/test_cobalt_deprecation_warning.py +2 -0
  232. parsl/tests/test_providers/test_local_provider.py +2 -1
  233. parsl/tests/test_providers/test_pbspro_template.py +1 -1
  234. parsl/tests/test_providers/test_slurm_template.py +1 -1
  235. parsl/tests/test_providers/test_submiterror_deprecation.py +2 -1
  236. parsl/tests/test_python_apps/test_context_manager.py +5 -12
  237. parsl/tests/test_python_apps/test_dep_standard_futures.py +2 -1
  238. parsl/tests/test_python_apps/test_futures.py +2 -1
  239. parsl/tests/test_python_apps/test_join.py +0 -1
  240. parsl/tests/test_python_apps/test_lifted.py +11 -7
  241. parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +1 -0
  242. parsl/tests/test_python_apps/test_pluggable_future_resolution.py +161 -0
  243. parsl/tests/test_radical/test_mpi_funcs.py +1 -1
  244. parsl/tests/test_regression/test_1480.py +2 -1
  245. parsl/tests/test_regression/test_1653.py +2 -1
  246. parsl/tests/test_regression/test_2652.py +1 -0
  247. parsl/tests/test_regression/test_69a.py +0 -1
  248. parsl/tests/test_regression/test_854.py +4 -2
  249. parsl/tests/test_regression/test_97_parallelism_0.py +1 -2
  250. parsl/tests/test_regression/test_98.py +0 -1
  251. parsl/tests/test_scaling/test_block_error_handler.py +9 -4
  252. parsl/tests/test_scaling/test_regression_1621.py +0 -2
  253. parsl/tests/test_scaling/test_scale_down.py +2 -3
  254. parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +4 -5
  255. parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +3 -4
  256. parsl/tests/test_scaling/test_shutdown_scalein.py +1 -4
  257. parsl/tests/test_serialization/test_2555_caching_deserializer.py +1 -1
  258. parsl/tests/test_serialization/test_basic.py +2 -1
  259. parsl/tests/test_serialization/test_htex_code_cache.py +3 -4
  260. parsl/tests/test_serialization/test_pack_resource_spec.py +2 -1
  261. parsl/tests/test_serialization/test_proxystore_configured.py +10 -6
  262. parsl/tests/test_serialization/test_proxystore_impl.py +5 -3
  263. parsl/tests/test_shutdown/test_kill_monitoring.py +3 -4
  264. parsl/tests/test_staging/staging_provider.py +2 -2
  265. parsl/tests/test_staging/test_1316.py +3 -4
  266. parsl/tests/test_staging/test_docs_1.py +1 -1
  267. parsl/tests/test_staging/test_docs_2.py +2 -1
  268. parsl/tests/test_staging/test_elaborate_noop_file.py +2 -3
  269. parsl/tests/test_staging/test_staging_https.py +2 -2
  270. parsl/tests/test_staging/test_staging_stdout.py +4 -3
  271. parsl/tests/test_staging/test_zip_in.py +6 -8
  272. parsl/tests/test_staging/test_zip_out.py +7 -9
  273. parsl/tests/test_staging/test_zip_to_zip.py +6 -8
  274. parsl/tests/test_summary.py +2 -2
  275. parsl/tests/test_thread_parallelism.py +0 -1
  276. parsl/tests/test_threads/test_configs.py +1 -2
  277. parsl/tests/test_threads/test_lazy_errors.py +2 -2
  278. parsl/usage_tracking/api.py +2 -3
  279. parsl/usage_tracking/usage.py +8 -18
  280. parsl/utils.py +13 -2
  281. parsl/version.py +1 -1
  282. {parsl-2024.5.20.data → parsl-2024.6.3.data}/scripts/exec_parsl_function.py +5 -4
  283. {parsl-2024.5.20.data → parsl-2024.6.3.data}/scripts/process_worker_pool.py +31 -20
  284. {parsl-2024.5.20.dist-info → parsl-2024.6.3.dist-info}/METADATA +6 -6
  285. parsl-2024.6.3.dist-info/RECORD +471 -0
  286. parsl-2024.5.20.dist-info/RECORD +0 -468
  287. {parsl-2024.5.20.data → parsl-2024.6.3.data}/scripts/parsl_coprocess.py +1 -1
  288. {parsl-2024.5.20.dist-info → parsl-2024.6.3.dist-info}/LICENSE +0 -0
  289. {parsl-2024.5.20.dist-info → parsl-2024.6.3.dist-info}/WHEEL +0 -0
  290. {parsl-2024.5.20.dist-info → parsl-2024.6.3.dist-info}/entry_points.txt +0 -0
  291. {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,8 +1,8 @@
1
+ import os
2
+
1
3
  from parsl.app.app import bash_app, python_app
2
4
  from parsl.data_provider.files import File
3
5
 
4
- import os
5
-
6
6
 
7
7
  @bash_app
8
8
  def echo(message, outputs=[]):
@@ -1,7 +1,7 @@
1
1
  """Functions used to explain kwargs"""
2
2
  from pathlib import Path
3
3
 
4
- from parsl import python_app, File
4
+ from parsl import File, python_app
5
5
 
6
6
 
7
7
  def test_inputs():
@@ -1,12 +1,11 @@
1
1
  import argparse
2
- import parsl
3
2
 
4
3
  import pytest
5
4
 
5
+ import parsl
6
6
  from parsl.app.app import bash_app
7
7
  from parsl.tests.configs.local_threads import config
8
8
 
9
-
10
9
  local_config = config
11
10
 
12
11
 
@@ -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
 
@@ -5,7 +5,6 @@ import pytest
5
5
  from parsl.app.app import python_app
6
6
  from parsl.tests.configs.local_threads import config
7
7
 
8
-
9
8
  local_config = config
10
9
 
11
10
 
@@ -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.high_throughput.mpi_prefix_composer import InvalidResourceSpecification
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
@@ -1,4 +1,5 @@
1
1
  import os
2
+
2
3
  import pytest
3
4
 
4
5
  import parsl
@@ -1,6 +1,7 @@
1
- import parsl
2
1
  import pytest
3
2
 
3
+ import parsl
4
+
4
5
 
5
6
  @parsl.python_app
6
7
  def always_fails():
@@ -1,8 +1,8 @@
1
1
  import pytest
2
2
 
3
3
  from parsl import python_app
4
- from parsl.tests.configs.htex_local import fresh_config
5
4
  from parsl.serialize.errors import SerializationError
5
+ from parsl.tests.configs.htex_local import fresh_config
6
6
 
7
7
 
8
8
  def local_config():
@@ -1,4 +1,5 @@
1
1
  import logging
2
+
2
3
  import pytest
3
4
 
4
5
  from parsl.process_loggers import wrap_with_logs
parsl/tests/test_flux.py CHANGED
@@ -1,5 +1,5 @@
1
- import os
2
1
  import concurrent.futures as cf
2
+ import os
3
3
 
4
4
  import pytest
5
5
 
@@ -14,7 +14,6 @@ def local_setup():
14
14
 
15
15
  def local_teardown():
16
16
  parsl.dfk().cleanup()
17
- parsl.clear()
18
17
 
19
18
 
20
19
  @python_app
@@ -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,7 +1,8 @@
1
- import parsl
2
1
  import pytest
3
- from parsl.executors import HighThroughputExecutor
2
+
3
+ import parsl
4
4
  from parsl import Config
5
+ from parsl.executors import HighThroughputExecutor
5
6
  from parsl.providers import LocalProvider
6
7
 
7
8
 
@@ -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
- import parsl
2
+
3
3
  import pytest
4
- from parsl.executors import HighThroughputExecutor
4
+
5
+ import parsl
5
6
  from parsl import Config
6
- from parsl.providers import LocalProvider
7
+ from parsl.executors import HighThroughputExecutor
7
8
  from parsl.executors.errors import BadStateException
8
- from parsl.jobs.states import JobStatus, JobState
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
- from parsl.providers import LocalProvider
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"
@@ -20,7 +20,6 @@ def load_config():
20
20
  yield
21
21
 
22
22
  parsl.dfk().cleanup()
23
- parsl.clear()
24
23
 
25
24
 
26
25
  @python_app
@@ -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 local_setup():
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
- parsl.load(config)
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 local_setup():
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
- parsl.load(config)
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
- import parsl
2
+
3
3
  import pytest
4
- from parsl.executors import HighThroughputExecutor
4
+
5
+ import parsl
5
6
  from parsl import Config
6
- from parsl.providers import LocalProvider
7
+ from parsl.executors import HighThroughputExecutor
7
8
  from parsl.executors.errors import BadStateException
8
- from parsl.jobs.states import JobStatus, JobState
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
- from parsl.providers import LocalProvider
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
- import parsl
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
 
@@ -1,4 +1,5 @@
1
1
  import pytest
2
+
2
3
  from parsl.dataflow.states import States
3
4
 
4
5