parsl 2024.3.18__py3-none-any.whl → 2025.1.13__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. parsl/__init__.py +9 -10
  2. parsl/addresses.py +26 -6
  3. parsl/app/app.py +7 -8
  4. parsl/app/bash.py +15 -8
  5. parsl/app/errors.py +10 -13
  6. parsl/app/futures.py +8 -10
  7. parsl/app/python.py +2 -1
  8. parsl/benchmark/perf.py +2 -1
  9. parsl/concurrent/__init__.py +2 -2
  10. parsl/config.py +53 -10
  11. parsl/configs/ASPIRE1.py +6 -5
  12. parsl/configs/Azure.py +9 -8
  13. parsl/configs/bridges.py +6 -4
  14. parsl/configs/cc_in2p3.py +3 -3
  15. parsl/configs/ec2.py +3 -1
  16. parsl/configs/expanse.py +4 -3
  17. parsl/configs/frontera.py +3 -4
  18. parsl/configs/htex_local.py +3 -4
  19. parsl/configs/illinoiscluster.py +3 -1
  20. parsl/configs/improv.py +34 -0
  21. parsl/configs/kubernetes.py +4 -3
  22. parsl/configs/local_threads.py +5 -1
  23. parsl/configs/midway.py +5 -3
  24. parsl/configs/osg.py +4 -2
  25. parsl/configs/polaris.py +4 -2
  26. parsl/configs/stampede2.py +6 -5
  27. parsl/configs/summit.py +3 -3
  28. parsl/configs/toss3_llnl.py +4 -3
  29. parsl/configs/vineex_local.py +6 -4
  30. parsl/configs/wqex_local.py +5 -3
  31. parsl/curvezmq.py +4 -0
  32. parsl/data_provider/data_manager.py +4 -3
  33. parsl/data_provider/file_noop.py +1 -2
  34. parsl/data_provider/files.py +3 -3
  35. parsl/data_provider/ftp.py +1 -3
  36. parsl/data_provider/globus.py +7 -6
  37. parsl/data_provider/http.py +2 -2
  38. parsl/data_provider/rsync.py +1 -1
  39. parsl/data_provider/staging.py +2 -2
  40. parsl/data_provider/zip.py +135 -0
  41. parsl/dataflow/dependency_resolvers.py +115 -0
  42. parsl/dataflow/dflow.py +259 -223
  43. parsl/dataflow/errors.py +3 -5
  44. parsl/dataflow/futures.py +27 -14
  45. parsl/dataflow/memoization.py +5 -5
  46. parsl/dataflow/rundirs.py +5 -6
  47. parsl/dataflow/taskrecord.py +4 -5
  48. parsl/executors/__init__.py +4 -2
  49. parsl/executors/base.py +45 -15
  50. parsl/executors/errors.py +13 -0
  51. parsl/executors/execute_task.py +37 -0
  52. parsl/executors/flux/execute_parsl_task.py +3 -3
  53. parsl/executors/flux/executor.py +18 -19
  54. parsl/executors/flux/flux_instance_manager.py +26 -27
  55. parsl/executors/high_throughput/errors.py +43 -3
  56. parsl/executors/high_throughput/executor.py +307 -285
  57. parsl/executors/high_throughput/interchange.py +137 -168
  58. parsl/executors/high_throughput/manager_record.py +4 -0
  59. parsl/executors/high_throughput/manager_selector.py +55 -0
  60. parsl/executors/high_throughput/monitoring_info.py +2 -1
  61. parsl/executors/high_throughput/mpi_executor.py +113 -0
  62. parsl/executors/high_throughput/mpi_prefix_composer.py +10 -11
  63. parsl/executors/high_throughput/mpi_resource_management.py +6 -17
  64. parsl/executors/high_throughput/probe.py +9 -7
  65. parsl/executors/high_throughput/process_worker_pool.py +77 -75
  66. parsl/executors/high_throughput/zmq_pipes.py +81 -23
  67. parsl/executors/radical/executor.py +130 -79
  68. parsl/executors/radical/rpex_resources.py +17 -15
  69. parsl/executors/radical/rpex_worker.py +4 -3
  70. parsl/executors/status_handling.py +157 -51
  71. parsl/executors/taskvine/__init__.py +1 -1
  72. parsl/executors/taskvine/errors.py +1 -1
  73. parsl/executors/taskvine/exec_parsl_function.py +2 -2
  74. parsl/executors/taskvine/executor.py +38 -55
  75. parsl/executors/taskvine/factory.py +1 -1
  76. parsl/executors/taskvine/factory_config.py +1 -1
  77. parsl/executors/taskvine/manager.py +17 -13
  78. parsl/executors/taskvine/manager_config.py +7 -2
  79. parsl/executors/threads.py +6 -6
  80. parsl/executors/workqueue/errors.py +1 -1
  81. parsl/executors/workqueue/exec_parsl_function.py +6 -5
  82. parsl/executors/workqueue/executor.py +64 -63
  83. parsl/executors/workqueue/parsl_coprocess.py +1 -1
  84. parsl/jobs/error_handlers.py +2 -2
  85. parsl/jobs/job_status_poller.py +28 -112
  86. parsl/jobs/states.py +7 -2
  87. parsl/jobs/strategy.py +43 -31
  88. parsl/launchers/__init__.py +12 -3
  89. parsl/launchers/errors.py +1 -1
  90. parsl/launchers/launchers.py +0 -6
  91. parsl/log_utils.py +1 -2
  92. parsl/monitoring/db_manager.py +55 -93
  93. parsl/monitoring/errors.py +6 -0
  94. parsl/monitoring/monitoring.py +85 -311
  95. parsl/monitoring/queries/pandas.py +1 -2
  96. parsl/monitoring/radios/base.py +13 -0
  97. parsl/monitoring/radios/filesystem.py +52 -0
  98. parsl/monitoring/radios/htex.py +57 -0
  99. parsl/monitoring/radios/multiprocessing.py +17 -0
  100. parsl/monitoring/radios/udp.py +56 -0
  101. parsl/monitoring/radios/zmq.py +17 -0
  102. parsl/monitoring/remote.py +33 -37
  103. parsl/monitoring/router.py +212 -0
  104. parsl/monitoring/types.py +5 -6
  105. parsl/monitoring/visualization/app.py +4 -2
  106. parsl/monitoring/visualization/models.py +0 -1
  107. parsl/monitoring/visualization/plots/default/workflow_plots.py +8 -4
  108. parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +1 -0
  109. parsl/monitoring/visualization/utils.py +0 -1
  110. parsl/monitoring/visualization/views.py +16 -9
  111. parsl/multiprocessing.py +0 -1
  112. parsl/process_loggers.py +1 -2
  113. parsl/providers/__init__.py +8 -17
  114. parsl/providers/aws/aws.py +2 -3
  115. parsl/providers/azure/azure.py +4 -5
  116. parsl/providers/base.py +2 -18
  117. parsl/providers/cluster_provider.py +3 -9
  118. parsl/providers/condor/condor.py +7 -17
  119. parsl/providers/errors.py +2 -2
  120. parsl/providers/googlecloud/googlecloud.py +2 -1
  121. parsl/providers/grid_engine/grid_engine.py +5 -14
  122. parsl/providers/kubernetes/kube.py +80 -40
  123. parsl/providers/local/local.py +13 -26
  124. parsl/providers/lsf/lsf.py +5 -23
  125. parsl/providers/pbspro/pbspro.py +5 -17
  126. parsl/providers/slurm/slurm.py +81 -39
  127. parsl/providers/torque/torque.py +3 -14
  128. parsl/serialize/__init__.py +8 -3
  129. parsl/serialize/base.py +1 -2
  130. parsl/serialize/concretes.py +5 -4
  131. parsl/serialize/facade.py +3 -3
  132. parsl/serialize/proxystore.py +3 -2
  133. parsl/tests/__init__.py +1 -1
  134. parsl/tests/configs/azure_single_node.py +4 -5
  135. parsl/tests/configs/bridges.py +3 -2
  136. parsl/tests/configs/cc_in2p3.py +1 -3
  137. parsl/tests/configs/comet.py +2 -1
  138. parsl/tests/configs/ec2_single_node.py +1 -2
  139. parsl/tests/configs/ec2_spot.py +1 -2
  140. parsl/tests/configs/flux_local.py +11 -0
  141. parsl/tests/configs/frontera.py +2 -3
  142. parsl/tests/configs/htex_local.py +3 -5
  143. parsl/tests/configs/htex_local_alternate.py +11 -15
  144. parsl/tests/configs/htex_local_intask_staging.py +5 -9
  145. parsl/tests/configs/htex_local_rsync_staging.py +4 -8
  146. parsl/tests/configs/local_radical.py +1 -3
  147. parsl/tests/configs/local_radical_mpi.py +2 -2
  148. parsl/tests/configs/local_threads_checkpoint_periodic.py +8 -10
  149. parsl/tests/configs/local_threads_monitoring.py +0 -1
  150. parsl/tests/configs/midway.py +2 -2
  151. parsl/tests/configs/nscc_singapore.py +3 -3
  152. parsl/tests/configs/osg_htex.py +1 -1
  153. parsl/tests/configs/petrelkube.py +3 -2
  154. parsl/tests/configs/slurm_local.py +24 -0
  155. parsl/tests/configs/summit.py +1 -0
  156. parsl/tests/configs/taskvine_ex.py +4 -7
  157. parsl/tests/configs/user_opts.py +0 -7
  158. parsl/tests/configs/workqueue_ex.py +4 -6
  159. parsl/tests/conftest.py +27 -13
  160. parsl/tests/integration/test_stress/test_python_simple.py +3 -4
  161. parsl/tests/integration/test_stress/test_python_threads.py +3 -5
  162. parsl/tests/manual_tests/htex_local.py +4 -6
  163. parsl/tests/manual_tests/test_basic.py +1 -0
  164. parsl/tests/manual_tests/test_log_filter.py +3 -1
  165. parsl/tests/manual_tests/test_memory_limits.py +6 -8
  166. parsl/tests/manual_tests/test_regression_220.py +2 -1
  167. parsl/tests/manual_tests/test_udp_simple.py +4 -4
  168. parsl/tests/manual_tests/test_worker_count.py +3 -2
  169. parsl/tests/scaling_tests/htex_local.py +2 -4
  170. parsl/tests/scaling_tests/test_scale.py +0 -9
  171. parsl/tests/scaling_tests/vineex_condor.py +1 -2
  172. parsl/tests/scaling_tests/vineex_local.py +1 -2
  173. parsl/tests/site_tests/site_config_selector.py +1 -6
  174. parsl/tests/site_tests/test_provider.py +4 -2
  175. parsl/tests/site_tests/test_site.py +2 -0
  176. parsl/tests/sites/test_affinity.py +7 -7
  177. parsl/tests/sites/test_dynamic_executor.py +3 -4
  178. parsl/tests/sites/test_ec2.py +3 -2
  179. parsl/tests/sites/test_worker_info.py +4 -5
  180. parsl/tests/test_aalst_patterns.py +0 -1
  181. parsl/tests/test_bash_apps/test_apptimeout.py +2 -2
  182. parsl/tests/test_bash_apps/test_basic.py +10 -4
  183. parsl/tests/test_bash_apps/test_error_codes.py +5 -7
  184. parsl/tests/test_bash_apps/test_inputs_default.py +25 -0
  185. parsl/tests/test_bash_apps/test_kwarg_storage.py +1 -1
  186. parsl/tests/test_bash_apps/test_memoize.py +2 -8
  187. parsl/tests/test_bash_apps/test_memoize_ignore_args.py +9 -14
  188. parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +9 -14
  189. parsl/tests/test_bash_apps/test_multiline.py +1 -1
  190. parsl/tests/test_bash_apps/test_pipeline.py +1 -1
  191. parsl/tests/test_bash_apps/test_std_uri.py +123 -0
  192. parsl/tests/test_bash_apps/test_stdout.py +33 -8
  193. parsl/tests/test_callables.py +2 -2
  194. parsl/tests/test_checkpointing/test_periodic.py +21 -39
  195. parsl/tests/test_checkpointing/test_python_checkpoint_1.py +1 -0
  196. parsl/tests/test_checkpointing/test_python_checkpoint_2.py +2 -2
  197. parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -1
  198. parsl/tests/test_checkpointing/test_regression_239.py +1 -1
  199. parsl/tests/test_checkpointing/test_task_exit.py +2 -3
  200. parsl/tests/test_docs/test_from_slides.py +5 -2
  201. parsl/tests/test_docs/test_kwargs.py +4 -1
  202. parsl/tests/test_docs/test_tutorial_1.py +1 -2
  203. parsl/tests/test_docs/test_workflow1.py +2 -2
  204. parsl/tests/test_docs/test_workflow2.py +0 -1
  205. parsl/tests/test_error_handling/test_rand_fail.py +2 -2
  206. parsl/tests/test_error_handling/test_resource_spec.py +10 -12
  207. parsl/tests/test_error_handling/test_retries.py +6 -16
  208. parsl/tests/test_error_handling/test_retry_handler.py +1 -0
  209. parsl/tests/test_error_handling/test_retry_handler_failure.py +2 -1
  210. parsl/tests/test_error_handling/test_serialization_fail.py +1 -1
  211. parsl/tests/test_error_handling/test_wrap_with_logs.py +1 -0
  212. parsl/tests/test_execute_task.py +29 -0
  213. parsl/tests/test_flux.py +1 -1
  214. parsl/tests/test_htex/test_basic.py +2 -3
  215. parsl/tests/test_htex/test_block_manager_selector_unit.py +20 -0
  216. parsl/tests/test_htex/test_command_client_timeout.py +66 -0
  217. parsl/tests/test_htex/test_connected_blocks.py +3 -2
  218. parsl/tests/test_htex/test_cpu_affinity_explicit.py +6 -10
  219. parsl/tests/test_htex/test_disconnected_blocks.py +6 -5
  220. parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +71 -0
  221. parsl/tests/test_htex/test_drain.py +11 -10
  222. parsl/tests/test_htex/test_htex.py +51 -25
  223. parsl/tests/test_htex/test_manager_failure.py +0 -1
  224. parsl/tests/test_htex/test_manager_selector_by_block.py +51 -0
  225. parsl/tests/test_htex/test_managers_command.py +36 -0
  226. parsl/tests/test_htex/test_missing_worker.py +2 -12
  227. parsl/tests/test_htex/test_multiple_disconnected_blocks.py +9 -9
  228. parsl/tests/test_htex/test_resource_spec_validation.py +45 -0
  229. parsl/tests/test_htex/test_zmq_binding.py +29 -8
  230. parsl/tests/test_monitoring/test_app_names.py +5 -5
  231. parsl/tests/test_monitoring/test_basic.py +73 -25
  232. parsl/tests/test_monitoring/test_db_locks.py +6 -4
  233. parsl/tests/test_monitoring/test_fuzz_zmq.py +19 -8
  234. parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +80 -0
  235. parsl/tests/test_monitoring/test_incomplete_futures.py +5 -4
  236. parsl/tests/test_monitoring/test_memoization_representation.py +4 -2
  237. parsl/tests/test_monitoring/test_stdouterr.py +134 -0
  238. parsl/tests/test_monitoring/test_viz_colouring.py +1 -0
  239. parsl/tests/test_mpi_apps/test_bad_mpi_config.py +33 -26
  240. parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +28 -11
  241. parsl/tests/test_mpi_apps/test_mpi_prefix.py +4 -4
  242. parsl/tests/test_mpi_apps/test_mpi_scheduler.py +7 -2
  243. parsl/tests/test_mpi_apps/test_mpiex.py +64 -0
  244. parsl/tests/test_mpi_apps/test_resource_spec.py +42 -49
  245. parsl/tests/test_providers/test_kubernetes_provider.py +102 -0
  246. parsl/tests/test_providers/test_local_provider.py +3 -132
  247. parsl/tests/test_providers/test_pbspro_template.py +2 -3
  248. parsl/tests/test_providers/test_slurm_template.py +2 -3
  249. parsl/tests/test_providers/test_submiterror_deprecation.py +2 -1
  250. parsl/tests/test_python_apps/test_context_manager.py +128 -0
  251. parsl/tests/test_python_apps/test_dep_standard_futures.py +2 -1
  252. parsl/tests/test_python_apps/test_dependencies_deep.py +59 -0
  253. parsl/tests/test_python_apps/test_fail.py +0 -25
  254. parsl/tests/test_python_apps/test_futures.py +2 -1
  255. parsl/tests/test_python_apps/test_inputs_default.py +22 -0
  256. parsl/tests/test_python_apps/test_join.py +0 -1
  257. parsl/tests/test_python_apps/test_lifted.py +11 -7
  258. parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +1 -0
  259. parsl/tests/test_python_apps/test_outputs.py +1 -1
  260. parsl/tests/test_python_apps/test_pluggable_future_resolution.py +161 -0
  261. parsl/tests/test_radical/test_mpi_funcs.py +1 -2
  262. parsl/tests/test_regression/test_1480.py +2 -1
  263. parsl/tests/test_regression/test_1653.py +2 -1
  264. parsl/tests/test_regression/test_226.py +1 -0
  265. parsl/tests/test_regression/test_2652.py +1 -0
  266. parsl/tests/test_regression/test_69a.py +0 -1
  267. parsl/tests/test_regression/test_854.py +4 -2
  268. parsl/tests/test_regression/test_97_parallelism_0.py +1 -2
  269. parsl/tests/test_regression/test_98.py +0 -1
  270. parsl/tests/test_scaling/test_block_error_handler.py +9 -4
  271. parsl/tests/test_scaling/test_regression_1621.py +11 -15
  272. parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +84 -0
  273. parsl/tests/test_scaling/test_regression_3696_oscillation.py +103 -0
  274. parsl/tests/test_scaling/test_scale_down.py +2 -5
  275. parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +5 -8
  276. parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +71 -0
  277. parsl/tests/test_scaling/test_shutdown_scalein.py +73 -0
  278. parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +90 -0
  279. parsl/tests/test_serialization/test_2555_caching_deserializer.py +1 -1
  280. parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +47 -0
  281. parsl/tests/test_serialization/test_basic.py +2 -1
  282. parsl/tests/test_serialization/test_htex_code_cache.py +3 -4
  283. parsl/tests/test_serialization/test_pack_resource_spec.py +2 -1
  284. parsl/tests/test_serialization/test_proxystore_configured.py +10 -6
  285. parsl/tests/test_serialization/test_proxystore_impl.py +5 -3
  286. parsl/tests/test_shutdown/test_kill_monitoring.py +64 -0
  287. parsl/tests/test_staging/staging_provider.py +2 -2
  288. parsl/tests/test_staging/test_1316.py +3 -4
  289. parsl/tests/test_staging/test_docs_1.py +2 -1
  290. parsl/tests/test_staging/test_docs_2.py +2 -1
  291. parsl/tests/test_staging/test_elaborate_noop_file.py +2 -3
  292. parsl/tests/{test_data → test_staging}/test_file.py +6 -6
  293. parsl/tests/{test_data → test_staging}/test_output_chain_filenames.py +3 -0
  294. parsl/tests/test_staging/test_staging_ftp.py +1 -0
  295. parsl/tests/test_staging/test_staging_https.py +5 -2
  296. parsl/tests/test_staging/test_staging_stdout.py +64 -0
  297. parsl/tests/test_staging/test_zip_in.py +39 -0
  298. parsl/tests/test_staging/test_zip_out.py +110 -0
  299. parsl/tests/test_staging/test_zip_to_zip.py +41 -0
  300. parsl/tests/test_summary.py +2 -2
  301. parsl/tests/test_thread_parallelism.py +0 -1
  302. parsl/tests/test_threads/test_configs.py +1 -2
  303. parsl/tests/test_threads/test_lazy_errors.py +2 -2
  304. parsl/tests/test_utils/test_execute_wait.py +35 -0
  305. parsl/tests/test_utils/test_sanitize_dns.py +76 -0
  306. parsl/tests/unit/test_address.py +20 -0
  307. parsl/tests/unit/test_file.py +99 -0
  308. parsl/tests/unit/test_usage_tracking.py +66 -0
  309. parsl/usage_tracking/api.py +65 -0
  310. parsl/usage_tracking/levels.py +6 -0
  311. parsl/usage_tracking/usage.py +104 -62
  312. parsl/utils.py +137 -4
  313. parsl/version.py +1 -1
  314. {parsl-2024.3.18.data → parsl-2025.1.13.data}/scripts/exec_parsl_function.py +6 -5
  315. parsl-2025.1.13.data/scripts/interchange.py +649 -0
  316. {parsl-2024.3.18.data → parsl-2025.1.13.data}/scripts/process_worker_pool.py +77 -75
  317. parsl-2025.1.13.dist-info/METADATA +96 -0
  318. parsl-2025.1.13.dist-info/RECORD +462 -0
  319. {parsl-2024.3.18.dist-info → parsl-2025.1.13.dist-info}/WHEEL +1 -1
  320. parsl/channels/__init__.py +0 -7
  321. parsl/channels/base.py +0 -141
  322. parsl/channels/errors.py +0 -113
  323. parsl/channels/local/local.py +0 -164
  324. parsl/channels/oauth_ssh/oauth_ssh.py +0 -110
  325. parsl/channels/ssh/ssh.py +0 -276
  326. parsl/channels/ssh_il/__init__.py +0 -0
  327. parsl/channels/ssh_il/ssh_il.py +0 -74
  328. parsl/configs/ad_hoc.py +0 -35
  329. parsl/executors/radical/rpex_master.py +0 -42
  330. parsl/monitoring/radios.py +0 -175
  331. parsl/providers/ad_hoc/__init__.py +0 -0
  332. parsl/providers/ad_hoc/ad_hoc.py +0 -248
  333. parsl/providers/cobalt/__init__.py +0 -0
  334. parsl/providers/cobalt/cobalt.py +0 -236
  335. parsl/providers/cobalt/template.py +0 -17
  336. parsl/tests/configs/ad_hoc_cluster_htex.py +0 -35
  337. parsl/tests/configs/cooley_htex.py +0 -37
  338. parsl/tests/configs/htex_ad_hoc_cluster.py +0 -28
  339. parsl/tests/configs/local_adhoc.py +0 -18
  340. parsl/tests/configs/swan_htex.py +0 -43
  341. parsl/tests/configs/theta.py +0 -37
  342. parsl/tests/integration/test_channels/__init__.py +0 -0
  343. parsl/tests/integration/test_channels/test_channels.py +0 -17
  344. parsl/tests/integration/test_channels/test_local_channel.py +0 -42
  345. parsl/tests/integration/test_channels/test_scp_1.py +0 -45
  346. parsl/tests/integration/test_channels/test_ssh_1.py +0 -40
  347. parsl/tests/integration/test_channels/test_ssh_errors.py +0 -46
  348. parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -41
  349. parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -24
  350. parsl/tests/manual_tests/test_ad_hoc_htex.py +0 -48
  351. parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -88
  352. parsl/tests/manual_tests/test_oauth_ssh.py +0 -13
  353. parsl/tests/sites/test_local_adhoc.py +0 -61
  354. parsl/tests/test_channels/__init__.py +0 -0
  355. parsl/tests/test_channels/test_large_output.py +0 -22
  356. parsl/tests/test_data/__init__.py +0 -0
  357. parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py +0 -51
  358. parsl/tests/test_providers/test_cobalt_deprecation_warning.py +0 -16
  359. parsl-2024.3.18.dist-info/METADATA +0 -98
  360. parsl-2024.3.18.dist-info/RECORD +0 -449
  361. parsl/{channels/local → monitoring/radios}/__init__.py +0 -0
  362. parsl/{channels/oauth_ssh → tests/test_shutdown}/__init__.py +0 -0
  363. parsl/tests/{test_data → test_staging}/test_file_apps.py +0 -0
  364. parsl/tests/{test_data → test_staging}/test_file_staging.py +0 -0
  365. parsl/{channels/ssh → tests/unit}/__init__.py +0 -0
  366. {parsl-2024.3.18.data → parsl-2025.1.13.data}/scripts/parsl_coprocess.py +1 -1
  367. {parsl-2024.3.18.dist-info → parsl-2025.1.13.dist-info}/LICENSE +0 -0
  368. {parsl-2024.3.18.dist-info → parsl-2025.1.13.dist-info}/entry_points.txt +0 -0
  369. {parsl-2024.3.18.dist-info → parsl-2025.1.13.dist-info}/top_level.txt +0 -0
parsl/__init__.py CHANGED
@@ -15,24 +15,23 @@ AUTO_LOGNAME
15
15
 
16
16
  """
17
17
  import logging
18
+ import multiprocessing as _multiprocessing
18
19
  import os
19
20
  import platform
20
21
 
21
- from parsl.version import VERSION
22
22
  from parsl.app.app import bash_app, join_app, python_app
23
23
  from parsl.config import Config
24
- from parsl.executors import ThreadPoolExecutor
25
- from parsl.executors import HighThroughputExecutor
26
- from parsl.executors import WorkQueueExecutor
27
- from parsl.log_utils import set_stream_logger
28
- from parsl.log_utils import set_file_logger
29
- from parsl.monitoring import MonitoringHub
30
-
31
24
  from parsl.data_provider.files import File
32
-
33
25
  from parsl.dataflow.dflow import DataFlowKernel, DataFlowKernelLoader
26
+ from parsl.executors import (
27
+ HighThroughputExecutor,
28
+ ThreadPoolExecutor,
29
+ WorkQueueExecutor,
30
+ )
31
+ from parsl.log_utils import set_file_logger, set_stream_logger
32
+ from parsl.monitoring import MonitoringHub
33
+ from parsl.version import VERSION
34
34
 
35
- import multiprocessing as _multiprocessing
36
35
  if platform.system() == 'Darwin':
37
36
  _multiprocessing.set_start_method('fork', force=True)
38
37
 
parsl/addresses.py CHANGED
@@ -6,19 +6,22 @@ The helper to use depends on the network environment around the submitter,
6
6
  so some experimentation will probably be needed to choose the correct one.
7
7
  """
