parsl 2024.10.7__tar.gz → 2024.10.21__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 (482) hide show
  1. {parsl-2024.10.7/parsl.egg-info → parsl-2024.10.21}/PKG-INFO +3 -4
  2. {parsl-2024.10.7 → parsl-2024.10.21}/README.rst +1 -1
  3. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/errors.py +13 -0
  4. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/executor.py +23 -17
  5. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/interchange.py +1 -19
  6. parsl-2024.10.21/parsl/executors/high_throughput/manager_selector.py +55 -0
  7. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/mpi_prefix_composer.py +5 -23
  8. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/process_worker_pool.py +1 -1
  9. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/threads.py +3 -2
  10. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/workqueue/executor.py +6 -5
  11. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/kubernetes/kube.py +35 -28
  12. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/conftest.py +1 -1
  13. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_resource_spec.py +10 -14
  14. parsl-2024.10.21/parsl/tests/test_htex/test_block_manager_selector_unit.py +20 -0
  15. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_drain.py +6 -4
  16. parsl-2024.10.21/parsl/tests/test_htex/test_manager_selector_by_block.py +53 -0
  17. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_resource_spec_validation.py +8 -3
  18. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +2 -4
  19. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_mpi_apps/test_resource_spec.py +2 -5
  20. parsl-2024.10.21/parsl/tests/test_providers/test_kubernetes_provider.py +102 -0
  21. parsl-2024.10.21/parsl/tests/test_utils/test_sanitize_dns.py +76 -0
  22. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/utils.py +78 -0
  23. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/version.py +1 -1
  24. {parsl-2024.10.7 → parsl-2024.10.21/parsl.egg-info}/PKG-INFO +3 -4
  25. {parsl-2024.10.7 → parsl-2024.10.21}/parsl.egg-info/SOURCES.txt +4 -0
  26. {parsl-2024.10.7 → parsl-2024.10.21}/setup.py +1 -2
  27. parsl-2024.10.7/parsl/executors/high_throughput/manager_selector.py +0 -25
  28. {parsl-2024.10.7 → parsl-2024.10.21}/LICENSE +0 -0
  29. {parsl-2024.10.7 → parsl-2024.10.21}/MANIFEST.in +0 -0
  30. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/__init__.py +0 -0
  31. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/addresses.py +0 -0
  32. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/app/__init__.py +0 -0
  33. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/app/app.py +0 -0
  34. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/app/bash.py +0 -0
  35. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/app/errors.py +0 -0
  36. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/app/futures.py +0 -0
  37. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/app/python.py +0 -0
  38. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/benchmark/__init__.py +0 -0
  39. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/benchmark/perf.py +0 -0
  40. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/__init__.py +0 -0
  41. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/base.py +0 -0
  42. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/errors.py +0 -0
  43. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/local/__init__.py +0 -0
  44. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/local/local.py +0 -0
  45. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/oauth_ssh/__init__.py +0 -0
  46. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/oauth_ssh/oauth_ssh.py +0 -0
  47. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/ssh/__init__.py +0 -0
  48. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/ssh/ssh.py +0 -0
  49. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/ssh_il/__init__.py +0 -0
  50. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/channels/ssh_il/ssh_il.py +0 -0
  51. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/concurrent/__init__.py +0 -0
  52. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/config.py +0 -0
  53. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/ASPIRE1.py +0 -0
  54. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/Azure.py +0 -0
  55. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/__init__.py +0 -0
  56. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/bridges.py +0 -0
  57. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/cc_in2p3.py +0 -0
  58. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/ec2.py +0 -0
  59. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/expanse.py +0 -0
  60. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/frontera.py +0 -0
  61. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/htex_local.py +0 -0
  62. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/illinoiscluster.py +0 -0
  63. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/improv.py +0 -0
  64. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/kubernetes.py +0 -0
  65. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/local_threads.py +0 -0
  66. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/midway.py +0 -0
  67. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/osg.py +0 -0
  68. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/polaris.py +0 -0
  69. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/stampede2.py +0 -0
  70. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/summit.py +0 -0
  71. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/toss3_llnl.py +0 -0
  72. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/vineex_local.py +0 -0
  73. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/configs/wqex_local.py +0 -0
  74. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/curvezmq.py +0 -0
  75. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/__init__.py +0 -0
  76. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/data_manager.py +0 -0
  77. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/file_noop.py +0 -0
  78. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/files.py +0 -0
  79. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/ftp.py +0 -0
  80. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/globus.py +0 -0
  81. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/http.py +0 -0
  82. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/rsync.py +0 -0
  83. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/staging.py +0 -0
  84. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/data_provider/zip.py +0 -0
  85. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/__init__.py +0 -0
  86. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/dependency_resolvers.py +0 -0
  87. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/dflow.py +0 -0
  88. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/errors.py +0 -0
  89. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/futures.py +0 -0
  90. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/memoization.py +0 -0
  91. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/rundirs.py +0 -0
  92. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/states.py +0 -0
  93. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/dataflow/taskrecord.py +0 -0
  94. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/errors.py +0 -0
  95. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/__init__.py +0 -0
  96. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/base.py +0 -0
  97. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/flux/__init__.py +0 -0
  98. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/flux/execute_parsl_task.py +0 -0
  99. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/flux/executor.py +0 -0
  100. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/flux/flux_instance_manager.py +0 -0
  101. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/__init__.py +0 -0
  102. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/errors.py +0 -0
  103. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/manager_record.py +0 -0
  104. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  105. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/mpi_executor.py +0 -0
  106. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
  107. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/probe.py +0 -0
  108. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
  109. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/radical/__init__.py +0 -0
  110. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/radical/executor.py +0 -0
  111. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/radical/rpex_resources.py +0 -0
  112. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/radical/rpex_worker.py +0 -0
  113. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/status_handling.py +0 -0
  114. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/__init__.py +0 -0
  115. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/errors.py +0 -0
  116. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  117. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/executor.py +0 -0
  118. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/factory.py +0 -0
  119. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/factory_config.py +0 -0
  120. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/manager.py +0 -0
  121. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/manager_config.py +0 -0
  122. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/taskvine/utils.py +0 -0
  123. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/workqueue/__init__.py +0 -0
  124. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/workqueue/errors.py +0 -0
  125. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  126. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  127. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  128. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/jobs/__init__.py +0 -0
  129. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/jobs/error_handlers.py +0 -0
  130. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/jobs/errors.py +0 -0
  131. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/jobs/job_status_poller.py +0 -0
  132. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/jobs/states.py +0 -0
  133. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/jobs/strategy.py +0 -0
  134. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/launchers/__init__.py +0 -0
  135. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/launchers/base.py +0 -0
  136. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/launchers/errors.py +0 -0
  137. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/launchers/launchers.py +0 -0
  138. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/log_utils.py +0 -0
  139. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/__init__.py +0 -0
  140. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/db_manager.py +0 -0
  141. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/errors.py +0 -0
  142. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/message_type.py +0 -0
  143. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/monitoring.py +0 -0
  144. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/queries/__init__.py +0 -0
  145. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/queries/pandas.py +0 -0
  146. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/radios.py +0 -0
  147. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/remote.py +0 -0
  148. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/router.py +0 -0
  149. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/types.py +0 -0
  150. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/__init__.py +0 -0
  151. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/app.py +0 -0
  152. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/models.py +0 -0
  153. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  154. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  155. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  156. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  157. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  158. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  159. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  160. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/templates/app.html +0 -0
  161. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/templates/dag.html +0 -0
  162. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/templates/error.html +0 -0
  163. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/templates/layout.html +0 -0
  164. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  165. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/templates/task.html +0 -0
  166. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  167. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  168. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/utils.py +0 -0
  169. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/version.py +0 -0
  170. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/monitoring/visualization/views.py +0 -0
  171. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/multiprocessing.py +0 -0
  172. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/process_loggers.py +0 -0
  173. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/__init__.py +0 -0
  174. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/ad_hoc/__init__.py +0 -0
  175. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/ad_hoc/ad_hoc.py +0 -0
  176. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/aws/__init__.py +0 -0
  177. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/aws/aws.py +0 -0
  178. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/aws/template.py +0 -0
  179. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/azure/__init__.py +0 -0
  180. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/azure/azure.py +0 -0
  181. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/azure/template.py +0 -0
  182. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/base.py +0 -0
  183. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/cluster_provider.py +0 -0
  184. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/cobalt/__init__.py +0 -0
  185. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/cobalt/cobalt.py +0 -0
  186. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/cobalt/template.py +0 -0
  187. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/condor/__init__.py +0 -0
  188. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/condor/condor.py +0 -0
  189. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/condor/template.py +0 -0
  190. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/errors.py +0 -0
  191. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/googlecloud/__init__.py +0 -0
  192. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/googlecloud/googlecloud.py +0 -0
  193. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/grid_engine/__init__.py +0 -0
  194. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/grid_engine/grid_engine.py +0 -0
  195. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/grid_engine/template.py +0 -0
  196. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/kubernetes/__init__.py +0 -0
  197. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/kubernetes/template.py +0 -0
  198. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/local/__init__.py +0 -0
  199. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/local/local.py +0 -0
  200. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/lsf/__init__.py +0 -0
  201. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/lsf/lsf.py +0 -0
  202. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/lsf/template.py +0 -0
  203. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/pbspro/__init__.py +0 -0
  204. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/pbspro/pbspro.py +0 -0
  205. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/pbspro/template.py +0 -0
  206. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/slurm/__init__.py +0 -0
  207. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/slurm/slurm.py +0 -0
  208. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/slurm/template.py +0 -0
  209. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/torque/__init__.py +0 -0
  210. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/torque/template.py +0 -0
  211. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/providers/torque/torque.py +0 -0
  212. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/py.typed +0 -0
  213. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/serialize/__init__.py +0 -0
  214. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/serialize/base.py +0 -0
  215. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/serialize/concretes.py +0 -0
  216. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/serialize/errors.py +0 -0
  217. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/serialize/facade.py +0 -0
  218. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/serialize/proxystore.py +0 -0
  219. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/__init__.py +0 -0
  220. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/callables_helper.py +0 -0
  221. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/__init__.py +0 -0
  222. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/azure_single_node.py +0 -0
  223. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/bluewaters.py +0 -0
  224. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/bridges.py +0 -0
  225. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/cc_in2p3.py +0 -0
  226. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/comet.py +0 -0
  227. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/cooley_htex.py +0 -0
  228. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/ec2_single_node.py +0 -0
  229. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/ec2_spot.py +0 -0
  230. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/flux_local.py +0 -0
  231. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/frontera.py +0 -0
  232. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/htex_local.py +0 -0
  233. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/htex_local_alternate.py +0 -0
  234. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  235. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  236. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_adhoc.py +0 -0
  237. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_radical.py +0 -0
  238. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_radical_mpi.py +0 -0
  239. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads.py +0 -0
  240. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  241. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  242. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
  243. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  244. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  245. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_globus.py +0 -0
  246. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  247. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_monitoring.py +0 -0
  248. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/local_threads_no_cache.py +0 -0
  249. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/midway.py +0 -0
  250. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/nscc_singapore.py +0 -0
  251. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/osg_htex.py +0 -0
  252. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/petrelkube.py +0 -0
  253. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/slurm_local.py +0 -0
  254. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/summit.py +0 -0
  255. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/taskvine_ex.py +0 -0
  256. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/theta.py +0 -0
  257. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/user_opts.py +0 -0
  258. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/configs/workqueue_ex.py +0 -0
  259. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/__init__.py +0 -0
  260. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/latency.py +0 -0
  261. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/test_apps/__init__.py +0 -0
  262. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/test_channels/__init__.py +0 -0
  263. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/test_channels/test_channels.py +0 -0
  264. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/test_channels/test_local_channel.py +0 -0
  265. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  266. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/test_stress/__init__.py +0 -0
  267. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  268. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  269. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/__init__.py +0 -0
  270. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/htex_local.py +0 -0
  271. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/test_basic.py +0 -0
  272. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -0
  273. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  274. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  275. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  276. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
  277. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  278. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/scaling_tests/__init__.py +0 -0
  279. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/scaling_tests/htex_local.py +0 -0
  280. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/scaling_tests/local_threads.py +0 -0
  281. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/scaling_tests/test_scale.py +0 -0
  282. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
  283. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/scaling_tests/vineex_local.py +0 -0
  284. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
  285. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/scaling_tests/wqex_local.py +0 -0
  286. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/site_tests/__init__.py +0 -0
  287. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/site_tests/site_config_selector.py +0 -0
  288. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/site_tests/test_provider.py +0 -0
  289. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/site_tests/test_site.py +0 -0
  290. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/__init__.py +0 -0
  291. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/test_affinity.py +0 -0
  292. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/test_concurrent.py +0 -0
  293. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  294. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/test_ec2.py +0 -0
  295. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/test_launchers.py +0 -0
  296. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/test_local_adhoc.py +0 -0
  297. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  298. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/sites/test_worker_info.py +0 -0
  299. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_aalst_patterns.py +0 -0
  300. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/__init__.py +0 -0
  301. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  302. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  303. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  304. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
  305. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  306. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  307. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  308. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  309. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  310. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  311. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  312. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
  313. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  314. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_callables.py +0 -0
  315. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_channels/__init__.py +0 -0
  316. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_channels/test_dfk_close.py +0 -0
  317. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_channels/test_large_output.py +0 -0
  318. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/__init__.py +0 -0
  319. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  320. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  321. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  322. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
  323. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  324. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  325. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  326. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  327. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_curvezmq.py +0 -0
  328. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_docs/__init__.py +0 -0
  329. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_docs/test_from_slides.py +0 -0
  330. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_docs/test_kwargs.py +0 -0
  331. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  332. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_docs/test_workflow1.py +0 -0
  333. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_docs/test_workflow2.py +0 -0
  334. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_docs/test_workflow4.py +0 -0
  335. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/__init__.py +0 -0
  336. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_fail.py +0 -0
  337. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  338. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
  339. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_retries.py +0 -0
  340. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  341. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  342. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  343. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  344. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  345. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_flux.py +0 -0
  346. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/__init__.py +0 -0
  347. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_basic.py +0 -0
  348. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
  349. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
  350. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  351. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
  352. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
  353. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_htex.py +0 -0
  354. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_manager_failure.py +0 -0
  355. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_managers_command.py +0 -0
  356. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_missing_worker.py +0 -0
  357. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
  358. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_worker_failure.py +0 -0
  359. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
  360. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/__init__.py +0 -0
  361. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_app_names.py +0 -0
  362. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_basic.py +0 -0
  363. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  364. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
  365. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
  366. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
  367. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  368. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
  369. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  370. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_mpi_apps/__init__.py +0 -0
  371. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
  372. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
  373. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
  374. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
  375. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_providers/__init__.py +0 -0
  376. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_providers/test_cobalt_deprecation_warning.py +0 -0
  377. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_providers/test_local_provider.py +0 -0
  378. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
  379. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  380. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_providers/test_slurm_template.py +0 -0
  381. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  382. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/__init__.py +0 -0
  383. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  384. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_basic.py +0 -0
  385. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
  386. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  387. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  388. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
  389. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  390. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_fail.py +0 -0
  391. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  392. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  393. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_futures.py +0 -0
  394. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
  395. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  396. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
  397. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_join.py +0 -0
  398. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  399. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  400. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  401. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  402. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  403. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  404. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  405. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  406. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  407. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_overview.py +0 -0
  408. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  409. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
  410. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_simple.py +0 -0
  411. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  412. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_python_apps/test_type5.py +0 -0
  413. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_radical/__init__.py +0 -0
  414. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
  415. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/__init__.py +0 -0
  416. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_1480.py +0 -0
  417. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  418. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_1653.py +0 -0
  419. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_221.py +0 -0
  420. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_226.py +0 -0
  421. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_2652.py +0 -0
  422. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_69a.py +0 -0
  423. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_854.py +0 -0
  424. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  425. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_regression/test_98.py +0 -0
  426. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_scaling/__init__.py +0 -0
  427. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  428. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  429. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
  430. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_scaling/test_scale_down.py +0 -0
  431. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
  432. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
  433. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
  434. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_serialization/__init__.py +0 -0
  435. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  436. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
  437. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_serialization/test_basic.py +0 -0
  438. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
  439. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
  440. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  441. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  442. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_shutdown/__init__.py +0 -0
  443. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
  444. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/__init__.py +0 -0
  445. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/staging_provider.py +0 -0
  446. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_1316.py +0 -0
  447. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_docs_1.py +0 -0
  448. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_docs_2.py +0 -0
  449. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  450. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_file.py +0 -0
  451. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_file_apps.py +0 -0
  452. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_file_staging.py +0 -0
  453. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
  454. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  455. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  456. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  457. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_staging_https.py +0 -0
  458. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
  459. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_zip_in.py +0 -0
  460. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_zip_out.py +0 -0
  461. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
  462. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_summary.py +0 -0
  463. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_thread_parallelism.py +0 -0
  464. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_threads/__init__.py +0 -0
  465. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_threads/test_configs.py +0 -0
  466. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  467. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_utils/__init__.py +0 -0
  468. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
  469. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/unit/__init__.py +0 -0
  470. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/unit/test_file.py +0 -0
  471. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/unit/test_usage_tracking.py +0 -0
  472. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/tests/utils.py +0 -0
  473. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/usage_tracking/__init__.py +0 -0
  474. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/usage_tracking/api.py +0 -0
  475. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/usage_tracking/levels.py +0 -0
  476. {parsl-2024.10.7 → parsl-2024.10.21}/parsl/usage_tracking/usage.py +0 -0
  477. {parsl-2024.10.7 → parsl-2024.10.21}/parsl.egg-info/dependency_links.txt +0 -0
  478. {parsl-2024.10.7 → parsl-2024.10.21}/parsl.egg-info/entry_points.txt +0 -0
  479. {parsl-2024.10.7 → parsl-2024.10.21}/parsl.egg-info/requires.txt +0 -0
  480. {parsl-2024.10.7 → parsl-2024.10.21}/parsl.egg-info/top_level.txt +0 -0
  481. {parsl-2024.10.7 → parsl-2024.10.21}/requirements.txt +0 -0
  482. {parsl-2024.10.7 → parsl-2024.10.21}/setup.cfg +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2024.10.7
