parsl 2024.6.3__tar.gz → 2024.6.10__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 (480) hide show
  1. {parsl-2024.6.3/parsl.egg-info → parsl-2024.6.10}/PKG-INFO +2 -2
  2. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/config.py +27 -4
  3. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/dataflow/dflow.py +36 -10
  4. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/high_throughput/executor.py +2 -1
  5. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/high_throughput/interchange.py +21 -20
  6. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/kubernetes/kube.py +19 -6
  7. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/slurm/slurm.py +31 -22
  8. parsl-2024.6.10/parsl/tests/configs/flux_local.py +11 -0
  9. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/conftest.py +4 -0
  10. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_bash_apps/test_stdout.py +20 -2
  11. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_htex/test_zmq_binding.py +22 -6
  12. parsl-2024.6.10/parsl/tests/test_python_apps/test_context_manager.py +128 -0
  13. parsl-2024.6.10/parsl/tests/test_python_apps/test_dependencies_deep.py +59 -0
  14. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_radical/test_mpi_funcs.py +0 -1
  15. parsl-2024.6.10/parsl/tests/unit/test_usage_tracking.py +45 -0
  16. parsl-2024.6.10/parsl/usage_tracking/levels.py +6 -0
  17. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/usage_tracking/usage.py +54 -23
  18. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/version.py +1 -1
  19. {parsl-2024.6.3 → parsl-2024.6.10/parsl.egg-info}/PKG-INFO +2 -2
  20. {parsl-2024.6.3 → parsl-2024.6.10}/parsl.egg-info/SOURCES.txt +4 -0
  21. parsl-2024.6.3/parsl/tests/test_python_apps/test_context_manager.py +0 -33
  22. {parsl-2024.6.3 → parsl-2024.6.10}/LICENSE +0 -0
  23. {parsl-2024.6.3 → parsl-2024.6.10}/MANIFEST.in +0 -0
  24. {parsl-2024.6.3 → parsl-2024.6.10}/README.rst +0 -0
  25. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/__init__.py +0 -0
  26. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/addresses.py +0 -0
  27. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/app/__init__.py +0 -0
  28. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/app/app.py +0 -0
  29. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/app/bash.py +0 -0
  30. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/app/errors.py +0 -0
  31. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/app/futures.py +0 -0
  32. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/app/python.py +0 -0
  33. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/benchmark/__init__.py +0 -0
  34. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/benchmark/perf.py +0 -0
  35. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/channels/__init__.py +0 -0
  36. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/channels/base.py +0 -0
  37. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/channels/errors.py +0 -0
  38. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/channels/local/__init__.py +0 -0
  39. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/channels/local/local.py +0 -0
  40. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/channels/oauth_ssh/__init__.py +0 -0
  41. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/channels/oauth_ssh/oauth_ssh.py +0 -0
  42. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/channels/ssh/__init__.py +0 -0
  43. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/channels/ssh/ssh.py +0 -0
  44. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/channels/ssh_il/__init__.py +0 -0
  45. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/channels/ssh_il/ssh_il.py +0 -0
  46. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/concurrent/__init__.py +0 -0
  47. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/ASPIRE1.py +0 -0
  48. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/Azure.py +0 -0
  49. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/__init__.py +0 -0
  50. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/ad_hoc.py +0 -0
  51. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/bridges.py +0 -0
  52. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/cc_in2p3.py +0 -0
  53. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/ec2.py +0 -0
  54. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/expanse.py +0 -0
  55. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/frontera.py +0 -0
  56. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/htex_local.py +0 -0
  57. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/illinoiscluster.py +0 -0
  58. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/kubernetes.py +0 -0
  59. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/local_threads.py +0 -0
  60. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/midway.py +0 -0
  61. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/osg.py +0 -0
  62. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/polaris.py +0 -0
  63. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/stampede2.py +0 -0
  64. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/summit.py +0 -0
  65. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/toss3_llnl.py +0 -0
  66. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/vineex_local.py +0 -0
  67. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/configs/wqex_local.py +0 -0
  68. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/curvezmq.py +0 -0
  69. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/data_provider/__init__.py +0 -0
  70. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/data_provider/data_manager.py +0 -0
  71. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/data_provider/file_noop.py +0 -0
  72. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/data_provider/files.py +0 -0
  73. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/data_provider/ftp.py +0 -0
  74. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/data_provider/globus.py +0 -0
  75. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/data_provider/http.py +0 -0
  76. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/data_provider/rsync.py +0 -0
  77. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/data_provider/staging.py +0 -0
  78. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/data_provider/zip.py +0 -0
  79. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/dataflow/__init__.py +0 -0
  80. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/dataflow/dependency_resolvers.py +0 -0
  81. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/dataflow/errors.py +0 -0
  82. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/dataflow/futures.py +0 -0
  83. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/dataflow/memoization.py +0 -0
  84. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/dataflow/rundirs.py +0 -0
  85. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/dataflow/states.py +0 -0
  86. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/dataflow/taskrecord.py +0 -0
  87. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/errors.py +0 -0
  88. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/__init__.py +0 -0
  89. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/base.py +0 -0
  90. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/errors.py +0 -0
  91. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/flux/__init__.py +0 -0
  92. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/flux/execute_parsl_task.py +0 -0
  93. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/flux/executor.py +0 -0
  94. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/flux/flux_instance_manager.py +0 -0
  95. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/high_throughput/__init__.py +0 -0
  96. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/high_throughput/errors.py +0 -0
  97. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/high_throughput/manager_record.py +0 -0
  98. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  99. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/high_throughput/mpi_executor.py +0 -0
  100. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
  101. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
  102. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/high_throughput/probe.py +0 -0
  103. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
  104. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
  105. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/radical/__init__.py +0 -0
  106. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/radical/executor.py +0 -0
  107. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/radical/rpex_master.py +0 -0
  108. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/radical/rpex_resources.py +0 -0
  109. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/radical/rpex_worker.py +0 -0
  110. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/status_handling.py +0 -0
  111. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/taskvine/__init__.py +0 -0
  112. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/taskvine/errors.py +0 -0
  113. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  114. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/taskvine/executor.py +0 -0
  115. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/taskvine/factory.py +0 -0
  116. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/taskvine/factory_config.py +0 -0
  117. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/taskvine/manager.py +0 -0
  118. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/taskvine/manager_config.py +0 -0
  119. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/taskvine/utils.py +0 -0
  120. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/threads.py +0 -0
  121. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/workqueue/__init__.py +0 -0
  122. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/workqueue/errors.py +0 -0
  123. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  124. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/workqueue/executor.py +0 -0
  125. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  126. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  127. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/jobs/__init__.py +0 -0
  128. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/jobs/error_handlers.py +0 -0
  129. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/jobs/errors.py +0 -0
  130. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/jobs/job_status_poller.py +0 -0
  131. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/jobs/states.py +0 -0
  132. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/jobs/strategy.py +0 -0
  133. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/launchers/__init__.py +0 -0
  134. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/launchers/base.py +0 -0
  135. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/launchers/errors.py +0 -0
  136. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/launchers/launchers.py +0 -0
  137. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/log_utils.py +0 -0
  138. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/__init__.py +0 -0
  139. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/db_manager.py +0 -0
  140. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/message_type.py +0 -0
  141. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/monitoring.py +0 -0
  142. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/queries/__init__.py +0 -0
  143. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/queries/pandas.py +0 -0
  144. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/radios.py +0 -0
  145. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/remote.py +0 -0
  146. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/router.py +0 -0
  147. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/types.py +0 -0
  148. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/__init__.py +0 -0
  149. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/app.py +0 -0
  150. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/models.py +0 -0
  151. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  152. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  153. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  154. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  155. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  156. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  157. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  158. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/templates/app.html +0 -0
  159. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/templates/dag.html +0 -0
  160. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/templates/error.html +0 -0
  161. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/templates/layout.html +0 -0
  162. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  163. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/templates/task.html +0 -0
  164. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  165. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  166. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/utils.py +0 -0
  167. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/version.py +0 -0
  168. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/monitoring/visualization/views.py +0 -0
  169. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/multiprocessing.py +0 -0
  170. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/process_loggers.py +0 -0
  171. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/__init__.py +0 -0
  172. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/ad_hoc/__init__.py +0 -0
  173. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/ad_hoc/ad_hoc.py +0 -0
  174. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/aws/__init__.py +0 -0
  175. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/aws/aws.py +0 -0
  176. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/aws/template.py +0 -0
  177. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/azure/__init__.py +0 -0
  178. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/azure/azure.py +0 -0
  179. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/azure/template.py +0 -0
  180. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/base.py +0 -0
  181. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/cluster_provider.py +0 -0
  182. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/cobalt/__init__.py +0 -0
  183. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/cobalt/cobalt.py +0 -0
  184. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/cobalt/template.py +0 -0
  185. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/condor/__init__.py +0 -0
  186. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/condor/condor.py +0 -0
  187. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/condor/template.py +0 -0
  188. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/errors.py +0 -0
  189. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/googlecloud/__init__.py +0 -0
  190. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/googlecloud/googlecloud.py +0 -0
  191. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/grid_engine/__init__.py +0 -0
  192. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/grid_engine/grid_engine.py +0 -0
  193. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/grid_engine/template.py +0 -0
  194. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/kubernetes/__init__.py +0 -0
  195. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/kubernetes/template.py +0 -0
  196. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/local/__init__.py +0 -0
  197. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/local/local.py +0 -0
  198. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/lsf/__init__.py +0 -0
  199. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/lsf/lsf.py +0 -0
  200. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/lsf/template.py +0 -0
  201. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/pbspro/__init__.py +0 -0
  202. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/pbspro/pbspro.py +0 -0
  203. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/pbspro/template.py +0 -0
  204. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/slurm/__init__.py +0 -0
  205. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/slurm/template.py +0 -0
  206. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/torque/__init__.py +0 -0
  207. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/torque/template.py +0 -0
  208. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/providers/torque/torque.py +0 -0
  209. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/py.typed +0 -0
  210. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/serialize/__init__.py +0 -0
  211. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/serialize/base.py +0 -0
  212. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/serialize/concretes.py +0 -0
  213. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/serialize/errors.py +0 -0
  214. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/serialize/facade.py +0 -0
  215. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/serialize/proxystore.py +0 -0
  216. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/__init__.py +0 -0
  217. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/callables_helper.py +0 -0
  218. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/__init__.py +0 -0
  219. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/ad_hoc_cluster_htex.py +0 -0
  220. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/azure_single_node.py +0 -0
  221. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/bluewaters.py +0 -0
  222. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/bridges.py +0 -0
  223. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/cc_in2p3.py +0 -0
  224. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/comet.py +0 -0
  225. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/cooley_htex.py +0 -0
  226. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/ec2_single_node.py +0 -0
  227. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/ec2_spot.py +0 -0
  228. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/frontera.py +0 -0
  229. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/htex_ad_hoc_cluster.py +0 -0
  230. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/htex_local.py +0 -0
  231. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/htex_local_alternate.py +0 -0
  232. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  233. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  234. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/local_adhoc.py +0 -0
  235. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/local_radical.py +0 -0
  236. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/local_radical_mpi.py +0 -0
  237. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/local_threads.py +0 -0
  238. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  239. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  240. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
  241. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  242. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  243. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/local_threads_globus.py +0 -0
  244. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  245. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/local_threads_monitoring.py +0 -0
  246. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/local_threads_no_cache.py +0 -0
  247. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/midway.py +0 -0
  248. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/nscc_singapore.py +0 -0
  249. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/osg_htex.py +0 -0
  250. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/petrelkube.py +0 -0
  251. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/summit.py +0 -0
  252. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/swan_htex.py +0 -0
  253. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/taskvine_ex.py +0 -0
  254. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/theta.py +0 -0
  255. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/user_opts.py +0 -0
  256. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/configs/workqueue_ex.py +0 -0
  257. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/integration/__init__.py +0 -0
  258. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/integration/latency.py +0 -0
  259. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/integration/test_apps/__init__.py +0 -0
  260. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/integration/test_channels/__init__.py +0 -0
  261. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/integration/test_channels/test_channels.py +0 -0
  262. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/integration/test_channels/test_local_channel.py +0 -0
  263. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/integration/test_channels/test_scp_1.py +0 -0
  264. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/integration/test_channels/test_ssh_1.py +0 -0
  265. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/integration/test_channels/test_ssh_errors.py +0 -0
  266. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -0
  267. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -0
  268. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  269. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/integration/test_stress/__init__.py +0 -0
  270. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  271. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  272. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/manual_tests/__init__.py +0 -0
  273. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/manual_tests/htex_local.py +0 -0
  274. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/manual_tests/test_ad_hoc_htex.py +0 -0
  275. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/manual_tests/test_basic.py +0 -0
  276. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -0
  277. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  278. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  279. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/manual_tests/test_oauth_ssh.py +0 -0
  280. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  281. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
  282. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  283. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/scaling_tests/__init__.py +0 -0
  284. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/scaling_tests/htex_local.py +0 -0
  285. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/scaling_tests/local_threads.py +0 -0
  286. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/scaling_tests/test_scale.py +0 -0
  287. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
  288. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/scaling_tests/vineex_local.py +0 -0
  289. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
  290. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/scaling_tests/wqex_local.py +0 -0
  291. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/site_tests/__init__.py +0 -0
  292. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/site_tests/site_config_selector.py +0 -0
  293. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/site_tests/test_provider.py +0 -0
  294. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/site_tests/test_site.py +0 -0
  295. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/sites/__init__.py +0 -0
  296. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/sites/test_affinity.py +0 -0
  297. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/sites/test_concurrent.py +0 -0
  298. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  299. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/sites/test_ec2.py +0 -0
  300. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/sites/test_launchers.py +0 -0
  301. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/sites/test_local_adhoc.py +0 -0
  302. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  303. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/sites/test_worker_info.py +0 -0
  304. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_aalst_patterns.py +0 -0
  305. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_bash_apps/__init__.py +0 -0
  306. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  307. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  308. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  309. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  310. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  311. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  312. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  313. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  314. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  315. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  316. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
  317. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_callables.py +0 -0
  318. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_channels/__init__.py +0 -0
  319. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_channels/test_large_output.py +0 -0
  320. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_checkpointing/__init__.py +0 -0
  321. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  322. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  323. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  324. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
  325. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  326. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  327. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  328. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  329. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_curvezmq.py +0 -0
  330. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_docs/__init__.py +0 -0
  331. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_docs/test_from_slides.py +0 -0
  332. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_docs/test_kwargs.py +0 -0
  333. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  334. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_docs/test_workflow1.py +0 -0
  335. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_docs/test_workflow2.py +0 -0
  336. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_docs/test_workflow4.py +0 -0
  337. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_error_handling/__init__.py +0 -0
  338. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_error_handling/test_fail.py +0 -0
  339. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  340. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
  341. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  342. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_error_handling/test_retries.py +0 -0
  343. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  344. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  345. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  346. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  347. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  348. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_flux.py +0 -0
  349. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_htex/__init__.py +0 -0
  350. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_htex/test_basic.py +0 -0
  351. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
  352. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
  353. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  354. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
  355. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_htex/test_drain.py +0 -0
  356. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_htex/test_htex.py +0 -0
  357. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_htex/test_manager_failure.py +0 -0
  358. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_htex/test_managers_command.py +0 -0
  359. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_htex/test_missing_worker.py +0 -0
  360. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
  361. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_htex/test_worker_failure.py +0 -0
  362. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_monitoring/__init__.py +0 -0
  363. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_monitoring/test_app_names.py +0 -0
  364. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_monitoring/test_basic.py +0 -0
  365. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  366. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
  367. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
  368. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
  369. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  370. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
  371. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  372. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_mpi_apps/__init__.py +0 -0
  373. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
  374. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py +0 -0
  375. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
  376. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
  377. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
  378. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
  379. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
  380. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_providers/__init__.py +0 -0
  381. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_providers/test_cobalt_deprecation_warning.py +0 -0
  382. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_providers/test_local_provider.py +0 -0
  383. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
  384. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  385. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_providers/test_slurm_template.py +0 -0
  386. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  387. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/__init__.py +0 -0
  388. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  389. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_basic.py +0 -0
  390. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  391. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  392. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  393. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_fail.py +0 -0
  394. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  395. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  396. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_futures.py +0 -0
  397. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
  398. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  399. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_join.py +0 -0
  400. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  401. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  402. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  403. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  404. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  405. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  406. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  407. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  408. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  409. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_overview.py +0 -0
  410. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  411. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
  412. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_simple.py +0 -0
  413. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  414. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_python_apps/test_type5.py +0 -0
  415. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_radical/__init__.py +0 -0
  416. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_regression/__init__.py +0 -0
  417. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_regression/test_1480.py +0 -0
  418. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  419. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_regression/test_1653.py +0 -0
  420. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_regression/test_221.py +0 -0
  421. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_regression/test_226.py +0 -0
  422. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_regression/test_2652.py +0 -0
  423. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_regression/test_69a.py +0 -0
  424. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_regression/test_854.py +0 -0
  425. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  426. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_regression/test_98.py +0 -0
  427. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_scaling/__init__.py +0 -0
  428. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  429. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  430. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_scaling/test_scale_down.py +0 -0
  431. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
  432. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
  433. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
  434. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_serialization/__init__.py +0 -0
  435. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  436. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_serialization/test_basic.py +0 -0
  437. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
  438. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
  439. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  440. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  441. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_shutdown/__init__.py +0 -0
  442. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
  443. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/__init__.py +0 -0
  444. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/staging_provider.py +0 -0
  445. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/test_1316.py +0 -0
  446. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/test_docs_1.py +0 -0
  447. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/test_docs_2.py +0 -0
  448. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  449. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/test_file.py +0 -0
  450. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/test_file_apps.py +0 -0
  451. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/test_file_staging.py +0 -0
  452. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
  453. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  454. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  455. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  456. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/test_staging_https.py +0 -0
  457. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
  458. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/test_zip_in.py +0 -0
  459. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/test_zip_out.py +0 -0
  460. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
  461. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_summary.py +0 -0
  462. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_thread_parallelism.py +0 -0
  463. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_threads/__init__.py +0 -0
  464. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_threads/test_configs.py +0 -0
  465. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  466. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_utils/__init__.py +0 -0
  467. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
  468. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/unit/__init__.py +0 -0
  469. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/unit/test_file.py +0 -0
  470. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/tests/utils.py +0 -0
  471. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/usage_tracking/__init__.py +0 -0
  472. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/usage_tracking/api.py +0 -0
  473. {parsl-2024.6.3 → parsl-2024.6.10}/parsl/utils.py +0 -0
  474. {parsl-2024.6.3 → parsl-2024.6.10}/parsl.egg-info/dependency_links.txt +0 -0
  475. {parsl-2024.6.3 → parsl-2024.6.10}/parsl.egg-info/entry_points.txt +0 -0
  476. {parsl-2024.6.3 → parsl-2024.6.10}/parsl.egg-info/requires.txt +0 -0
  477. {parsl-2024.6.3 → parsl-2024.6.10}/parsl.egg-info/top_level.txt +0 -0
  478. {parsl-2024.6.3 → parsl-2024.6.10}/requirements.txt +0 -0
  479. {parsl-2024.6.3 → parsl-2024.6.10}/setup.cfg +0 -0
  480. {parsl-2024.6.3 → parsl-2024.6.10}/setup.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2024.6.3
3
+ Version: 2024.6.10
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.06.03.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2024.06.10.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -11,6 +11,8 @@ from parsl.executors.base import ParslExecutor
11
11
  from parsl.executors.threads import ThreadPoolExecutor
12
12
  from parsl.monitoring import MonitoringHub
13
13
  from parsl.usage_tracking.api import UsageInformation
14
+ from parsl.usage_tracking.levels import DISABLED as USAGE_TRACKING_DISABLED
15
+ from parsl.usage_tracking.levels import LEVEL_3 as USAGE_TRACKING_LEVEL_3
14
16
  from parsl.utils import RepresentationMixin
15
17
 
16
18
  logger = logging.getLogger(__name__)
@@ -38,6 +40,15 @@ class Config(RepresentationMixin, UsageInformation):
38
40
  ``checkpoint_mode='periodic'``.
39
41
  dependency_resolver: plugin point for custom dependency resolvers. Default: only resolve Futures,
40
42
  using the `SHALLOW_DEPENDENCY_RESOLVER`.
43
+ exit_mode: str, optional
44
+ When Parsl is used as a context manager (using ``with parsl.load`` syntax) then this parameter
45
+ controls what will happen to running tasks and exceptions at exit. The options are:
46
+
47
+ * ``cleanup``: cleanup the DFK on exit without waiting for any tasks
48
+ * ``skip``: skip all shutdown behaviour when exiting the context manager
49
+ * ``wait``: wait for all tasks to complete when exiting normally, but exit immediately when exiting due to an exception.
50
+
51
+ Default is ``cleanup``.
41
52
  garbage_collect : bool. optional.