8
8
 
9
+ import ipaddress
9
10
  import logging
10
11
  import platform
11
- import requests
12
12
  import socket
13
+
14
+ import requests
15
+
13
16
  try:
14
17
  import fcntl
15
18
  except ImportError:
16
19
  fcntl = None # type: ignore[assignment]
17
20
  import struct
18
- import typeguard
19
- import psutil
21
+ from typing import Callable, List, Set, Union
20
22
 
21
- from typing import Set, List, Callable
23
+ import psutil
24
+ import typeguard
22
25
 
23
26
  logger = logging.getLogger(__name__)
24
27
 
@@ -113,7 +116,7 @@ def get_all_addresses() -> Set[str]:
113
116
  try:
114
117
  s_addresses.add(address_by_interface(interface))
115
118
  except Exception:
116
- logger.info("Ignoring failure to fetch address from interface {}".format(interface))
119
+ logger.debug("Ignoring failure to fetch address from interface {}".format(interface))
117
120
 
118
121
  resolution_functions: List[Callable[[], str]]
119
122
  resolution_functions = [address_by_hostname, address_by_route, address_by_query]
@@ -121,7 +124,7 @@ def get_all_addresses() -> Set[str]:
121
124
  try:
122
125
  s_addresses.add(f())
123
126
  except Exception:
124
- logger.info("Ignoring an address finder exception")
127
+ logger.debug("Ignoring an address finder exception")
125
128
 
126
129
  return s_addresses
127
130
 
@@ -154,3 +157,20 @@ def get_any_address() -> str:
154
157
  if addr == '':
155
158
  raise Exception('Cannot find address of the local machine.')
156
159
  return addr
160
+
161
+
162
+ def tcp_url(address: str, port: Union[str, int, None] = None) -> str:
163
+ """Construct a tcp url safe for IPv4 and IPv6"""
164
+ if address == "*":
165
+ return "tcp://*"
166
+
167
+ ip_addr = ipaddress.ip_address(address)
168
+
169
+ port_suffix = f":{port}" if port else ""
170
+
171
+ if ip_addr.version == 6 and port_suffix:
172
+ url = f"tcp://[{address}]{port_suffix}"
173
+ else:
174
+ url = f"tcp://{address}{port_suffix}"
175
+
176
+ return url
parsl/app/app.py CHANGED
@@ -3,19 +3,16 @@
3
3
  The App class encapsulates a generic leaf task that can be executed asynchronously.
4
4
  """
5
5
  import logging
6
- import typeguard
7
6
  from abc import ABCMeta, abstractmethod
8
7
  from inspect import signature
9
- from typing import List, Optional, Sequence, Union
8
+ from typing import Any, Callable, Dict, List, Optional, Sequence, Union
9
+
10
+ import typeguard
10
11
  from typing_extensions import Literal
11
12
 
12
13
  from parsl.dataflow.dflow import DataFlowKernel
13
-
14
- from typing import Any, Callable, Dict
15
-
16
14
  from parsl.dataflow.futures import AppFuture
17
15
 
18
-
19
16
  logger = logging.getLogger(__name__)
20
17
 
21
18
 
@@ -69,8 +66,10 @@ class AppBase(metaclass=ABCMeta):
69
66
  self.kwargs['walltime'] = params['walltime'].default
70
67
  if 'parsl_resource_specification' in params:
71
68
  self.kwargs['parsl_resource_specification'] = params['parsl_resource_specification'].default
72
- self.outputs = params['outputs'].default if 'outputs' in params else []
73
- self.inputs = params['inputs'].default if 'inputs' in params else []
69
+ if 'outputs' in params:
70
+ self.kwargs['outputs'] = params['outputs'].default
71
+ if 'inputs' in params:
72
+ self.kwargs['inputs'] = params['inputs'].default
74
73
 
75
74
  @abstractmethod
76
75
  def __call__(self, *args: Any, **kwargs: Any) -> AppFuture:
parsl/app/bash.py CHANGED
@@ -1,10 +1,10 @@
1
- from functools import update_wrapper
2
- from functools import partial
3
- from inspect import signature, Parameter
4
1
  import logging
2
+ from functools import partial
3
+ from inspect import Parameter, signature
5
4
 
6
- from parsl.app.errors import wrap_error
7
5
  from parsl.app.app import AppBase
6
+ from parsl.app.errors import wrap_error
7
+ from parsl.data_provider.files import File
8
8
  from parsl.dataflow.dflow import DataFlowKernelLoader
9
9
 
10
10
  logger = logging.getLogger(__name__)
@@ -16,6 +16,7 @@ def remote_side_bash_executor(func, *args, **kwargs):
16
16
  """
