blob: 83011b197a88e22d673a6af2397abab453f58fb4 [file] [log] [blame]
############################################################################
# Copyright (C) SchedMD LLC.
############################################################################
import atf
import pytest
# import re
dw_wlm_cli_client = f"{atf.properties['slurm-sbin-dir']}/dw_wlm_cli"
dwstat_client = f"{atf.properties['slurm-sbin-dir']}/dwstat"
def require_datawarp_clients():
# For the time being, we are installing the clients if necessary,
# but not removing them afterwards. Later on, we could generalize
# {backup,restore}_config_file to work for any file
if (
atf.run_command_exit(
f"test -f {dw_wlm_cli_client}",
user=atf.properties["slurm-user"],
quiet=True,
)
!= 0
):
if atf.properties["auto-config"]:
atf.run_command(
f"cp {atf.properties['slurm-source-dir']}/src/plugins/burst_buffer/datawarp/dw_wlm_cli {dw_wlm_cli_client}",
user=atf.properties["slurm-user"],
fatal=True,
quiet=True,
)
else:
pytest.skip(
f"This test requires the dw_wlm_cli client to be installed in {atf.properties['slurm-sbin-dir']}",
allow_module_level=True,
)
if (
atf.run_command_exit(
f"test -f {dwstat_client}", user=atf.properties["slurm-user"], quiet=True
)
!= 0
):
if atf.properties["auto-config"]:
atf.run_command(
f"cp {atf.properties['slurm-source-dir']}/src/plugins/burst_buffer/datawarp/dwstat {dwstat_client}",
user=atf.properties["slurm-user"],
fatal=True,
quiet=True,
)
else:
pytest.skip(
f"This test requires the dwstat client to be installed in {atf.properties['slurm-sbin-dir']}",
allow_module_level=True,
)
@pytest.fixture(scope="module", autouse=True)
def setup():
atf.require_config_parameter("BurstBufferType", "burst_buffer/datawarp")
# atf.require_config_parameter('DebugFlags', 'burstbuffer')
atf.require_config_parameter(
"AllowUsers", f"{atf.properties['test-user']}", source="burst_buffer"
)
atf.require_config_parameter_includes("Flags", "EmulateCray", source="burst_buffer")
atf.require_config_parameter_includes(
"Flags", "EnablePersistent", source="burst_buffer"
)
require_datawarp_clients()
atf.require_config_parameter(
"GetSysState", dw_wlm_cli_client, source="burst_buffer"
)
atf.require_config_parameter("GetSysStatus", dwstat_client, source="burst_buffer")
atf.require_slurm_running()
def test_create_and_use_burst_buffer(tmp_path):
"""Create and use burst buffer"""
bb_use_script = str(tmp_path / "bb_use.sh")
bb_use_output = str(tmp_path / "bb_use.out")
atf.make_bash_script(
bb_use_script,
"""#DW persistentdw name=test_buffer
scontrol show burst
""",
)
bb_create_script = str(tmp_path / "bb_create.sh")
bb_create_output = str(tmp_path / "bb_create.out")
atf.make_bash_script(
bb_create_script,
"""#BB create_persistent name=test_buffer capacity=48 access=striped type=scratch
scontrol show burst
""",
)
# Submit a job to use the persisent burst buffer
bb_use_job_id = atf.submit_job_sbatch(
f"-N1 -t1 -o {bb_use_output} {bb_use_script}", fatal=True
)
# Submit a job to create the persisent burst buffer
bb_create_job_id = atf.submit_job_sbatch(
f"-N1 -t1 -o {bb_create_output} {bb_create_script}", fatal=True
)
# The burst buffer creation should complete first
assert atf.wait_for_job_state(
bb_create_job_id, "DONE", timeout=660
), f"Burst buffer creation job ({bb_create_job_id}) did not run"
# The burst buffer usage should then complete
assert atf.wait_for_job_state(
bb_use_job_id, "DONE", timeout=660
), f"Burst buffer usage job ({bb_create_job_id}) did not run"
# Ensure the burst buffer usage job ran after the buffer creation
assert atf.wait_for_file(bb_use_output, timeout=660)
assert (
atf.run_command_exit(f"grep test_buffer {bb_use_output}") == 0
), "Job using burst buffer ran before bb creation"
assert atf.wait_for_file(bb_create_output, timeout=660)
assert (
atf.run_command_exit(f"grep test_buffer {bb_create_output}") == 0
), "Job creating burst buffer failed to do so"
def test_remove_burst_buffer(tmp_path):
"""Delete burst buffer"""
bb_delete_script = str(tmp_path / "bb_delete.sh")
bb_delete_output = str(tmp_path / "bb_delete.out")
atf.make_bash_script(
bb_delete_script,
"""#BB destroy_persistent name=test_buffer
scontrol show burst
""",
)
# Submit a job to delete the persisent burst buffer
bb_delete_job_id = atf.submit_job_sbatch(
f"-N1 -t1 -o {bb_delete_output} {bb_delete_script}", fatal=True
)
# The burst buffer deletion job should complete
assert atf.wait_for_job_state(
bb_delete_job_id, "DONE", timeout=660
), f"Burst buffer deletion job ({bb_delete_job_id}) did not run"
assert atf.wait_for_file(bb_delete_output, timeout=660)
assert (
atf.run_command_exit(f"grep test_buffer {bb_delete_output}") != 0
), "Job deleting burst buffer failed to do so"