parsl 2024.1.29__tar.gz → 2024.2.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. {parsl-2024.1.29/parsl.egg-info → parsl-2024.2.5}/PKG-INFO +2 -2
  2. parsl-2024.2.5/parsl/curvezmq.py +205 -0
  3. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/dataflow/dflow.py +1 -1
  4. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/executor.py +78 -49
  5. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/interchange.py +14 -7
  6. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/process_worker_pool.py +15 -7
  7. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/zmq_pipes.py +21 -15
  8. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/manager.py +44 -43
  9. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/monitoring.py +18 -3
  10. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/errors.py +4 -6
  11. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/slurm/slurm.py +7 -6
  12. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/ad_hoc_cluster_htex.py +1 -0
  13. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/azure_single_node.py +1 -0
  14. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/bluewaters.py +1 -0
  15. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/bridges.py +1 -0
  16. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/cc_in2p3.py +1 -0
  17. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/comet.py +1 -0
  18. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/cooley_htex.py +1 -0
  19. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/ec2_single_node.py +1 -0
  20. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/ec2_spot.py +1 -0
  21. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/frontera.py +1 -0
  22. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/htex_ad_hoc_cluster.py +1 -0
  23. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/htex_local.py +1 -0
  24. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/htex_local_alternate.py +1 -0
  25. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/htex_local_intask_staging.py +1 -0
  26. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/htex_local_rsync_staging.py +1 -0
  27. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_adhoc.py +1 -0
  28. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/midway.py +1 -0
  29. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/nscc_singapore.py +1 -0
  30. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/osg_htex.py +1 -0
  31. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/petrelkube.py +1 -0
  32. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/summit.py +1 -0
  33. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/swan_htex.py +1 -0
  34. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/theta.py +1 -0
  35. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/htex_local.py +1 -0
  36. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_ad_hoc_htex.py +1 -0
  37. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +1 -0
  38. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_memory_limits.py +1 -0
  39. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/scaling_tests/htex_local.py +1 -0
  40. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/test_affinity.py +1 -0
  41. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/test_concurrent.py +2 -1
  42. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/test_dynamic_executor.py +1 -0
  43. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/test_worker_info.py +1 -0
  44. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_stdout.py +6 -1
  45. parsl-2024.2.5/parsl/tests/test_curvezmq.py +455 -0
  46. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_data/test_file_apps.py +5 -5
  47. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_data/test_file_staging.py +3 -3
  48. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_docs/test_kwargs.py +3 -3
  49. parsl-2024.2.5/parsl/tests/test_htex/test_htex.py +46 -0
  50. parsl-2024.2.5/parsl/tests/test_htex/test_htex_zmq_binding.py +86 -0
  51. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_futures.py +5 -5
  52. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_97_parallelism_0.py +1 -0
  53. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_scaling/test_block_error_handler.py +6 -5
  54. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_scaling/test_regression_1621.py +1 -0
  55. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_scaling/test_scale_down.py +1 -0
  56. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/version.py +1 -1
  57. {parsl-2024.1.29 → parsl-2024.2.5/parsl.egg-info}/PKG-INFO +2 -2
  58. {parsl-2024.1.29 → parsl-2024.2.5}/parsl.egg-info/SOURCES.txt +3 -0
  59. {parsl-2024.1.29 → parsl-2024.2.5}/parsl.egg-info/requires.txt +1 -1
  60. parsl-2024.2.5/requirements.txt +17 -0
  61. parsl-2024.1.29/parsl/tests/test_htex/test_htex_zmq_binding.py +0 -46
  62. parsl-2024.1.29/requirements.txt +0 -10
  63. {parsl-2024.1.29 → parsl-2024.2.5}/LICENSE +0 -0
  64. {parsl-2024.1.29 → parsl-2024.2.5}/MANIFEST.in +0 -0
  65. {parsl-2024.1.29 → parsl-2024.2.5}/README.rst +0 -0
  66. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/__init__.py +0 -0
  67. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/addresses.py +0 -0
  68. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/app/__init__.py +0 -0
  69. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/app/app.py +0 -0
  70. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/app/bash.py +0 -0
  71. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/app/errors.py +0 -0
  72. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/app/futures.py +0 -0
  73. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/app/python.py +0 -0
  74. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/benchmark/__init__.py +0 -0
  75. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/benchmark/perf.py +0 -0
  76. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/__init__.py +0 -0
  77. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/base.py +0 -0
  78. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/errors.py +0 -0
  79. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/local/__init__.py +0 -0
  80. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/local/local.py +0 -0
  81. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/oauth_ssh/__init__.py +0 -0
  82. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/oauth_ssh/oauth_ssh.py +0 -0
  83. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/ssh/__init__.py +0 -0
  84. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/ssh/ssh.py +0 -0
  85. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/ssh_il/__init__.py +0 -0
  86. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/ssh_il/ssh_il.py +0 -0
  87. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/concurrent/__init__.py +0 -0
  88. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/config.py +0 -0
  89. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/ASPIRE1.py +0 -0
  90. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/Azure.py +0 -0
  91. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/__init__.py +0 -0
  92. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/ad_hoc.py +0 -0
  93. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/bluewaters.py +0 -0
  94. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/bridges.py +0 -0
  95. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/cc_in2p3.py +0 -0
  96. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/comet.py +0 -0
  97. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/cooley.py +0 -0
  98. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/ec2.py +0 -0
  99. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/frontera.py +0 -0
  100. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/htex_local.py +0 -0
  101. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/illinoiscluster.py +0 -0
  102. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/kubernetes.py +0 -0
  103. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/local_threads.py +0 -0
  104. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/midway.py +0 -0
  105. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/osg.py +0 -0
  106. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/polaris.py +0 -0
  107. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/stampede2.py +0 -0
  108. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/summit.py +0 -0
  109. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/theta.py +0 -0
  110. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/toss3_llnl.py +0 -0
  111. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/vineex_local.py +0 -0
  112. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/wqex_local.py +0 -0
  113. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/__init__.py +0 -0
  114. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/data_manager.py +0 -0
  115. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/file_noop.py +0 -0
  116. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/files.py +0 -0
  117. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/ftp.py +0 -0
  118. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/globus.py +0 -0
  119. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/http.py +0 -0
  120. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/rsync.py +0 -0
  121. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/staging.py +0 -0
  122. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/dataflow/__init__.py +0 -0
  123. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/dataflow/errors.py +0 -0
  124. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/dataflow/futures.py +0 -0
  125. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/dataflow/memoization.py +0 -0
  126. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/dataflow/rundirs.py +0 -0
  127. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/dataflow/states.py +0 -0
  128. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/dataflow/taskrecord.py +0 -0
  129. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/errors.py +0 -0
  130. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/__init__.py +0 -0
  131. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/base.py +0 -0
  132. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/errors.py +0 -0
  133. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/flux/__init__.py +0 -0
  134. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/flux/execute_parsl_task.py +0 -0
  135. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/flux/executor.py +0 -0
  136. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/flux/flux_instance_manager.py +0 -0
  137. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/__init__.py +0 -0
  138. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/errors.py +0 -0
  139. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/manager_record.py +0 -0
  140. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  141. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/probe.py +0 -0
  142. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/radical/__init__.py +0 -0
  143. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/radical/executor.py +0 -0
  144. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/radical/rpex_master.py +0 -0
  145. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/radical/rpex_resources.py +0 -0
  146. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/radical/rpex_worker.py +0 -0
  147. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/status_handling.py +0 -0
  148. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/__init__.py +0 -0
  149. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/errors.py +0 -0
  150. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  151. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/executor.py +0 -0
  152. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/factory.py +0 -0
  153. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/factory_config.py +0 -0
  154. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/manager_config.py +0 -0
  155. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/utils.py +0 -0
  156. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/threads.py +0 -0
  157. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/workqueue/__init__.py +0 -0
  158. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/workqueue/errors.py +0 -0
  159. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  160. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/workqueue/executor.py +0 -0
  161. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  162. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  163. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/jobs/__init__.py +0 -0
  164. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/jobs/error_handlers.py +0 -0
  165. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/jobs/errors.py +0 -0
  166. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/jobs/job_status_poller.py +0 -0
  167. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/jobs/states.py +0 -0
  168. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/jobs/strategy.py +0 -0
  169. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/launchers/__init__.py +0 -0
  170. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/launchers/base.py +0 -0
  171. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/launchers/errors.py +0 -0
  172. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/launchers/launchers.py +0 -0
  173. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/log_utils.py +0 -0
  174. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/__init__.py +0 -0
  175. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/db_manager.py +0 -0
  176. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/message_type.py +0 -0
  177. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/queries/__init__.py +0 -0
  178. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/queries/pandas.py +0 -0
  179. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/radios.py +0 -0
  180. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/remote.py +0 -0
  181. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/types.py +0 -0
  182. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/__init__.py +0 -0
  183. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/app.py +0 -0
  184. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/models.py +0 -0
  185. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  186. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  187. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  188. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  189. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  190. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  191. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  192. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/templates/app.html +0 -0
  193. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/templates/dag.html +0 -0
  194. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/templates/error.html +0 -0
  195. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/templates/layout.html +0 -0
  196. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  197. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/templates/task.html +0 -0
  198. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  199. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  200. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/utils.py +0 -0
  201. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/version.py +0 -0
  202. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/views.py +0 -0
  203. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/multiprocessing.py +0 -0
  204. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/process_loggers.py +0 -0
  205. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/__init__.py +0 -0
  206. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/ad_hoc/__init__.py +0 -0
  207. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/ad_hoc/ad_hoc.py +0 -0
  208. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/aws/__init__.py +0 -0
  209. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/aws/aws.py +0 -0
  210. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/aws/template.py +0 -0
  211. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/azure/__init__.py +0 -0
  212. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/azure/azure.py +0 -0
  213. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/azure/template.py +0 -0
  214. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/base.py +0 -0
  215. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/cluster_provider.py +0 -0
  216. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/cobalt/__init__.py +0 -0
  217. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/cobalt/cobalt.py +0 -0
  218. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/cobalt/template.py +0 -0
  219. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/condor/__init__.py +0 -0
  220. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/condor/condor.py +0 -0
  221. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/condor/template.py +0 -0
  222. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/googlecloud/__init__.py +0 -0
  223. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/googlecloud/googlecloud.py +0 -0
  224. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/grid_engine/__init__.py +0 -0
  225. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/grid_engine/grid_engine.py +0 -0
  226. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/grid_engine/template.py +0 -0
  227. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/kubernetes/__init__.py +0 -0
  228. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/kubernetes/kube.py +0 -0
  229. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/kubernetes/template.py +0 -0
  230. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/local/__init__.py +0 -0
  231. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/local/local.py +0 -0
  232. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/lsf/__init__.py +0 -0
  233. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/lsf/lsf.py +0 -0
  234. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/lsf/template.py +0 -0
  235. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/pbspro/__init__.py +0 -0
  236. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/pbspro/pbspro.py +0 -0
  237. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/pbspro/template.py +0 -0
  238. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/slurm/__init__.py +0 -0
  239. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/slurm/template.py +0 -0
  240. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/torque/__init__.py +0 -0
  241. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/torque/template.py +0 -0
  242. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/torque/torque.py +0 -0
  243. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/py.typed +0 -0
  244. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/serialize/__init__.py +0 -0
  245. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/serialize/base.py +0 -0
  246. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/serialize/concretes.py +0 -0
  247. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/serialize/errors.py +0 -0
  248. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/serialize/facade.py +0 -0
  249. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/serialize/proxystore.py +0 -0
  250. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/__init__.py +0 -0
  251. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/callables_helper.py +0 -0
  252. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/__init__.py +0 -0
  253. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_radical.py +0 -0
  254. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_radical_mpi.py +0 -0
  255. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads.py +0 -0
  256. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  257. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  258. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
  259. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  260. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  261. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_globus.py +0 -0
  262. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  263. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_monitoring.py +0 -0
  264. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_no_cache.py +0 -0
  265. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/taskvine_ex.py +0 -0
  266. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/user_opts.py +0 -0
  267. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/workqueue_ex.py +0 -0
  268. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/conftest.py +0 -0
  269. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/__init__.py +0 -0
  270. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/latency.py +0 -0
  271. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_apps/__init__.py +0 -0
  272. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_channels/__init__.py +0 -0
  273. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_channels/test_channels.py +0 -0
  274. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_channels/test_local_channel.py +0 -0
  275. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_channels/test_scp_1.py +0 -0
  276. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_channels/test_ssh_1.py +0 -0
  277. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_channels/test_ssh_errors.py +0 -0
  278. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -0
  279. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -0
  280. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  281. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_stress/__init__.py +0 -0
  282. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  283. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  284. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/__init__.py +0 -0
  285. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_basic.py +0 -0
  286. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  287. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_oauth_ssh.py +0 -0
  288. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  289. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
  290. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  291. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/scaling_tests/__init__.py +0 -0
  292. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/scaling_tests/local_threads.py +0 -0
  293. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/scaling_tests/test_scale.py +0 -0
  294. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
  295. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/scaling_tests/vineex_local.py +0 -0
  296. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
  297. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/scaling_tests/wqex_local.py +0 -0
  298. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/site_tests/__init__.py +0 -0
  299. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/site_tests/site_config_selector.py +0 -0
  300. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/site_tests/test_provider.py +0 -0
  301. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/site_tests/test_site.py +0 -0
  302. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/__init__.py +0 -0
  303. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/test_ec2.py +0 -0
  304. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/test_launchers.py +0 -0
  305. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/test_local_adhoc.py +0 -0
  306. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  307. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_aalst_patterns.py +0 -0
  308. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/__init__.py +0 -0
  309. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  310. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  311. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  312. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  313. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  314. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  315. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  316. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  317. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  318. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  319. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_callables.py +0 -0
  320. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_channels/__init__.py +0 -0
  321. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_channels/test_large_output.py +0 -0
  322. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/__init__.py +0 -0
  323. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  324. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  325. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  326. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
  327. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  328. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  329. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  330. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  331. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_data/__init__.py +0 -0
  332. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_data/test_file.py +0 -0
  333. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_data/test_output_chain_filenames.py +0 -0
  334. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_docs/__init__.py +0 -0
  335. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_docs/test_from_slides.py +0 -0
  336. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  337. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_docs/test_workflow1.py +0 -0
  338. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_docs/test_workflow2.py +0 -0
  339. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_docs/test_workflow4.py +0 -0
  340. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/__init__.py +0 -0
  341. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_fail.py +0 -0
  342. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_htex_basic.py +0 -0
  343. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_htex_manager_failure.py +0 -0
  344. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_htex_missing_worker.py +0 -0
  345. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_htex_worker_failure.py +0 -0
  346. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  347. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
  348. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  349. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_retries.py +0 -0
  350. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  351. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  352. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  353. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  354. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  355. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_flux.py +0 -0
  356. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_htex/__init__.py +0 -0
  357. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  358. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_monitoring/__init__.py +0 -0
  359. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_monitoring/test_basic.py +0 -0
  360. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  361. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
  362. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  363. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  364. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_providers/__init__.py +0 -0
  365. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_providers/test_local_provider.py +0 -0
  366. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  367. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  368. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/__init__.py +0 -0
  369. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  370. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_basic.py +0 -0
  371. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  372. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  373. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  374. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_fail.py +0 -0
  375. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  376. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  377. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
  378. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  379. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_join.py +0 -0
  380. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  381. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  382. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  383. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  384. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  385. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  386. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  387. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  388. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  389. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_overview.py +0 -0
  390. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  391. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_simple.py +0 -0
  392. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  393. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_type5.py +0 -0
  394. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_radical/__init__.py +0 -0
  395. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
  396. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/__init__.py +0 -0
  397. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_1480.py +0 -0
  398. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  399. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_1653.py +0 -0
  400. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_221.py +0 -0
  401. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_226.py +0 -0
  402. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_2652.py +0 -0
  403. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_69a.py +0 -0
  404. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_854.py +0 -0
  405. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_98.py +0 -0
  406. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_scaling/__init__.py +0 -0
  407. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_serialization/__init__.py +0 -0
  408. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  409. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_serialization/test_basic.py +0 -0
  410. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  411. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  412. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/__init__.py +0 -0
  413. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/staging_provider.py +0 -0
  414. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/test_1316.py +0 -0
  415. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/test_docs_1.py +0 -0
  416. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/test_docs_2.py +0 -0
  417. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  418. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  419. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  420. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  421. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/test_staging_https.py +0 -0
  422. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_summary.py +0 -0
  423. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_thread_parallelism.py +0 -0
  424. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_threads/__init__.py +0 -0
  425. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_threads/test_configs.py +0 -0
  426. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  427. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_utils/__init__.py +0 -0
  428. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
  429. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/utils.py +0 -0
  430. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/usage_tracking/__init__.py +0 -0
  431. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/usage_tracking/usage.py +0 -0
  432. {parsl-2024.1.29 → parsl-2024.2.5}/parsl/utils.py +0 -0
  433. {parsl-2024.1.29 → parsl-2024.2.5}/parsl.egg-info/dependency_links.txt +0 -0
  434. {parsl-2024.1.29 → parsl-2024.2.5}/parsl.egg-info/entry_points.txt +0 -0
  435. {parsl-2024.1.29 → parsl-2024.2.5}/parsl.egg-info/top_level.txt +0 -0
  436. {parsl-2024.1.29 → parsl-2024.2.5}/setup.cfg +0 -0
  437. {parsl-2024.1.29 → parsl-2024.2.5}/setup.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2024.1.29
3
+ Version: 2024.2.5
4
4
  Summary: Simple data dependent workflows in Python
5
5
  Home-page: https://github.com/Parsl/parsl
6
- Download-URL: https://github.com/Parsl/parsl/archive/2024.01.29.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2024.02.05.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -0,0 +1,205 @@
1
+ import os
2
+ from abc import ABCMeta, abstractmethod
3
+ from typing import Optional, Tuple, Union
4
+
5
+ import zmq
6
+ import zmq.auth
7
+ from zmq.auth.thread import ThreadAuthenticator
8
+
9
+
10
+ def create_certificates(base_dir: Union[str, os.PathLike]):
11
+ """Create server and client certificates in a private directory.
12
+
13
+ This will overwrite existing certificate files.
14
+
15
+ Parameters
16
+ ----------
17
+ base_dir : str | os.PathLike
18
+ Parent directory of the private certificates directory.
19
+ """
20
+ cert_dir = os.path.join(base_dir, "certificates")
21
+ os.makedirs(cert_dir, mode=0o700, exist_ok=True)
22
+
23
+ zmq.auth.create_certificates(cert_dir, name="server")
24
+ zmq.auth.create_certificates(cert_dir, name="client")
25
+
26
+ return cert_dir
27
+
28
+
29
+ def _load_certificate(
30
+ cert_dir: Union[str, os.PathLike], name: str
31
+ ) -> Tuple[bytes, bytes]:
32
+ if os.stat(cert_dir).st_mode & 0o777 != 0o700:
33
+ raise OSError(f"The certificates directory must be private: {cert_dir}")
34
+
35
+ # pyzmq creates secret key files with the '.key_secret' extension
36
+ # Ref: https://github.com/zeromq/pyzmq/blob/ae615d4097ccfbc6b5c17de60355cbe6e00a6065/zmq/auth/certs.py#L73
37
+ secret_key_file = os.path.join(cert_dir, f"{name}.key_secret")
38
+ public_key, secret_key = zmq.auth.load_certificate(secret_key_file)
39
+ if secret_key is None:
40
+ raise ValueError(f"No secret key found in {secret_key_file}")
41
+
42
+ return public_key, secret_key
43
+
44
+
45
+ class BaseContext(metaclass=ABCMeta):
46
+ """Base CurveZMQ context"""
47
+
48
+ def __init__(self, cert_dir: Optional[Union[str, os.PathLike]]) -> None:
49
+ self.cert_dir = cert_dir
50
+ self._ctx = zmq.Context()
51
+
52
+ @property
53
+ def encrypted(self):
54
+ """Indicates whether encryption is enabled.
55
+
56
+ False (disabled) when self.cert_dir is set to None.
57
+ """
58
+ return self.cert_dir is not None
59
+
60
+ @property
61
+ def closed(self):
62
+ return self._ctx.closed
63
+
64
+ @abstractmethod
65
+ def socket(self, socket_type: int, *args, **kwargs) -> zmq.Socket:
66
+ """Create a socket associated with this context.
67
+
68
+ This method will apply all necessary certificates and socket options.
69
+
70
+ Parameters
71
+ ----------
72
+ socket_type : int
73
+ The socket type, which can be any of the 0MQ socket types: REQ, REP,
74
+ PUB, SUB, PAIR, DEALER, ROUTER, PULL, PUSH, etc.
75
+
76
+ args:
77
+ passed to the zmq.Context.socket method.
78
+
79
+ kwargs:
80
+ passed to the zmq.Context.socket method.
81
+ """
82
+ ...
83
+
84
+ def term(self):
85
+ """Terminate the context."""
86
+ self._ctx.term()
87
+
88
+ def destroy(self, linger: Optional[int] = None):
89
+ """Close all sockets associated with this context and then terminate
90
+ the context.
91
+
92
+ .. warning::
93
+
94
+ destroy involves calling ``zmq_close()``, which is **NOT** threadsafe.
95
+ If there are active sockets in other threads, this must not be called.
96
+
97
+ Parameters
98
+ ----------
99
+ linger : int, optional
100
+ If specified, set LINGER on sockets prior to closing them.
101
+ """
102
+ self._ctx.destroy(linger)
103
+
104
+ def recreate(self, linger: Optional[int] = None):
105
+ """Destroy then recreate the context.
106
+
107
+ Parameters
108
+ ----------
109
+ linger : int, optional
110
+ If specified, set LINGER on sockets prior to closing them.
111
+ """
112
+ self.destroy(linger)
113
+ self._ctx = zmq.Context()
114
+
115
+
116
+ class ServerContext(BaseContext):
117
+ """CurveZMQ server context
118
+
119
+ We create server sockets via the `ctx.socket` method, which automatically
120
+ applies the necessary certificates and socket options.
121
+
122
+ We handle client certificate authentication in a separate dedicated thread.
123
+
124
+ Parameters
125
+ ----------
126
+ cert_dir : str | os.PathLike | None
127
+ Path to the certificate directory. Setting this to None will disable encryption.
128
+ """
129
+
130
+ def __init__(self, cert_dir: Optional[Union[str, os.PathLike]]) -> None:
131
+ super().__init__(cert_dir)
132
+ self.auth_thread = None
133
+ if self.encrypted:
134
+ self.auth_thread = self._start_auth_thread()
135
+
136
+ def __del__(self):
137
+ # Avoid issues in which the auth_thread attr was
138
+ # previously deleted
139
+ if getattr(self, "auth_thread", None):
140
+ self.auth_thread.stop()
141
+
142
+ def _start_auth_thread(self) -> ThreadAuthenticator:
143
+ auth_thread = ThreadAuthenticator(self._ctx)
144
+ auth_thread.start()
145
+ # Only allow certs that are in the cert dir
146
+ assert self.cert_dir # For mypy
147
+ auth_thread.configure_curve(domain="*", location=self.cert_dir)
148
+ return auth_thread
149
+
150
+ def socket(self, socket_type: int, *args, **kwargs) -> zmq.Socket:
151
+ sock = self._ctx.socket(socket_type, *args, **kwargs)
152
+ if self.encrypted:
153
+ assert self.cert_dir # For mypy
154
+ _, secret_key = _load_certificate(self.cert_dir, name="server")
155
+ try:
156
+ # Only the clients need the server's public key to encrypt
157
+ # messages and verify the server's identity.
158
+ # Ref: http://curvezmq.org/page:read-the-docs
159
+ sock.setsockopt(zmq.CURVE_SECRETKEY, secret_key)
160
+ except zmq.ZMQError as e:
161
+ raise ValueError("Invalid CurveZMQ key format") from e
162
+ sock.setsockopt(zmq.CURVE_SERVER, True) # Must come before bind
163
+ return sock
164
+
165
+ def term(self):
166
+ if self.auth_thread:
167
+ self.auth_thread.stop()
168
+ super().term()
169
+
170
+ def destroy(self, linger: Optional[int] = None):
171
+ if self.auth_thread:
172
+ self.auth_thread.stop()
173
+ super().destroy(linger)
174
+
175
+ def recreate(self, linger: Optional[int] = None):
176
+ super().recreate(linger)
177
+ if self.auth_thread:
178
+ self.auth_thread = self._start_auth_thread()
179
+
180
+
181
+ class ClientContext(BaseContext):
182
+ """CurveZMQ client context
183
+
184
+ We create client sockets via the `ctx.socket` method, which automatically
185
+ applies the necessary certificates and socket options.
186
+
187
+ Parameters
188
+ ----------
189
+ cert_dir : str | os.PathLike | None
190
+ Path to the certificate directory. Setting this to None will disable encryption.
191
+ """
192
+
193
+ def socket(self, socket_type: int, *args, **kwargs) -> zmq.Socket:
194
+ sock = self._ctx.socket(socket_type, *args, **kwargs)
195
+ if self.encrypted:
196
+ assert self.cert_dir # For mypy
197
+ public_key, secret_key = _load_certificate(self.cert_dir, name="client")
198
+ server_public_key, _ = _load_certificate(self.cert_dir, name="server")
199
+ try:
200
+ sock.setsockopt(zmq.CURVE_PUBLICKEY, public_key)
201
+ sock.setsockopt(zmq.CURVE_SECRETKEY, secret_key)
202
+ sock.setsockopt(zmq.CURVE_SERVERKEY, server_public_key)
203
+ except zmq.ZMQError as e:
204
+ raise ValueError("Invalid CurveZMQ key format") from e
205
+ return sock
@@ -302,7 +302,7 @@ class DataFlowKernel:
302
302
  res = self._unwrap_remote_exception_wrapper(future)