3
+ Version: 2024.10.21
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.10.07.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2024.10.21.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -11,12 +11,11 @@ Keywords: Workflows,Scientific computing
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: License :: OSI Approved :: Apache Software License
14
- Classifier: Programming Language :: Python :: 3.8
15
14
  Classifier: Programming Language :: Python :: 3.9
16
15
  Classifier: Programming Language :: Python :: 3.10
17
16
  Classifier: Programming Language :: Python :: 3.11
18
17
  Classifier: Programming Language :: Python :: 3.12
19
- Requires-Python: >=3.8.0
18
+ Requires-Python: >=3.9.0
20
19
  Provides-Extra: monitoring
21
20
  Provides-Extra: visualization
22
21
  Provides-Extra: aws
@@ -117,7 +117,7 @@ For Developers
117
117
  Requirements
118
118
  ============
119
119
 
120
- Parsl is supported in Python 3.8+. Requirements can be found `here <requirements.txt>`_. Requirements for running tests can be found `here <test-requirements.txt>`_.
120
+ Parsl is supported in Python 3.9+. Requirements can be found `here <requirements.txt>`_. Requirements for running tests can be found `here <test-requirements.txt>`_.
121
121
 
122
122
  Code of Conduct
123
123
  ===============
@@ -1,4 +1,6 @@
1
1
  """Exceptions raise by Executors."""
2
+ from typing import Set
3
+
2
4
  from parsl.errors import ParslError
3
5
  from parsl.executors.base import ParslExecutor
4
6
 
@@ -44,6 +46,17 @@ class UnsupportedFeatureError(ExecutorError):
44
46
  self.current_executor)
45
47
 
46
48
 
49
+ class InvalidResourceSpecification(ExecutorError):
50
+ """Error raised when Invalid input is supplied via resource Specification"""
51
+
52
+ def __init__(self, invalid_keys: Set[str], message: str = ''):
53
+ self.invalid_keys = invalid_keys
54
+ self.message = message
55
+
56
+ def __str__(self):
57
+ return f"Invalid Resource Specification Supplied: {self.invalid_keys}. {self.message}"
58
+
59
+
47
60
  class ScalingFailed(ExecutorError):
48
61
  """Scaling failed due to error in Execution provider."""
49
62
 
@@ -16,16 +16,17 @@ from parsl import curvezmq
16
16
  from parsl.addresses import get_all_addresses
17
17
  from parsl.app.errors import RemoteExceptionWrapper
18
18
  from parsl.data_provider.staging import Staging
19
- from parsl.executors.errors import BadMessage, ScalingFailed
19
+ from parsl.executors.errors import (
20
+ BadMessage,
21
+ InvalidResourceSpecification,
22
+ ScalingFailed,
23
+ )
20
24
  from parsl.executors.high_throughput import zmq_pipes
