dpdispatcher 0.6.2__tar.gz → 0.6.4__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 (234) hide show
  1. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/workflows/pyright.yml +1 -1
  2. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/workflows/release.yml +1 -1
  3. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/workflows/test-bohrium.yml +1 -1
  4. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/workflows/test.yml +1 -1
  5. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.pre-commit-config.yaml +1 -1
  6. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/PKG-INFO +1 -1
  7. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/batch.md +8 -1
  8. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/_version.py +2 -2
  9. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/contexts/hdfs_context.py +8 -6
  10. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/contexts/local_context.py +18 -10
  11. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/contexts/ssh_context.py +2 -2
  12. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/dpdisp.py +6 -0
  13. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/entrypoints/submission.py +21 -1
  14. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/pbs.py +104 -0
  15. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/PKG-INFO +1 -1
  16. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_local_context.py +2 -2
  17. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_run_submission.py +33 -0
  18. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/dependabot.yml +0 -0
  19. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/workflows/ci-docker.yml +0 -0
  20. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/workflows/machines.yml +0 -0
  21. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/workflows/mirror_gitee.yml +0 -0
  22. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/workflows/publish_conda.yml +0 -0
  23. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.gitignore +0 -0
  24. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.readthedocs.yaml +0 -0
  25. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/CONTRIBUTING.md +0 -0
  26. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/Dockerfile +0 -0
  27. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/LICENSE +0 -0
  28. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/README.md +0 -0
  29. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/LICENSE +0 -0
  30. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/README.md +0 -0
  31. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/pbs/docker-compose.yml +0 -0
  32. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/pbs/start-pbs.sh +0 -0
  33. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/pbs.sh +0 -0
  34. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/slurm/docker-compose.yml +0 -0
  35. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/slurm/register_cluster.sh +0 -0
  36. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/slurm/start-slurm.sh +0 -0
  37. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/slurm.sh +0 -0
  38. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/ssh/docker-compose.yml +0 -0
  39. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/ssh/start-ssh.sh +0 -0
  40. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/ssh.sh +0 -0
  41. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/ssh_rsync.sh +0 -0
  42. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/codecov.yml +0 -0
  43. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/conda/conda_build_config.yaml +0 -0
  44. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/conda/meta.yaml +0 -0
  45. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/.gitignore +0 -0
  46. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/Makefile +0 -0
  47. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/cli.rst +0 -0
  48. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/conf.py +0 -0
  49. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/context.md +0 -0
  50. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/credits.rst +0 -0
  51. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/dpdispatcher_on_yarn.md +0 -0
  52. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/examples/expanse.md +0 -0
  53. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/examples/g16.md +0 -0
  54. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/examples/shell.md +0 -0
  55. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/examples/template.md +0 -0
  56. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/getting-started.md +0 -0
  57. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/index.rst +0 -0
  58. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/install.md +0 -0
  59. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/machine.rst +0 -0
  60. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/make.bat +0 -0
  61. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/requirements.txt +0 -0
  62. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/resources.rst +0 -0
  63. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/task.rst +0 -0
  64. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/__init__.py +0 -0
  65. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/__main__.py +0 -0
  66. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/arginfo.py +0 -0
  67. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/base_context.py +0 -0
  68. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/contexts/__init__.py +0 -0
  69. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/contexts/dp_cloud_server_context.py +0 -0
  70. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/contexts/lazy_local_context.py +0 -0
  71. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/contexts/openapi_context.py +0 -0
  72. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/dlog.py +0 -0
  73. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/dpcloudserver/__init__.py +0 -0
  74. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/dpcloudserver/client.py +0 -0
  75. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/entrypoints/__init__.py +0 -0
  76. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/entrypoints/gui.py +0 -0
  77. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machine.py +0 -0
  78. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/__init__.py +0 -0
  79. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/distributed_shell.py +0 -0
  80. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/dp_cloud_server.py +0 -0
  81. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/fugaku.py +0 -0
  82. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/lsf.py +0 -0
  83. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/openapi.py +0 -0
  84. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/shell.py +0 -0
  85. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/slurm.py +0 -0
  86. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/submission.py +0 -0
  87. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/__init__.py +0 -0
  88. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/dpcloudserver/__init__.py +0 -0
  89. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/dpcloudserver/client.py +0 -0
  90. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/dpcloudserver/config.py +0 -0
  91. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/dpcloudserver/retcode.py +0 -0
  92. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/dpcloudserver/zip_file.py +0 -0
  93. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/hdfs_cli.py +0 -0
  94. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/job_status.py +0 -0
  95. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/record.py +0 -0
  96. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/utils.py +0 -0
  97. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/SOURCES.txt +0 -0
  98. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/dependency_links.txt +0 -0
  99. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/entry_points.txt +0 -0
  100. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/requires.txt +0 -0
  101. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/top_level.txt +0 -0
  102. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/machine/expanse.json +0 -0
  103. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/machine/lazy_local.json +0 -0
  104. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/machine/mandu.json +0 -0
  105. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/resources/expanse_cpu.json +0 -0
  106. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/resources/mandu.json +0 -0
  107. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/resources/template.slurm +0 -0
  108. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/resources/tiger.json +0 -0
  109. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/task/deepmd-kit.json +0 -0
  110. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/task/g16.json +0 -0
  111. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/pyproject.toml +0 -0
  112. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/scripts/script_gen_dargs_docs.py +0 -0
  113. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/scripts/script_gen_dargs_json.py +0 -0
  114. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/setup.cfg +0 -0
  115. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/.gitignore +0 -0
  116. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/__init__.py +0 -0
  117. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/batch.json +0 -0
  118. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/context.py +0 -0
  119. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/debug_test_class_submission_init.py +0 -0
  120. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/devel_test_ali_ehpc.py +0 -0
  121. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/devel_test_dp_cloud_server.py +0 -0
  122. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/devel_test_lazy_ali_ehpc.py +0 -0
  123. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/devel_test_lsf.py +0 -0
  124. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/devel_test_shell.py +0 -0
  125. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/devel_test_slurm.py +0 -0
  126. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/devel_test_ssh_ali_ehpc.py +0 -0
  127. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/graph.pb +0 -0
  128. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/job.json +0 -0
  129. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine.json +0 -0
  130. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_ali_ehpc.json +0 -0
  131. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_center.json +0 -0
  132. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_diffenert.json +0 -0
  133. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_dp_cloud_server.json +0 -0
  134. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_fugaku.json +0 -0
  135. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_if_cuda_multi_devices.json +0 -0
  136. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_lazy_local_lsf.json +0 -0
  137. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_lazy_local_slurm.json +0 -0
  138. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_lazylocal_shell.json +0 -0
  139. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_local_fugaku.json +0 -0
  140. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_local_shell.json +0 -0
  141. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_lsf.json +0 -0
  142. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_openapi.json +0 -0
  143. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_slurm.json +0 -0
  144. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_yarn.json +0 -0
  145. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/resources.json +0 -0
  146. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/submission.json +0 -0
  147. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/task.json +0 -0
  148. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/sample_class.py +0 -0
  149. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/script_gen_json.py +0 -0
  150. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/slurm_test.env +0 -0
  151. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_argcheck.py +0 -0
  152. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_class_job.py +0 -0
  153. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_class_machine.py +0 -0
  154. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_class_machine_dispatch.py +0 -0
  155. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_class_resources.py +0 -0
  156. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_class_submission.py +0 -0
  157. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_class_submission_init.py +0 -0
  158. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_class_task.py +0 -0
  159. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_cli.py +0 -0
  160. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-1/conf.lmp +0 -0
  161. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-1/input.lammps +0 -0
  162. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-1/some_dir/some_file +0 -0
  163. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-2/conf.lmp +0 -0
  164. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-2/input.lammps +0 -0
  165. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-3/conf.lmp +0 -0
  166. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-3/input.lammps +0 -0
  167. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-4/conf.lmp +0 -0
  168. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-4/input.lammps +0 -0
  169. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/dir with space/file with space +0 -0
  170. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/graph.pb +0 -0
  171. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/some_dir/some_file +0 -0
  172. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_examples.py +0 -0
  173. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_group_size.py +0 -0
  174. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_gui.py +0 -0
  175. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_context.py +0 -0
  176. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-1/conf.lmp +0 -0
  177. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-1/input.lammps +0 -0
  178. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-2/conf.lmp +0 -0
  179. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-2/input.lammps +0 -0
  180. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-3/conf.lmp +0 -0
  181. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-3/input.lammps +0 -0
  182. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-4/conf.lmp +0 -0
  183. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-4/input.lammps +0 -0
  184. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/graph.pb +0 -0
  185. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_if_cuda_multi_devices/test_dir/test.txt +0 -0
  186. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_import_classes.py +0 -0
  187. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lazy_local_context.py +0 -0
  188. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-1/conf.lmp +0 -0
  189. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-1/input.lammps +0 -0
  190. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-2/conf.lmp +0 -0
  191. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-2/input.lammps +0 -0
  192. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-3/conf.lmp +0 -0
  193. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-3/input.lammps +0 -0
  194. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-4/conf.lmp +0 -0
  195. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-4/input.lammps +0 -0
  196. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/graph.pb +0 -0
  197. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/submission.json +0 -0
  198. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_script_generation.py +0 -0
  199. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-1/conf.lmp +0 -0
  200. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-1/input.lammps +0 -0
  201. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-2/conf.lmp +0 -0
  202. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-2/input.lammps +0 -0
  203. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-3/conf.lmp +0 -0
  204. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-3/input.lammps +0 -0
  205. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-4/conf.lmp +0 -0
  206. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-4/input.lammps +0 -0
  207. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/graph.pb +0 -0
  208. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_retry.py +0 -0
  209. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_run_submission_bohrium.py +0 -0
  210. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_run_submission_ratio_unfinished.py +0 -0
  211. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_cuda_multi_devices.py +0 -0
  212. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival.py +0 -0
  213. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/fail_dir/mock_fail_task.txt +0 -0
  214. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/dir with space/example.txt +0 -0
  215. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/dir1/example.txt +0 -0
  216. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/dir2/example.txt +0 -0
  217. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/dir3/example.txt +0 -0
  218. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/dir4/example.txt +0 -0
  219. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/graph.pb +0 -0
  220. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/recover_dir/mock_recover_task.txt +0 -0
  221. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-1/conf.lmp +0 -0
  222. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-1/input.lammps +0 -0
  223. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-2/conf.lmp +0 -0
  224. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-2/input.lammps +0 -0
  225. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-3/conf.lmp +0 -0
  226. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-3/input.lammps +0 -0
  227. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-4/conf.lmp +0 -0
  228. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-4/input.lammps +0 -0
  229. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/d3c842c5b9476e48f7145b370cd330372b9293e1.json +0 -0
  230. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/graph.pb +0 -0
  231. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/submission.json +0 -0
  232. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_script_generation.py +0 -0
  233. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_ssh_context.py +0 -0
  234. {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_work_path/.gitkeep +0 -0
@@ -8,7 +8,7 @@ jobs:
8
8
  runs-on: ubuntu-latest
9
9
  steps:
10
10
  - uses: actions/checkout@v4
11
- - uses: actions/setup-python@v4
11
+ - uses: actions/setup-python@v5
12
12
  with:
13
13
  python-version: '3.11'
14
14
  - run: pip install -e .[cloudserver,gui]
@@ -10,7 +10,7 @@ jobs:
10
10
  steps:
11
11
  - uses: actions/checkout@v4
12
12
  - name: Setup python
13
- uses: actions/setup-python@v4
13
+ uses: actions/setup-python@v5
14
14
  with:
15
15
  python-version: 3.x
16
16
  architecture: x64
@@ -16,7 +16,7 @@ jobs:
16
16
  with:
17
17
  ref: "${{ github.event.pull_request.merge_commit_sha }}"
18
18
  - name: Set up Python 3.12
19
- uses: actions/setup-python@v4
19
+ uses: actions/setup-python@v5
20
20
  with:
21
21
  python-version: '3.12'
22
22
  cache: 'pip'
@@ -22,7 +22,7 @@ jobs:
22
22
  steps:
23
23
  - uses: actions/checkout@v4
24
24
  - name: Set up Python ${{ matrix.python-version }}
25
- uses: actions/setup-python@v4
25
+ uses: actions/setup-python@v5
26
26
  with:
27
27
  python-version: ${{ matrix.python-version }}
28
28
  - run: pip install .[test] coverage
@@ -18,7 +18,7 @@ repos:
18
18
  # Python
19
19
  - repo: https://github.com/astral-sh/ruff-pre-commit
20
20
  # Ruff version.
21
- rev: v0.1.5
21
+ rev: v0.1.13
22
22
  hooks:
23
23
  - id: ruff
24
24
  args: ["--fix"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dpdispatcher
3
- Version: 0.6.2
3
+ Version: 0.6.4
4
4
  Summary: Generate HPC scheduler systems jobs input scripts, submit these scripts to HPC systems, and poke until they finish
5
5
  Author: DeepModeling
6
6
  License: GNU LESSER GENERAL PUBLIC LICENSE
@@ -75,4 +75,11 @@ Read Fujitsu cloud service documentation for details.
75
75
  ## OpenAPI
76
76
 
77
77
  {dargs:argument}`batcy_type <resources/batch_type>`: `OpenAPI`
78
- OpenAPI is a new way to submit jobs to Bohrium. It using [AccessKey](https://bohrium.dp.tech/personal/setting) instead of username and password. Read Bohrium documentation for details.
78
+ OpenAPI is a new way to submit jobs to Bohrium. It using [AccessKey](https://bohrium.dp.tech/personal/setting) instead of username and password. Read Bohrium documentation for details.
79
+
80
+
81
+ ## SGE
82
+
83
+ {dargs:argument}`batch_type <resources/batch_type>`: `SGE`
84
+
85
+ The [Sun Grid Engine (SGE) scheduler](https://gridscheduler.sourceforge.net) is a batch-queueing system distributed resource management. The commands and flags of SGE share a lot similarity with PBS except when checking job status. Use this argument if one is submitting job to SGE based batch system.
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.6.2'
16
- __version_tuple__ = version_tuple = (0, 6, 2)
15
+ __version__ = version = '0.6.4'
16
+ __version_tuple__ = version_tuple = (0, 6, 4)
@@ -88,7 +88,7 @@ class HDFSContext(BaseContext):
88
88
  for ff in task.forward_files:
89
89
  abs_file_list = glob(os.path.join(local_job, ff))
90
90
  if not abs_file_list:
91
- raise RuntimeError(
91
+ raise FileNotFoundError(
92
92
  "cannot find upload file " + os.path.join(local_job, ff)
93
93
  )
94
94
  rel_file_list = [
@@ -100,7 +100,7 @@ class HDFSContext(BaseContext):
100
100
  for fc in submission.forward_common_files:
101
101
  abs_file_list = glob(os.path.join(local_job, fc))
102
102
  if not abs_file_list:
103
- raise RuntimeError(
103
+ raise FileNotFoundError(
104
104
  "cannot find upload file " + os.path.join(local_job, fc)
105
105
  )
106
106
  rel_file_list = [
@@ -170,9 +170,11 @@ class HDFSContext(BaseContext):
170
170
  ) as fp:
171
171
  pass
172
172
  else:
173
- raise RuntimeError("do not find download file " + rfile)
173
+ raise FileNotFoundError(
174
+ "do not find download file " + rfile
175
+ )
174
176
  else:
175
- raise RuntimeError("do not find download file " + rfile)
177
+ raise FileNotFoundError("do not find download file " + rfile)
176
178
  else:
177
179
  if os.path.exists(lfile):
178
180
  dlog.info(f"find existing {lfile}, replacing by {rfile}")
@@ -203,9 +205,9 @@ class HDFSContext(BaseContext):
203
205
  ) as fp:
204
206
  pass
205
207
  else:
206
- raise RuntimeError("do not find download file " + rfile)
208
+ raise FileNotFoundError("do not find download file " + rfile)
207
209
  else:
208
- raise RuntimeError("do not find download file " + rfile)
210
+ raise FileNotFoundError("do not find download file " + rfile)
209
211
  else:
210
212
  if os.path.exists(lfile):
211
213
  dlog.info(f"find existing {lfile}, replacing by {rfile}")
@@ -94,7 +94,7 @@ class LocalContext(BaseContext):
94
94
  for kk in ii.forward_files:
95
95
  abs_file_list = glob(os.path.join(local_job, kk))
96
96
  if not abs_file_list:
97
- raise RuntimeError(
97
+ raise FileNotFoundError(
98
98
  "cannot find upload file " + os.path.join(local_job, kk)
99
99
  )
100
100
  rel_file_list = [
@@ -104,7 +104,7 @@ class LocalContext(BaseContext):
104
104
 
105
105
  for jj in file_list:
106
106
  if not os.path.exists(os.path.join(local_job, jj)):
107
- raise RuntimeError(
107
+ raise FileNotFoundError(
108
108
  "cannot find upload file " + os.path.join(local_job, jj)
109
109
  )
110
110
  if os.path.exists(os.path.join(remote_job, jj)):
@@ -119,7 +119,7 @@ class LocalContext(BaseContext):
119
119
  for kk in submission.forward_common_files:
120
120
  abs_file_list = glob(os.path.join(local_job, kk))
121
121
  if not abs_file_list:
122
- raise RuntimeError(
122
+ raise FileNotFoundError(
123
123
  "cannot find upload file " + os.path.join(local_job, kk)
124
124
  )
125
125
  rel_file_list = [
@@ -129,7 +129,7 @@ class LocalContext(BaseContext):
129
129
 
130
130
  for jj in file_list:
131
131
  if not os.path.exists(os.path.join(local_job, jj)):
132
- raise RuntimeError(
132
+ raise FileNotFoundError(
133
133
  "cannot find upload file " + os.path.join(local_job, jj)
134
134
  )
135
135
  if os.path.exists(os.path.join(remote_job, jj)):
@@ -160,7 +160,7 @@ class LocalContext(BaseContext):
160
160
  else:
161
161
  pass
162
162
  else:
163
- raise RuntimeError(
163
+ raise FileNotFoundError(
164
164
  "cannot find download file " + os.path.join(remote_job, kk)
165
165
  )
166
166
  rel_flist = [
@@ -188,7 +188,9 @@ class LocalContext(BaseContext):
188
188
  else:
189
189
  pass
190
190
  else:
191
- raise RuntimeError("do not find download file " + rfile)
191
+ raise FileNotFoundError(
192
+ "do not find download file " + rfile
193
+ )
192
194
  elif (not os.path.exists(rfile)) and (os.path.exists(lfile)):
193
195
  # already downloaded
194
196
  pass
@@ -206,7 +208,10 @@ class LocalContext(BaseContext):
206
208
  shutil.rmtree(lfile, ignore_errors=True)
207
209
  elif os.path.isfile(lfile) or os.path.islink(lfile):
208
210
  os.remove(lfile)
209
- shutil.copyfile(rfile, lfile)
211
+ if not os.path.islink(rfile):
212
+ shutil.move(rfile, lfile)
213
+ else:
214
+ shutil.copyfile(rfile, lfile)
210
215
  else:
211
216
  raise RuntimeError("should not reach here!")
212
217
  else:
@@ -229,7 +234,7 @@ class LocalContext(BaseContext):
229
234
  else:
230
235
  pass
231
236
  else:
232
- raise RuntimeError(
237
+ raise FileNotFoundError(
233
238
  "cannot find download file " + os.path.join(remote_job, kk)
234
239
  )
235
240
  rel_flist = [os.path.relpath(ii, start=remote_job) for ii in abs_flist_r]
@@ -255,7 +260,7 @@ class LocalContext(BaseContext):
255
260
  else:
256
261
  pass
257
262
  else:
258
- raise RuntimeError("do not find download file " + rfile)
263
+ raise FileNotFoundError("do not find download file " + rfile)
259
264
  elif (not os.path.exists(rfile)) and (os.path.exists(lfile)):
260
265
  # already downloaded
261
266
  pass
@@ -273,7 +278,10 @@ class LocalContext(BaseContext):
273
278
  shutil.rmtree(lfile, ignore_errors=True)
274
279
  elif os.path.isfile(lfile) or os.path.islink(lfile):
275
280
  os.remove(lfile)
276
- shutil.copyfile(rfile, lfile)
281
+ if not os.path.islink(rfile):
282
+ shutil.move(rfile, lfile)
283
+ else:
284
+ shutil.copyfile(rfile, lfile)
277
285
  else:
278
286
  raise RuntimeError("should not reach here!")
279
287
  else:
@@ -295,7 +295,7 @@ class SSHSession:
295
295
  assert self.ssh is not None
296
296
  try:
297
297
  return self.ssh.exec_command(cmd)
298
- except (paramiko.ssh_exception.SSHException, socket.timeout) as e:
298
+ except (paramiko.ssh_exception.SSHException, socket.timeout, EOFError) as e:
299
299
  # SSH session not active
300
300
  # retry for up to 3 times
301
301
  # ensure alive
@@ -569,7 +569,7 @@ class SSHContext(BaseContext):
569
569
  rel_file_list, work_path, file_list, directory_list
570
570
  )
571
571
  else:
572
- raise RuntimeError(f"cannot find upload file {work_path} {jj}")
572
+ raise FileNotFoundError(f"cannot find upload file {work_path} {jj}")
573
573
 
574
574
  def upload(
575
575
  self,
@@ -54,6 +54,11 @@ def main_parser() -> argparse.ArgumentParser:
54
54
  action="store_true",
55
55
  help="Clean submission.",
56
56
  )
57
+ parser_submission_action.add_argument(
58
+ "--reset-fail-count",
59
+ action="store_true",
60
+ help="Reset fail count of all jobs to zero.",
61
+ )
57
62
  ##########################################
58
63
  # gui
59
64
  parser_gui = subparsers.add_parser(
@@ -105,6 +110,7 @@ def main():
105
110
  download_terminated_log=args.download_terminated_log,
106
111
  download_finished_task=args.download_finished_task,
107
112
  clean=args.clean,
113
+ reset_fail_count=args.reset_fail_count,
108
114
  )
109
115
  elif args.command == "gui":
110
116
  start_dpgui(
@@ -12,6 +12,7 @@ def handle_submission(
12
12
  download_terminated_log: bool = False,
13
13
  download_finished_task: bool = False,
14
14
  clean: bool = False,
15
+ reset_fail_count: bool = False,
15
16
  ):
16
17
  """Handle terminated submission.
17
18
 
@@ -25,13 +26,21 @@ def handle_submission(
25
26
  Download finished tasks.
26
27
  clean : bool, optional
27
28
  Clean submission.
29
+ reset_fail_count : bool, optional
30
+ Reset fail count of all jobs to zero.
28
31
 
29
32
  Raises
30
33
  ------
31
34
  ValueError
32
35
  At least one action should be specified.
33
36
  """
34
- if int(download_terminated_log) + int(download_finished_task) + int(clean) == 0:
37
+ if (
38
+ int(download_terminated_log)
39
+ + int(download_finished_task)
40
+ + int(clean)
41
+ + int(reset_fail_count)
42
+ == 0
43
+ ):
35
44
  raise ValueError("At least one action should be specified.")
36
45
 
37
46
  submission_file = record.get_submission(submission_hash)
@@ -42,7 +51,18 @@ def handle_submission(
42
51
  # TODO: for unclear reason, the submission_hash may be changed
43
52
  submission.submission_hash = submission_hash
44
53
  submission.machine.context.bind_submission(submission)
54
+ if reset_fail_count:
55
+ for job in submission.belonging_jobs:
56
+ job.fail_count = 0
57
+ # save to remote and local
58
+ submission.submission_to_json()
59
+ record.write(submission)
60
+ if int(download_terminated_log) + int(download_finished_task) + int(clean) == 0:
61
+ # if only reset_fail_count, no need to update submission state (expensive)
62
+ return
45
63
  submission.update_submission_state()
64
+ submission.submission_to_json()
65
+ record.write(submission)
46
66
 
47
67
  terminated_tasks = []
48
68
  finished_tasks = []
@@ -177,3 +177,107 @@ class Torque(PBS):
177
177
  **pbs_script_header_dict
178
178
  )
179
179
  return pbs_script_header
180
+
181
+
182
+ sge_script_header_template = """
183
+ #!/bin/bash
184
+ #$ -N dpdispatcher_submit
185
+ {select_node_line}
186
+ #$ -cwd
187
+
188
+ """
189
+
190
+
191
+ class SGE(PBS):
192
+ def __init__(
193
+ self,
194
+ batch_type=None,
195
+ context_type=None,
196
+ local_root=None,
197
+ remote_root=None,
198
+ remote_profile={},
199
+ *,
200
+ context=None,
201
+ ):
202
+ super(PBS, self).__init__(
203
+ batch_type,
204
+ context_type,
205
+ local_root,
206
+ remote_root,
207
+ remote_profile,
208
+ context=context,
209
+ )
210
+
211
+ def gen_script_header(self, job):
212
+ resources = job.resources
213
+ sge_script_header_dict = {}
214
+ # resources.number_node is not used
215
+ sge_script_header_dict[
216
+ "select_node_line"
217
+ ] = f"#$ -pe mpi {resources.cpu_per_node} "
218
+ # resources.queue_name is not necessary
219
+ sge_script_header = sge_script_header_template.format(**sge_script_header_dict)
220
+ return sge_script_header
221
+
222
+ def do_submit(self, job):
223
+ script_file_name = job.script_file_name
224
+ script_str = self.gen_script(job)
225
+ job_id_name = job.job_hash + "_job_id"
226
+ self.context.write_file(fname=script_file_name, write_str=script_str)
227
+ script_file_dir = self.context.remote_root
228
+ stdin, stdout, stderr = self.context.block_checkcall(
229
+ "cd {} && {} {}".format(script_file_dir, "qsub", script_file_name)
230
+ )
231
+ subret = stdout.readlines()
232
+ job_id = subret[0].split()[2]
233
+ self.context.write_file(job_id_name, job_id)
234
+ return job_id
235
+
236
+ def default_resources(self, resources):
237
+ pass
238
+
239
+ def check_status(self, job):
240
+ job_id = job.job_id
241
+ status_line = None
242
+ if job_id == "":
243
+ return JobStatus.unsubmitted
244
+ ret, stdin, stdout, stderr = self.context.block_call("qstat")
245
+ err_str = stderr.read().decode("utf-8")
246
+ if ret != 0:
247
+ raise RuntimeError(
248
+ "status command qstat fails to execute. erro info: %s return code %d"
249
+ % (err_str, ret)
250
+ )
251
+ status_text_list = stdout.read().decode("utf-8").split("\n")
252
+ for txt in status_text_list:
253
+ if job_id in txt:
254
+ status_line = txt
255
+
256
+ if status_line is None:
257
+ count = 0
258
+ while count <= 6:
259
+ if self.check_finish_tag(job=job):
260
+ return JobStatus.finished
261
+ dlog.info(
262
+ "not tag_finished detected, execute sync command and wait. count "
263
+ + str(count)
264
+ )
265
+ self.context.block_call("sync")
266
+ import time
267
+
268
+ time.sleep(10)
269
+ count += 1
270
+ return JobStatus.terminated
271
+ else:
272
+ status_word = status_line.split()[4]
273
+ # dlog.info (status_word)
274
+ if status_word in ["qw"]:
275
+ return JobStatus.waiting
276
+ elif status_word in ["r"]:
277
+ return JobStatus.running
278
+ else:
279
+ return JobStatus.unknown
280
+
281
+ def check_finish_tag(self, job):
282
+ job_tag_finished = job.job_hash + "_job_tag_finished"
283
+ return self.context.check_file_exists(job_tag_finished)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dpdispatcher
3
- Version: 0.6.2
3
+ Version: 0.6.4
4
4
  Summary: Generate HPC scheduler systems jobs input scripts, submit these scripts to HPC systems, and poke until they finish
5
5
  Author: DeepModeling
6
6
  License: GNU LESSER GENERAL PUBLIC LICENSE
@@ -69,7 +69,7 @@ class TestLocalContext(unittest.TestCase):
69
69
 
70
70
  self.local_context.bind_submission(submission)
71
71
 
72
- with self.assertRaises(RuntimeError):
72
+ with self.assertRaises(FileNotFoundError):
73
73
  self.local_context.upload(submission)
74
74
 
75
75
  def test_upload(self):
@@ -236,7 +236,7 @@ class TestLocalContextDownload(unittest.TestCase):
236
236
  submission_hash="0_md/",
237
237
  )
238
238
  self.local_context.bind_submission(submission)
239
- with self.assertRaises(RuntimeError):
239
+ with self.assertRaises(FileNotFoundError):
240
240
  self.local_context.download(submission, check_exists=False)
241
241
 
242
242
  def test_download_mark_failure_tag(self):
@@ -3,6 +3,7 @@ import os
3
3
  import random
4
4
  import shutil
5
5
  import sys
6
+ import tempfile
6
7
  import traceback
7
8
 
8
9
  sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
@@ -72,6 +73,16 @@ class RunSubmission:
72
73
  )
73
74
  task_list.append(task)
74
75
 
76
+ for ii in range(2):
77
+ task = Task(
78
+ command=f"mkdir -p out_dir{ii} && touch out_dir{ii}/out{ii}",
79
+ task_work_path="./",
80
+ forward_files=[],
81
+ backward_files=[f"out_dir{ii}"],
82
+ outlog=f"out_dir{ii}.txt",
83
+ )
84
+ task_list.append(task)
85
+
75
86
  # test space in file name
76
87
  task_list.append(
77
88
  Task(
@@ -90,6 +101,11 @@ class RunSubmission:
90
101
  backward_common_files=[],
91
102
  task_list=task_list,
92
103
  )
104
+ # test override directory
105
+ os.makedirs(
106
+ os.path.join(self.machine_dict["local_root"], "test_dir", "out_dir1"),
107
+ exist_ok=True,
108
+ )
93
109
  submission.run_submission(check_interval=2)
94
110
 
95
111
  for ii in range(4):
@@ -251,6 +267,23 @@ class TestPBSRun(RunSubmission, unittest.TestCase):
251
267
  return super().test_async_run_submission()
252
268
 
253
269
 
270
+ @unittest.skipIf(sys.platform == "win32", "Shell is not supported on Windows")
271
+ class TestLocalContext(RunSubmission, unittest.TestCase):
272
+ def setUp(self):
273
+ super().setUp()
274
+ self.temp_dir = tempfile.TemporaryDirectory()
275
+ self.machine_dict["context_type"] = "LocalContext"
276
+ self.machine_dict["remote_root"] = self.temp_dir.name
277
+
278
+ def tearDown(self):
279
+ super().tearDown()
280
+ self.temp_dir.cleanup()
281
+
282
+ @unittest.skip("It seems the remote file may be deleted")
283
+ def test_async_run_submission(self):
284
+ return super().test_async_run_submission()
285
+
286
+
254
287
  @unittest.skipIf(sys.platform == "win32", "Shell is not supported on Windows")
255
288
  class TestLazyLocalContext(RunSubmission, unittest.TestCase):
256
289
  def setUp(self):
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes