parsl 2024.8.12__tar.gz → 2024.8.19__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 (476) hide show
  1. {parsl-2024.8.12/parsl.egg-info → parsl-2024.8.19}/PKG-INFO +3 -2
  2. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/channels/oauth_ssh/oauth_ssh.py +10 -2
  3. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/channels/ssh/ssh.py +16 -6
  4. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/channels/ssh_il/ssh_il.py +12 -2
  5. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/high_throughput/executor.py +16 -26
  6. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/high_throughput/mpi_executor.py +23 -2
  7. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/high_throughput/mpi_prefix_composer.py +5 -4
  8. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/db_manager.py +26 -39
  9. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/monitoring.py +8 -3
  10. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/router.py +15 -12
  11. parsl-2024.8.19/parsl/tests/test_htex/test_resource_spec_validation.py +40 -0
  12. parsl-2024.8.19/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +48 -0
  13. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +16 -8
  14. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_mpi_apps/test_mpiex.py +2 -3
  15. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_mpi_apps/test_resource_spec.py +39 -41
  16. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/version.py +1 -1
  17. {parsl-2024.8.12 → parsl-2024.8.19/parsl.egg-info}/PKG-INFO +3 -2
  18. {parsl-2024.8.12 → parsl-2024.8.19}/parsl.egg-info/SOURCES.txt +1 -1
  19. {parsl-2024.8.12 → parsl-2024.8.19}/parsl.egg-info/requires.txt +4 -1
  20. {parsl-2024.8.12 → parsl-2024.8.19}/requirements.txt +0 -1
  21. {parsl-2024.8.12 → parsl-2024.8.19}/setup.py +1 -0
  22. parsl-2024.8.12/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -33
  23. parsl-2024.8.12/parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py +0 -47
  24. {parsl-2024.8.12 → parsl-2024.8.19}/LICENSE +0 -0
  25. {parsl-2024.8.12 → parsl-2024.8.19}/MANIFEST.in +0 -0
  26. {parsl-2024.8.12 → parsl-2024.8.19}/README.rst +0 -0
  27. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/__init__.py +0 -0
  28. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/addresses.py +0 -0
  29. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/app/__init__.py +0 -0
  30. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/app/app.py +0 -0
  31. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/app/bash.py +0 -0
  32. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/app/errors.py +0 -0
  33. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/app/futures.py +0 -0
  34. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/app/python.py +0 -0
  35. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/benchmark/__init__.py +0 -0
  36. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/benchmark/perf.py +0 -0
  37. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/channels/__init__.py +0 -0
  38. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/channels/base.py +0 -0
  39. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/channels/errors.py +0 -0
  40. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/channels/local/__init__.py +0 -0
  41. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/channels/local/local.py +0 -0
  42. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/channels/oauth_ssh/__init__.py +0 -0
  43. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/channels/ssh/__init__.py +0 -0
  44. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/channels/ssh_il/__init__.py +0 -0
  45. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/concurrent/__init__.py +0 -0
  46. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/config.py +0 -0
  47. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/ASPIRE1.py +0 -0
  48. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/Azure.py +0 -0
  49. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/__init__.py +0 -0
  50. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/bridges.py +0 -0
  51. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/cc_in2p3.py +0 -0
  52. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/ec2.py +0 -0
  53. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/expanse.py +0 -0
  54. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/frontera.py +0 -0
  55. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/htex_local.py +0 -0
  56. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/illinoiscluster.py +0 -0
  57. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/kubernetes.py +0 -0
  58. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/local_threads.py +0 -0
  59. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/midway.py +0 -0
  60. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/osg.py +0 -0
  61. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/polaris.py +0 -0
  62. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/stampede2.py +0 -0
  63. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/summit.py +0 -0
  64. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/toss3_llnl.py +0 -0
  65. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/vineex_local.py +0 -0
  66. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/configs/wqex_local.py +0 -0
  67. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/curvezmq.py +0 -0
  68. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/data_provider/__init__.py +0 -0
  69. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/data_provider/data_manager.py +0 -0
  70. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/data_provider/file_noop.py +0 -0
  71. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/data_provider/files.py +0 -0
  72. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/data_provider/ftp.py +0 -0
  73. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/data_provider/globus.py +0 -0
  74. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/data_provider/http.py +0 -0
  75. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/data_provider/rsync.py +0 -0
  76. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/data_provider/staging.py +0 -0
  77. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/data_provider/zip.py +0 -0
  78. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/dataflow/__init__.py +0 -0
  79. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/dataflow/dependency_resolvers.py +0 -0
  80. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/dataflow/dflow.py +0 -0
  81. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/dataflow/errors.py +0 -0
  82. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/dataflow/futures.py +0 -0
  83. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/dataflow/memoization.py +0 -0
  84. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/dataflow/rundirs.py +0 -0
  85. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/dataflow/states.py +0 -0
  86. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/dataflow/taskrecord.py +0 -0
  87. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/errors.py +0 -0
  88. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/__init__.py +0 -0
  89. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/base.py +0 -0
  90. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/errors.py +0 -0
  91. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/flux/__init__.py +0 -0
  92. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/flux/execute_parsl_task.py +0 -0
  93. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/flux/executor.py +0 -0
  94. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/flux/flux_instance_manager.py +0 -0
  95. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/high_throughput/__init__.py +0 -0
  96. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/high_throughput/errors.py +0 -0
  97. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/high_throughput/interchange.py +0 -0
  98. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/high_throughput/manager_record.py +0 -0
  99. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/high_throughput/manager_selector.py +0 -0
  100. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  101. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
  102. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/high_throughput/probe.py +0 -0
  103. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
  104. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
  105. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/radical/__init__.py +0 -0
  106. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/radical/executor.py +0 -0
  107. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/radical/rpex_resources.py +0 -0
  108. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/radical/rpex_worker.py +0 -0
  109. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/status_handling.py +0 -0
  110. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/taskvine/__init__.py +0 -0
  111. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/taskvine/errors.py +0 -0
  112. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  113. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/taskvine/executor.py +0 -0
  114. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/taskvine/factory.py +0 -0
  115. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/taskvine/factory_config.py +0 -0
  116. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/taskvine/manager.py +0 -0
  117. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/taskvine/manager_config.py +0 -0
  118. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/taskvine/utils.py +0 -0
  119. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/threads.py +0 -0
  120. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/workqueue/__init__.py +0 -0
  121. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/workqueue/errors.py +0 -0
  122. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  123. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/workqueue/executor.py +0 -0
  124. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  125. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  126. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/jobs/__init__.py +0 -0
  127. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/jobs/error_handlers.py +0 -0
  128. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/jobs/errors.py +0 -0
  129. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/jobs/job_status_poller.py +0 -0
  130. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/jobs/states.py +0 -0
  131. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/jobs/strategy.py +0 -0
  132. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/launchers/__init__.py +0 -0
  133. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/launchers/base.py +0 -0
  134. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/launchers/errors.py +0 -0
  135. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/launchers/launchers.py +0 -0
  136. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/log_utils.py +0 -0
  137. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/__init__.py +0 -0
  138. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/errors.py +0 -0
  139. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/message_type.py +0 -0
  140. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/queries/__init__.py +0 -0
  141. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/queries/pandas.py +0 -0
  142. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/radios.py +0 -0
  143. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/remote.py +0 -0
  144. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/types.py +0 -0
  145. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/__init__.py +0 -0
  146. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/app.py +0 -0
  147. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/models.py +0 -0
  148. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  149. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  150. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  151. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  152. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  153. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  154. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  155. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/templates/app.html +0 -0
  156. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/templates/dag.html +0 -0
  157. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/templates/error.html +0 -0
  158. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/templates/layout.html +0 -0
  159. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  160. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/templates/task.html +0 -0
  161. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  162. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  163. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/utils.py +0 -0
  164. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/version.py +0 -0
  165. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/monitoring/visualization/views.py +0 -0
  166. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/multiprocessing.py +0 -0
  167. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/process_loggers.py +0 -0
  168. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/__init__.py +0 -0
  169. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/ad_hoc/__init__.py +0 -0
  170. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/ad_hoc/ad_hoc.py +0 -0
  171. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/aws/__init__.py +0 -0
  172. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/aws/aws.py +0 -0
  173. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/aws/template.py +0 -0
  174. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/azure/__init__.py +0 -0
  175. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/azure/azure.py +0 -0
  176. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/azure/template.py +0 -0
  177. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/base.py +0 -0
  178. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/cluster_provider.py +0 -0
  179. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/cobalt/__init__.py +0 -0
  180. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/cobalt/cobalt.py +0 -0
  181. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/cobalt/template.py +0 -0
  182. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/condor/__init__.py +0 -0
  183. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/condor/condor.py +0 -0
  184. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/condor/template.py +0 -0
  185. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/errors.py +0 -0
  186. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/googlecloud/__init__.py +0 -0
  187. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/googlecloud/googlecloud.py +0 -0
  188. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/grid_engine/__init__.py +0 -0
  189. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/grid_engine/grid_engine.py +0 -0
  190. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/grid_engine/template.py +0 -0
  191. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/kubernetes/__init__.py +0 -0
  192. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/kubernetes/kube.py +0 -0
  193. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/kubernetes/template.py +0 -0
  194. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/local/__init__.py +0 -0
  195. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/local/local.py +0 -0
  196. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/lsf/__init__.py +0 -0
  197. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/lsf/lsf.py +0 -0
  198. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/lsf/template.py +0 -0
  199. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/pbspro/__init__.py +0 -0
  200. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/pbspro/pbspro.py +0 -0
  201. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/pbspro/template.py +0 -0
  202. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/slurm/__init__.py +0 -0
  203. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/slurm/slurm.py +0 -0
  204. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/slurm/template.py +0 -0
  205. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/torque/__init__.py +0 -0
  206. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/torque/template.py +0 -0
  207. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/providers/torque/torque.py +0 -0
  208. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/py.typed +0 -0
  209. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/serialize/__init__.py +0 -0
  210. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/serialize/base.py +0 -0
  211. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/serialize/concretes.py +0 -0
  212. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/serialize/errors.py +0 -0
  213. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/serialize/facade.py +0 -0
  214. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/serialize/proxystore.py +0 -0
  215. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/__init__.py +0 -0
  216. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/callables_helper.py +0 -0
  217. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/__init__.py +0 -0
  218. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/azure_single_node.py +0 -0
  219. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/bluewaters.py +0 -0
  220. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/bridges.py +0 -0
  221. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/cc_in2p3.py +0 -0
  222. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/comet.py +0 -0
  223. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/cooley_htex.py +0 -0
  224. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/ec2_single_node.py +0 -0
  225. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/ec2_spot.py +0 -0
  226. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/flux_local.py +0 -0
  227. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/frontera.py +0 -0
  228. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/htex_local.py +0 -0
  229. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/htex_local_alternate.py +0 -0
  230. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  231. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  232. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/local_adhoc.py +0 -0
  233. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/local_radical.py +0 -0
  234. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/local_radical_mpi.py +0 -0
  235. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/local_threads.py +0 -0
  236. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  237. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  238. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
  239. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  240. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  241. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/local_threads_globus.py +0 -0
  242. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  243. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/local_threads_monitoring.py +0 -0
  244. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/local_threads_no_cache.py +0 -0
  245. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/midway.py +0 -0
  246. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/nscc_singapore.py +0 -0
  247. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/osg_htex.py +0 -0
  248. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/petrelkube.py +0 -0
  249. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/summit.py +0 -0
  250. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/taskvine_ex.py +0 -0
  251. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/theta.py +0 -0
  252. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/user_opts.py +0 -0
  253. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/configs/workqueue_ex.py +0 -0
  254. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/conftest.py +0 -0
  255. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/integration/__init__.py +0 -0
  256. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/integration/latency.py +0 -0
  257. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/integration/test_apps/__init__.py +0 -0
  258. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/integration/test_channels/__init__.py +0 -0
  259. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/integration/test_channels/test_channels.py +0 -0
  260. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/integration/test_channels/test_local_channel.py +0 -0
  261. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  262. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/integration/test_stress/__init__.py +0 -0
  263. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  264. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  265. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/manual_tests/__init__.py +0 -0
  266. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/manual_tests/htex_local.py +0 -0
  267. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/manual_tests/test_basic.py +0 -0
  268. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -0
  269. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  270. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  271. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  272. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
  273. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  274. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/scaling_tests/__init__.py +0 -0
  275. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/scaling_tests/htex_local.py +0 -0
  276. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/scaling_tests/local_threads.py +0 -0
  277. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/scaling_tests/test_scale.py +0 -0
  278. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
  279. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/scaling_tests/vineex_local.py +0 -0
  280. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
  281. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/scaling_tests/wqex_local.py +0 -0
  282. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/site_tests/__init__.py +0 -0
  283. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/site_tests/site_config_selector.py +0 -0
  284. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/site_tests/test_provider.py +0 -0
  285. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/site_tests/test_site.py +0 -0
  286. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/sites/__init__.py +0 -0
  287. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/sites/test_affinity.py +0 -0
  288. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/sites/test_concurrent.py +0 -0
  289. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  290. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/sites/test_ec2.py +0 -0
  291. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/sites/test_launchers.py +0 -0
  292. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/sites/test_local_adhoc.py +0 -0
  293. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  294. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/sites/test_worker_info.py +0 -0
  295. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_aalst_patterns.py +0 -0
  296. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_bash_apps/__init__.py +0 -0
  297. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  298. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  299. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  300. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
  301. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  302. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  303. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  304. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  305. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  306. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  307. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  308. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
  309. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  310. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_callables.py +0 -0
  311. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_channels/__init__.py +0 -0
  312. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_channels/test_dfk_close.py +0 -0
  313. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_channels/test_large_output.py +0 -0
  314. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_checkpointing/__init__.py +0 -0
  315. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  316. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  317. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  318. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
  319. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  320. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  321. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  322. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  323. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_curvezmq.py +0 -0
  324. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_docs/__init__.py +0 -0
  325. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_docs/test_from_slides.py +0 -0
  326. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_docs/test_kwargs.py +0 -0
  327. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  328. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_docs/test_workflow1.py +0 -0
  329. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_docs/test_workflow2.py +0 -0
  330. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_docs/test_workflow4.py +0 -0
  331. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_error_handling/__init__.py +0 -0
  332. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_error_handling/test_fail.py +0 -0
  333. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  334. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
  335. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  336. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_error_handling/test_retries.py +0 -0
  337. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  338. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  339. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  340. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  341. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  342. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_flux.py +0 -0
  343. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_htex/__init__.py +0 -0
  344. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_htex/test_basic.py +0 -0
  345. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
  346. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
  347. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  348. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
  349. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
  350. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_htex/test_drain.py +0 -0
  351. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_htex/test_htex.py +0 -0
  352. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_htex/test_manager_failure.py +0 -0
  353. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_htex/test_managers_command.py +0 -0
  354. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_htex/test_missing_worker.py +0 -0
  355. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
  356. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_htex/test_worker_failure.py +0 -0
  357. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
  358. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_monitoring/__init__.py +0 -0
  359. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_monitoring/test_app_names.py +0 -0
  360. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_monitoring/test_basic.py +0 -0
  361. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  362. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
  363. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
  364. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
  365. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  366. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
  367. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  368. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_mpi_apps/__init__.py +0 -0
  369. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
  370. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
  371. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_providers/__init__.py +0 -0
  372. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_providers/test_cobalt_deprecation_warning.py +0 -0
  373. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_providers/test_local_provider.py +0 -0
  374. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
  375. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  376. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_providers/test_slurm_template.py +0 -0
  377. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  378. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/__init__.py +0 -0
  379. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  380. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_basic.py +0 -0
  381. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
  382. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  383. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  384. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
  385. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  386. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_fail.py +0 -0
  387. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  388. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  389. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_futures.py +0 -0
  390. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
  391. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  392. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
  393. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_join.py +0 -0
  394. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  395. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  396. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  397. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  398. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  399. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  400. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  401. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  402. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  403. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_overview.py +0 -0
  404. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  405. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
  406. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_simple.py +0 -0
  407. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  408. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_python_apps/test_type5.py +0 -0
  409. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_radical/__init__.py +0 -0
  410. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
  411. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_regression/__init__.py +0 -0
  412. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_regression/test_1480.py +0 -0
  413. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  414. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_regression/test_1653.py +0 -0
  415. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_regression/test_221.py +0 -0
  416. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_regression/test_226.py +0 -0
  417. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_regression/test_2652.py +0 -0
  418. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_regression/test_69a.py +0 -0
  419. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_regression/test_854.py +0 -0
  420. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  421. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_regression/test_98.py +0 -0
  422. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_scaling/__init__.py +0 -0
  423. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  424. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  425. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_scaling/test_scale_down.py +0 -0
  426. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
  427. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
  428. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
  429. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_serialization/__init__.py +0 -0
  430. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  431. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
  432. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_serialization/test_basic.py +0 -0
  433. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
  434. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
  435. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  436. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  437. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_shutdown/__init__.py +0 -0
  438. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
  439. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/__init__.py +0 -0
  440. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/staging_provider.py +0 -0
  441. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/test_1316.py +0 -0
  442. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/test_docs_1.py +0 -0
  443. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/test_docs_2.py +0 -0
  444. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  445. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/test_file.py +0 -0
  446. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/test_file_apps.py +0 -0
  447. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/test_file_staging.py +0 -0
  448. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
  449. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  450. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  451. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  452. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/test_staging_https.py +0 -0
  453. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
  454. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/test_zip_in.py +0 -0
  455. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/test_zip_out.py +0 -0
  456. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
  457. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_summary.py +0 -0
  458. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_thread_parallelism.py +0 -0
  459. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_threads/__init__.py +0 -0
  460. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_threads/test_configs.py +0 -0
  461. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  462. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_utils/__init__.py +0 -0
  463. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
  464. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/unit/__init__.py +0 -0
  465. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/unit/test_file.py +0 -0
  466. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/unit/test_usage_tracking.py +0 -0
  467. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/tests/utils.py +0 -0
  468. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/usage_tracking/__init__.py +0 -0
  469. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/usage_tracking/api.py +0 -0
  470. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/usage_tracking/levels.py +0 -0
  471. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/usage_tracking/usage.py +0 -0
  472. {parsl-2024.8.12 → parsl-2024.8.19}/parsl/utils.py +0 -0
  473. {parsl-2024.8.12 → parsl-2024.8.19}/parsl.egg-info/dependency_links.txt +0 -0
  474. {parsl-2024.8.12 → parsl-2024.8.19}/parsl.egg-info/entry_points.txt +0 -0
  475. {parsl-2024.8.12 → parsl-2024.8.19}/parsl.egg-info/top_level.txt +0 -0
  476. {parsl-2024.8.12 → parsl-2024.8.19}/setup.cfg +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2024.8.12