21
25
  from parsl.executors.high_throughput.errors import CommandClientTimeoutError
22
26
  from parsl.executors.high_throughput.manager_selector import (
23
27
  ManagerSelector,
24
28
  RandomManagerSelector,
25
29
  )
26
- from parsl.executors.high_throughput.mpi_prefix_composer import (
27
- InvalidResourceSpecification,
28
- )
29
30
  from parsl.executors.status_handling import BlockProviderExecutor
30
31
  from parsl.jobs.states import TERMINAL_STATES, JobState, JobStatus
31
32
  from parsl.process_loggers import wrap_with_logs
@@ -145,6 +146,11 @@ GENERAL_HTEX_PARAM_DOCS = """provider : :class:`~parsl.providers.base.ExecutionP
145
146
 
146
147
  encrypted : bool
147
148
  Flag to enable/disable encryption (CurveZMQ). Default is False.
149
+
150
+ manager_selector: ManagerSelector
151
+ Determines what strategy the interchange uses to select managers during task distribution.
152
+ See API reference under "Manager Selectors" regarding the various manager selectors.
153
+ Default: 'RandomManagerSelector'
148
154
  """ # Documentation for params used by both HTEx and MPIEx
149
155
 
150
156
 
@@ -340,15 +346,17 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
340
346
  return self.logdir
341
347
 
342
348
  def validate_resource_spec(self, resource_specification: dict):
343
- """HTEX does not support *any* resource_specification options and
344
- will raise InvalidResourceSpecification is any are passed to it"""
349
+ """HTEX supports the following *Optional* resource specifications:
350
+ priority: lower value is higher priority"""
345
351
  if resource_specification:
346
- raise InvalidResourceSpecification(
347
- set(resource_specification.keys()),
348
- ("HTEX does not support the supplied resource_specifications."
349
- "For MPI applications consider using the MPIExecutor. "
350
- "For specifications for core count/memory/walltime, consider using WorkQueueExecutor. ")
351
- )
352
+ acceptable_fields = {'priority'}
353
+ keys = set(resource_specification.keys())
354
+ invalid_keys = keys - acceptable_fields
355
+ if invalid_keys:
356
+ message = "Task resource specification only accepts these types of resources: {}".format(
357
+ ', '.join(acceptable_fields))
358
+ logger.error(message)
359
+ raise InvalidResourceSpecification(set(invalid_keys), message)
352
360
  return
