blob: dfb5a0a12d612f0f58c6e86ffc229f09a9029a91 [file] [log] [blame]
############################################################################
# Copyright (C) SchedMD LLC.
############################################################################
import atf
import pytest
import re
@pytest.fixture(scope="module", autouse=True)
def setup():
atf.require_accounting()
atf.require_nodes(3, [("CPUs", 8), ("RealMemory", 80)])
# only to make the test faster
atf.require_config_parameter("SchedulerParameters", "bf_interval=1")
atf.require_slurm_running()
def test_hetjob():
file_in = "hetjob.in"
atf.make_bash_script(
file_in,
"""
#SBATCH --cpus-per-task=4 --mem-per-cpu=10 --ntasks=1
#SBATCH hetjob
#SBATCH --cpus-per-task=2 --mem-per-cpu=2 --ntasks=1 -t1
#SBATCH hetjob
#SBATCH --cpus-per-task=1 --mem-per-cpu=6 --ntasks=1 -t1
srun sleep 60
""",
)
leader_job_id = atf.submit_job_sbatch(f"-t1 {file_in}", fatal=True)
atf.wait_for_job_state(leader_job_id, "RUNNING", fatal=True)
jobs_dict = atf.get_jobs()
# Verify details about leader job
assert leader_job_id in jobs_dict
leader_job_dict = jobs_dict[leader_job_id]
assert leader_job_dict["JobId"] == leader_job_id
assert leader_job_dict["HetJobId"] == leader_job_id
assert leader_job_dict["HetJobOffset"] == 0
het_job_expression = leader_job_dict["HetJobIdSet"]
assert re.search(r"[\d,-]+", het_job_expression) is not None
assert leader_job_dict["CPUs/Task"] == 4
assert leader_job_dict["MinMemoryCPU"] == "10M"
het_job_component_list = atf.range_to_list(het_job_expression)
het_job_component_list.remove(leader_job_id)
assert len(het_job_component_list) == 2
# Verify details about first component job
component1_job_id = het_job_component_list[0]
assert component1_job_id in jobs_dict
component1_job_dict = jobs_dict[component1_job_id]
assert component1_job_dict["JobId"] == component1_job_id
assert component1_job_dict["HetJobId"] == leader_job_id
assert component1_job_dict["HetJobOffset"] == 1
assert re.search(r"[\d,-]+", component1_job_dict["HetJobIdSet"]) is not None
assert component1_job_dict["CPUs/Task"] == 2
assert component1_job_dict["MinMemoryCPU"] == "2M"
# Verify details about second component job
component2_job_id = het_job_component_list[1]
assert component2_job_id in jobs_dict
component2_job_dict = jobs_dict[component2_job_id]
assert component2_job_dict["JobId"] == component2_job_id
assert component2_job_dict["HetJobId"] == leader_job_id
assert component2_job_dict["HetJobOffset"] == 2
assert re.search(r"[\d,-]+", component2_job_dict["HetJobIdSet"]) is not None
assert component2_job_dict["CPUs/Task"] == 1
assert component2_job_dict["MinMemoryCPU"] == "6M"