42
53
  Delete task records from DFK when tasks have completed. Default: True
43
54
  internal_tasks_max_threads : int, optional
@@ -66,9 +77,12 @@ class Config(RepresentationMixin, UsageInformation):
66
77
  How often the scaling strategy should be executed. Default is 5 seconds.
67
78
  max_idletime : float, optional
68
79
  The maximum idle time allowed for an executor before strategy could shut down unused blocks. Default is 120.0 seconds.
69
- usage_tracking : bool, optional
70
- Set this field to True to opt-in to Parsl's usage tracking system. Parsl only collects minimal, non personally-identifiable,
71
- information used for reporting to our funding agencies. Default is False.
80
+ usage_tracking : int, optional
81
+ Set this field to 1, 2, or 3 to opt-in to Parsl's usage tracking system.
82
+ The value represents the level of usage tracking detail to be collected.
83
+ Setting this field to 0 will disable usage tracking. Default (this field is not set): usage tracking is not enabled.
84
+ Parsl only collects minimal, non personally-identifiable,
85
+ information used for reporting to our funding agencies.
72
86
  initialize_logging : bool, optional
73
87
  Make DFK optionally not initialize any logging. Log messages
74
88
  will still be passed into the python logging system under the
@@ -92,6 +106,7 @@ class Config(RepresentationMixin, UsageInformation):
92
106
  Literal['manual']] = None,