3
+ Version: 2024.8.19
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.08.12.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2024.08.19.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -30,6 +30,7 @@ Provides-Extra: workqueue
30
30
  Provides-Extra: flux
31
31
  Provides-Extra: proxystore
32
32
  Provides-Extra: radical-pilot
33
+ Provides-Extra: ssh
33
34
  Provides-Extra: all
34
35
  License-File: LICENSE
35
36
 
@@ -1,11 +1,15 @@
1
1
  import logging
2
2
  import socket
3
3
 
4
- import paramiko
5
-
6
4
  from parsl.channels.ssh.ssh import DeprecatedSSHChannel
7
5
  from parsl.errors import OptionalModuleMissing
8
6
 
7
+ try:
8
+ import paramiko
9
+ _ssh_enabled = True
10
+ except (ImportError, NameError, FileNotFoundError):
11
+ _ssh_enabled = False
12
+
9
13
  try:
10
14
  from oauth_ssh.oauth_ssh_token import find_access_token
11
15
  from oauth_ssh.ssh_service import SSHService
@@ -38,6 +42,10 @@ class DeprecatedOAuthSSHChannel(DeprecatedSSHChannel):
38
42
 
39
43
  Raises:
40
44
  '''
45
+ if not _ssh_enabled:
46
+ raise OptionalModuleMissing(['ssh'],
47
+ "OauthSSHChannel requires the ssh module and config.")
48
+
41
49
  if not _oauth_ssh_enabled:
42
50
  raise OptionalModuleMissing(['oauth_ssh'],
43
51
  "OauthSSHChannel requires oauth_ssh module and config.")
@@ -2,8 +2,6 @@ import errno
2
2
  import logging
3
3
  import os
4
4
 
5
- import paramiko
6
-
7
5
  from parsl.channels.base import Channel
8
6
  from parsl.channels.errors import (
9
7
  AuthException,
@@ -13,15 +11,24 @@ from parsl.channels.errors import (
13
11
  FileCopyException,
14
12
  SSHException,
15
13
  )
14
+ from parsl.errors import OptionalModuleMissing
16
15
  from parsl.utils import RepresentationMixin
17
16
 
17
+ try:
18
+ import paramiko
19
+ _ssh_enabled = True
20
+ except (ImportError, NameError, FileNotFoundError):
21
+ _ssh_enabled = False
22
+
23
+
18
24
  logger = logging.getLogger(__name__)
19
25
 
20
26
 
21
- class NoAuthSSHClient(paramiko.SSHClient):
22
- def _auth(self, username, *args):
23
- self._transport.auth_none(username)
24
- return
27
+ if _ssh_enabled:
28
+ class NoAuthSSHClient(paramiko.SSHClient):
29
+ def _auth(self, username, *args):
30
+ self._transport.auth_none(username)
31
+ return
25
32
 
26
33
 
27
34
  class DeprecatedSSHChannel(Channel, RepresentationMixin):
@@ -53,6 +60,9 @@ class DeprecatedSSHChannel(Channel, RepresentationMixin):
53
60
 
54
61
  Raises:
55
62
  '''
