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.
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/workflows/pyright.yml +1 -1
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/workflows/release.yml +1 -1
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/workflows/test-bohrium.yml +1 -1
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/workflows/test.yml +1 -1
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.pre-commit-config.yaml +1 -1
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/PKG-INFO +1 -1
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/batch.md +8 -1
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/_version.py +2 -2
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/contexts/hdfs_context.py +8 -6
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/contexts/local_context.py +18 -10
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/contexts/ssh_context.py +2 -2
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/dpdisp.py +6 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/entrypoints/submission.py +21 -1
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/pbs.py +104 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/PKG-INFO +1 -1
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_local_context.py +2 -2
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_run_submission.py +33 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/dependabot.yml +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/workflows/ci-docker.yml +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/workflows/machines.yml +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/workflows/mirror_gitee.yml +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.github/workflows/publish_conda.yml +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.gitignore +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/.readthedocs.yaml +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/CONTRIBUTING.md +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/Dockerfile +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/LICENSE +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/README.md +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/LICENSE +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/README.md +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/pbs/docker-compose.yml +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/pbs/start-pbs.sh +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/pbs.sh +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/slurm/docker-compose.yml +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/slurm/register_cluster.sh +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/slurm/start-slurm.sh +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/slurm.sh +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/ssh/docker-compose.yml +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/ssh/start-ssh.sh +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/ssh.sh +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/ci/ssh_rsync.sh +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/codecov.yml +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/conda/conda_build_config.yaml +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/conda/meta.yaml +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/.gitignore +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/Makefile +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/cli.rst +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/conf.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/context.md +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/credits.rst +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/dpdispatcher_on_yarn.md +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/examples/expanse.md +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/examples/g16.md +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/examples/shell.md +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/examples/template.md +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/getting-started.md +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/index.rst +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/install.md +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/machine.rst +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/make.bat +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/requirements.txt +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/resources.rst +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/doc/task.rst +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/__init__.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/__main__.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/arginfo.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/base_context.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/contexts/__init__.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/contexts/dp_cloud_server_context.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/contexts/lazy_local_context.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/contexts/openapi_context.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/dlog.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/dpcloudserver/__init__.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/dpcloudserver/client.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/entrypoints/__init__.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/entrypoints/gui.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machine.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/__init__.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/distributed_shell.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/dp_cloud_server.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/fugaku.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/lsf.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/openapi.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/shell.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/machines/slurm.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/submission.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/__init__.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/dpcloudserver/__init__.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/dpcloudserver/client.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/dpcloudserver/config.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/dpcloudserver/retcode.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/dpcloudserver/zip_file.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/hdfs_cli.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/job_status.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/record.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher/utils/utils.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/SOURCES.txt +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/dependency_links.txt +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/entry_points.txt +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/requires.txt +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/dpdispatcher.egg-info/top_level.txt +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/machine/expanse.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/machine/lazy_local.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/machine/mandu.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/resources/expanse_cpu.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/resources/mandu.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/resources/template.slurm +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/resources/tiger.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/task/deepmd-kit.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/examples/task/g16.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/pyproject.toml +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/scripts/script_gen_dargs_docs.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/scripts/script_gen_dargs_json.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/setup.cfg +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/.gitignore +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/__init__.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/batch.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/context.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/debug_test_class_submission_init.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/devel_test_ali_ehpc.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/devel_test_dp_cloud_server.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/devel_test_lazy_ali_ehpc.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/devel_test_lsf.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/devel_test_shell.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/devel_test_slurm.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/devel_test_ssh_ali_ehpc.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/graph.pb +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/job.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_ali_ehpc.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_center.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_diffenert.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_dp_cloud_server.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_fugaku.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_if_cuda_multi_devices.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_lazy_local_lsf.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_lazy_local_slurm.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_lazylocal_shell.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_local_fugaku.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_local_shell.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_lsf.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_openapi.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_slurm.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/machine_yarn.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/resources.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/submission.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/jsons/task.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/sample_class.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/script_gen_json.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/slurm_test.env +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_argcheck.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_class_job.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_class_machine.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_class_machine_dispatch.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_class_resources.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_class_submission.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_class_submission_init.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_class_task.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_cli.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-1/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-1/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-1/some_dir/some_file +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-2/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-2/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-3/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-3/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-4/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/bct-4/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/dir with space/file with space +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/graph.pb +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_context_dir/0_md/some_dir/some_file +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_examples.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_group_size.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_gui.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_context.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-1/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-1/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-2/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-2/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-3/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-3/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-4/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/bct-4/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_hdfs_dir/0_md/graph.pb +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_if_cuda_multi_devices/test_dir/test.txt +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_import_classes.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lazy_local_context.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-1/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-1/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-2/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-2/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-3/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-3/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-4/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/bct-4/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/graph.pb +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_dir/0_md/submission.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_lsf_script_generation.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-1/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-1/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-2/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-2/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-3/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-3/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-4/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/bct-4/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_pbs_dir/0_md/graph.pb +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_retry.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_run_submission_bohrium.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_run_submission_ratio_unfinished.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_cuda_multi_devices.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/fail_dir/mock_fail_task.txt +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/dir with space/example.txt +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/dir1/example.txt +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/dir2/example.txt +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/dir3/example.txt +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/dir4/example.txt +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/parent_dir/graph.pb +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_shell_trival_dir/recover_dir/mock_recover_task.txt +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-1/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-1/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-2/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-2/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-3/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-3/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-4/conf.lmp +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/bct-4/input.lammps +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/d3c842c5b9476e48f7145b370cd330372b9293e1.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/graph.pb +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_dir/0_md/submission.json +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_slurm_script_generation.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_ssh_context.py +0 -0
- {dpdispatcher-0.6.2 → dpdispatcher-0.6.4}/tests/test_work_path/.gitkeep +0 -0
|
@@ -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@
|
|
25
|
+
uses: actions/setup-python@v5
|
|
26
26
|
with:
|
|
27
27
|
python-version: ${{ matrix.python-version }}
|
|
28
28
|
- run: pip install .[test] coverage
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: dpdispatcher
|
|
3
|
-
Version: 0.6.
|
|
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.
|
|
@@ -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
|
|
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
|
|
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
|
|
173
|
+
raise FileNotFoundError(
|
|
174
|
+
"do not find download file " + rfile
|
|
175
|
+
)
|
|
174
176
|
else:
|
|
175
|
-
raise
|
|
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
|
|
208
|
+
raise FileNotFoundError("do not find download file " + rfile)
|
|
207
209
|
else:
|
|
208
|
-
raise
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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.
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|