303
303
 
304
304
  except Exception as e:
305
- logger.debug("Task {} try {} failed".format(task_id, task_record['try_id']))
305
+ logger.info(f"Task {task_id} try {task_record['try_id']} failed with exception of type {type(e).__name__}")
306
306
  # We keep the history separately, since the future itself could be
307
307
  # tossed.
308
308
  task_record['fail_history'].append(repr(e))
@@ -22,6 +22,7 @@ from parsl.executors.errors import (
22
22
  UnsupportedFeatureError
23
23
  )
24
24
 
25
+ from parsl import curvezmq
25
26
  from parsl.executors.status_handling import BlockProviderExecutor
26
27
  from parsl.providers.base import ExecutionProvider
27
28
  from parsl.data_provider.staging import Staging
@@ -174,6 +175,9 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
174
175
 
175
176
  worker_logdir_root : string
176
177
  In case of a remote file system, specify the path to where logs will be kept.
178
+
179
+ encrypted : bool
180
+ Flag to enable/disable encryption (CurveZMQ). Default is False.
177
181
  """
178
182
 
179
183
  @typeguard.typechecked
@@ -199,7 +203,8 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
199
203
  poll_period: int = 10,
200
204
  address_probe_timeout: Optional[int] = None,
201
205
  worker_logdir_root: Optional[str] = None,
202
- block_error_handler: Union[bool, Callable[[BlockProviderExecutor, Dict[str, JobStatus]], None]] = True):
206
+ block_error_handler: Union[bool, Callable[[BlockProviderExecutor, Dict[str, JobStatus]], None]] = True,
207
+ encrypted: bool = False):
203
208
 
204
209
  logger.debug("Initializing HighThroughputExecutor")
205
210
 
@@ -256,6 +261,8 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
256
261
  self.run_dir = '.'
257
262
  self.worker_logdir_root = worker_logdir_root
258
263
  self.cpu_affinity = cpu_affinity
264
+ self.encrypted = encrypted
265
+ self.cert_dir = None
259
266
 
260
267
  if not launch_cmd:
261
268
  launch_cmd = (
@@ -267,6 +274,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
267
274
  "--poll {poll_period} "
268
275
  "--task_port={task_port} "
269
276
  "--result_port={result_port} "
277
+ "--cert_dir {cert_dir} "
270
278
  "--logdir={logdir} "
271
279
  "--block_id={{block_id}} "
272
280
  "--hb_period={heartbeat_period} "
@@ -280,6 +288,16 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
280
288
 
281
289
  radio_mode = "htex"
282
290
 
291
+ @property
292
+ def logdir(self):
293
+ return "{}/{}".format(self.run_dir, self.label)
294
+
295
+ @property
296
+ def worker_logdir(self):
297
+ if self.worker_logdir_root is not None:
298
+ return "{}/{}".format(self.worker_logdir_root, self.label)
299
+ return self.logdir
300
+
283
301
  def initialize_scaling(self):
284
302
  """Compose the launch command and scale out the initial blocks.
285
303
  """
@@ -289,9 +307,6 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
289
307
  address_probe_timeout_string = ""
290
308
  if self.address_probe_timeout:
291
309
  address_probe_timeout_string = "--address_probe_timeout={}".format(self.address_probe_timeout)
292
- worker_logdir = "{}/{}".format(self.run_dir, self.label)
293
- if self.worker_logdir_root is not None:
294
- worker_logdir = "{}/{}".format(self.worker_logdir_root, self.label)
295
310
 
296
311
  l_cmd = self.launch_cmd.format(debug=debug_opts,
297
312
  prefetch_capacity=self.prefetch_capacity,
@@ -306,7 +321,8 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
306
321
  heartbeat_period=self.heartbeat_period,
307
322
  heartbeat_threshold=self.heartbeat_threshold,
308
323
  poll_period=self.poll_period,
309
- logdir=worker_logdir,
324
+ cert_dir=self.cert_dir,
325
+ logdir=self.worker_logdir,
310
326
  cpu_affinity=self.cpu_affinity,
311
327
  accelerators=" ".join(self.available_accelerators))
312
328
  self.launch_cmd = l_cmd
@@ -327,9 +343,25 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
327
343
  def start(self):
328
344
  """Create the Interchange process and connect to it.
329
345
  """
330
- self.outgoing_q = zmq_pipes.TasksOutgoing("127.0.0.1", self.interchange_port_range)
331
- self.incoming_q = zmq_pipes.ResultsIncoming("127.0.0.1", self.interchange_port_range)
332
- self.command_client = zmq_pipes.CommandClient("127.0.0.1", self.interchange_port_range)
346
+ if self.encrypted and self.cert_dir is None:
347
+ logger.debug("Creating CurveZMQ certificates")
348
+ self.cert_dir = curvezmq.create_certificates(self.logdir)
349
+ elif not self.encrypted and self.cert_dir:
350
+ raise AttributeError(
351
+ "The certificates directory path attribute (cert_dir) is defined, but the "
352
+ "encrypted attribute is set to False. You must either change cert_dir to "
353
+ "None or encrypted to True."
354
+ )
355
+
356
+ self.outgoing_q = zmq_pipes.TasksOutgoing(
357
+ curvezmq.ClientContext(self.cert_dir), "127.0.0.1", self.interchange_port_range
358
+ )
359
+ self.incoming_q = zmq_pipes.ResultsIncoming(
360
+ curvezmq.ClientContext(self.cert_dir), "127.0.0.1", self.interchange_port_range
361
+ )
362
+ self.command_client = zmq_pipes.CommandClient(
363
+ curvezmq.ClientContext(self.cert_dir), "127.0.0.1", self.interchange_port_range
364
+ )
333
365
 
334
366
  self._queue_management_thread = None
335
367
  self._start_queue_management_thread()
@@ -450,10 +482,11 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
450
482
  "worker_port_range": self.worker_port_range,
451
483
  "hub_address": self.hub_address,
452
484
  "hub_port": self.hub_port,
453
- "logdir": "{}/{}".format(self.run_dir, self.label),
485
+ "logdir": self.logdir,
454
486
  "heartbeat_threshold": self.heartbeat_threshold,
455
487
  "poll_period": self.poll_period,
456
- "logging_level": logging.DEBUG if self.worker_debug else logging.INFO
488
+ "logging_level": logging.DEBUG if self.worker_debug else logging.INFO,
489
+ "cert_dir": self.cert_dir,
457
490
  },
458
491
  daemon=True,
459
492
  name="HTEX-Interchange"
@@ -603,7 +636,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
603
636
  def workers_per_node(self) -> Union[int, float]:
604
637
  return self._workers_per_node
605
638
 
606
- def scale_in(self, blocks=None, block_ids=[], force=True, max_idletime=None):
639
+ def scale_in(self, blocks, force=True, max_idletime=None):
607
640
  """Scale in the number of active blocks by specified amount.
608
641
 
609
642
  The scale in method here is very rude. It doesn't give the workers
@@ -618,55 +651,51 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
618
651
 
619
652
  force : Bool
620
653
  Used along with blocks to indicate whether blocks should be terminated by force.
654
+
621
655
  When force = True, we will kill blocks regardless of the blocks being busy
622
- When force = False, Only idle blocks will be terminated.
623
- If the # of ``idle_blocks`` < ``blocks``, the list of jobs marked for termination
624
- will be in the range: 0 - ``blocks``.
656
+
657
+ When force = False, only idle blocks will be terminated. If the
658
+ number of idle blocks < ``blocks``, then fewer than ``blocks``
659
+ blocks will be terminated.
625
660
 
626
661
  max_idletime: float
627
662
  A time to indicate how long a block can be idle.
628
663
  Used along with force = False to kill blocks that have been idle for that long.
629
664
 
630
- block_ids : list
631
- List of specific block ids to terminate. Optional
632
-
633
665
  Returns
634
666
  -------
635
- List of job_ids marked for termination
667
+ List of block IDs scaled in
636
668
  """
637
- logger.debug(f"Scale in called, blocks={blocks}, block_ids={block_ids}")
638
- if block_ids:
639
- block_ids_to_kill = block_ids
669
+ logger.debug(f"Scale in called, blocks={blocks}")
670
+ managers = self.connected_managers()
671
+ block_info = {} # block id -> list( tasks, idle duration )
672
+ for manager in managers:
673
+ if not manager['active']:
674
+ continue
675
+ b_id = manager['block_id']
676
+ if b_id not in block_info:
677
+ block_info[b_id] = [0, float('inf')]
678
+ block_info[b_id][0] += manager['tasks']
679
+ block_info[b_id][1] = min(block_info[b_id][1], manager['idle_duration'])
680
+
681
+ sorted_blocks = sorted(block_info.items(), key=lambda item: (item[1][1], item[1][0]))
682
+ logger.debug(f"Scale in selecting from {len(sorted_blocks)} blocks")
683
+ if force is True:
684
+ block_ids_to_kill = [x[0] for x in sorted_blocks[:blocks]]
640
685
  else:
641
- managers = self.connected_managers()
642
- block_info = {} # block id -> list( tasks, idle duration )
643
- for manager in managers:
644
- if not manager['active']:
645
- continue
646
- b_id = manager['block_id']
647
- if b_id not in block_info:
648
- block_info[b_id] = [0, float('inf')]
649
- block_info[b_id][0] += manager['tasks']
650
- block_info[b_id][1] = min(block_info[b_id][1], manager['idle_duration'])
651
-
652
- sorted_blocks = sorted(block_info.items(), key=lambda item: (item[1][1], item[1][0]))
653
- logger.debug(f"Scale in selecting from {len(sorted_blocks)} blocks")
654
- if force is True:
655
- block_ids_to_kill = [x[0] for x in sorted_blocks[:blocks]]
686
+ if not max_idletime:
687
+ block_ids_to_kill = [x[0] for x in sorted_blocks if x[1][0] == 0][:blocks]
656
688
  else:
657
- if not max_idletime:
658
- block_ids_to_kill = [x[0] for x in sorted_blocks if x[1][0] == 0][:blocks]
659
- else:
660
- block_ids_to_kill = []
661
- for x in sorted_blocks:
662
- if x[1][1] > max_idletime and x[1][0] == 0:
663
- block_ids_to_kill.append(x[0])
664
- if len(block_ids_to_kill) == blocks:
665
- break
666
- logger.debug("Selected idle block ids to kill: {}".format(
667
- block_ids_to_kill))
668
- if len(block_ids_to_kill) < blocks:
669
- logger.warning(f"Could not find enough blocks to kill: wanted {blocks} but only selected {len(block_ids_to_kill)}")
689
+ block_ids_to_kill = []
690
+ for x in sorted_blocks:
691
+ if x[1][1] > max_idletime and x[1][0] == 0:
692
+ block_ids_to_kill.append(x[0])
693
+ if len(block_ids_to_kill) == blocks:
694
+ break
695
+ logger.debug("Selected idle block ids to kill: {}".format(
696
+ block_ids_to_kill))
697
+ if len(block_ids_to_kill) < blocks:
698
+ logger.warning(f"Could not find enough blocks to kill: wanted {blocks} but only selected {len(block_ids_to_kill)}")
670
699
 
671
700
  # Hold the block
672
701
  for block_id in block_ids_to_kill:
@@ -16,6 +16,7 @@ import json
16
16
 
17
17
  from typing import cast, Any, Dict, NoReturn, Sequence, Set, Optional, Tuple
18
18
 
19
+ from parsl import curvezmq
19
20
  from parsl.utils import setproctitle
20
21
  from parsl.version import VERSION as PARSL_VERSION
21
22
  from parsl.serialize import serialize as serialize_object
@@ -79,6 +80,7 @@ class Interchange:
79
80
  logdir: str = ".",
80
81
  logging_level: int = logging.INFO,
81
82
  poll_period: int = 10,
83
+ cert_dir: Optional[str] = None,
82
84
  ) -> None:
83
85
  """
