############################################################################
# Copyright (C) SchedMD LLC.
############################################################################
import re

import pytest

import atf


# Setup
@pytest.fixture(scope="module", autouse=True)
def setup():
    atf.require_auto_config("wants to create custom resources")
    atf.require_accounting()
    atf.require_config_parameter("AccountingStorageTRES", "gres/r1")
    atf.require_config_parameter("SelectType", "select/cons_tres")
    atf.require_config_parameter("SelectTypeParameters", "CR_CPU")
    atf.require_config_parameter("GresTypes", "r1,r2")
    atf.require_nodes(1, [("Gres", "r1:1,r2:2")])
    atf.require_config_parameter("Name", {"r2": {"Flags": "explicit"}}, source="gres")
    atf.require_slurm_running()


def test_explicit_gres_requested():
    """Test gres.conf flag explicit with --exclusive allocation
    and explicitly requesting 'explicit' gres"""

    with_gres_output = atf.run_command_output(
        "salloc -wnode1 --gres=r2 --exclusive scontrol show node node1 -d",
        fatal=True,
    )
    assert (
        re.search(r"GresUsed=r1:1,r2:1", with_gres_output) is not None
    ), "Allocation should give all of non-explicit gres (r1:1) and only requested explicit gres (r2:1)"


def test_explicit_gres_not_requested():
    """Test gres.conf flag explicit with --exclusive allocation
    and not explicitly requesting 'explict' gres"""

    without_gres_output = atf.run_command_output(
        "salloc -wnode1 --exclusive scontrol show node node1 -d", fatal=True
    )
    assert (
        re.search(r"GresUsed=r1:1,r2:0", without_gres_output) is not None
    ), "Allocation should give all of non-explicit gres (r1:1) and none of the not requested explicit gres (r2:0)"