93
107
  checkpoint_period: Optional[str] = None,
94
108
  dependency_resolver: Optional[DependencyResolver] = None,
109
+ exit_mode: Literal['cleanup', 'skip', 'wait'] = 'cleanup',
95
110
  garbage_collect: bool = True,
96
111
  internal_tasks_max_threads: int = 10,
97
112
  retries: int = 0,
@@ -102,7 +117,7 @@ class Config(RepresentationMixin, UsageInformation):
102
117
  strategy_period: Union[float, int] = 5,
103
118
  max_idletime: float = 120.0,
104
119
  monitoring: Optional[MonitoringHub] = None,
105
- usage_tracking: bool = False,
120
+ usage_tracking: int = 0,
106
121
  initialize_logging: bool = True) -> None:
107
122
 
108
123
  executors = tuple(executors or [])
@@ -128,6 +143,7 @@ class Config(RepresentationMixin, UsageInformation):
128
143
  checkpoint_period = "00:30:00"
129
144
  self.checkpoint_period = checkpoint_period
130
145
  self.dependency_resolver = dependency_resolver
146
+ self.exit_mode = exit_mode
131
147
  self.garbage_collect = garbage_collect
132
148
  self.internal_tasks_max_threads = internal_tasks_max_threads
133
149
  self.retries = retries