63
+ if not _ssh_enabled:
64
+ raise OptionalModuleMissing(['ssh'],
65
+ "SSHChannel requires the ssh module and config.")
56
66
 
57
67
  self.hostname = hostname
58
68
  self.username = username
@@ -1,9 +1,15 @@
1
1
  import getpass
2
2
  import logging
3
3
 
4
- import paramiko
5
-
6
4
  from parsl.channels.ssh.ssh import DeprecatedSSHChannel
5
+ from parsl.errors import OptionalModuleMissing
6
+
7
+ try:
8
+ import paramiko
9
+ _ssh_enabled = True
10
+ except (ImportError, NameError, FileNotFoundError):
11
+ _ssh_enabled = False
12
+
7
13
 
8
14
  logger = logging.getLogger(__name__)
9
15
 
@@ -30,6 +36,10 @@ class DeprecatedSSHInteractiveLoginChannel(DeprecatedSSHChannel):
30
36
 
31
37
  Raises:
32
38
  '''
39
+ if not _ssh_enabled:
40
+ raise OptionalModuleMissing(['ssh'],
41
+ "SSHInteractiveLoginChannel requires the ssh module and config.")
42
+
33
43
  self.hostname = hostname
34
44
  self.username = username
35
45
  self.password = password
@@ -12,7 +12,6 @@ from typing import Callable, Dict, List, Optional, Sequence, Tuple, Union
12
12
 
13
13
  import typeguard
14
14
 
15
- import parsl.launchers
16
15
  from parsl import curvezmq
17
16
  from parsl.addresses import get_all_addresses
18
17
  from parsl.app.errors import RemoteExceptionWrapper
@@ -25,8 +24,7 @@ from parsl.executors.high_throughput.manager_selector import (
25
24
  RandomManagerSelector,
26
25
  )
27
26
  from parsl.executors.high_throughput.mpi_prefix_composer import (
28
- VALID_LAUNCHERS,
29
- validate_resource_spec,
27
+ InvalidResourceSpecification,
30
28
  )
31
29
  from parsl.executors.status_handling import BlockProviderExecutor
32
30
  from parsl.jobs.states import TERMINAL_STATES, JobState, JobStatus
@@ -224,17 +222,6 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
224
222
  Parsl will create names as integers starting with 0.
225
223
 
226
224
  default: empty list
227
-
228
- enable_mpi_mode: bool
229
- If enabled, MPI launch prefixes will be composed for the batch scheduler based on
230
- the nodes available in each batch job and the resource_specification dict passed
231
- from the app. This is an experimental feature, please refer to the following doc section
232
- before use: https://parsl.readthedocs.io/en/stable/userguide/mpi_apps.html
233
-
234
- mpi_launcher: str
235
- This field is only used if enable_mpi_mode is set. Select one from the
236
- list of supported MPI launchers = ("srun", "aprun", "mpiexec").
237
- default: "mpiexec"
238
225
  """
239
226
 
240
227
  @typeguard.typechecked
@@ -263,8 +250,6 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
263
250
  poll_period: int = 10,
264
251
  address_probe_timeout: Optional[int] = None,
265
252
  worker_logdir_root: Optional[str] = None,
266
- enable_mpi_mode: bool = False,
267
- mpi_launcher: str = "mpiexec",
268
253
  manager_selector: ManagerSelector = RandomManagerSelector(),
269
254
  block_error_handler: Union[bool, Callable[[BlockProviderExecutor, Dict[str, JobStatus]], None]] = True,
270
255
  encrypted: bool = False):
@@ -330,15 +315,6 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
330
315
  self.encrypted = encrypted
331
316
  self.cert_dir = None
332
317
 
333
- self.enable_mpi_mode = enable_mpi_mode
334
- assert mpi_launcher in VALID_LAUNCHERS, \
335
- f"mpi_launcher must be set to one of {VALID_LAUNCHERS}"
336
- if self.enable_mpi_mode:
337
- assert isinstance(self.provider.launcher, parsl.launchers.SimpleLauncher), \
338
- "mpi_mode requires the provider to be configured to use a SimpleLauncher"
339
-
340
- self.mpi_launcher = mpi_launcher
341
-
342
318
  if not launch_cmd:
343
319
  launch_cmd = DEFAULT_LAUNCH_CMD
344
320
  self.launch_cmd = launch_cmd
@@ -348,6 +324,8 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
348
324
  self.interchange_launch_cmd = interchange_launch_cmd
349
325
 
350
326
  radio_mode = "htex"
327
+ enable_mpi_mode: bool = False
328
+ mpi_launcher: str = "mpiexec"
351
329
 
352
330
  def _warn_deprecated(self, old: str, new: str):
353
331
  warnings.warn(
@@ -377,6 +355,18 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
377
355
  return "{}/{}".format(self.worker_logdir_root, self.label)
378
356
  return self.logdir
379
357
 
358
+ def validate_resource_spec(self, resource_specification: dict):
359
+ """HTEX does not support *any* resource_specification options and
360
+ will raise InvalidResourceSpecification is any are passed to it"""
361
+ if resource_specification:
362
+ raise InvalidResourceSpecification(
363
+ set(resource_specification.keys()),
364
+ ("HTEX does not support the supplied resource_specifications."
365
+ "For MPI applications consider using the MPIExecutor. "
366
+ "For specifications for core count/memory/walltime, consider using WorkQueueExecutor. ")
367
+ )
368
+ return
369
+
380
370
  def initialize_scaling(self):
381
371
  """Compose the launch command and scale out the initial blocks.
382
372
  """
@@ -660,7 +650,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
660
650
  Future
661
651
  """
662
652
 
663
- validate_resource_spec(resource_specification, self.enable_mpi_mode)
653
+ self.validate_resource_spec(resource_specification)
664
654
 
665
655
  if self.bad_state_is_set:
666
656
  raise self.executor_exception
@@ -8,8 +8,13 @@ from parsl.executors.high_throughput.executor import (
8
8
  GENERAL_HTEX_PARAM_DOCS,
9
9
  HighThroughputExecutor,
10
10
  )
11
+ from parsl.executors.high_throughput.mpi_prefix_composer import (
12
+ VALID_LAUNCHERS,
13
+ validate_resource_spec,
14
+ )
11
15
  from parsl.executors.status_handling import BlockProviderExecutor
12
16
  from parsl.jobs.states import JobStatus
17
+ from parsl.launchers import SimpleLauncher
13
18
  from parsl.providers import LocalProvider
14
19
  from parsl.providers.base import ExecutionProvider
15
20
 
@@ -30,6 +35,11 @@ class MPIExecutor(HighThroughputExecutor):
30
35
  max_workers_per_block: int
31
36
  Maximum number of MPI applications to run at once per block
32
37
 
38
+ mpi_launcher: str
39
+ Select one from the list of supported MPI launchers:
40
+ ("srun", "aprun", "mpiexec").
41
+ default: "mpiexec"
42
+
33
43
  {GENERAL_HTEX_PARAM_DOCS}
34
44
  """
35
45
 
@@ -60,7 +70,6 @@ class MPIExecutor(HighThroughputExecutor):
60
70
  super().__init__(
61
71
  # Hard-coded settings
62
72
  cores_per_worker=1e-9, # Ensures there will be at least an absurd number of workers
63
- enable_mpi_mode=True,
64
73
  max_workers_per_node=max_workers_per_block,
65
74
 
66
75
  # Everything else
@@ -82,9 +91,21 @@ class MPIExecutor(HighThroughputExecutor):
82
91
  poll_period=poll_period,
83
92
  address_probe_timeout=address_probe_timeout,
84
93
  worker_logdir_root=worker_logdir_root,
85
- mpi_launcher=mpi_launcher,
86
94
  block_error_handler=block_error_handler,
87
95
  encrypted=encrypted
88
96
  )
97
+ self.enable_mpi_mode = True
98
+ self.mpi_launcher = mpi_launcher
89
99
 
90
100
  self.max_workers_per_block = max_workers_per_block
101
+
102
+ if not isinstance(self.provider.launcher, SimpleLauncher):
103
+ raise TypeError("mpi_mode requires the provider to be configured to use a SimpleLauncher")
104
+
105
+ if mpi_launcher not in VALID_LAUNCHERS:
106
+ raise ValueError(f"mpi_launcher set to:{mpi_launcher} must be set to one of {VALID_LAUNCHERS}")
107
+
108
+ self.mpi_launcher = mpi_launcher
109
+
110
+ def validate_resource_spec(self, resource_specification: dict):
111
+ return validate_resource_spec(resource_specification)
@@ -21,14 +21,15 @@ class MissingResourceSpecification(Exception):
21
21
  class InvalidResourceSpecification(Exception):
22
22
  """Exception raised when Invalid input is supplied via resource specification"""
23
23
 
24
- def __init__(self, invalid_keys: Set[str]):
24
+ def __init__(self, invalid_keys: Set[str], message: str = ''):
25
25
  self.invalid_keys = invalid_keys
26
+ self.message = message
26
27
 
27
28
  def __str__(self):
28
- return f"Invalid resource specification options supplied: {self.invalid_keys}"
29
+ return f"Invalid resource specification options supplied: {self.invalid_keys} {self.message}"
29
30
 
30
31
 
31
- def validate_resource_spec(resource_spec: Dict[str, str], is_mpi_enabled: bool):
32
+ def validate_resource_spec(resource_spec: Dict[str, str]):
32
33
  """Basic validation of keys in the resource_spec
33
34
 
34
35
  Raises: InvalidResourceSpecification if the resource_spec
@@ -38,7 +39,7 @@ def validate_resource_spec(resource_spec: Dict[str, str], is_mpi_enabled: bool):
38
39
 
39
40
  # empty resource_spec when mpi_mode is set causes parsl to hang
40
41
  # ref issue #3427
41
- if is_mpi_enabled and len(user_keys) == 0:
42
+ if len(user_keys) == 0:
42
43
  raise MissingResourceSpecification('MPI mode requires optional parsl_resource_specification keyword argument to be configured')
43
44
 
44
45
  legal_keys = set(("ranks_per_node",
@@ -1,11 +1,14 @@
1
1
  import datetime
2
2
  import logging
3
+ import multiprocessing.queues as mpq
3
4
  import os
4
5
  import queue
5
6
  import threading
6
7
  import time
7
8
  from typing import Any, Dict, List, Optional, Set, Tuple, TypeVar, cast
8
9
 
10
+ import typeguard
11
+
9
12
  from parsl.dataflow.states import States
10
13
  from parsl.errors import OptionalModuleMissing
11
14
  from parsl.log_utils import set_file_logger
@@ -305,15 +308,15 @@ class DatabaseManager:
305
308
  self.pending_resource_queue: queue.Queue[MonitoringMessage] = queue.Queue()
306
309
 
307
310
  def start(self,
308
- priority_queue: "queue.Queue[TaggedMonitoringMessage]",
309
- node_queue: "queue.Queue[MonitoringMessage]",
310
- block_queue: "queue.Queue[MonitoringMessage]",
311
- resource_queue: "queue.Queue[MonitoringMessage]") -> None:
311
+ priority_queue: mpq.Queue,
312
+ node_queue: mpq.Queue,
313
+ block_queue: mpq.Queue,
314
+ resource_queue: mpq.Queue) -> None:
312
315
 
313
316
  self._kill_event = threading.Event()
314
317
  self._priority_queue_pull_thread = threading.Thread(target=self._migrate_logs_to_internal,
315
318
  args=(
316
- priority_queue, 'priority', self._kill_event,),
319
+ priority_queue, self._kill_event,),
317
320
  name="Monitoring-migrate-priority",
318
321
  daemon=True,
319
322
  )
@@ -321,7 +324,7 @@ class DatabaseManager:
321
324
 
322
325
  self._node_queue_pull_thread = threading.Thread(target=self._migrate_logs_to_internal,
323
326
  args=(
324
- node_queue, 'node', self._kill_event,),
327
+ node_queue, self._kill_event,),
325
328
  name="Monitoring-migrate-node",
326
329
  daemon=True,
327
330
  )
@@ -329,7 +332,7 @@ class DatabaseManager:
329
332
 
330
333
  self._block_queue_pull_thread = threading.Thread(target=self._migrate_logs_to_internal,
331
334
  args=(
332
- block_queue, 'block', self._kill_event,),
335
+ block_queue, self._kill_event,),
333
336
  name="Monitoring-migrate-block",
334
337
  daemon=True,
335
338
  )
@@ -337,7 +340,7 @@ class DatabaseManager:
337
340
 
338
341
  self._resource_queue_pull_thread = threading.Thread(target=self._migrate_logs_to_internal,
339
342
  args=(
340
- resource_queue, 'resource', self._kill_event,),
343
+ resource_queue, self._kill_event,),
341
344
  name="Monitoring-migrate-resource",
342
345
  daemon=True,
343
346
  )
@@ -574,43 +577,26 @@ class DatabaseManager:
574
577
  raise RuntimeError("An exception happened sometime during database processing and should have been logged in database_manager.log")
575
578
 
576
579
  @wrap_with_logs(target="database_manager")
577
- def _migrate_logs_to_internal(self, logs_queue: queue.Queue, queue_tag: str, kill_event: threading.Event) -> None:
578
- logger.info("Starting processing for queue {}".format(queue_tag))
580
+ def _migrate_logs_to_internal(self, logs_queue: queue.Queue, kill_event: threading.Event) -> None:
581
+ logger.info("Starting _migrate_logs_to_internal")
579
582
 
580
583
  while not kill_event.is_set() or logs_queue.qsize() != 0:
581
- logger.debug("""Checking STOP conditions for {} threads: {}, {}"""
582
- .format(queue_tag, kill_event.is_set(), logs_queue.qsize() != 0))
584
+ logger.debug("Checking STOP conditions: kill event: %s, queue has entries: %s",
585
+ kill_event.is_set(), logs_queue.qsize() != 0)
583
586
  try:
584
587
  x, addr = logs_queue.get(timeout=0.1)
585
588
  except queue.Empty:
586
589
  continue
587
590
  else:
588
- if queue_tag == 'priority' and x == 'STOP':
591
+ if x == 'STOP':
589
592
  self.close()
590
- elif queue_tag == 'priority': # implicitly not 'STOP'
591
- assert isinstance(x, tuple)
592
- assert len(x) == 2
593
- assert x[0] in [MessageType.WORKFLOW_INFO, MessageType.TASK_INFO], \
594
- "_migrate_logs_to_internal can only migrate WORKFLOW_,TASK_INFO message from priority queue, got x[0] == {}".format(x[0])
595
- self._dispatch_to_internal(x)
596
- elif queue_tag == 'resource':
597
- assert isinstance(x, tuple), "_migrate_logs_to_internal was expecting a tuple, got {}".format(x)
598
- assert x[0] == MessageType.RESOURCE_INFO, (
599
- "_migrate_logs_to_internal can only migrate RESOURCE_INFO message from resource queue, "
600
- "got tag {}, message {}".format(x[0], x)
601
- )
602
- self._dispatch_to_internal(x)
603
- elif queue_tag == 'node':
604
- assert len(x) == 2, "expected message tuple to have exactly two elements"
605
- assert x[0] == MessageType.NODE_INFO, "_migrate_logs_to_internal can only migrate NODE_INFO messages from node queue"
606
-
607
- self._dispatch_to_internal(x)
608
- elif queue_tag == "block":
609
- self._dispatch_to_internal(x)
610
593
  else:
611
- logger.error(f"Discarding because unknown queue tag '{queue_tag}', message: {x}")
594
+ self._dispatch_to_internal(x)
612
595
 
613
596
  def _dispatch_to_internal(self, x: Tuple) -> None:
597
+ assert isinstance(x, tuple)
598
+ assert len(x) == 2, "expected message tuple to have exactly two elements"
599
+
614
600
  if x[0] in [MessageType.WORKFLOW_INFO, MessageType.TASK_INFO]:
615
601
  self.pending_priority_queue.put(cast(Any, x))
616
602
  elif x[0] == MessageType.RESOURCE_INFO:
@@ -719,11 +705,12 @@ class DatabaseManager:
719
705
 
720
706
 
721
707
  @wrap_with_logs(target="database_manager")
722
- def dbm_starter(exception_q: "queue.Queue[Tuple[str, str]]",
723
- priority_msgs: "queue.Queue[TaggedMonitoringMessage]",
724
- node_msgs: "queue.Queue[MonitoringMessage]",
725
- block_msgs: "queue.Queue[MonitoringMessage]",
726
- resource_msgs: "queue.Queue[MonitoringMessage]",
708
+ @typeguard.typechecked
709
+ def dbm_starter(exception_q: mpq.Queue,
710
+ priority_msgs: mpq.Queue,
711
+ node_msgs: mpq.Queue,
712
+ block_msgs: mpq.Queue,
713
+ resource_msgs: mpq.Queue,
727
714
  db_url: str,
728
715
  logdir: str,
729
716
  logging_level: int) -> None:
@@ -154,9 +154,14 @@ class MonitoringHub(RepresentationMixin):
154
154
  self.router_exit_event = Event()
155
155
 
156
156
  self.router_proc = ForkProcess(target=router_starter,
157
- args=(comm_q, self.exception_q, self.priority_msgs, self.node_msgs,
158
- self.block_msgs, self.resource_msgs, self.router_exit_event),
159
- kwargs={"hub_address": self.hub_address,
157
+ kwargs={"comm_q": comm_q,
158
+ "exception_q": self.exception_q,
159
+ "priority_msgs": self.priority_msgs,
160
+ "node_msgs": self.node_msgs,
161
+ "block_msgs": self.block_msgs,
162
+ "resource_msgs": self.resource_msgs,
163
+ "exit_event": self.router_exit_event,
164
+ "hub_address": self.hub_address,
160
165
  "udp_port": self.hub_port,
161
166
  "zmq_port_range": self.hub_port_range,
162
167
  "logdir": self.logdir,
@@ -1,15 +1,16 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
+ import multiprocessing.queues as mpq
4
5
  import os
5
6
  import pickle
6
- import queue
7
7
  import socket
8
8
  import threading
9
9
  import time
10
10
  from multiprocessing.synchronize import Event
11
- from typing import Optional, Tuple, Union
11
+ from typing import Optional, Tuple
12
12
 
13
+ import typeguard
13
14
  import zmq
14
15
 
15
16
  from parsl.log_utils import set_file_logger
@@ -33,10 +34,10 @@ class MonitoringRouter:
33
34
  logdir: str = ".",
34
35
  logging_level: int = logging.INFO,
35
36
  atexit_timeout: int = 3, # in seconds
36
- priority_msgs: "queue.Queue[AddressedMonitoringMessage]",
37
- node_msgs: "queue.Queue[AddressedMonitoringMessage]",
38
- block_msgs: "queue.Queue[AddressedMonitoringMessage]",
39
- resource_msgs: "queue.Queue[AddressedMonitoringMessage]",
37
+ priority_msgs: mpq.Queue,
38
+ node_msgs: mpq.Queue,
39
+ block_msgs: mpq.Queue,
40
+ resource_msgs: mpq.Queue,
40
41
  exit_event: Event,
41
42
  ):
42
43
  """ Initializes a monitoring configuration class.
@@ -202,12 +203,14 @@ class MonitoringRouter:
202
203
 
203
204
 
204
205
  @wrap_with_logs
205
- def router_starter(comm_q: "queue.Queue[Union[Tuple[int, int], str]]",
206
- exception_q: "queue.Queue[Tuple[str, str]]",
207
- priority_msgs: "queue.Queue[AddressedMonitoringMessage]",
208
- node_msgs: "queue.Queue[AddressedMonitoringMessage]",
209
- block_msgs: "queue.Queue[AddressedMonitoringMessage]",
210
- resource_msgs: "queue.Queue[AddressedMonitoringMessage]",
206
+ @typeguard.typechecked
207
+ def router_starter(*,
208
+ comm_q: mpq.Queue,
209
+ exception_q: mpq.Queue,
210
+ priority_msgs: mpq.Queue,
211
+ node_msgs: mpq.Queue,
212
+ block_msgs: mpq.Queue,
213
+ resource_msgs: mpq.Queue,
211
214
  exit_event: Event,
212
215
 
213
216
  hub_address: str,
@@ -0,0 +1,40 @@
1
+ import queue
2
+ from unittest import mock
3
+
4
+ import pytest
5
+
6
+ from parsl.executors import HighThroughputExecutor
7
+ from parsl.executors.high_throughput.mpi_prefix_composer import (
8
+ InvalidResourceSpecification,
9
+ )
10
+
11
+
12
+ def double(x):
13
+ return x * 2
14
+
15
+
16
+ @pytest.mark.local
17
+ def test_submit_calls_validate():
18
+
19
+ htex = HighThroughputExecutor()
20
+ htex.outgoing_q = mock.Mock(spec=queue.Queue)
21
+ htex.validate_resource_spec = mock.Mock(spec=htex.validate_resource_spec)
22
+
23
+ res_spec = {}
24
+ htex.submit(double, res_spec, (5,), {})
25
+ htex.validate_resource_spec.assert_called()
26
+
27
+
28
+ @pytest.mark.local
29
+ def test_resource_spec_validation():
30
+ htex = HighThroughputExecutor()
31
+ ret_val = htex.validate_resource_spec({})
32
+ assert ret_val is None
33
+
34
+
35
+ @pytest.mark.local
36
+ def test_resource_spec_validation_bad_keys():
37
+ htex = HighThroughputExecutor()
38
+
39
+ with pytest.raises(InvalidResourceSpecification):
40
+ htex.validate_resource_spec({"num_nodes": 2})
@@ -0,0 +1,48 @@
1
+ import pytest
2
+
3
+ from parsl import Config
4
+ from parsl.executors import MPIExecutor
5
+ from parsl.launchers import AprunLauncher, SimpleLauncher, SrunLauncher
6
+ from parsl.providers import SlurmProvider
7
+
8
+
9
+ @pytest.mark.local
10
+ def test_bad_launcher():
11
+ """TypeError if a launcher other than SimpleLauncher is supplied"""
12
+
13
+ for launcher in [SrunLauncher(), AprunLauncher()]:
14
+ with pytest.raises(TypeError):
15
+ Config(executors=[
16
+ MPIExecutor(
17
+ provider=SlurmProvider(launcher=launcher),
18
+ )
19
+ ])
20
+
21
+
22
+ @pytest.mark.local
23
+ def test_bad_mpi_launcher():
24
+ """ValueError if an unsupported mpi_launcher is specified"""
25
+
26
+ with pytest.raises(ValueError):
27
+ Config(executors=[
28
+ MPIExecutor(
29
+ mpi_launcher="bad_launcher",
30
+ provider=SlurmProvider(launcher=SimpleLauncher()),
31
+ )
32
+ ])
33
+
34
+
35
+ @pytest.mark.local
36
+ @pytest.mark.parametrize(
37
+ "mpi_launcher",
38
+ ["srun", "aprun", "mpiexec"]
39
+ )
40
+ def test_correct_launcher_with_mpi_mode(mpi_launcher: str):
41
+ """Confirm that SimpleLauncher works with mpi_mode"""
42
+
43
+ executor = MPIExecutor(
44
+ mpi_launcher=mpi_launcher,
45
+ provider=SlurmProvider(launcher=SimpleLauncher()),
46
+ )
47
+
48
+ assert isinstance(executor.provider.launcher, SimpleLauncher)
@@ -6,26 +6,34 @@ from typing import Dict
6
6
  import pytest
7
7
 
8
8
  import parsl
9
- from parsl import bash_app, python_app
9
+ from parsl import Config, bash_app, python_app
10
+ from parsl.executors import MPIExecutor
10
11
  from parsl.executors.high_throughput.mpi_prefix_composer import (
11
12
  MissingResourceSpecification,
12
13
  )
13
- from parsl.tests.configs.htex_local import fresh_config
14
+ from parsl.launchers import SimpleLauncher
15
+ from parsl.providers import LocalProvider
14
16
 
15
17
  EXECUTOR_LABEL = "MPI_TEST"
16
18
 
17
19
 
18
20
  def local_setup():
19
- config = fresh_config()
20
- config.executors[0].label = EXECUTOR_LABEL
21
- config.executors[0].max_workers_per_node = 2
22
- config.executors[0].enable_mpi_mode = True
23
- config.executors[0].mpi_launcher = "mpiexec"
24
21
 
25
22
  cwd = os.path.abspath(os.path.dirname(__file__))
26
23
  pbs_nodefile = os.path.join(cwd, "mocks", "pbs_nodefile")
27
24
 
28
- config.executors[0].provider.worker_init = f"export PBS_NODEFILE={pbs_nodefile}"
25
+ config = Config(
26
+ executors=[
27
+ MPIExecutor(
28
+ label=EXECUTOR_LABEL,
29
+ max_workers_per_block=2,
30
+ mpi_launcher="mpiexec",
31
+ provider=LocalProvider(
32
+ worker_init=f"export PBS_NODEFILE={pbs_nodefile}",
33
+ launcher=SimpleLauncher()
34
+ )
35
+ )
36
+ ])
29
37
 
30
38
  parsl.load(config)
31
39
 
@@ -4,7 +4,6 @@ from pathlib import Path
4
4
 
5
5
  import pytest
6
6
 
7
- import parsl
8
7
  from parsl import Config, HighThroughputExecutor
9
8
  from parsl.executors.high_throughput.mpi_executor import MPIExecutor
10
9
  from parsl.launchers import SimpleLauncher
@@ -42,8 +41,8 @@ def test_docstring():
42
41
  def test_init():
43
42
  """Ensure all relevant kwargs are copied over from HTEx"""
44
43
 
45
- new_kwargs = {'max_workers_per_block'}
46
- excluded_kwargs = {'available_accelerators', 'enable_mpi_mode', 'cores_per_worker', 'max_workers_per_node',
44
+ new_kwargs = {'max_workers_per_block', 'mpi_launcher'}
45
+ excluded_kwargs = {'available_accelerators', 'cores_per_worker', 'max_workers_per_node',
47
46
  'mem_per_worker', 'cpu_affinity', 'max_workers', 'manager_selector'}
48
47
 
49
48
  # Get the kwargs from both HTEx and MPIEx