17
17
  import os
18
18
  import subprocess
19
+
19
20
  import parsl.app.errors as pe
20
21
  from parsl.utils import get_std_fname_mode
21
22
 
@@ -54,13 +55,20 @@ def remote_side_bash_executor(func, *args, **kwargs):
54
55
  if stdfspec is None:
55
56
  return None
56
57
 
57
- fname, mode = get_std_fname_mode(fdname, stdfspec)
58
+ if isinstance(stdfspec, File):
59
+ # a File is an os.PathLike and so we can use it directly for
60
+ # the subsequent file operations
61
+ fname = stdfspec
62
+ mode = "w"
63
+ else:
64
+ fname, mode = get_std_fname_mode(fdname, stdfspec)
65
+
58
66
  try:
59
67
  if os.path.dirname(fname):
60
68
  os.makedirs(os.path.dirname(fname), exist_ok=True)
61
69
  fd = open(fname, mode)
62
70
  except Exception as e:
63
- raise pe.BadStdStreamFile(fname, e)
71
+ raise pe.BadStdStreamFile(str(fname)) from e
64
72
  return fd
65
73
 
66
74
  std_out = open_std_fd('stdout')
@@ -115,11 +123,10 @@ class BashApp(AppBase):
115
123
  if sig.parameters[s].default is not Parameter.empty:
116
124
  self.kwargs[s] = sig.parameters[s].default
117
125
 
118
- # update_wrapper allows remote_side_bash_executor to masquerade as self.func
119
126
  # partial is used to attach the first arg the "func" to the remote_side_bash_executor
120
127
  # this is done to avoid passing a function type in the args which parsl.serializer
121
128
  # doesn't support
122
- remote_fn = partial(update_wrapper(remote_side_bash_executor, self.func), self.func)
129
+ remote_fn = partial(remote_side_bash_executor, self.func)
123
130
  remote_fn.__name__ = self.func.__name__
124
131
  self.wrapped_remote_function = wrap_error(remote_fn)
125
132
 
parsl/app/errors.py CHANGED
@@ -1,10 +1,11 @@
1
1
  """Exceptions raised by Apps."""
2
+ import logging
2
3
  from functools import wraps
3
- from typing import Callable, List, Optional, TypeVar, Union
4
- from typing_extensions import ParamSpec
5
4
  from types import TracebackType
6
- import logging
5
+ from typing import Callable, List, Optional, TypeVar, Union
6
+
7
7
  from tblib import Traceback
8
+ from typing_extensions import ParamSpec
8
9
 
9
10
  from parsl.data_provider.files import File
10
11
  from parsl.errors import ParslError
@@ -69,8 +70,8 @@ class MissingOutputs(ParslError):
69
70
  self.reason = reason
70
71
  self.outputs = outputs
71
72
 
72
- def __repr__(self) -> str:
73
- return "Missing Outputs: {0}, Reason:{1}".format(self.outputs, self.reason)
73
+ def __str__(self) -> str:
74
+ return "Missing Outputs: {0}, Reason: {1}".format(self.outputs, self.reason)
74
75
 
75
76
 
76
77
  class BadStdStreamFile(ParslError):
@@ -78,19 +79,14 @@ class BadStdStreamFile(ParslError):
78
79
 
79
80
  Contains:
80
81
  reason(string)
81
- exception object
82
82
  """
83
83
 
84
- def __init__(self, reason: str, exception: Exception) -> None:
85
- super().__init__(reason, exception)
84
+ def __init__(self, reason: str) -> None:
85
+ super().__init__(reason)
86
86
  self._reason = reason
87
- self._exception = exception
88
-
89
- def __repr__(self) -> str:
90
- return "Bad Stream File: {} Exception: {}".format(self._reason, self._exception)
91
87
 
92
88
  def __str__(self) -> str:
93
- return self.__repr__()
89
+ return "Bad Stream File: {}".format(self._reason)
94
90
 
95
91
 
96
92
  class RemoteExceptionWrapper:
@@ -136,6 +132,7 @@ def wrap_error(func: Callable[P, R]) -> Callable[P, Union[R, RemoteExceptionWrap
136
132
  @wraps(func)
137
133
  def wrapper(*args: P.args, **kwargs: P.kwargs) -> Union[R, RemoteExceptionWrapper]:
138
134
  import sys
135
+
139
136
  from parsl.app.errors import RemoteExceptionWrapper
140
137
  try:
141
138
  return func(*args, **kwargs)
parsl/app/futures.py CHANGED
@@ -1,12 +1,11 @@
1
1
  """This module implements DataFutures.
2
2
  """
3
3
  import logging
4
- import typeguard
5
4
  from concurrent.futures import Future
6
5
 
7
- from parsl.data_provider.files import File
6
+ import typeguard
8
7
 
9
- from typing import Optional
8
+ from parsl.data_provider.files import File
10
9
 
11
10
  logger = logging.getLogger(__name__)
12
11
 
@@ -39,24 +38,23 @@ class DataFuture(Future):
39
38
  self.set_result(self.file_obj)
40
39
 
41
40
  @typeguard.typechecked
42
- def __init__(self, fut: Future, file_obj: File, tid: Optional[int] = None) -> None:
41
+ def __init__(self, fut: Future, file_obj: File, tid: int) -> None:
43
42
  """Construct the DataFuture object.
44
43
 
45
44
  If the file_obj is a string convert to a File.
46
45
 
47
46
  Args:
48
- - fut (AppFuture) : AppFuture that this DataFuture will track
49
- - file_obj (string/File obj) : Something representing file(s)
47
+ - fut (Future) : Future that this DataFuture will track.
48
+ Completion of ``fut`` indicates that the data is
49
+ ready.
50
+ - file_obj (File) : File that this DataFuture represents the availability of
50
51
 
51
52
  Kwargs:
52
53
  - tid (task_id) : Task id that this DataFuture tracks
53
54
  """
54
55
  super().__init__()
55
56
  self._tid = tid
56
- if isinstance(file_obj, File):
57
- self.file_obj = file_obj
58
- else:
59
- raise ValueError("DataFuture must be initialized with a File, not {}".format(type(file_obj)))
57
+ self.file_obj = file_obj
60
58
  self.parent = fut
61
59
 
62
60
  self.parent.add_done_callback(self.parent_callback)
parsl/app/python.py CHANGED
@@ -2,6 +2,7 @@ import logging
2
2
  import threading
3
3
 
4
4
  import tblib.pickling_support
5
+
5
6
  tblib.pickling_support.install()
6
7
 
7
8
  from functools import wraps
@@ -11,7 +12,6 @@ from parsl.app.errors import wrap_error
11
12
  from parsl.dataflow.dflow import DataFlowKernelLoader
12
13
  from parsl.utils import AutoCancelTimer
13
14
 
14
-
15
15
  logger = logging.getLogger(__name__)
16
16
 
17
17
 
@@ -19,6 +19,7 @@ def timeout(f, seconds: float):
19
19
  @wraps(f)
20
20
  def wrapper(*args, **kwargs):
21
21
  import ctypes
22
+
22
23
  import parsl.app.errors
23
24
 
24
25
  def inject_exception(thread):
parsl/benchmark/perf.py CHANGED
@@ -1,7 +1,8 @@
1
1
  import argparse
2
+ import concurrent.futures
2
3
  import importlib
3
4
  import time
4
- import concurrent.futures
5
+
5
6
  import parsl
6
7
 
7
8
  min_iterations = 2
@@ -1,8 +1,8 @@
1
1
  """Interfaces modeled after Python's `concurrent library <https://docs.python.org/3/library/concurrent.html>`_"""
2
- from typing import Callable, Dict, Optional, Iterator, Iterable
2
+ import time
3
3
  from concurrent.futures import Executor
4
+ from typing import Callable, Dict, Iterable, Iterator, Optional
4
5
  from warnings import warn
5
- import time
6
6
 
7
7
  from parsl import Config, DataFlowKernel
8
8
  from parsl.app.python import PythonApp
parsl/config.py CHANGED
@@ -1,20 +1,24 @@
1
1
  import logging
2
- import typeguard
3
-
4
2
  from typing import Callable, Iterable, Optional, Sequence, Union
3
+
4
+ import typeguard
5
5
  from typing_extensions import Literal
6
6
 
7
- from parsl.utils import RepresentationMixin
7
+ from parsl.dataflow.dependency_resolvers import DependencyResolver
8
+ from parsl.dataflow.taskrecord import TaskRecord
9
+ from parsl.errors import ConfigurationError
8
10
  from parsl.executors.base import ParslExecutor
9
11
  from parsl.executors.threads import ThreadPoolExecutor