@@ -136,6 +152,7 @@ class Config(RepresentationMixin, UsageInformation):
136
152
  self.strategy = strategy
137
153
  self.strategy_period = strategy_period
138
154
  self.max_idletime = max_idletime
155
+ self.validate_usage_tracking(usage_tracking)
139
156
  self.usage_tracking = usage_tracking
140
157
  self.initialize_logging = initialize_logging
141
158
  self.monitoring = monitoring
@@ -156,6 +173,12 @@ class Config(RepresentationMixin, UsageInformation):
156
173
  raise ConfigurationError('Executors must have unique labels ({})'.format(
157
174
  ', '.join(['label={}'.format(repr(d)) for d in duplicates])))
158
175
 
176
+ def validate_usage_tracking(self, level: int) -> None:
177
+ if not USAGE_TRACKING_DISABLED <= level <= USAGE_TRACKING_LEVEL_3:
178
+ raise ConfigurationError(
179
+ f"Usage Tracking values must be 0, 1, 2, or 3 and not {level}"
180
+ )
181
+
159
182
  def get_usage_information(self):
160
183
  return {"executors_len": len(self.executors),
161
184
  "dependency_resolver": self.dependency_resolver is not None}
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import atexit
4
+ import concurrent.futures as cf
4
5
  import datetime
5
6
  import inspect
6
7
  import logging
@@ -209,6 +210,8 @@ class DataFlowKernel:
209
210
  self.tasks: Dict[int, TaskRecord] = {}
210
211
  self.submitter_lock = threading.Lock()
211
212
 
213
+ self.dependency_launch_pool = cf.ThreadPoolExecutor(max_workers=1, thread_name_prefix="Dependency-Launch")
214
+
212
215
  self.dependency_resolver = self.config.dependency_resolver if self.config.dependency_resolver is not None \
213
216
  else SHALLOW_DEPENDENCY_RESOLVER
214
217
 
@@ -217,9 +220,24 @@ class DataFlowKernel:
217
220
  def __enter__(self):
218
221
  return self
219
222
 
220
- def __exit__(self, exc_type, exc_value, traceback):
221
- logger.debug("Exiting the context manager, calling cleanup for DFK")
222
- self.cleanup()
223
+ def __exit__(self, exc_type, exc_value, traceback) -> None:
224
+ mode = self.config.exit_mode
225
+ logger.debug("Exiting context manager, with exit mode '%s'", mode)
226
+ if mode == "cleanup":
227
+ logger.info("Calling cleanup for DFK")
228
+ self.cleanup()
229
+ elif mode == "skip":
230
+ logger.info("Skipping all cleanup handling")
231
+ elif mode == "wait":
232
+ if exc_type is None:
233
+ logger.info("Waiting for all tasks to complete")
234
+ self.wait_for_current_tasks()
235
+ self.cleanup()
236
+ else:
237
+ logger.info("There was an exception - cleaning up without waiting for task completion")
238
+ self.cleanup()
239
+ else:
240
+ raise InternalConsistencyError(f"Exit case for {mode} should be unreachable, validated by typeguard on Config()")
223
241
 
224
242
  def _send_task_log_info(self, task_record: TaskRecord) -> None:
225
243
  if self.monitoring:
@@ -611,9 +629,9 @@ class DataFlowKernel:
611
629
  return kwargs.get('_parsl_staging_inhibit', False)
612
630
 
613
631
  def launch_if_ready(self, task_record: TaskRecord) -> None:
614
- """
615
- launch_if_ready will launch the specified task, if it is ready
616
- to run (for example, without dependencies, and in pending state).
632
+ """Schedules a task record for re-inspection to see if it is ready
633
+ for launch and for launch if it is ready. The call will return
634
+ immediately.
617
635
 
618
636
  This should be called by any piece of the DataFlowKernel that
619
637
  thinks a task may have become ready to run.
@@ -622,13 +640,17 @@ class DataFlowKernel:
622
640
  ready to run - launch_if_ready will not incorrectly launch that
623
641
  task.
624
642
 
625
- It is also not an error to call launch_if_ready on a task that has
626
- already been launched - launch_if_ready will not re-launch that
627
- task.
628
-
629
643
  launch_if_ready is thread safe, so may be called from any thread
630
644
  or callback.
631
645
  """
646
+ self.dependency_launch_pool.submit(self._launch_if_ready_async, task_record)
647
+
648
+ @wrap_with_logs
649
+ def _launch_if_ready_async(self, task_record: TaskRecord) -> None:
650
+ """
651
+ _launch_if_ready will launch the specified task, if it is ready
652
+ to run (for example, without dependencies, and in pending state).
653
+ """
632
654
  exec_fu = None
633
655
 
634
656
  task_id = task_record['id']
@@ -1271,6 +1293,10 @@ class DataFlowKernel:
1271
1293
  self.monitoring.close()
1272
1294
  logger.info("Terminated monitoring")
1273
1295
 
1296
+ logger.info("Terminating dependency launch pool")
1297
+ self.dependency_launch_pool.shutdown()
1298
+ logger.info("Terminated dependency launch pool")
1299
+
1274
1300
  logger.info("Unregistering atexit hook")
1275
1301
  atexit.unregister(self.atexit_cleanup)
1276
1302
  logger.info("Unregistered atexit hook")
@@ -527,7 +527,8 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
527
527
  get the worker task and result ports that the interchange has bound to.
528
528
  """
529
529
  self.interchange_proc = ForkProcess(target=interchange.starter,
530
- kwargs={"client_ports": (self.outgoing_q.port,
530
+ kwargs={"client_address": "127.0.0.1",
531
+ "client_ports": (self.outgoing_q.port,
531
532
  self.incoming_q.port,
532
533
  self.command_client.port),
533
534
  "interchange_address": self.address,
@@ -65,18 +65,19 @@ class Interchange:
65
65
  3. Detect workers that have failed using heartbeats
66
66
  """
67
67
  def __init__(self,
68
- client_address: str = "127.0.0.1",
69
- interchange_address: Optional[str] = None,
70
- client_ports: Tuple[int, int, int] = (50055, 50056, 50057),
71
- worker_ports: Optional[Tuple[int, int]] = None,
72
- worker_port_range: Tuple[int, int] = (54000, 55000),
73
- hub_address: Optional[str] = None,
74
- hub_zmq_port: Optional[int] = None,
75
- heartbeat_threshold: int = 60,
76
- logdir: str = ".",
77
- logging_level: int = logging.INFO,
78
- poll_period: int = 10,
79
- cert_dir: Optional[str] = None,
68
+ *,
69
+ client_address: str,
70
+ interchange_address: Optional[str],
71
+ client_ports: Tuple[int, int, int],
72
+ worker_ports: Optional[Tuple[int, int]],
73
+ worker_port_range: Tuple[int, int],
74
+ hub_address: Optional[str],
75
+ hub_zmq_port: Optional[int],
76
+ heartbeat_threshold: int,
77
+ logdir: str,
78
+ logging_level: int,
79
+ poll_period: int,
80
+ cert_dir: Optional[str],
80
81
  ) -> None:
81
82
  """
82
83
  Parameters
@@ -92,34 +93,34 @@ class Interchange:
92
93
  The ports at which the client can be reached
93
94
 
94
95
  worker_ports : tuple(int, int)
95
- The specific two ports at which workers will connect to the Interchange. Default: None
96
+ The specific two ports at which workers will connect to the Interchange.
96
97
 
97
98
  worker_port_range : tuple(int, int)
98
99
  The interchange picks ports at random from the range which will be used by workers.
99
- This is overridden when the worker_ports option is set. Default: (54000, 55000)
100
+ This is overridden when the worker_ports option is set.
100
101
 
101
102
  hub_address : str
102
103
  The IP address at which the interchange can send info about managers to when monitoring is enabled.
103
- Default: None (meaning monitoring disabled)
104
+ When None, monitoring is disabled.
104
105
 
105
106
  hub_zmq_port : str
106
107
  The port at which the interchange can send info about managers to when monitoring is enabled.
107
- Default: None (meaning monitoring disabled)
108
+ When None, monitoring is disabled.
108
109
 
109
110
  heartbeat_threshold : int
110
111
  Number of seconds since the last heartbeat after which worker is considered lost.
111
112
 
112
113
  logdir : str
113
- Parsl log directory paths. Logs and temp files go here. Default: '.'
114
+ Parsl log directory paths. Logs and temp files go here.
114
115
 
115
116
  logging_level : int
116
- Logging level as defined in the logging module. Default: logging.INFO
117
+ Logging level as defined in the logging module.
117
118
 
118
119
  poll_period : int
119
- The main thread polling period, in milliseconds. Default: 10ms
120
+ The main thread polling period, in milliseconds.
120
121
 
121
122
  cert_dir : str | None
122
- Path to the certificate directory. Default: None
123
+ Path to the certificate directory.
123
124
  """
124
125
  self.cert_dir = cert_dir
125
126
  self.logdir = logdir
@@ -83,6 +83,10 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
83
83
  persistent_volumes: list[(str, str)]
84
84
  List of tuples describing persistent volumes to be mounted in the pod.
85
85
  The tuples consist of (PVC Name, Mount Directory).
86
+ service_account_name: str
87
+ Name of the service account to run the pod as.
88
+ annotations: Dict[str, str]
89
+ Annotations to set on the pod.
86
90
  """
87
91
  @typeguard.typechecked
88
92
  def __init__(self,
@@ -103,7 +107,9 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
103
107
  group_id: Optional[str] = None,
104
108
  run_as_non_root: bool = False,
105
109
  secret: Optional[str] = None,
106
- persistent_volumes: List[Tuple[str, str]] = []) -> None:
110
+ persistent_volumes: List[Tuple[str, str]] = [],
111
+ service_account_name: Optional[str] = None,
112
+ annotations: Optional[Dict[str, str]] = None) -> None:
107
113
  if not _kubernetes_enabled:
108
114
  raise OptionalModuleMissing(['kubernetes'],
109
115
  "Kubernetes provider requires kubernetes module and config.")
@@ -146,6 +152,8 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
146
152
  self.group_id = group_id
147
153
  self.run_as_non_root = run_as_non_root
148
154
  self.persistent_volumes = persistent_volumes
155
+ self.service_account_name = service_account_name
156
+ self.annotations = annotations
149
157
 
150
158
  self.kube_client = client.CoreV1Api()
151
159
 
@@ -184,7 +192,9 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
184
192
  pod_name=pod_name,
185
193
  job_name=job_name,
186
194
  cmd_string=formatted_cmd,
187
- volumes=self.persistent_volumes)
195
+ volumes=self.persistent_volumes,
196
+ service_account_name=self.service_account_name,
197
+ annotations=self.annotations)
188
198
  self.resources[pod_name] = {'status': JobStatus(JobState.RUNNING)}
189
199
 
190
200
  return pod_name
@@ -253,7 +263,9 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
253
263
  job_name,
254
264
  port=80,
255
265
  cmd_string=None,
256
- volumes=[]):
266
+ volumes=[],
267
+ service_account_name=None,
268
+ annotations=None):
257
269
  """ Create a kubernetes pod for the job.
258
270
  Args:
259
271
  - image (string) : Docker image to launch
@@ -311,11 +323,12 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
311
323
  claim_name=volume[0])))
312
324
 
313
325
  metadata = client.V1ObjectMeta(name=pod_name,
314
- labels={"app": job_name})
326
+ labels={"app": job_name},
327
+ annotations=annotations)
315
328
  spec = client.V1PodSpec(containers=[container],
316
329
  image_pull_secrets=[secret],
317
- volumes=volume_defs
318
- )
330
+ volumes=volume_defs,
331
+ service_account_name=service_account_name)
319
332
 
320
333
  pod = client.V1Pod(spec=spec, metadata=metadata)
321
334
  api_response = self.kube_client.create_namespaced_pod(namespace=self.namespace,
@@ -19,25 +19,29 @@ from parsl.utils import RepresentationMixin, wtime_to_minutes
19
19
 
20
20
  logger = logging.getLogger(__name__)
21
21
 
22
+ # From https://slurm.schedmd.com/sacct.html#SECTION_JOB-STATE-CODES
22
23
  translate_table = {
23
- 'PD': JobState.PENDING,
24
- 'R': JobState.RUNNING,
25
- 'CA': JobState.CANCELLED,
26
- 'CF': JobState.PENDING, # (configuring),
27
- 'CG': JobState.RUNNING, # (completing),
28
- 'CD': JobState.COMPLETED,
29
- 'F': JobState.FAILED, # (failed),
30
- 'TO': JobState.TIMEOUT, # (timeout),
31
- 'NF': JobState.FAILED, # (node failure),
32
- 'RV': JobState.FAILED, # (revoked) and
33
- 'SE': JobState.FAILED # (special exit state)
24
+ 'PENDING': JobState.PENDING,
25
+ 'RUNNING': JobState.RUNNING,
26
+ 'CANCELLED': JobState.CANCELLED,
27
+ 'COMPLETED': JobState.COMPLETED,
28
+ 'FAILED': JobState.FAILED,
29
+ 'NODE_FAIL': JobState.FAILED,
30
+ 'BOOT_FAIL': JobState.FAILED,
31
+ 'DEADLINE': JobState.TIMEOUT,
32
+ 'TIMEOUT': JobState.TIMEOUT,
33
+ 'REVOKED': JobState.FAILED,
34
+ 'OUT_OF_MEMORY': JobState.FAILED,
35
+ 'SUSPENDED': JobState.HELD,
36
+ 'PREEMPTED': JobState.TIMEOUT,
37
+ 'REQUEUED': JobState.PENDING
34
38
  }
35
39
 
36
40
 
37
41
  class SlurmProvider(ClusterProvider, RepresentationMixin):
38
42
  """Slurm Execution Provider
39
43
 
40
- This provider uses sbatch to submit, squeue for status and scancel to cancel
44
+ This provider uses sbatch to submit, sacct for status and scancel to cancel
41
45
  jobs. The sbatch script to be used is created from a template file in this
42
46
  same module.
43
47
 
@@ -168,14 +172,16 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
168
172
  logger.debug('No active jobs, skipping status update')
169
173
  return
170
174
 
171
- cmd = "squeue --noheader --format='%i %t' --job '{0}'".format(job_id_list)
175
+ # Using state%20 to get enough characters to not truncate output
176
+ # of the state. Without output can look like "<job_id> CANCELLED+"
177
+ cmd = "sacct -X --noheader --format=jobid,state%20 --job '{0}'".format(job_id_list)
172
178
  logger.debug("Executing %s", cmd)
173
179
  retcode, stdout, stderr = self.execute_wait(cmd)
174
- logger.debug("squeue returned %s %s", stdout, stderr)
180
+ logger.debug("sacct returned %s %s", stdout, stderr)
175
181
 
176
182
  # Execute_wait failed. Do no update
177
183
  if retcode != 0:
178
- logger.warning("squeue failed with non-zero exit code {}".format(retcode))
184
+ logger.warning("sacct failed with non-zero exit code {}".format(retcode))
179
185
  return
180
186
 
181
187
  jobs_missing = set(self.resources.keys())
@@ -183,7 +189,10 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
183
189
  if not line:
184
190
  # Blank line
185
191
  continue
186
- job_id, slurm_state = line.split()
192
+ # Sacct includes extra information in some outputs
193
+ # For example "<job_id> CANCELLED by <user_id>"
194
+ # This splits and ignores anything past the first two unpacked values
195
+ job_id, slurm_state, *ignore = line.split()
187
196
  if slurm_state not in translate_table:
188
197
  logger.warning(f"Slurm status {slurm_state} is not recognized")
189
198
  status = translate_table.get(slurm_state, JobState.UNKNOWN)
@@ -193,13 +202,13 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
193
202
  stderr_path=self.resources[job_id]['job_stderr_path'])
194
203
  jobs_missing.remove(job_id)
195
204
 
196
- # squeue does not report on jobs that are not running. So we are filling in the
197
- # blanks for missing jobs, we might lose some information about why the jobs failed.
205
+ # sacct can get job info after jobs have completed so this path shouldn't be hit
206
+ # log a warning if there are missing jobs for some reason
198
207
  for missing_job in jobs_missing:
199
- logger.debug("Updating missing job {} to completed status".format(missing_job))
200
- self.resources[missing_job]['status'] = JobStatus(JobState.COMPLETED,
201
- stdout_path=self.resources[missing_job]['job_stdout_path'],
202
- stderr_path=self.resources[missing_job]['job_stderr_path'])
208
+ logger.warning("Updating missing job {} to completed status".format(missing_job))
209
+ self.resources[missing_job]['status'] = JobStatus(
210
+ JobState.COMPLETED, stdout_path=self.resources[missing_job]['job_stdout_path'],
211
+ stderr_path=self.resources[missing_job]['job_stderr_path'])
203
212
 
204
213
  def submit(self, command: str, tasks_per_node: int, job_name="parsl.slurm") -> str:
205
214
  """Submit the command as a slurm job.
@@ -0,0 +1,11 @@
1
+ from parsl.config import Config
2
+ from parsl.executors import FluxExecutor
3
+
4
+
5
+ def fresh_config():
6
+ return Config(
7
+ executors=[FluxExecutor()],
8
+ )
9
+
10
+
11
+ config = fresh_config()
@@ -151,6 +151,10 @@ def pytest_configure(config):
151
151
  'markers',
152
152
  'multiple_cores_required: Marks tests that require multiple cores, such as htex affinity'
153
153
  )
154
+ config.addinivalue_line(
155
+ 'markers',
156
+ 'unix_filesystem_permissions_required: Marks tests that require unix-level filesystem permission enforcement'
157
+ )
154
158
  config.addinivalue_line(
155
159
  'markers',
156
160
  'issue3328: Marks tests broken by issue #3328'
@@ -16,7 +16,6 @@ def echo_to_streams(msg, stderr=None, stdout=None):
16
16
  whitelist = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'configs', '*threads*')
17
17
 
18
18
  speclist = (
19
- '/bad/dir/t.out',
20
19
  ['t3.out', 'w'],
21
20
  ('t4.out', None),
22
21
  (42, 'w'),
@@ -26,7 +25,6 @@ speclist = (
26
25
  )
27
26
 
28
27
  testids = [
29
- 'nonexistent_dir',
30
28
  'list_not_tuple',
31
29
  'null_mode',
32
30
  'not_a_string',
@@ -55,6 +53,26 @@ def test_bad_stdout_specs(spec):
55
53
 
56
54
 
57
55
  @pytest.mark.issue3328
56
+ @pytest.mark.unix_filesystem_permissions_required
57
+ def test_bad_stdout_file():
58
+ """Testing bad stderr file"""
59
+
60
+ o = "/bad/dir/t2.out"
61
+
62
+ fn = echo_to_streams("Hello world", stdout=o, stderr='t.err')
63
+
64
+ try:
65
+ fn.result()
66
+ except perror.BadStdStreamFile:
67
+ pass
68
+ else:
69
+ assert False, "Did not raise expected exception BadStdStreamFile"
70
+
71
+ return
72
+
73
+
74
+ @pytest.mark.issue3328
75
+ @pytest.mark.unix_filesystem_permissions_required
58
76
  def test_bad_stderr_file():
59
77
  """Testing bad stderr file"""
60
78
 
@@ -1,3 +1,4 @@
1
+ import logging
1
2
  import pathlib
2
3
  from typing import Optional
3
4
  from unittest import mock
@@ -10,6 +11,21 @@ from parsl import curvezmq
10
11
  from parsl.executors.high_throughput.interchange import Interchange
11
12
 
12
13
 
14
+ def make_interchange(*, interchange_address: Optional[str], cert_dir: Optional[str]) -> Interchange:
15
+ return Interchange(interchange_address=interchange_address,
16
+ cert_dir=cert_dir,
17
+ client_address="127.0.0.1",
18
+ client_ports=(50055, 50056, 50057),
19
+ worker_ports=None,
20
+ worker_port_range=(54000, 55000),
21
+ hub_address=None,
22
+ hub_zmq_port=None,
23
+ heartbeat_threshold=60,
24
+ logdir=".",
25
+ logging_level=logging.INFO,
26
+ poll_period=10)
27
+
28
+
13
29
  @pytest.fixture
14
30
  def encrypted(request: pytest.FixtureRequest):
15
31
  if hasattr(request, "param"):
@@ -31,7 +47,7 @@ def test_interchange_curvezmq_sockets(
31
47
  mock_socket: mock.MagicMock, cert_dir: Optional[str], encrypted: bool
32
48
  ):
33
49
  address = "127.0.0.1"
34
- ix = Interchange(interchange_address=address, cert_dir=cert_dir)
50
+ ix = make_interchange(interchange_address=address, cert_dir=cert_dir)
35
51
  assert isinstance(ix.zmq_context, curvezmq.ServerContext)
36
52
  assert ix.zmq_context.encrypted is encrypted
37
53
  assert mock_socket.call_count == 5
@@ -40,7 +56,7 @@ def test_interchange_curvezmq_sockets(
40
56
  @pytest.mark.local
41
57
  @pytest.mark.parametrize("encrypted", (True, False), indirect=True)
42
58
  def test_interchange_binding_no_address(cert_dir: Optional[str]):
43
- ix = Interchange(cert_dir=cert_dir)
59
+ ix = make_interchange(interchange_address=None, cert_dir=cert_dir)
44
60
  assert ix.interchange_address == "*"
45
61
 
46
62
 
@@ -49,7 +65,7 @@ def test_interchange_binding_no_address(cert_dir: Optional[str]):
49
65
  def test_interchange_binding_with_address(cert_dir: Optional[str]):
50
66
  # Using loopback address
51
67
  address = "127.0.0.1"
52
- ix = Interchange(interchange_address=address, cert_dir=cert_dir)
68
+ ix = make_interchange(interchange_address=address, cert_dir=cert_dir)
53
69
  assert ix.interchange_address == address
54
70
 
55
71
 
@@ -60,7 +76,7 @@ def test_interchange_binding_with_non_ipv4_address(cert_dir: Optional[str]):
60
76
  # Confirm that a ipv4 address is required
61
77
  address = "localhost"
62
78
  with pytest.raises(zmq.error.ZMQError):
63
- Interchange(interchange_address=address, cert_dir=cert_dir)
79
+ make_interchange(interchange_address=address, cert_dir=cert_dir)
64
80
 
65
81
 
66
82
  @pytest.mark.local
@@ -69,7 +85,7 @@ def test_interchange_binding_bad_address(cert_dir: Optional[str]):
69
85
  """Confirm that we raise a ZMQError when a bad address is supplied"""
70
86
  address = "550.0.0.0"
71
87
  with pytest.raises(zmq.error.ZMQError):
72
- Interchange(interchange_address=address, cert_dir=cert_dir)
88
+ make_interchange(interchange_address=address, cert_dir=cert_dir)
73
89
 
74
90
 
75
91
  @pytest.mark.local
@@ -77,7 +93,7 @@ def test_interchange_binding_bad_address(cert_dir: Optional[str]):
77
93
  def test_limited_interface_binding(cert_dir: Optional[str]):
78
94
  """When address is specified the worker_port would be bound to it rather than to 0.0.0.0"""
79
95
  address = "127.0.0.1"
80
- ix = Interchange(interchange_address=address, cert_dir=cert_dir)
96
+ ix = make_interchange(interchange_address=address, cert_dir=cert_dir)
81
97
  ix.worker_result_port
82
98
  proc = psutil.Process()
83
99
  conns = proc.connections(kind="tcp")