353
361
 
354
362
  def initialize_scaling(self):
@@ -459,9 +467,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
459
467
  except pickle.UnpicklingError:
460
468
  raise BadMessage("Message received could not be unpickled")
461
469
 
462
- if msg['type'] == 'heartbeat':
463
- continue
464
- elif msg['type'] == 'result':
470
+ if msg['type'] == 'result':
465
471
  try:
466
472
  tid = msg['task_id']
467
473
  except Exception:
@@ -581,7 +587,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
581
587
  def outstanding(self) -> int:
582
588
  """Returns the count of tasks outstanding across the interchange
583
589
  and managers"""
584
- return self.command_client.run("OUTSTANDING_C")
590
+ return len(self.tasks)
585
591
 
586
592
  @property
587
593
  def connected_workers(self) -> int:
@@ -658,7 +664,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
658
664
  except TypeError:
659
665
  raise SerializationError(func.__name__)
660
666
 
661
- msg = {"task_id": task_id, "buffer": fn_buf}
667
+ msg = {"task_id": task_id, "resource_spec": resource_specification, "buffer": fn_buf}
662
668
 
663
669
  # Post task to the outgoing queue
664
670
  self.outgoing_q.put(msg)
@@ -6,7 +6,6 @@ import os
6
6
  import pickle
7
7
  import platform
8
8
  import queue
9
- import signal
10
9
  import sys
11
10
  import threading
12
11
  import time
@@ -252,13 +251,7 @@ class Interchange:
252
251
  try:
253
252
  command_req = self.command_channel.recv_pyobj()
254
253
  logger.debug("Received command request: {}".format(command_req))
255
- if command_req == "OUTSTANDING_C":
256
- outstanding = self.pending_task_queue.qsize()
257
- for manager in self._ready_managers.values():
258
- outstanding += len(manager['tasks'])
259
- reply = outstanding
260
-
261
- elif command_req == "CONNECTED_BLOCKS":
254
+ if command_req == "CONNECTED_BLOCKS":
262
255
  reply = self.connected_block_history
263
256
 
264
257
  elif command_req == "WORKERS":
@@ -319,16 +312,6 @@ class Interchange:
319
312
  """ Start the interchange
320
313
  """
321
314
 
322
- # If a user workflow has set its own signal handler for sigterm, that
323
- # handler will be inherited by the interchange process because it is
324
- # launched as a multiprocessing fork process.
325
- # That can interfere with the interchange shutdown mechanism, which is
326
- # to receive a SIGTERM and exit immediately.
327
- # See Parsl issue #2343 (Threads and multiprocessing cannot be
328
- # intermingled without deadlocks) which talks about other fork-related
329
- # parent-process-inheritance problems.
330
- signal.signal(signal.SIGTERM, signal.SIG_DFL)
331
-
332
315
  logger.info("Starting main interchange method")
333
316
 
334
317
  if self.hub_address is not None and self.hub_zmq_port is not None:
@@ -549,7 +532,6 @@ class Interchange:
549
532
  monitoring_radio.send(r['payload'])
550
533
  elif r['type'] == 'heartbeat':
551
534
  logger.debug("Manager %r sent heartbeat via results connection", manager_id)
552
- b_messages.append((p_message, r))
553
535
  else:
554
536
  logger.error("Interchange discarding result_queue message of unknown type: %s", r["type"])
555
537
 
@@ -0,0 +1,55 @@
1
+ import random
2
+ from abc import ABCMeta, abstractmethod
3
+ from typing import Dict, List, Set
4
+
5
+ from parsl.executors.high_throughput.manager_record import ManagerRecord
6
+
7
+
8
+ class ManagerSelector(metaclass=ABCMeta):
9
+
10
+ @abstractmethod
11
+ def sort_managers(self, ready_managers: Dict[bytes, ManagerRecord], manager_list: Set[bytes]) -> List[bytes]:
12
+ """ Sort a given list of managers.
13
+
14
+ Any operations pertaining to the sorting and rearrangement of the
15
+ interesting_managers Set should be performed here.
16
+ """
17
+ pass
18
+
19
+
20
+ class RandomManagerSelector(ManagerSelector):
21
+
22
+ """Returns a shuffled list of interesting_managers
23
+
24
+ By default this strategy is used by the interchange. Works well
25
+ in distributing workloads equally across all availble compute
26
+ resources. The random workload strategy is not effective in
27
+ conjunction with elastic scaling behavior as the even task
28
+ distribution does not allow the scaling down of blocks, leading
29
+ to wasted resource consumption.
30
+ """
31
+
32
+ def sort_managers(self, ready_managers: Dict[bytes, ManagerRecord], manager_list: Set[bytes]) -> List[bytes]:
33
+ c_manager_list = list(manager_list)
34
+ random.shuffle(c_manager_list)
35
+ return c_manager_list
36
+
37
+
38
+ class BlockIdManagerSelector(ManagerSelector):
39
+
40
+ """Returns an interesting_managers list sorted by block ID
41
+
42
+ Observations:
43
+ 1. BlockID manager selector helps with workloads that see a varying
44
+ amount of tasks over time. New blocks are prioritized with the
45
+ blockID manager selector, when used with 'htex_auto_scaling', results
46
+ in compute cost savings.
47
+
48
+ 2. Doesn't really work with bag-of-tasks workloads. When all the tasks
49
+ are put into the queue upfront, all blocks operate at near full
50
+ utilization for the majority of the workload, which task goes where
51
+ doesn't really matter.
52
+ """
53
+
54
+ def sort_managers(self, ready_managers: Dict[bytes, ManagerRecord], manager_list: Set[bytes]) -> List[bytes]:
55
+ return sorted(manager_list, key=lambda x: (ready_managers[x]['block_id'] is not None, ready_managers[x]['block_id']))
@@ -1,5 +1,7 @@
1
1
  import logging
2
- from typing import Dict, List, Set, Tuple
2
+ from typing import Dict, List, Tuple
3
+
4
+ from parsl.executors.errors import InvalidResourceSpecification
3
5
 
4
6
  logger = logging.getLogger(__name__)
5
7
 
@@ -8,27 +10,6 @@ VALID_LAUNCHERS = ('srun',
8
10
  'mpiexec')
9
11
 
10
12
 
11
- class MissingResourceSpecification(Exception):
12
- """Exception raised when input is not supplied a resource specification"""
13
-
14
- def __init__(self, reason: str):
15
- self.reason = reason
16
-
17
- def __str__(self):
18
- return f"Missing resource specification: {self.reason}"
19
-
20
-
21
- class InvalidResourceSpecification(Exception):
22
- """Exception raised when Invalid input is supplied via resource specification"""
23
-
24
- def __init__(self, invalid_keys: Set[str], message: str = ''):
25
- self.invalid_keys = invalid_keys
26
- self.message = message
27
-
28
- def __str__(self):
29
- return f"Invalid resource specification options supplied: {self.invalid_keys} {self.message}"
30
-
31
-
32
13
  def validate_resource_spec(resource_spec: Dict[str, str]):
33
14
  """Basic validation of keys in the resource_spec
34
15
 
@@ -40,7 +21,8 @@ def validate_resource_spec(resource_spec: Dict[str, str]):
40
21
  # empty resource_spec when mpi_mode is set causes parsl to hang
41
22
  # ref issue #3427
42
23
  if len(user_keys) == 0:
43
- raise MissingResourceSpecification('MPI mode requires optional parsl_resource_specification keyword argument to be configured')
24
+ raise InvalidResourceSpecification(user_keys,
25
+ 'MPI mode requires optional parsl_resource_specification keyword argument to be configured')
44
26
 
45
27
  legal_keys = set(("ranks_per_node",
46
28
  "num_nodes",
@@ -362,7 +362,7 @@ class Manager:
362
362
  if tasks == HEARTBEAT_CODE:
363
363
  logger.debug("Got heartbeat from interchange")
364
364
  elif tasks == DRAINED_CODE:
365
- logger.info("Got fulled drained message from interchange - setting kill flag")
365
+ logger.info("Got fully drained message from interchange - setting kill flag")
366
366
  kill_event.set()
367
367
  else:
368
368
  task_recv_counter += len(tasks)
@@ -6,7 +6,7 @@ import typeguard
6
6
 
7
7
  from parsl.data_provider.staging import Staging
8
8
  from parsl.executors.base import ParslExecutor
9
- from parsl.executors.errors import UnsupportedFeatureError
9
+ from parsl.executors.errors import InvalidResourceSpecification
10
10
  from parsl.utils import RepresentationMixin
11
11
 
12
12
  logger = logging.getLogger(__name__)
@@ -54,7 +54,8 @@ class ThreadPoolExecutor(ParslExecutor, RepresentationMixin):
54
54
  if resource_specification:
55
55
  logger.error("Ignoring the resource specification. "
56
56
  "Parsl resource specification is not supported in ThreadPool Executor.")
57
- raise UnsupportedFeatureError('resource specification', 'ThreadPool Executor', None)
57
+ raise InvalidResourceSpecification(set(resource_specification.keys()),
58
+ "Parsl resource specification is not supported in ThreadPool Executor.")
58
59
 
59
60
  return self.executor.submit(func, *args, **kwargs)
60
61
 
@@ -28,7 +28,7 @@ import parsl.utils as putils
28
28
  from parsl.data_provider.files import File
29
29
  from parsl.data_provider.staging import Staging
30
30
  from parsl.errors import OptionalModuleMissing
31
- from parsl.executors.errors import ExecutorError
31
+ from parsl.executors.errors import ExecutorError, InvalidResourceSpecification
32
32
  from parsl.executors.status_handling import BlockProviderExecutor
33
33
  from parsl.executors.workqueue import exec_parsl_function
34
34
  from parsl.process_loggers import wrap_with_logs
@@ -419,7 +419,7 @@ class WorkQueueExecutor(BlockProviderExecutor, putils.RepresentationMixin):
419
419
  message = "Task resource specification only accepts these types of resources: {}".format(
420
420
  ', '.join(acceptable_fields))
421
421
  logger.error(message)
422
- raise ExecutorError(self, message)
422
+ raise InvalidResourceSpecification(keys, message)
423
423
 
424
424
  # this checks that either all of the required resource types are specified, or
425
425
  # that none of them are: the `required_resource_types` are not actually required,
@@ -430,9 +430,10 @@ class WorkQueueExecutor(BlockProviderExecutor, putils.RepresentationMixin):
430
430
  logger.error("Running with `autolabel=False`. In this mode, "
431
431
  "task resource specification requires "
432
432
  "three resources to be specified simultaneously: cores, memory, and disk")
433
- raise ExecutorError(self, "Task resource specification requires "
434
- "three resources to be specified simultaneously: cores, memory, and disk. "
435
- "Try setting autolabel=True if you are unsure of the resource usage")
433
+ raise InvalidResourceSpecification(keys,
434
+ "Task resource specification requires "
435
+ "three resources to be specified simultaneously: cores, memory, and disk. "
436
+ "Try setting autolabel=True if you are unsure of the resource usage")
436
437
 
437
438
  for k in keys:
438
439
  if k == 'cores':
@@ -1,10 +1,5 @@
1
1
  import logging
2
- import time
3
-
4
- from parsl.providers.kubernetes.template import template_string
5
-
6
- logger = logging.getLogger(__name__)
7
-
2
+ import uuid
8
3
  from typing import Any, Dict, List, Optional, Tuple
9
4
 
10
5
  import typeguard
@@ -12,7 +7,8 @@ import typeguard
12
7
  from parsl.errors import OptionalModuleMissing
13
8
  from parsl.jobs.states import JobState, JobStatus
14
9
  from parsl.providers.base import ExecutionProvider
15
- from parsl.utils import RepresentationMixin
10
+ from parsl.providers.kubernetes.template import template_string
11
+ from parsl.utils import RepresentationMixin, sanitize_dns_subdomain_rfc1123
16
12
 
17
13
  try:
18
14
  from kubernetes import client, config
@@ -20,6 +16,8 @@ try:
20
16
  except (ImportError, NameError, FileNotFoundError):
21
17
  _kubernetes_enabled = False
22
18
 
19
+ logger = logging.getLogger(__name__)
20
+
23
21
  translate_table = {
24
22
  'Running': JobState.RUNNING,
25
23
  'Pending': JobState.PENDING,
@@ -161,7 +159,7 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
161
159
  self.resources: Dict[object, Dict[str, Any]]
162
160
  self.resources = {}
163
161
 
164
- def submit(self, cmd_string, tasks_per_node, job_name="parsl"):
162
+ def submit(self, cmd_string: str, tasks_per_node: int, job_name: str = "parsl.kube"):
165
163
  """ Submit a job
166
164
  Args:
167
165
  - cmd_string :(String) - Name of the container to initiate
@@ -173,15 +171,19 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
173
171
  Returns:
174
172
  - job_id: (string) Identifier for the job
175
173
  """
174
+ job_id = uuid.uuid4().hex[:8]
176
175
 
177
- cur_timestamp = str(time.time() * 1000).split(".")[0]
178
- job_name = "{0}-{1}".format(job_name, cur_timestamp)
179
-
180
- if not self.pod_name:
181
- pod_name = '{}'.format(job_name)
182
- else:
183
- pod_name = '{}-{}'.format(self.pod_name,
184
- cur_timestamp)
176
+ pod_name = self.pod_name or job_name
177
+ try:
178
+ pod_name = sanitize_dns_subdomain_rfc1123(pod_name)
179
+ except ValueError:
180
+ logger.warning(
181
+ f"Invalid pod name '{pod_name}' for job '{job_id}', falling back to 'parsl.kube'"
182
+ )
183
+ pod_name = "parsl.kube"
184
+ pod_name = pod_name[:253 - 1 - len(job_id)] # Leave room for the job ID
185
+ pod_name = pod_name.rstrip(".-") # Remove trailing dot or hyphen after trim
186
+ pod_name = f"{pod_name}.{job_id}"
185
187
 
186
188
  formatted_cmd = template_string.format(command=cmd_string,
187
189
  worker_init=self.worker_init)
@@ -189,14 +191,14 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
189
191
  logger.debug("Pod name: %s", pod_name)
190
192
  self._create_pod(image=self.image,
191
193
  pod_name=pod_name,
192
- job_name=job_name,
194
+ job_id=job_id,
193
195
  cmd_string=formatted_cmd,
194
196
  volumes=self.persistent_volumes,
195
197
  service_account_name=self.service_account_name,
196
198
  annotations=self.annotations)
197
- self.resources[pod_name] = {'status': JobStatus(JobState.RUNNING)}
199
+ self.resources[job_id] = {'status': JobStatus(JobState.RUNNING), 'pod_name': pod_name}
198
200
 
199
- return pod_name
201
+ return job_id
200
202
 
201
203
  def status(self, job_ids):
202
204
  """ Get the status of a list of jobs identified by the job identifiers
@@ -212,6 +214,9 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
212
214
  self._status()
213
215
  return [self.resources[jid]['status'] for jid in job_ids]
214
216
 
217
+ def _get_pod_name(self, job_id: str) -> str:
218
+ return self.resources[job_id]['pod_name']
219
+
215
220
  def cancel(self, job_ids):
216
221
  """ Cancels the jobs specified by a list of job ids
217
222
  Args:
@@ -221,7 +226,8 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
221
226
  """
222
227
  for job in job_ids:
223
228
  logger.debug("Terminating job/pod: {0}".format(job))
224
- self._delete_pod(job)
229
+ pod_name = self._get_pod_name(job)
230
+ self._delete_pod(pod_name)
225
231
 
226
232
  self.resources[job]['status'] = JobStatus(JobState.CANCELLED)
227
233
  rets = [True for i in job_ids]
@@ -242,7 +248,8 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
242
248
  for jid in to_poll_job_ids:
243
249
  phase = None
244
250
  try:
245
- pod = self.kube_client.read_namespaced_pod(name=jid, namespace=self.namespace)
251
+ pod_name = self._get_pod_name(jid)
252
+ pod = self.kube_client.read_namespaced_pod(name=pod_name, namespace=self.namespace)
246
253
  except Exception:
247
254
  logger.exception("Failed to poll pod {} status, most likely because pod was terminated".format(jid))
248
255
  if self.resources[jid]['status'] is JobStatus(JobState.RUNNING):
@@ -257,10 +264,10 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
257
264
  self.resources[jid]['status'] = JobStatus(status)
258
265
 
259
266
  def _create_pod(self,
260
- image,
261
- pod_name,
262
- job_name,
263
- port=80,
267
+ image: str,
268
+ pod_name: str,
269
+ job_id: str,
270
+ port: int = 80,
264
271
  cmd_string=None,
265
272
  volumes=[],
266
273
  service_account_name=None,
@@ -269,7 +276,7 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
269
276
  Args:
270
277
  - image (string) : Docker image to launch
271
278
  - pod_name (string) : Name of the pod
272
- - job_name (string) : App label
279
+ - job_id (string) : Job ID
273
280
  KWargs:
274
281
  - port (integer) : Container port
275
282
  Returns:
@@ -299,7 +306,7 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
299
306
  )
300
307
  # Configure Pod template container
301
308
  container = client.V1Container(
302
- name=pod_name,
309
+ name=job_id,
303
310
  image=image,
304
311
  resources=resources,
305
312
  ports=[client.V1ContainerPort(container_port=port)],
@@ -322,7 +329,7 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
322
329
  claim_name=volume[0])))
323
330
 
324
331
  metadata = client.V1ObjectMeta(name=pod_name,
325
- labels={"app": job_name},
332
+ labels={"parsl-job-id": job_id},
326
333
  annotations=annotations)
327
334
  spec = client.V1PodSpec(containers=[container],
328
335
  image_pull_secrets=[secret],
@@ -58,7 +58,7 @@ def tmpd_cwd_session(pytestconfig):
58
58
 
59
59
  config = re.sub(r"[^A-z0-9_-]+", "_", pytestconfig.getoption('config')[0])
60
60
  cwd = pathlib.Path(os.getcwd())
61
- pytest_dir = cwd / ".pytest"
61
+ pytest_dir = cwd / "pytest-parsl"
62
62
  pytest_dir.mkdir(mode=0o700, parents=True, exist_ok=True)
63
63
 
64
64
  test_dir_prefix = "parsltest-"
@@ -1,11 +1,9 @@
1
1
  import parsl
2
2
  from parsl.app.app import python_app
3
3
  from parsl.executors import WorkQueueExecutor
4
- from parsl.executors.errors import ExecutorError, UnsupportedFeatureError
4
+ from parsl.executors.errors import InvalidResourceSpecification
5
5
  from parsl.executors.high_throughput.executor import HighThroughputExecutor
6
- from parsl.executors.high_throughput.mpi_prefix_composer import (
7
- InvalidResourceSpecification,
8
- )
6
+ from parsl.executors.threads import ThreadPoolExecutor
9
7
 
10
8
 
11
9
  @python_app
@@ -27,11 +25,10 @@ def test_resource(n=2):
27
25
  try:
28
26
  fut.result()
29
27
  except InvalidResourceSpecification:
30
- assert isinstance(executor, HighThroughputExecutor)
31
- except UnsupportedFeatureError:
32
- assert not isinstance(executor, WorkQueueExecutor)
33
- except Exception as e:
34
- assert isinstance(e, ExecutorError)
28
+ assert (
29
+ isinstance(executor, HighThroughputExecutor) or
30
+ isinstance(executor, WorkQueueExecutor) or
31
+ isinstance(executor, ThreadPoolExecutor))
35
32
 
36
33
  # Specify resources with wrong types
37
34
  # 'cpus' is incorrect, should be 'cores'
@@ -40,8 +37,7 @@ def test_resource(n=2):
40
37
  try:
41
38
  fut.result()
42
39
  except InvalidResourceSpecification:
43
- assert isinstance(executor, HighThroughputExecutor)
44
- except UnsupportedFeatureError:
45
- assert not isinstance(executor, WorkQueueExecutor)
46
- except Exception as e:
47
- assert isinstance(e, ExecutorError)
40
+ assert (
41
+ isinstance(executor, HighThroughputExecutor) or
42
+ isinstance(executor, WorkQueueExecutor) or
43
+ isinstance(executor, ThreadPoolExecutor))
@@ -0,0 +1,20 @@
1
+ import pytest
2
+
3
+ from parsl.executors.high_throughput.manager_record import ManagerRecord
4
+ from parsl.executors.high_throughput.manager_selector import BlockIdManagerSelector
5
+
6
+
7
+ @pytest.mark.local
8
+ def test_sort_managers():
9
+ ready_managers = {
10
+ b'manager1': {'block_id': 1},
11
+ b'manager2': {'block_id': None},
12
+ b'manager3': {'block_id': 3},
13
+ b'manager4': {'block_id': 2}
14
+ }
15
+
16
+ manager_list = {b'manager1', b'manager2', b'manager3', b'manager4'}
17
+ expected_sorted_list = [b'manager2', b'manager1', b'manager4', b'manager3']
18
+ manager_selector = BlockIdManagerSelector()
19
+ sorted_managers = manager_selector.sort_managers(ready_managers, manager_list)
20
+ assert sorted_managers == expected_sorted_list
@@ -13,7 +13,9 @@ from parsl.providers import LocalProvider
13
13
  # based around the expected drain period: the drain period
14
14
  # is TIME_CONST seconds, and the single executed task will
15
15
  # last twice that many number of seconds.
16
- TIME_CONST = 1
16
+ TIME_CONST = 4
17
+
18
+ CONNECTED_MANAGERS_POLL_MS = 100
17
19
 
18
20
 
19
21
  def local_config():
@@ -52,7 +54,7 @@ def test_drain(try_assert):
52
54
 
53
55
  # wait till we have a block running...
54
56
 
55
- try_assert(lambda: len(htex.connected_managers()) == 1)
57
+ try_assert(lambda: len(htex.connected_managers()) == 1, check_period_ms=CONNECTED_MANAGERS_POLL_MS)
56
58
 
57
59
  managers = htex.connected_managers()
58
60
  assert managers[0]['active'], "The manager should be active"
@@ -63,7 +65,7 @@ def test_drain(try_assert):
63
65
  time.sleep(TIME_CONST)
64
66
 
65
67
  # this assert should happen *very fast* after the above delay...
66
- try_assert(lambda: htex.connected_managers()[0]['draining'], timeout_ms=500)
68
+ try_assert(lambda: htex.connected_managers()[0]['draining'], timeout_ms=500, check_period_ms=CONNECTED_MANAGERS_POLL_MS)
67
69
 
68
70
  # and the test task should still be running...
69
71
  assert not fut.done(), "The test task should still be running"
@@ -76,4 +78,4 @@ def test_drain(try_assert):
76
78
  # connected managers.
77
79
  # As with the above draining assert, this should happen very fast after
78
80
  # the task ends.
79
- try_assert(lambda: len(htex.connected_managers()) == 0, timeout_ms=500)
81
+ try_assert(lambda: len(htex.connected_managers()) == 0, timeout_ms=500, check_period_ms=CONNECTED_MANAGERS_POLL_MS)