10
- from parsl.errors import ConfigurationError
11
- from parsl.dataflow.taskrecord import TaskRecord
12
12
  from parsl.monitoring import MonitoringHub
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
16
+ from parsl.utils import RepresentationMixin
13
17
 
14
18
  logger = logging.getLogger(__name__)
15
19
 
16
20
 
17
- class Config(RepresentationMixin):
21
+ class Config(RepresentationMixin, UsageInformation):
18
22
  """
19
23
  Specification of Parsl configuration options.
20
24
 
@@ -34,6 +38,17 @@ class Config(RepresentationMixin):
34
38
  checkpoint_period : str, optional
35
39
  Time interval (in "HH:MM:SS") at which to checkpoint completed tasks. Only has an effect if
36
40
  ``checkpoint_mode='periodic'``.
41
+ dependency_resolver: plugin point for custom dependency resolvers. Default: only resolve Futures,
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``.
37
52
  garbage_collect : bool. optional.
38
53
  Delete task records from DFK when tasks have completed. Default: True
39
54
  internal_tasks_max_threads : int, optional
@@ -50,6 +65,9 @@ class Config(RepresentationMixin):
50
65
  of 1.
51
66
  run_dir : str, optional
52
67
  Path to run directory. Default is 'runinfo'.
68
+ std_autopath : function, optional
69
+ Sets the function used to generate stdout/stderr specifications when parsl.AUTO_LOGPATH is used. If no function
70
+ is specified, generates paths that look like: ``rundir/NNN/task_logs/X/task_{id}_{name}{label}.{out/err}``
53
71
  strategy : str, optional
54
72
  Strategy to use for scaling blocks according to workflow needs. Can be 'simple', 'htex_auto_scale', 'none'
55
73
  or `None`.
@@ -59,9 +77,15 @@ class Config(RepresentationMixin):
59
77
  How often the scaling strategy should be executed. Default is 5 seconds.
60
78
  max_idletime : float, optional
61
79
  The maximum idle time allowed for an executor before strategy could shut down unused blocks. Default is 120.0 seconds.
62
- usage_tracking : bool, optional
63
- Set this field to True to opt-in to Parsl's usage tracking system. Parsl only collects minimal, non personally-identifiable,
64
- 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.
86
+ project_name: str, optional
87
+ Option to deanonymize usage tracking data.
88
+ If set, this value will be used as the project name in the usage tracking data and placed on the leaderboard.
65
89
  initialize_logging : bool, optional
66
90
  Make DFK optionally not initialize any logging. Log messages
67
91
  will still be passed into the python logging system under the
@@ -84,16 +108,20 @@ class Config(RepresentationMixin):
84
108
  Literal['dfk_exit'],
85
109
  Literal['manual']] = None,
86
110
  checkpoint_period: Optional[str] = None,
111
+ dependency_resolver: Optional[DependencyResolver] = None,
112
+ exit_mode: Literal['cleanup', 'skip', 'wait'] = 'cleanup',
87
113
  garbage_collect: bool = True,
88
114
  internal_tasks_max_threads: int = 10,
89
115
  retries: int = 0,
90
116
  retry_handler: Optional[Callable[[Exception, TaskRecord], float]] = None,
91
117
  run_dir: str = 'runinfo',
118
+ std_autopath: Optional[Callable] = None,
92
119
  strategy: Optional[str] = 'simple',
93
120
  strategy_period: Union[float, int] = 5,
94
121
  max_idletime: float = 120.0,
95
122
  monitoring: Optional[MonitoringHub] = None,
96
- usage_tracking: bool = False,
123
+ usage_tracking: int = 0,
124
+ project_name: Optional[str] = None,
97
125
  initialize_logging: bool = True) -> None:
98
126
 
99
127
  executors = tuple(executors or [])
@@ -118,6 +146,8 @@ class Config(RepresentationMixin):
118
146
  if checkpoint_mode == 'periodic' and checkpoint_period is None:
119
147
  checkpoint_period = "00:30:00"
120
148
  self.checkpoint_period = checkpoint_period
149
+ self.dependency_resolver = dependency_resolver
150
+ self.exit_mode = exit_mode
121
151
  self.garbage_collect = garbage_collect
122
152
  self.internal_tasks_max_threads = internal_tasks_max_threads
123
153
  self.retries = retries
@@ -126,9 +156,12 @@ class Config(RepresentationMixin):
126
156
  self.strategy = strategy
127
157
  self.strategy_period = strategy_period
128
158
  self.max_idletime = max_idletime
159
+ self.validate_usage_tracking(usage_tracking)
129
160
  self.usage_tracking = usage_tracking
161
+ self.project_name = project_name
130
162
  self.initialize_logging = initialize_logging
131
163
  self.monitoring = monitoring
164
+ self.std_autopath: Optional[Callable] = std_autopath
132
165
 
133
166
  @property
134
167
  def executors(self) -> Sequence[ParslExecutor]:
@@ -144,3 +177,13 @@ class Config(RepresentationMixin):
144
177
  if len(duplicates) > 0:
145
178
  raise ConfigurationError('Executors must have unique labels ({})'.format(
146
179
  ', '.join(['label={}'.format(repr(d)) for d in duplicates])))
180
+
181
+ def validate_usage_tracking(self, level: int) -> None:
182
+ if not USAGE_TRACKING_DISABLED <= level <= USAGE_TRACKING_LEVEL_3:
183
+ raise ConfigurationError(
184
+ f"Usage Tracking values must be 0, 1, 2, or 3 and not {level}"
185
+ )
186
+
187
+ def get_usage_information(self):
188
+ return {"executors_len": len(self.executors),
189
+ "dependency_resolver": self.dependency_resolver is not None}
parsl/configs/ASPIRE1.py CHANGED
@@ -1,9 +1,10 @@
1
- from parsl.providers import PBSProProvider
2
- from parsl.launchers import MpiRunLauncher
1
+ from parsl.addresses import address_by_interface
3
2
  from parsl.config import Config
4
3
  from parsl.executors import HighThroughputExecutor
5
- from parsl.addresses import address_by_interface
4
+ from parsl.launchers import MpiRunLauncher
6
5
  from parsl.monitoring.monitoring import MonitoringHub
6
+ from parsl.providers import PBSProProvider
7
+ from parsl.usage_tracking.levels import LEVEL_1
7
8
 
8
9
  config = Config(
9
10
  executors=[
@@ -33,11 +34,11 @@ config = Config(
33
34
  ],
34
35
  monitoring=MonitoringHub(
35
36
  hub_address=address_by_interface('ib0'),
36
- hub_port=55055,
37
37
  resource_monitoring_interval=10,
38
38
  ),
39
39
  strategy='simple',
40
40
  retries=3,
41
41
  app_cache=True,
42
- checkpoint_mode='task_exit'
42
+ checkpoint_mode='task_exit',
43
+ usage_tracking=LEVEL_1,
43
44
  )
parsl/configs/Azure.py CHANGED
@@ -1,14 +1,14 @@
1
1
  """Config for Azure"""
2
- from parsl.config import Config
2
+ import getpass
3
3
 
4
- from parsl.providers import AzureProvider
5
- from parsl.executors import HighThroughputExecutor
6
- from parsl.data_provider.http import HTTPInTaskStaging
4
+ from parsl.addresses import address_by_query
5
+ from parsl.config import Config
7
6
  from parsl.data_provider.ftp import FTPInTaskStaging
7
+ from parsl.data_provider.http import HTTPInTaskStaging
8
8
  from parsl.data_provider.rsync import RSyncStaging
9
- from parsl.addresses import address_by_query
10
-
11
- import getpass
9
+ from parsl.executors import HighThroughputExecutor
10
+ from parsl.providers import AzureProvider
11
+ from parsl.usage_tracking.levels import LEVEL_1
12
12
 
13
13
  vm_reference = {
14
14
  # All fields below are required
@@ -34,5 +34,6 @@ config = Config(
34
34
  FTPInTaskStaging(),
35
35
  RSyncStaging(getpass.getuser() + "@" + address_by_query())],
36
36
  )
37
- ]
37
+ ],
38
+ usage_tracking=LEVEL_1,
38
39
  )
parsl/configs/bridges.py CHANGED
@@ -1,8 +1,9 @@
1
+ from parsl.addresses import address_by_interface
1
2
  from parsl.config import Config
2
- from parsl.providers import SlurmProvider
3
- from parsl.launchers import SrunLauncher
4
3
  from parsl.executors import HighThroughputExecutor
5
- from parsl.addresses import address_by_interface
4
+ from parsl.launchers import SrunLauncher
5
+ from parsl.providers import SlurmProvider
6
+ from parsl.usage_tracking.levels import LEVEL_1
6
7
 
7
8
  """ This config assumes that it is used to launch parsl tasks from the login nodes
8
9
  of Bridges at PSC. Each job submitted to the scheduler will request 2 nodes for 10 minutes.
@@ -34,5 +35,6 @@ config = Config(
34
35
  cmd_timeout=120,
35
36
  ),
36
37
  )
37
- ]
38
+ ],
39
+ usage_tracking=LEVEL_1,
38
40
  )
parsl/configs/cc_in2p3.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from parsl.config import Config
2
- from parsl.channels import LocalChannel
3
- from parsl.providers import GridEngineProvider
4
2
  from parsl.executors import HighThroughputExecutor
3
+ from parsl.providers import GridEngineProvider
4
+ from parsl.usage_tracking.levels import LEVEL_1
5
5
 
6
6
  config = Config(
7
7
  executors=[
@@ -9,7 +9,6 @@ config = Config(
9
9
  label='cc_in2p3_htex',
10
10
  max_workers_per_node=2,
11
11
  provider=GridEngineProvider(
12
- channel=LocalChannel(),
13
12
  nodes_per_block=1,
14
13
  init_blocks=2,
15
14
  max_blocks=2,
@@ -19,4 +18,5 @@ config = Config(
19
18
  ),
20
19
  )
21
20
  ],
21
+ usage_tracking=LEVEL_1,
22
22
  )
parsl/configs/ec2.py CHANGED
@@ -1,6 +1,7 @@
1
1
  from parsl.config import Config
2
- from parsl.providers import AWSProvider
3
2
  from parsl.executors import HighThroughputExecutor
3
+ from parsl.providers import AWSProvider
4
+ from parsl.usage_tracking.levels import LEVEL_1
4
5
 
5
6
  config = Config(
6
7
  executors=[
@@ -25,4 +26,5 @@ config = Config(
25
26
  ),
26
27
  )
27
28
  ],
29
+ usage_tracking=LEVEL_1,
28
30
  )
parsl/configs/expanse.py CHANGED
@@ -1,8 +1,8 @@
1
1
  from parsl.config import Config
2
+ from parsl.executors import HighThroughputExecutor
2
3
  from parsl.launchers import SrunLauncher
3
4
  from parsl.providers import SlurmProvider
4
- from parsl.executors import HighThroughputExecutor
5
-
5
+ from parsl.usage_tracking.levels import LEVEL_1
6
6
 
7
7
  config = Config(
8
8
  executors=[
@@ -25,5 +25,6 @@ config = Config(
25
25
  nodes_per_block=2,
26
26
  ),
27
27
  )
28
- ]
28
+ ],
29
+ usage_tracking=LEVEL_1,
29
30
  )
parsl/configs/frontera.py CHANGED
@@ -1,9 +1,8 @@
1
1
  from parsl.config import Config
2
- from parsl.channels import LocalChannel
3
- from parsl.providers import SlurmProvider
4
2
  from parsl.executors import HighThroughputExecutor
5
3
  from parsl.launchers import SrunLauncher
6
-
4
+ from parsl.providers import SlurmProvider
5
+ from parsl.usage_tracking.levels import LEVEL_1
7
6
 
8
7
  """ This config assumes that it is used to launch parsl tasks from the login nodes
9
8
  of Frontera at TACC. Each job submitted to the scheduler will request 2 nodes for 10 minutes.
@@ -15,7 +14,6 @@ config = Config(
15
14
  max_workers_per_node=1, # Set number of workers per node
16
15
  provider=SlurmProvider(
17
16
  cmd_timeout=60, # Add extra time for slow scheduler responses
18
- channel=LocalChannel(),
19
17
  nodes_per_block=2,
20
18
  init_blocks=1,
21
19
  min_blocks=1,
@@ -33,4 +31,5 @@ config = Config(
33
31
  ),
34
32
  )
35
33
  ],
34
+ usage_tracking=LEVEL_1,
36
35
  )
@@ -1,8 +1,7 @@
1
- from parsl.providers import LocalProvider
2
- from parsl.channels import LocalChannel
3
-
4
1
  from parsl.config import Config
5
2
  from parsl.executors import HighThroughputExecutor
3
+ from parsl.providers import LocalProvider
4
+ from parsl.usage_tracking.levels import LEVEL_1
6
5
 
7
6
  config = Config(
8
7
  executors=[
@@ -10,10 +9,10 @@ config = Config(
10
9
  label="htex_local",
11
10
  cores_per_worker=1,
12
11
  provider=LocalProvider(
13
- channel=LocalChannel(),
14
12
  init_blocks=1,
15
13
  max_blocks=1,
16
14
  ),
17
15
  )
18
16
  ],
17
+ usage_tracking=LEVEL_1,
19
18
  )