84
86
  Parameters
@@ -120,7 +122,10 @@ class Interchange:
120
122
  poll_period : int
121
123
  The main thread polling period, in milliseconds. Default: 10ms
122
124
 
125
+ cert_dir : str | None
126
+ Path to the certificate directory. Default: None
123
127
  """
128
+ self.cert_dir = cert_dir
124
129
  self.logdir = logdir
125
130
  os.makedirs(self.logdir, exist_ok=True)
126
131
 
@@ -134,15 +139,15 @@ class Interchange:
134
139
 
135
140
  logger.info("Attempting connection to client at {} on ports: {},{},{}".format(
136
141
  client_address, client_ports[0], client_ports[1], client_ports[2]))
137
- self.context = zmq.Context()
138
- self.task_incoming = self.context.socket(zmq.DEALER)
142
+ self.zmq_context = curvezmq.ServerContext(self.cert_dir)
143
+ self.task_incoming = self.zmq_context.socket(zmq.DEALER)
139
144
  self.task_incoming.set_hwm(0)
140
145
  self.task_incoming.connect("tcp://{}:{}".format(client_address, client_ports[0]))
141
- self.results_outgoing = self.context.socket(zmq.DEALER)
146
+ self.results_outgoing = self.zmq_context.socket(zmq.DEALER)
142
147
  self.results_outgoing.set_hwm(0)
143
148
  self.results_outgoing.connect("tcp://{}:{}".format(client_address, client_ports[1]))
144
149
 
145
- self.command_channel = self.context.socket(zmq.REP)
150
+ self.command_channel = self.zmq_context.socket(zmq.REP)
146
151
  self.command_channel.connect("tcp://{}:{}".format(client_address, client_ports[2]))
147
152
  logger.info("Connected to client")
148
153
 
@@ -155,9 +160,9 @@ class Interchange:
155
160
  self.worker_ports = worker_ports
156
161
  self.worker_port_range = worker_port_range
157
162
 
158
- self.task_outgoing = self.context.socket(zmq.ROUTER)
163
+ self.task_outgoing = self.zmq_context.socket(zmq.ROUTER)
159
164
  self.task_outgoing.set_hwm(0)
160
- self.results_incoming = self.context.socket(zmq.ROUTER)
165
+ self.results_incoming = self.zmq_context.socket(zmq.ROUTER)
161
166
  self.results_incoming.set_hwm(0)
162
167
 
163
168
  if self.worker_ports:
@@ -241,7 +246,8 @@ class Interchange:
241
246
  def _create_monitoring_channel(self) -> Optional[zmq.Socket]:
242
247
  if self.hub_address and self.hub_port:
243
248
  logger.info("Connecting to monitoring")
244
- hub_channel = self.context.socket(zmq.DEALER)
249
+ # This is a one-off because monitoring is unencrypted
250
+ hub_channel = zmq.Context().socket(zmq.DEALER)
245
251
  hub_channel.set_hwm(0)
246
252
  hub_channel.connect("tcp://{}:{}".format(self.hub_address, self.hub_port))
247
253
  logger.info("Monitoring enabled and connected to hub")
@@ -379,6 +385,7 @@ class Interchange:
379
385
  self.expire_bad_managers(interesting_managers, hub_channel)
380
386
  self.process_tasks_to_send(interesting_managers)
381
387
 
388
+ self.zmq_context.destroy()
382
389
  delta = time.time() - start
383
390
  logger.info("Processed {} tasks in {} seconds".format(self.count, delta))
384
391
  logger.warning("Exiting")
@@ -20,8 +20,8 @@ import multiprocessing
20
20
  from multiprocessing.managers import DictProxy
21
21
  from multiprocessing.sharedctypes import Synchronized
22
22
 
23
+ from parsl import curvezmq
23
24
  from parsl.process_loggers import wrap_with_logs
24
-
25
25
  from parsl.version import VERSION as PARSL_VERSION
26
26
  from parsl.app.errors import RemoteExceptionWrapper
27
27
  from parsl.executors.high_throughput.errors import WorkerLost
@@ -63,7 +63,8 @@ class Manager:
63
63
  heartbeat_period,
64
64
  poll_period,
65
65
  cpu_affinity,
66
- available_accelerators: Sequence[str]):
66
+ available_accelerators: Sequence[str],
67
+ cert_dir: Optional[str]):
67
68
  """
68
69
  Parameters
69
70
  ----------
@@ -118,6 +119,8 @@ class Manager:
118
119
  available_accelerators: list of str
119
120
  List of accelerators available to the workers.
120
121
 
122
+ cert_dir : str | None
123
+ Path to the certificate directory.
121
124
  """
122
125
 
123
126
  logger.info("Manager started")
@@ -137,15 +140,16 @@ class Manager:
137
140
  print("Failed to find a viable address to connect to interchange. Exiting")
138
141
  exit(5)
139
142
 
140
- self.context = zmq.Context()
141
- self.task_incoming = self.context.socket(zmq.DEALER)
143
+ self.cert_dir = cert_dir
144
+ self.zmq_context = curvezmq.ClientContext(self.cert_dir)
145
+ self.task_incoming = self.zmq_context.socket(zmq.DEALER)
142
146
  self.task_incoming.setsockopt(zmq.IDENTITY, uid.encode('utf-8'))
143
147
  # Linger is set to 0, so that the manager can exit even when there might be
144
148
  # messages in the pipe
145
149
  self.task_incoming.setsockopt(zmq.LINGER, 0)
146
150
  self.task_incoming.connect(task_q_url)
147
151
 
148
- self.result_outgoing = self.context.socket(zmq.DEALER)
152
+ self.result_outgoing = self.zmq_context.socket(zmq.DEALER)
149
153
  self.result_outgoing.setsockopt(zmq.IDENTITY, uid.encode('utf-8'))
150
154
  self.result_outgoing.setsockopt(zmq.LINGER, 0)
151
155
  self.result_outgoing.connect(result_q_url)
@@ -468,7 +472,7 @@ class Manager:
468
472
 
469
473
  self.task_incoming.close()
470
474
  self.result_outgoing.close()
471
- self.context.term()
475
+ self.zmq_context.term()
472
476
  delta = time.time() - start
473
477
  logger.info("process_worker_pool ran for {} seconds".format(delta))
474
478
  return
@@ -720,6 +724,8 @@ if __name__ == "__main__":
720
724
  help="Enable logging at DEBUG level")
721
725
  parser.add_argument("-a", "--addresses", default='',
722
726
  help="Comma separated list of addresses at which the interchange could be reached")
727
+ parser.add_argument("--cert_dir", required=True,
728
+ help="Path to certificate directory.")
723
729
  parser.add_argument("-l", "--logdir", default="process_worker_pool_logs",
724
730
  help="Process worker pool log directory")
725
731
  parser.add_argument("-u", "--uid", default=str(uuid.uuid4()).split('-')[-1],
@@ -773,6 +779,7 @@ if __name__ == "__main__":
773
779
 
774
780
  logger.info("Python version: {}".format(sys.version))
775
781
  logger.info("Debug logging: {}".format(args.debug))
782
+ logger.info("Certificates dir: {}".format(args.cert_dir))
776
783
  logger.info("Log dir: {}".format(args.logdir))
777
784
  logger.info("Manager ID: {}".format(args.uid))
778
785
  logger.info("Block ID: {}".format(args.block_id))
@@ -804,7 +811,8 @@ if __name__ == "__main__":
804
811
  heartbeat_period=int(args.hb_period),
805
812
  poll_period=int(args.poll),
806
813
  cpu_affinity=args.cpu_affinity,
807
- available_accelerators=args.available_accelerators)
814
+ available_accelerators=args.available_accelerators,
815
+ cert_dir=None if args.cert_dir == "None" else args.cert_dir)
808
816
  manager.start()
809
817
 
810
818
  except Exception: