############################################################################
# Copyright (C) SchedMD LLC.
############################################################################
import getpass
import json
import logging
import os
import random
import time

import pytest
import requests
import yaml

import atf

pytestmark = pytest.mark.slow

random.seed()

cluster_name = f"test-cluster-{random.randrange(0, 99999999999)}"
cluster2_name = f"{cluster_name}-2"
user_name = f"test-user-{random.randrange(0, 99999999999)}"
user_name2 = f"{user_name}-2"
local_user_name = getpass.getuser()
account_name = f"test-account-{random.randrange(0, 99999999999)}"
account2_name = f"{account_name}-2"
account3_name = f"{account_name}-3"
coord_name = f"{user_name}-commander"
wckey_name = f"test-wckey-{random.randrange(0, 99999999999)}"
wckey2_name = f"{wckey_name}-2"
qos_name = f"test-qos-{random.randrange(0, 99999999999)}"
qos2_name = f"{qos_name}-2"
resv_name = f"test-reservation-{random.randrange(0, 99999999999)}"
req_node_count = 10


@pytest.fixture(scope="module", autouse=True)
def setup():
    global slurmrestd_url, token, slurmrestd
    global local_cluster_name, partition_name

    atf.require_version((26, 11), "sbin/slurmdbd")
    atf.require_version((26, 11), "sbin/slurmctld")
    atf.require_version((26, 11), "sbin/slurmrestd")
    atf.require_slurmrestd("slurmctld,slurmdbd,util", "v0.0.46")

    atf.require_accounting(modify=True)
    atf.require_nodes(req_node_count)
    atf.require_config_parameter("AllowNoDefAcct", "Yes", source="slurmdbd")
    atf.require_config_parameter("TrackWCKey", "Yes", source="slurmdbd")
    atf.require_config_parameter("TrackWCKey", "Yes")
    atf.require_config_parameter_includes("AuthAltTypes", "auth/jwt")
    atf.require_config_parameter_includes("AuthAltTypes", "auth/jwt", source="slurmdbd")
    atf.require_slurm_running()

    # Setup OpenAPI client with OpenAPI-Generator once Slurm(restd) is running
    atf.require_openapi_generator("7.3.0")

    # Uncomment the following two lines to generate a new openapi_spec.json
    # file, then it could be moved to the testsuite_data_dir if we really
    # want to change the OpenAPI specs after .0.
    # with open("openapi_spec.json", "w") as f:
    #     json.dump(atf.properties["openapi_spec"], f, indent=2)

    # Conf reliant variables (put here to avert --auto-config errors)
    local_cluster_name = atf.get_config_parameter("ClusterName")

    partition_name = atf.default_partition()
    if not partition_name:
        partition_name = "debug"


@pytest.fixture(scope="function")
def slurm(setup):
    yield atf.openapi_slurm()


@pytest.fixture(scope="function")
def slurmdb(setup):
    yield atf.openapi_slurmdb()


@pytest.fixture(scope="function")
def admin_level(setup):
    atf.run_command(
        f"sacctmgr -i add user {local_cluster_name} defaultaccount=root AdminLevel=Admin",
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    yield
    atf.cancel_all_jobs()
    atf.run_command(
        f"sacctmgr -i delete user {local_cluster_name}",
        user=atf.properties["slurm-user"],
    )


@pytest.fixture(scope="function")
def non_admin(setup):
    atf.run_command(
        f"sacctmgr -i add user {local_cluster_name} defaultaccount=root",
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    yield
    atf.cancel_all_jobs()
    atf.run_command(
        f"sacctmgr -i delete user {local_cluster_name}",
        user=atf.properties["slurm-user"],
    )


@pytest.fixture(scope="function")
def cleanup_crash(setup):
    yield

    if not atf.is_slurmrestd_running():
        atf.start_slurmrestd()
        # We have a new port
        atf.properties["openapi_config"].host = atf.properties["slurmrestd_url"]


@pytest.fixture(scope="function")
def create_accounts():
    atf.run_command(
        f"sacctmgr -i create account {account_name}",
        user=atf.properties["slurm-user"],
        fatal=False,
    )
    atf.run_command(
        f"sacctmgr -i create account {account2_name}",
        user=atf.properties["slurm-user"],
        fatal=False,
    )

    yield

    atf.run_command(
        f"sacctmgr -i delete account {account_name}",
        user=atf.properties["slurm-user"],
        fatal=False,
    )
    atf.run_command(
        f"sacctmgr -i delete account {account2_name}",
        user=atf.properties["slurm-user"],
        fatal=False,
    )


@pytest.fixture(scope="function")
def create_users(create_accounts):
    atf.run_command(
        f"sacctmgr -i create user {user_name} cluster={local_cluster_name} account={account_name}",
        user=atf.properties["slurm-user"],
        fatal=False,
    )

    yield

    atf.cancel_all_jobs()
    atf.run_command(
        f"sacctmgr -i delete user {user_name} cluster={local_cluster_name} account={account_name}",
        user=atf.properties["slurm-user"],
        fatal=False,
    )


@pytest.fixture(scope="function")
def create_coords(create_users):
    atf.run_command(
        f"sacctmgr -i create user {coord_name} cluster={local_cluster_name} account={account2_name}",
        user=atf.properties["slurm-user"],
        fatal=False,
    )

    yield

    atf.cancel_all_jobs()
    atf.run_command(
        f"sacctmgr -i delete user {coord_name} cluster={local_cluster_name} account={account2_name}",
        user=atf.properties["slurm-user"],
        fatal=False,
    )


@pytest.fixture(scope="function")
def create_wckeys():
    atf.run_command(
        f"sacctmgr -i create user {user_name} cluster={local_cluster_name} wckey={wckey_name}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    atf.run_command(
        f"sacctmgr -i create user {coord_name} cluster={local_cluster_name} wckey={wckey_name}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )

    yield

    atf.cancel_all_jobs()
    atf.run_command(
        f"sacctmgr -i delete user {user_name} cluster={local_cluster_name} wckey={wckey_name}",
        user=atf.properties["slurm-user"],
        fatal=False,
    )
    atf.run_command(
        f"sacctmgr -i delete user {coord_name} cluster={local_cluster_name} wckey={wckey_name}",
        user=atf.properties["slurm-user"],
        fatal=False,
    )


@pytest.fixture(scope="function")
def create_qos(create_coords):
    atf.run_command(
        f"sacctmgr -i create qos {qos_name}",
        user=atf.properties["slurm-user"],
        fatal=False,
    )
    atf.run_command(
        f"sacctmgr -i create qos {qos2_name}",
        user=atf.properties["slurm-user"],
        fatal=False,
    )

    yield

    atf.run_command(
        f"sacctmgr -i delete qos {qos_name}",
        user=atf.properties["slurm-user"],
        fatal=False,
    )
    atf.run_command(
        f"sacctmgr -i delete qos {qos2_name}",
        user=atf.properties["slurm-user"],
        fatal=False,
    )


@pytest.fixture(scope="function")
def dynamic_node(setup):
    """
    Sets the required MaxNodeCount + cons_tres, and returns a non-existing node.
    """
    nonexistent_node_name = "nonexistent_node"
    config = atf.get_config()

    atf.stop_slurm()
    atf.require_config_parameter("SelectType", "select/cons_tres")
    atf.require_config_parameter("SelectTypeParameters", "CR_CPU")
    atf.require_config_parameter("MaxNodeCount", str(req_node_count + 1))
    atf.start_slurm()

    atf.run_command(
        f"scontrol delete node {nonexistent_node_name}",
        user=atf.properties["slurm-user"],
        fatal=False,
        xfail=True,
    )

    yield nonexistent_node_name

    atf.run_command(
        f"scontrol delete node {nonexistent_node_name}",
        user=atf.properties["slurm-user"],
        fatal=False,
    )

    atf.stop_slurm()
    atf.require_config_parameter("SelectType", config["SelectType"])
    atf.require_config_parameter("SelectTypeParameters", config["SelectTypeParameters"])
    atf.require_config_parameter("MaxNodeCount", None)
    atf.start_slurm()


def test_loaded_versions():
    r = atf.request_slurmrestd("openapi/v3")
    assert r.status_code == 200

    spec = r.json()

    # verify older plugins are not loaded
    assert "/slurm/v0.0.45/jobs" not in spec["paths"].keys()
    assert "/slurm/v0.0.44/jobs" not in spec["paths"].keys()
    assert "/slurm/v0.0.43/jobs" not in spec["paths"].keys()
    assert "/slurm/v0.0.42/jobs" not in spec["paths"].keys()
    assert "/slurm/v0.0.41/jobs" not in spec["paths"].keys()
    assert "/slurm/v0.0.40/jobs" not in spec["paths"].keys()
    assert "/slurm/v0.0.39/jobs" not in spec["paths"].keys()
    assert "/slurm/v0.0.38/jobs" not in spec["paths"].keys()
    assert "/slurmdb/v0.0.38/jobs" not in spec["paths"].keys()
    assert "/slurm/v0.0.37/jobs" not in spec["paths"].keys()
    assert "/slurmdb/v0.0.37/jobs" not in spec["paths"].keys()
    assert "/slurm/v0.0.36/jobs" not in spec["paths"].keys()
    assert "/slurmdb/v0.0.36/jobs" not in spec["paths"].keys()
    assert "/slurm/v0.0.35/jobs" not in spec["paths"].keys()

    # verify current plugins are loaded
    assert "/slurm/v0.0.46/jobs/" in spec["paths"].keys()
    assert "/slurmdb/v0.0.46/jobs/" in spec["paths"].keys()


@pytest.mark.skipif(
    atf.get_version() <= (26, 11, 0), reason="Specs may change until .0 is released"
)
@pytest.mark.parametrize("openapi_spec", ["46"], indirect=True)
def test_specification(openapi_spec):
    if atf.get_version("sbin/slurmrestd") >= (28, 5):
        # This is expected to be deprecated in 28.05+
        patch = atf.get_deprecated_openapi_spec_patch(openapi_spec)
        patch.apply(openapi_spec, in_place=True)

    atf.assert_openapi_spec_eq(openapi_spec, atf.properties["openapi_spec"])


def test_db_accounts(slurm, slurmdb, create_wckeys, admin_level):
    from openapi_client import ApiClient as Client
    from openapi_client import Configuration as Config
    from openapi_client.models.v0046_account import V0046Account
    from openapi_client.models.v0046_assoc_short import V0046AssocShort
    from openapi_client.models.v0046_coord import V0046Coord
    from openapi_client.models.v0046_openapi_accounts_resp import (
        V0046OpenapiAccountsResp,
    )

    # make sure account doesn't already exist
    resp = slurmdb.slurmdb_v0046_get_account_with_http_info(account_name)
    assert resp.status_code == 200
    assert len(resp.data.accounts) == 0
    resp = slurmdb.slurmdb_v0046_get_account_with_http_info(account2_name)
    assert resp.status_code == 200
    assert len(resp.data.accounts) == 0

    # create account
    accounts = V0046OpenapiAccountsResp(
        accounts=[
            V0046Account(
                description="test description",
                name=account_name,
                organization="test organization",
            ),
            V0046Account(
                coordinators=[
                    V0046Coord(
                        name=coord_name,
                    )
                ],
                description="test description",
                name=account2_name,
                organization="test organization",
            ),
        ]
    )
    resp = slurmdb.slurmdb_v0046_post_accounts_with_http_info(accounts)
    assert resp.status_code == 200

    accounts = V0046OpenapiAccountsResp(
        accounts=[
            V0046Account(
                name=account2_name,
                description="fail description",
                organization="fail organization",
            )
        ]
    )
    resp = slurmdb.slurmdb_v0046_post_accounts_with_http_info(accounts)
    assert resp.status_code == 200

    # verify account matches modify request
    resp = slurmdb.slurmdb_v0046_get_account(account2_name)
    assert resp.accounts
    for account in resp.accounts:
        assert account.name == account2_name
        assert account.description == accounts.accounts[0].description
        assert account.organization == accounts.accounts[0].organization
        assert not account.flags

    # change account desc and org
    accounts = V0046OpenapiAccountsResp(
        accounts=[
            V0046Account(
                coordinators=[],
                description="test description modified",
                name=account2_name,
                organization="test organization modified",
            )
        ]
    )
    resp = slurmdb.slurmdb_v0046_post_accounts(accounts)
    assert not resp.warnings
    assert len(resp.errors) == 0
    resp = slurmdb.slurmdb_v0046_get_account(account2_name)
    assert resp.accounts
    for account in resp.accounts:
        assert account.name == account2_name
        assert account.description == accounts.accounts[0].description
        assert account.organization == accounts.accounts[0].organization
        assert not account.coordinators

    resp = slurmdb.slurmdb_v0046_get_account(account_name)
    assert resp.accounts
    for account in resp.accounts:
        assert account.name == account_name

    # check full listing works
    resp = slurmdb.slurmdb_v0046_get_accounts(deleted="true")
    assert resp.accounts
    resp = slurmdb.slurmdb_v0046_get_accounts()
    assert resp.accounts

    accounts = V0046OpenapiAccountsResp(
        accounts=[
            V0046Account(
                coordinators=[],
                description="test description modified",
                name=account2_name,
                organization="test organization modified",
            )
        ]
    )

    resp = slurmdb.slurmdb_v0046_delete_account(account_name)
    assert not resp.warnings
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_delete_account(account2_name)
    assert not resp.warnings
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_get_account(account_name)
    assert len(resp.warnings) > 0
    assert len(resp.errors) == 0
    assert not resp.accounts

    resp = slurmdb.slurmdb_v0046_get_account(account2_name)
    assert len(resp.warnings) > 0
    assert len(resp.errors) == 0
    assert not resp.accounts


def test_db_diag(slurmdb, admin_level):
    resp = slurmdb.slurmdb_v0046_get_diag()
    assert not resp.warnings
    assert len(resp.errors) == 0
    assert resp.statistics.time_start > 0


def test_db_wckeys(slurmdb, create_coords, admin_level):
    from openapi_client.models.v0046_openapi_wckey_resp import V0046OpenapiWckeyResp
    from openapi_client.models.v0046_wckey import V0046Wckey

    wckeys = V0046OpenapiWckeyResp(
        wckeys=[
            V0046Wckey(
                cluster=local_cluster_name,
                name=wckey_name,
                user=user_name,
            ),
            V0046Wckey(
                cluster=local_cluster_name,
                name=wckey2_name,
                user=user_name,
            ),
            V0046Wckey(
                cluster=local_cluster_name,
                name=wckey2_name,
                user=coord_name,
            ),
        ]
    )

    resp = slurmdb.slurmdb_v0046_post_wckeys_with_http_info(
        v0046_openapi_wckey_resp=wckeys
    )
    assert resp.status_code == 200

    resp = slurmdb.slurmdb_v0046_get_wckeys()
    assert not resp.warnings
    assert len(resp.errors) == 0
    assert len(resp.wckeys) >= 1

    resp = slurmdb.slurmdb_v0046_get_wckey(wckey_name)
    assert not resp.warnings
    assert len(resp.errors) == 0
    assert resp.wckeys
    for wckey in resp.wckeys:
        assert wckey.name == wckey_name or wckey.name == wckey2_name
        assert wckey.user == user_name or wckey.user == coord_name

    resp = slurmdb.slurmdb_v0046_get_wckey(wckey2_name)
    assert not resp.warnings
    assert len(resp.errors) == 0
    assert resp.wckeys
    for wckey in resp.wckeys:
        assert wckey.name == wckey2_name
        assert wckey.user == user_name or wckey.user == coord_name

    resp = slurmdb.slurmdb_v0046_delete_wckey(wckey_name)
    assert not resp.warnings
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_delete_wckey(wckey2_name)
    assert not resp.warnings
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_get_wckey(wckey_name)
    assert len(resp.warnings) > 0
    assert len(resp.errors) == 0
    assert len(resp.wckeys) == 0

    resp = slurmdb.slurmdb_v0046_get_wckey(wckey2_name)
    assert len(resp.warnings) > 0
    assert len(resp.errors) == 0
    assert len(resp.wckeys) == 0


def test_db_clusters(slurmdb, admin_level):
    from openapi_client.models.v0046_cluster_rec import V0046ClusterRec
    from openapi_client.models.v0046_openapi_clusters_resp import (
        V0046OpenapiClustersResp,
    )

    clusters = V0046OpenapiClustersResp(
        clusters=[
            V0046ClusterRec(
                name=cluster_name,
            ),
            V0046ClusterRec(
                name=cluster2_name,
            ),
        ]
    )

    resp = slurmdb.slurmdb_v0046_post_clusters(v0046_openapi_clusters_resp=clusters)
    assert not resp.warnings
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_get_clusters()
    assert not resp.warnings
    assert len(resp.errors) == 0
    assert resp.clusters

    resp = slurmdb.slurmdb_v0046_get_cluster(cluster_name)
    assert not resp.warnings
    assert len(resp.errors) == 0
    assert resp.clusters
    for cluster in resp.clusters:
        assert cluster.name == cluster_name
        assert not cluster.nodes

    resp = slurmdb.slurmdb_v0046_get_cluster(cluster2_name)
    assert not resp.warnings
    assert len(resp.errors) == 0
    assert resp.clusters
    for cluster in resp.clusters:
        assert cluster.name == cluster2_name
        assert not cluster.nodes

    resp = slurmdb.slurmdb_v0046_delete_cluster(cluster_name)
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_delete_cluster(cluster2_name)
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_get_cluster(cluster_name)
    assert len(resp.warnings) > 0
    assert len(resp.errors) == 0
    assert not resp.clusters

    resp = slurmdb.slurmdb_v0046_get_cluster(cluster2_name)
    assert len(resp.warnings) > 0
    assert len(resp.errors) == 0
    assert not resp.clusters


def test_db_users(slurmdb, admin_level):
    from openapi_client.models.v0046_assoc_short import V0046AssocShort
    from openapi_client.models.v0046_coord import V0046Coord
    from openapi_client.models.v0046_openapi_users_resp import V0046OpenapiUsersResp
    from openapi_client.models.v0046_user import V0046User
    from openapi_client.models.v0046_user_default import V0046UserDefault
    from openapi_client.models.v0046_wckey import V0046Wckey

    users = V0046OpenapiUsersResp(
        users=[
            V0046User(
                administrator_level=["None"],
                default=dict(
                    wckey=wckey_name,
                ),
                name=user_name,
            ),
            V0046User(
                administrator_level=["Operator"],
                wckeys=[
                    V0046Wckey(
                        cluster=local_cluster_name, name=wckey_name, user=coord_name
                    ),
                    V0046Wckey(
                        cluster=local_cluster_name,
                        name=wckey2_name,
                        user=coord_name,
                    ),
                ],
                default=V0046UserDefault(
                    wckey=wckey2_name,
                ),
                name=coord_name,
            ),
        ]
    )

    resp = slurmdb.slurmdb_v0046_post_users(v0046_openapi_users_resp=users)
    assert not resp.warnings
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_get_users()
    assert not resp.warnings
    assert len(resp.errors) == 0
    assert resp.users

    # Using query parameters (i.e. with_wckeys/with_deleted) results in warnings
    # Slurmrestd expected OpenAPI type=boolean but got OpenAPI type=string

    resp = slurmdb.slurmdb_v0046_get_user(user_name, with_wckeys="true")
    if resp.warnings:
        assert len(resp.warnings) == 1
        assert resp.warnings[0].source == "#/with_wckeys/"
    assert len(resp.errors) == 0
    assert resp.users
    for user in resp.users:
        assert user.name == user_name
        assert user.default.wckey == wckey_name

    resp = slurmdb.slurmdb_v0046_get_user(coord_name, with_wckeys="true")
    if resp.warnings:
        assert len(resp.warnings) == 1
        assert resp.warnings[0].source == "#/with_wckeys/"
    assert len(resp.errors) == 0
    assert resp.users
    for user in resp.users:
        assert user.name == coord_name
        assert user.default.wckey == wckey2_name
        for wckey in user.wckeys:
            assert wckey.name == wckey_name or wckey.name == wckey2_name
            assert wckey.user == coord_name
            assert wckey.cluster == local_cluster_name

    resp = slurmdb.slurmdb_v0046_delete_user(coord_name)
    assert len(resp.errors) == 0

    user_exists = False
    resp = slurmdb.slurmdb_v0046_get_user(coord_name, with_deleted="true")
    assert len(resp.errors) == 0
    for user in resp.users:
        assert user.name == coord_name
        assert user.flags[0] == "DELETED"
        user_exists = True

    if not user_exists:
        users = V0046OpenapiUsersResp(
            users=[
                V0046User(
                    administrator_level=["Administrator"],
                    default=dict(
                        wckey=wckey_name,
                    ),
                    old_name=user_name,
                    name=coord_name,
                )
            ]
        )

        resp = slurmdb.slurmdb_v0046_post_users(v0046_openapi_users_resp=users)
        assert not resp.warnings
        assert len(resp.errors) == 0

        resp = slurmdb.slurmdb_v0046_get_user(coord_name, with_wckeys="true")
        if resp.warnings:
            assert len(resp.warnings) == 1
            assert resp.warnings[0].source == "#/with_wckeys/"
        assert len(resp.errors) == 0
        assert resp.users
        for user in resp.users:
            assert user.name == coord_name
            assert not user.old_name
            assert user.default.wckey == wckey_name
            for wckey in user.wckeys:
                assert wckey.name == wckey_name
                assert wckey.user == coord_name
                assert wckey.cluster == local_cluster_name

        resp = slurmdb.slurmdb_v0046_delete_user(coord_name)
        assert len(resp.errors) == 0

        resp = slurmdb.slurmdb_v0046_get_user(coord_name)
        assert len(resp.warnings) > 0
        assert len(resp.errors) == 0
        assert not resp.users


def test_db_assoc(slurmdb, create_coords, create_qos, admin_level):
    from openapi_client.models.v0046_assoc import V0046Assoc
    from openapi_client.models.v0046_assoc_short import V0046AssocShort
    from openapi_client.models.v0046_coord import V0046Coord
    from openapi_client.models.v0046_openapi_assocs_resp import V0046OpenapiAssocsResp
    from openapi_client.models.v0046_uint32_no_val_struct import (
        V0046Uint32NoValStruct as V0046Uint32NoVal,
    )
    from openapi_client.models.v0046_user import V0046User
    from openapi_client.models.v0046_wckey import V0046Wckey

    associations = V0046OpenapiAssocsResp(
        associations=[
            V0046Assoc(
                account=account_name,
                cluster=local_cluster_name,
                default=dict(
                    qos=qos_name,
                ),
                flags=[],
                max=dict(
                    jobs=dict(
                        per=dict(
                            wall_clock=V0046Uint32NoVal(
                                set=True,
                                number=150,
                            )
                        ),
                    ),
                ),
                min=dict(
                    priority_threshold=V0046Uint32NoVal(
                        set=True,
                        number=10,
                    )
                ),
                partition=partition_name,
                priority=V0046Uint32NoVal(number=9, set=True),
                qos=[qos_name, qos2_name],
                shares_raw=23,
                user=user_name,
            ),
            V0046Assoc(
                account=account_name,
                cluster=local_cluster_name,
                default=dict(
                    qos=qos_name,
                ),
                flags=[],
                max=dict(
                    jobs=dict(
                        per=dict(
                            wall_clock=V0046Uint32NoVal(
                                set=True,
                                number=150,
                            )
                        ),
                    ),
                ),
                min=dict(
                    priority_threshold=V0046Uint32NoVal(
                        set=True,
                        number=10,
                    )
                ),
                priority=V0046Uint32NoVal(number=9, set=True),
                qos=[qos_name, qos2_name],
                shares_raw=23,
                user=user_name,
            ),
            V0046Assoc(
                account=account2_name,
                cluster=local_cluster_name,
                default=dict(
                    qos=qos2_name,
                ),
                flags=[],
                max=dict(
                    jobs=dict(
                        per=dict(
                            wall_clock=V0046Uint32NoVal(
                                set=True,
                                number=50,
                            )
                        ),
                    ),
                ),
                min=dict(
                    priority_threshold=V0046Uint32NoVal(
                        set=True,
                        number=4,
                    )
                ),
                partition=partition_name,
                priority=V0046Uint32NoVal(number=90, set=True),
                qos=[qos2_name],
                shares_raw=1012,
                user=user_name,
            ),
        ]
    )

    resp = slurmdb.slurmdb_v0046_post_associations(
        v0046_openapi_assocs_resp=associations
    )
    assert not resp.warnings
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_get_associations()
    assert not resp.warnings
    assert len(resp.errors) == 0
    assert resp.associations

    resp = slurmdb.slurmdb_v0046_get_association(
        cluster=local_cluster_name,
        account=account_name,
        user=user_name,
        partition=partition_name,
    )
    assert not resp.warnings
    assert len(resp.errors) == 0
    assert resp.associations
    for assoc in resp.associations:
        assert assoc.cluster == local_cluster_name
        assert assoc.account == account_name
        assert assoc.user == user_name
        assert assoc.partition == partition_name
        assert assoc.default.qos == qos_name
        assert not assoc.flags
        assert assoc.max.jobs.per.wall_clock.set
        assert assoc.max.jobs.per.wall_clock.number == 150
        assert assoc.min.priority_threshold.set
        assert assoc.min.priority_threshold.number == 10
        assert assoc.priority.set
        assert assoc.priority.number == 9
        for qos in assoc.qos:
            assert qos == qos_name or qos == qos2_name
        assert assoc.shares_raw == 23

    associations = V0046OpenapiAssocsResp(
        associations=[
            V0046Assoc(
                account=account_name,
                cluster=local_cluster_name,
                partition=partition_name,
                user=user_name,
                default=dict(
                    qos=qos2_name,
                ),
                qos=[qos2_name],
                max=dict(
                    jobs=dict(
                        per=dict(wall_clock=V0046Uint32NoVal(set=True, number=250)),
                    ),
                ),
                min=dict(
                    priority_threshold=V0046Uint32NoVal(set=True, number=100),
                ),
                priority=V0046Uint32NoVal(number=848, set=True),
                shares_raw=230,
            )
        ]
    )

    resp = slurmdb.slurmdb_v0046_post_associations(
        v0046_openapi_assocs_resp=associations
    )
    assert not resp.warnings
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_get_association(
        cluster=local_cluster_name,
        account=account_name,
        user=user_name,
        partition=partition_name,
    )
    assert not resp.warnings
    assert len(resp.errors) == 0
    assert resp.associations
    for assoc in resp.associations:
        assert assoc.cluster == local_cluster_name
        assert assoc.account == account_name
        assert assoc.user == user_name
        assert assoc.partition == partition_name
        assert assoc.default.qos == qos2_name
        assert not assoc.flags
        assert assoc.max.jobs.per.wall_clock.set
        assert assoc.max.jobs.per.wall_clock.number == 250
        assert assoc.min.priority_threshold.set
        assert assoc.min.priority_threshold.number == 100
        assert assoc.priority.set
        assert assoc.priority.number == 848
        for qos in assoc.qos:
            assert qos == qos2_name
        assert assoc.shares_raw == 230

    resp = slurmdb.slurmdb_v0046_delete_association(
        cluster=local_cluster_name,
        account=account_name,
        user=user_name,
        partition=partition_name,
    )
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_get_association(
        cluster=local_cluster_name,
        account=account_name,
        user=user_name,
        partition=partition_name,
    )
    assert len(resp.warnings) > 0
    assert len(resp.errors) == 0
    assert not resp.associations

    resp = slurmdb.slurmdb_v0046_delete_associations(
        cluster=local_cluster_name,
        user=user_name,
    )
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_delete_associations(
        cluster=local_cluster_name,
        account=account_name,
    )
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_get_association(
        cluster=local_cluster_name,
        account=account_name,
    )
    assert len(resp.warnings) > 0
    assert len(resp.errors) == 0
    assert not resp.associations

    resp = slurmdb.slurmdb_v0046_delete_associations(
        cluster=local_cluster_name,
        account=account2_name,
    )
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_get_association(
        cluster=local_cluster_name,
        account=account2_name,
    )
    assert len(resp.warnings) > 0
    assert len(resp.errors) == 0
    assert not resp.associations


def test_db_qos(slurmdb, create_coords, admin_level):
    from openapi_client.models.v0046_float64_no_val_struct import (
        V0046Float64NoValStruct as V0046Float64NoVal,
    )
    from openapi_client.models.v0046_openapi_slurmdbd_qos_resp import (
        V0046OpenapiSlurmdbdQosResp,
    )
    from openapi_client.models.v0046_qos import V0046Qos
    from openapi_client.models.v0046_tres import V0046Tres
    from openapi_client.models.v0046_uint32_no_val_struct import (
        V0046Uint32NoValStruct as V0046Uint32NoVal,
    )

    qos = V0046OpenapiSlurmdbdQosResp(
        qos=[
            V0046Qos(
                description="test QOS",
                flags=[
                    "PARTITION_MAXIMUM_NODE",
                    "PARTITION_TIME_LIMIT",
                    "ENFORCE_USAGE_THRESHOLD",
                    "NO_RESERVE",
                    "DENY_LIMIT",
                    "OVERRIDE_PARTITION_QOS",
                    "NO_DECAY",
                ],
                limits=dict(
                    min=dict(
                        tres=dict(
                            per=dict(
                                job=[
                                    V0046Tres(
                                        type="cpu",
                                        count=100,
                                    ),
                                    V0046Tres(
                                        type="memory",
                                        count=100000,
                                    ),
                                ],
                            ),
                        ),
                    ),
                ),
                name=qos_name,
                preempt=dict(
                    exempt_time=V0046Uint32NoVal(set=True, number=199),
                ),
                priority=V0046Uint32NoVal(number=180, set=True),
                usage_factor=V0046Float64NoVal(
                    set=True,
                    number=82382.23823,
                ),
                usage_threshold=V0046Float64NoVal(
                    set=True,
                    number=929392.33,
                ),
            ),
            V0046Qos(
                description="test QOS 2",
                name=qos2_name,
            ),
        ]
    )

    resp = slurmdb.slurmdb_v0046_post_qos(v0046_openapi_slurmdbd_qos_resp=qos)
    assert not resp.warnings
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_get_qos()
    assert not resp.warnings
    assert len(resp.errors) == 0
    assert resp.qos

    resp = slurmdb.slurmdb_v0046_get_single_qos(qos_name)
    assert not resp.warnings
    assert len(resp.errors) == 0
    assert resp.qos
    for qos in resp.qos:
        assert qos.description == "test QOS"
        assert qos.flags
        for flag in qos.flags:
            assert flag in [
                "PARTITION_MAXIMUM_NODE",
                "PARTITION_TIME_LIMIT",
                "ENFORCE_USAGE_THRESHOLD",
                "NO_RESERVE",
                "DENY_LIMIT",
                "OVERRIDE_PARTITION_QOS",
                "NO_DECAY",
            ]
        assert qos.limits.min.tres.per.job
        for tres in qos.limits.min.tres.per.job:
            assert tres.type == "cpu" or tres.type == "memory"
            if tres.type == "cpu":
                assert tres.count == 100
            if tres.type == "memory":
                assert tres.count == 100000
        assert qos.name == qos_name
        assert qos.preempt.exempt_time.set
        assert qos.preempt.exempt_time.number == 199
        assert qos.priority.set
        assert qos.priority.number == 180
        assert qos.usage_factor.set
        assert qos.usage_factor.number == 82382.23823
        assert qos.usage_threshold.set
        assert qos.usage_threshold.number == 929392.33

    resp = slurmdb.slurmdb_v0046_get_single_qos(qos2_name)
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    assert resp.qos
    for qos in resp.qos:
        assert qos.description == "test QOS 2"
        assert not qos.flags
        assert not qos.limits.min.tres.per.job
        assert qos.name == qos2_name
        assert not qos.preempt.exempt_time.set
        assert qos.priority.set
        assert qos.priority.number == 0
        assert qos.usage_factor.set
        assert qos.usage_factor.number == 1
        assert not qos.usage_threshold.set

    resp = slurmdb.slurmdb_v0046_delete_single_qos(qos_name)
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_get_single_qos(qos_name)
    assert len(resp.warnings) > 0
    assert len(resp.errors) == 0
    assert not resp.qos

    resp = slurmdb.slurmdb_v0046_delete_single_qos(qos2_name)
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_get_single_qos(qos2_name)
    assert len(resp.warnings) > 0
    assert len(resp.errors) == 0
    assert not resp.qos


def test_db_tres(slurmdb):
    resp = slurmdb.slurmdb_v0046_get_tres()
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0


def test_db_config(slurmdb, admin_level):
    resp = slurmdb.slurmdb_v0046_get_config()
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0


def test_jobs(slurm, slurmdb, non_admin):
    from openapi_client.models.v0046_job_comment import V0046JobComment
    from openapi_client.models.v0046_job_desc_msg import V0046JobDescMsg
    from openapi_client.models.v0046_job_info import V0046JobInfo
    from openapi_client.models.v0046_job_modify import V0046JobModify
    from openapi_client.models.v0046_job_modify_tres import V0046JobModifyTres
    from openapi_client.models.v0046_job_submit_req import V0046JobSubmitReq
    from openapi_client.models.v0046_openapi_job_modify_req import (
        V0046OpenapiJobModifyReq,
    )
    from openapi_client.models.v0046_process_exit_code_verbose import (
        V0046ProcessExitCodeVerbose,
    )
    from openapi_client.models.v0046_process_exit_code_verbose_signal import (
        V0046ProcessExitCodeVerboseSignal,
    )
    from openapi_client.models.v0046_tres import V0046Tres
    from openapi_client.models.v0046_uint32_no_val_struct import V0046Uint32NoValStruct
    from openapi_client.models.v0046_uint32_no_val_struct import (
        V0046Uint32NoValStruct as V0046Uint32NoVal,
    )

    script = "#!/bin/bash\n/bin/true"
    env = ["PATH=/bin/:/sbin/:/usr/bin/:/usr/sbin/"]

    job = V0046JobSubmitReq(
        script=script,
        job=V0046JobDescMsg(
            partition=partition_name,
            name="runjob",
            environment=env,
            current_working_directory="/tmp/",
        ),
    )

    resp = slurm.slurm_v0046_post_job_submit(job)
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    assert resp.job_id
    assert resp.step_id
    jobid1 = int(resp.job_id)

    resp = slurm.slurm_v0046_get_jobs()
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    for job in resp.jobs:
        assert job.job_id == jobid1
        assert job.name == "runjob"
        assert job.partition == partition_name

    resp = slurm.slurm_v0046_get_job(str(jobid1))
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    for job in resp.jobs:
        assert job.job_id == jobid1
        assert job.name == "runjob"
        assert job.partition == partition_name

    job = V0046JobSubmitReq(
        script=script,
        job=V0046JobDescMsg(
            partition=partition_name,
            name="runjob",
            environment=env,
            current_working_directory="/tmp/",
        ),
    )

    resp = slurm.slurm_v0046_post_job_submit(job)
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    assert resp.job_id
    assert resp.step_id
    jobid2 = int(resp.job_id)

    resp = slurm.slurm_v0046_get_job(str(jobid2))
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    assert len(resp.jobs) == 1
    for job in resp.jobs:
        assert job.job_id == jobid2
        assert job.name == "runjob"
        assert job.partition == partition_name

    # submit a HELD job to be able to update it
    job = V0046JobSubmitReq(
        script=script,
        job=V0046JobDescMsg(
            partition=partition_name,
            name="test job",
            environment=env,
            priority=V0046Uint32NoVal(number=0, set=True),
            current_working_directory="/tmp/",
        ),
    )

    resp = slurm.slurm_v0046_post_job_submit(job)
    assert len(resp.warnings) > 0
    assert len(resp.errors) == 0
    assert resp.job_id
    assert resp.step_id
    jobid3 = int(resp.job_id)

    job = V0046JobDescMsg(
        environment=env,
        partition=partition_name,
        name="updated test job",
        priority=V0046Uint32NoVal(number=0, set=True),
    )

    resp = slurm.slurm_v0046_post_job(str(jobid3), v0046_job_desc_msg=job)
    assert not len(resp.warnings)
    assert not len(resp.errors)
    if resp.results:
        for result in resp.results:
            assert result.job_id == jobid3
            assert result.error_code == 0

    resp = slurm.slurm_v0046_get_job(str(jobid3))
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    for job in resp.jobs:
        assert job.job_id == jobid3
        assert job.name == "updated test job"
        assert job.partition == partition_name
        assert job.priority.set
        assert job.priority.number == 0
        assert job.user_name == local_user_name

    resp = slurm.slurm_v0046_delete_job(str(jobid3))
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0

    resp = slurm.slurm_v0046_get_job(str(jobid3))
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    for job in resp.jobs:
        assert job.job_id == jobid3
        assert job.name == "updated test job"
        assert job.partition == partition_name
        assert job.user_name == local_user_name
        assert job.job_state == ["CANCELLED"]

    # Ensure that job is in the DB before querying it
    atf.wait_for_job_accounted(jobid3, fatal=True)

    resp = slurmdb.slurmdb_v0046_get_jobs()
    assert len(resp.errors) == 0

    for t in atf.timer():
        resp = slurmdb.slurmdb_v0046_get_job(str(jobid3))
        assert len(resp.warnings) == 0
        assert len(resp.errors) == 0
        assert resp.jobs
        updated_job_found = False
        for job in resp.jobs:
            if job.name == "updated test job":
                assert job.job_id == jobid3
                assert job.name == "updated test job"
                assert job.partition == partition_name
                updated_job_found = True
                break
        if updated_job_found:
            break
    else:
        assert False, "Updated job should reach the DB"

    resp = slurmdb.slurmdb_v0046_get_jobs(users=local_user_name)
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    assert resp.jobs
    for job in resp.jobs:
        assert job.user == local_user_name

    # Update job in db -- posting to /job/jobid/
    atf.wait_for_job_accounted(jobid1, "State", "COMPLETED", fatal=True)
    atf.wait_for_job_accounted(jobid2, "State", "COMPLETED", fatal=True)

    atf.run_command(
        f"sacctmgr -i mod user {local_cluster_name} set AdminLevel=Admin",
        user=atf.properties["slurm-user"],
        fatal=True,
    )

    WIFEXIT_CODE = V0046Uint32NoValStruct(
        set=True, infinite=False, number=4  # 1024 >> 8
    )

    job_modify = V0046JobModify(
        comment=V0046JobComment(
            administrator="admin1",
            job="job1",
            system="system1",
        ),
        derived_exit_code=V0046ProcessExitCodeVerbose(
            return_code=V0046Uint32NoValStruct(set=True, infinite=False, number=1024),
        ),
        extra="extra1",
        tres=V0046JobModifyTres(
            allocated=[V0046Tres(type="energy", count=12346, id=3)]
        ),
        wckey="mywckey1",
    )

    resp = slurmdb.slurmdb_v0046_post_job(str(jobid1), v0046_job_modify=job_modify)
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_get_jobs(step=str(jobid1))
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    assert len(resp.jobs) == 1
    for job in resp.jobs:
        logging.debug(job)
        assert job.comment == job_modify.comment
        assert job.derived_exit_code.return_code == WIFEXIT_CODE
        assert job.extra == job_modify.extra
        found_tres = False
        for tres in job.tres.allocated:
            if tres.type == "energy":
                found_tres = True
                tres == job_modify.tres.allocated[0]
        assert found_tres
        assert job.wckey.wckey == job_modify.wckey

    # Update jobs in db -- posting to /jobs/
    # Update values to be different
    WIFEXIT_CODE = V0046Uint32NoValStruct(
        set=True, infinite=False, number=8  # 2048 >> 8
    )

    job_modify = V0046JobModify(
        comment=V0046JobComment(
            administrator="admin2",
            job="job2",
            system="system2",
        ),
        derived_exit_code=V0046ProcessExitCodeVerbose(
            return_code=V0046Uint32NoValStruct(set=True, infinite=False, number=2048),
        ),
        extra="extra2",
        tres=V0046JobModifyTres(
            allocated=[V0046Tres(type="energy", count=54321, id=3)]
        ),
        wckey="mywckey2",
    )

    job_modify_req = V0046OpenapiJobModifyReq(
        job_id_list=[str(jobid1), str(jobid2)], job_rec=job_modify
    )
    resp = slurmdb.slurmdb_v0046_post_jobs(v0046_openapi_job_modify_req=job_modify_req)
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0

    resp = slurmdb.slurmdb_v0046_get_jobs(job_name="runjob")
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    assert len(resp.jobs) == 2
    for job in resp.jobs:
        logging.debug(job)
        assert job.comment == job_modify.comment
        assert job.derived_exit_code.return_code == WIFEXIT_CODE
        assert job.extra == job_modify.extra
        found_tres = False
        for tres in job.tres.allocated:
            if tres.type == "energy":
                found_tres = True
                tres == job_modify.tres.allocated[0]
        found_tres = True
        assert job.wckey.wckey == job_modify.wckey


@pytest.fixture(scope="function")
def reservation(setup):
    # Ensure that ALL nodes are idle before reserving them (or scontrol may return an error)
    nodes = atf.get_nodes()
    for node in nodes:
        atf.wait_for_node_state(node, "IDLE", fatal=True)

    atf.run_command(
        f"scontrol create reservation starttime=now duration=120 user=root nodes=ALL ReservationName={resv_name}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )

    yield

    atf.run_command(
        f"scontrol delete ReservationName={resv_name}",
        user=atf.properties["slurm-user"],
        fatal=False,
    )


def test_partitions(slurm):
    resp = slurm.slurm_v0046_get_partition(partition_name)
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    assert resp.partitions
    for part in resp.partitions:
        assert part.name == partition_name

    resp = slurm.slurm_v0046_get_partitions()
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    assert resp.partitions


def test_partition_get_post_roundtrip(slurm, admin_level):
    """GET one partition, POST the same partition descriptions as an update.

    Echoing read-only fields (cluster, totals, tres, etc.) may produce warnings
    but must not produce errors.
    """
    from openapi_client.models.v0046_openapi_partitions_mod_req import (
        V0046OpenapiPartitionsModReq,
    )

    get_resp = slurm.slurm_v0046_get_partition(partition_name)
    assert len(get_resp.errors) == 0, "GET partition should not return errors"
    assert len(get_resp.warnings) == 0, "GET partition should not return warnings"
    assert len(get_resp.partitions) == 1, "GET partition should return one partition"

    for part in get_resp.partitions:
        assert part.name == partition_name, "GET should return the requested partition"

    req = V0046OpenapiPartitionsModReq(partitions=get_resp.partitions)
    post_resp = slurm.slurm_v0046_post_partitions(req)
    assert len(post_resp.errors) == 0, "POST echoed partition must not return errors"


def test_post_partitions(slurm, admin_level):
    from openapi_client.models.v0046_openapi_partitions_mod_req import (
        V0046OpenapiPartitionsModReq,
    )
    from openapi_client.models.v0046_partition_info import V0046PartitionInfo
    from openapi_client.models.v0046_partition_info_defaults import (
        V0046PartitionInfoDefaults,
    )
    from openapi_client.models.v0046_partition_info_nodes import V0046PartitionInfoNodes
    from openapi_client.models.v0046_partition_info_partition import (
        V0046PartitionInfoPartition,
    )
    from openapi_client.models.v0046_uint64_no_val_struct import V0046Uint64NoValStruct

    part_1_name = "part_1"
    part_2_name = "part_2"

    nodes = list(atf.get_nodes().keys())
    part_1_nodes = atf.run_command_output(
        f"scontrol show hostlist {','.join(nodes[0:5])}"
    ).strip()
    part_2_nodes = atf.run_command_output(
        f"scontrol show hostlist {','.join(nodes[5:10])}"
    ).strip()

    req = V0046OpenapiPartitionsModReq(
        partitions=[
            V0046PartitionInfo(
                name=part_1_name,
                nodes=V0046PartitionInfoNodes(configured=part_1_nodes),
                flags=[
                    "HIDDEN",
                    "NO_ROOT",
                    "ROOT_ONLY",
                    "REQ_RESV",
                    "LLN",
                    "PDOI",
                ],
                preempt_mode=[
                    "REQUEUE",
                ],
                defaults=V0046PartitionInfoDefaults(
                    partition_memory_per_cpu=V0046Uint64NoValStruct(
                        set=True,
                        number=10,
                    ),
                ),
                partition=V0046PartitionInfoPartition(
                    oversubscribe="FORCE:5", exclusive="USER"
                ),
            ),
            V0046PartitionInfo(
                name=part_2_name,
                nodes=V0046PartitionInfoNodes(configured=part_2_nodes),
                flags=[
                    "LLN",
                ],
                preempt_mode=["DISABLED"],
                defaults=V0046PartitionInfoDefaults(
                    partition_memory_per_node=V0046Uint64NoValStruct(
                        set=True,
                        number=12,
                    )
                ),
                partition=V0046PartitionInfoPartition(
                    oversubscribe="YES:6", exclusive="NO"
                ),
            ),
        ]
    )

    # Create partitions part_1 and part_2
    resp = slurm.slurm_v0046_post_partitions(req)
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    # Check that they were created
    resp = slurm.slurm_v0046_get_partitions()
    assert len(resp.errors) == 0
    match_cnt = 0
    inx = 0
    for part in resp.partitions:
        if part.name == part_1_name:
            inx = 0
        elif part.name == part_2_name:
            inx = 1
        else:
            continue

        match_cnt += 1

        assert (
            req.partitions[inx].nodes.configured == part.nodes.configured
        ), "Partition was not created with the correct nodes"
        assert set(req.partitions[inx].flags) == set(
            part.flags
        ), "Partition was not create with the correct flags"
        assert set(req.partitions[inx].preempt_mode) == set(
            part.preempt_mode
        ), "Partition was not create with the correct PreemptMode"
        if req.partitions[inx].defaults.partition_memory_per_cpu:
            assert (
                req.partitions[inx].defaults.partition_memory_per_cpu.number
                == part.defaults.partition_memory_per_cpu.number
            ), "Partition was not create with the correct DefMemPerCpu"
        if req.partitions[inx].defaults.partition_memory_per_node:
            assert (
                req.partitions[inx].defaults.partition_memory_per_node.number
                == part.defaults.partition_memory_per_node.number
            ), "Partition was not create with the correct DefMemPerNode"
        assert req.partitions[inx].partition is not None
        assert part.partition is not None
        assert (
            req.partitions[inx].partition.oversubscribe == part.partition.oversubscribe
        ), "Partition oversubscribe string did not round-trip"

    assert match_cnt == 2

    # Test updating
    req.partitions[0].nodes.configured = part_2_nodes  # swap nodes
    req.partitions[1].nodes.configured = part_1_nodes
    req.partitions[0].flags = [  # clear all flags
        "HIDDEN_CLEAR",
        "NO_ROOT_CLEAR",
        "ROOT_ONLY_CLEAR",
        "REQ_RESV_CLEAR",
        "LLN_CLEAR",
        "PDOI_CLEAR",
    ]
    req.partitions[1].flags = [  # append HIDDEN to existing LLN
        "HIDDEN",
    ]
    req.partitions[0].partition.oversubscribe = "NO"
    req.partitions[0].partition.exclusive = "TOPO"
    req.partitions[1].partition.oversubscribe = "FORCE:1"
    req.partitions[1].partition.exclusive = "USER"

    resp = slurm.slurm_v0046_post_partitions(req)
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0

    # Check that they were updated
    resp = slurm.slurm_v0046_get_partitions()
    assert len(resp.errors) == 0
    match_cnt = 0
    for part in resp.partitions:
        if part.name == part_1_name:
            inx = 0
        elif part.name == part_2_name:
            inx = 1
        else:
            continue

        match_cnt += 1

        assert (
            req.partitions[inx].nodes.configured == part.nodes.configured
        ), "Partition nodes failed to update"
        if inx == 0:
            assert (
                len(part.flags) == 0
            ), f"Partition flags were not all cleared during update: {part.flags}"
        else:
            assert set(part.flags) == {
                "HIDDEN",
                "LLN",
            }, "Partition flags did not update correctly"

        assert (
            req.partitions[inx].partition.oversubscribe == part.partition.oversubscribe
        ), "Partition oversubscribe failed to update"
        assert (
            req.partitions[inx].partition.exclusive == part.partition.exclusive
        ), "Partition exclusive failed to update"

    assert match_cnt == 2

    atf.run_command_output(f"scontrol delete partition {part_1_name}")
    atf.run_command_output(f"scontrol delete partition {part_2_name}")


def test_delete_partition(slurm, admin_level):
    partition_name = "new_partition"
    atf.run_command_output(f"scontrol create partitionname={partition_name}")
    assert partition_name in atf.get_partitions(), "Failed to create partition"
    resp = slurm.slurm_v0046_delete_partition(partition_name)
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    assert partition_name not in atf.get_partitions(), "Failed to delete partition"


def test_nodes(slurm, admin_level):
    from openapi_client.models.v0046_update_node_msg import V0046UpdateNodeMsg

    node_name = None
    reasonuid = None
    resp = slurm.slurm_v0046_get_nodes()
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    assert resp.nodes
    for node in resp.nodes:
        if "IDLE" in node.state:
            node_name = node.name
            # comment = node.comment
            extra = node.extra
            feat = node.features
            actfeat = node.active_features
            # state = node.state
            reason = node.reason
            reasonuid = node.reason_set_by_user
            break

    # Skip if no idle nodes are found
    if node_name is None:
        pytest.fail("No idle nodes are found")

    if reasonuid is None or len(reasonuid) <= 0:
        reasonuid = local_user_name

    node = V0046UpdateNodeMsg(
        comment="test node comment",
        extra="test node extra",
        features=[
            "feat1",
            "feat2",
            "feat3",
        ],
        features_act=[
            "feat1",
            "feat3",
        ],
        state=["DRAIN"],
        reason="testing",
        reason_uid=local_user_name,
    )

    resp = slurm.slurm_v0046_post_node(node_name, v0046_update_node_msg=node)
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0

    resp = slurm.slurm_v0046_get_node(node_name)
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    assert resp.nodes
    for node in resp.nodes:
        assert node.name == node_name
        assert node.comment == "test node comment"
        assert node.extra == "test node extra"
        assert "DRAIN" in node.state
        assert node.reason == "testing"
        assert node.reason_set_by_user == local_user_name

    ncomment = "test comment comment 2"
    node = V0046UpdateNodeMsg(
        comment=ncomment,
        extra=extra,
        features=feat,
        features_act=actfeat,
        state=["RESUME"],
        reason=reason,
        reason_uid=reasonuid,
    )

    resp = slurm.slurm_v0046_post_node(node_name, node)
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0

    resp = slurm.slurm_v0046_get_node(node_name)
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    assert resp.nodes
    for node in resp.nodes:
        assert node.name == node_name
        assert node.comment == ncomment
        assert node.extra == extra


def test_ping(slurm):
    resp = slurm.slurm_v0046_get_ping()
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0


def test_diag(slurm):
    resp = slurm.slurm_v0046_get_diag()
    assert len(resp.warnings) == 0
    assert len(resp.errors) == 0
    assert resp.statistics


def test_licenses(slurm):
    resp = slurm.slurm_v0046_get_licenses()
    assert len(resp.errors) == 0


@pytest.mark.parametrize(
    "flags",
    [[], ["IGNORE_JOBS"], ["IGNORE_JOBS", "MAGNETIC"]],
)
def test_reservations(slurm, flags, admin_level):
    from openapi_client.models.v0046_reservation_desc_msg import V0046ReservationDescMsg
    from openapi_client.models.v0046_reservation_mod_req import V0046ReservationModReq
    from openapi_client.models.v0046_uint32_no_val_struct import V0046Uint32NoValStruct
    from openapi_client.models.v0046_uint64_no_val_struct import V0046Uint64NoValStruct

    resv_name = "test_resv"
    users = ["root", "atf"]
    duration = V0046Uint32NoValStruct(number=300, set=True)
    start_time = V0046Uint64NoValStruct(number=int(time.time()) + 60, set=True)
    end_time = V0046Uint64NoValStruct(
        number=start_time.number + duration.number * 60, set=True
    )
    partition = "primary"
    node_list = ["node1", "node7"]

    # Create a reservation
    logging.debug(f"Creating reservation '{resv_name}'...")
    reservation_info = V0046ReservationDescMsg(
        name=resv_name,
        users=users,
        duration=duration,
        start_time=start_time,
        node_list=node_list,
        partition=partition,
        flags=flags,
    )
    resp = slurm.slurm_v0046_post_reservations(
        V0046ReservationModReq(reservations=[reservation_info])
    )
    assert resp.reservations, f"Reservation {resv_name} should be created"
    assert not resp.warnings and not resp.errors

    # Verify the fields of the response
    retrieved_reservation = resp.reservations[0]
    assert (
        retrieved_reservation.name == resv_name
    ), f"Field 'name' should be {resv_name}"
    assert (
        retrieved_reservation.partition == partition
    ), f"Field 'partition' should be {partition}"
    assert (
        retrieved_reservation.node_list == node_list
    ), f"Field 'node_list' should be {node_list}"
    assert retrieved_reservation.users == users, f"Field 'users' should be {users}"
    assert (
        retrieved_reservation.start_time.number == start_time.number
    ), f"Field 'start_time' should be {start_time}"
    assert (
        retrieved_reservation.duration.number == duration.number
    ), f"Field 'duration' should be {duration}"
    assert (
        # SPEC_NODES is automatically added
        set([flag for flag in retrieved_reservation.flags if flag != "SPEC_NODES"])
        == set(flags)
    ), f"Field 'flags' should be {flags}"

    # Verify fields of reservation created
    resp = slurm.slurm_v0046_get_reservation(resv_name)
    assert len(resp.reservations) == 1, f"Reservation '{resv_name}' should be returned"

    retrieved_reservation = resp.reservations[0]
    assert (
        retrieved_reservation.name == resv_name
    ), f"Field 'name' should be {resv_name}"
    assert (
        retrieved_reservation.partition == partition
    ), f"Field 'partition' should be {partition}"
    assert (
        atf.node_range_to_list(retrieved_reservation.node_list) == node_list
    ), f"Field 'node_list' should be {node_list}"
    assert (
        retrieved_reservation.users.split(",") == users
    ), f"Field 'users' should be {users}"
    assert (
        retrieved_reservation.start_time.number == start_time.number
    ), f"Field 'start_time' should be {start_time}"
    assert (
        retrieved_reservation.end_time.number == end_time.number
    ), f"Field 'end_time' should be {end_time}"
    assert (
        # SPEC_NODES is automatically added
        set([flag for flag in retrieved_reservation.flags if flag != "SPEC_NODES"])
        == set(flags)
    ), f"Field 'flags' should be {flags}"

    # Update reservation
    new_end_time = retrieved_reservation.end_time.number + 300
    new_users = ["root"]
    new_node_list = ["node2"]
    new_start_time = V0046Uint64NoValStruct(number=int(time.time()) + 90, set=True)
    new_flags = ["IGNORE_JOBS", "MAGNETIC", "USER_DELETE"]

    update_info = V0046ReservationDescMsg(
        name=resv_name,
        end_time=V0046Uint64NoValStruct(set=True, number=new_end_time),
        users=new_users,
        node_list=new_node_list,
        start_time=new_start_time,
        flags=new_flags,
    )
    resp = slurm.slurm_v0046_post_reservation(update_info)
    assert resp.reservations, "Reservation should be updated"
    assert not resp.warnings and not resp.errors

    # Validate update
    resp = slurm.slurm_v0046_get_reservation(resv_name)
    assert len(resp.reservations) == 1, f"Reservation '{resv_name}' should be returned"

    updated = resp.reservations[0]

    assert updated.end_time.number == new_end_time
    assert updated.users.split(",") == new_users, f"Field 'users' should be {new_users}"
    assert (
        atf.node_range_to_list(updated.node_list) == new_node_list
    ), f"Field 'node_list' should be {new_node_list}"
    assert (
        updated.start_time.number == new_start_time.number
    ), f"Field 'start_time' should be {new_start_time}"
    assert (
        # SPEC_NODES is automatically added
        set([flag for flag in updated.flags if flag != "SPEC_NODES"])
        == set(new_flags)
    ), f"Field 'flags' should be {flags}"

    # Delete reservation
    resp = slurm.slurm_v0046_delete_reservation(reservation_name=resv_name)
    assert not resp.warnings and not resp.errors
    assert resv_name not in [
        r.name for r in slurm.slurm_v0046_get_reservations().reservations
    ], f"Reservation {resv_name} should be deleted"


@pytest.mark.parametrize("legal_state", ["CLOUD", "FUTURE", "EXTERNAL"])
def test_legal_node_creation(slurm, admin_level, legal_state, dynamic_node):
    from openapi_client.models.v0046_openapi_create_node_req import (
        V0046OpenapiCreateNodeReq,
    )

    request_body = V0046OpenapiCreateNodeReq(
        node_conf=f"nodename={dynamic_node} State={legal_state}"
    )

    response = slurm.slurm_v0046_post_new_node(
        v0046_openapi_create_node_req=request_body
    )

    # Validate there are no errors or warnings, and the meta data exits
    assert not response.errors
    assert not response.warnings
    assert response.meta

    # Validate the node exists and is in the correct state
    node_states = atf.get_node_parameter(dynamic_node, "state")
    assert (
        legal_state in node_states
    ), f"Dynamic node should have {legal_state} in its state only has {node_states}"
    assert (
        "DYNAMIC_NORM" in node_states
    ), "Dynamic node should have DYNAMIC_NORM in its state"


@pytest.mark.parametrize(
    "illegal_state", ["DOWN", "DRAIN", "FAIL", "FAILING", "UNKNOWN"]
)
def test_illegal_node_creation(slurm, admin_level, illegal_state, dynamic_node):
    from openapi_client.api_response import ApiResponse
    from openapi_client.exceptions import ApiException
    from openapi_client.models.v0046_openapi_create_node_req import (
        V0046OpenapiCreateNodeReq,
    )

    request_body = V0046OpenapiCreateNodeReq(
        node_conf=f"nodename={dynamic_node} State={illegal_state}"
    )

    try:
        # This should throw an exception
        slurm.slurm_v0046_post_new_node_with_http_info(
            v0046_openapi_create_node_req=request_body
        )
        assert (
            False
        ), "slurm_v0046_post_new_node_with_http_info should have raised an exception"
    except ApiException as e:
        response = slurm.api_client.deserialize(
            response=ApiResponse(data=e.body), response_type="V0046OpenapiResp"
        )
        # Validate there is an error and no warnings
        assert e.status != 200
        assert len(response.errors) == 1  # error about wrong state
        assert not response.warnings
        assert response.meta

    # Validate the node doesn't exist
    atf.run_command(
        f"scontrol show NodeName={dynamic_node}",
        user="slurm",
        xfail=True,
        fatal=True,
    )


# Test until endpoints
@pytest.fixture
def util_api(setup):
    yield atf.openapi_util()


def test_util_hostnames(util_api):
    from openapi_client.models.v0046_openapi_hostlist_req_resp import (
        V0046OpenapiHostlistReqResp,
    )

    hostnames = ["node01", "node02", "node03"]
    request_body = V0046OpenapiHostlistReqResp(hostlist="node[01-03]")

    response = util_api.util_v0046_post_hostnames(
        v0046_openapi_hostlist_req_resp=request_body
    )
    assert response.hostnames is not None
    assert isinstance(response.hostnames, list)
    assert all(isinstance(host, str) for host in response.hostnames)
    assert hostnames == response.hostnames


def test_util_hostlist(util_api):
    from openapi_client.models.v0046_openapi_hostnames_req_resp import (
        V0046OpenapiHostnamesReqResp,
    )

    request_body = V0046OpenapiHostnamesReqResp(
        hostnames=["node01", "node02", "node03"]
    )
    response = util_api.util_v0046_post_hostlist(
        v0046_openapi_hostnames_req_resp=request_body
    )
    assert response.hostlist is not None
    assert isinstance(response.hostlist, str)
    assert "node[01-03]" == response.hostlist


def test_resv_crash(slurm, admin_level, cleanup_crash):
    """Check for xfree crash (bug 23038)"""
    from openapi_client.models.v0046_reservation_desc_msg import V0046ReservationDescMsg
    from openapi_client.models.v0046_reservation_mod_req import V0046ReservationModReq
    from openapi_client.models.v0046_uint32_no_val_struct import V0046Uint32NoValStruct
    from openapi_client.models.v0046_uint64_no_val_struct import V0046Uint64NoValStruct

    # Don't overlap with other resv in case of restd crash/restart
    resv_name = "crash_test_resv"
    users = ["root", "atf"]
    duration = V0046Uint32NoValStruct(number=1, set=True)
    start_time = V0046Uint64NoValStruct(
        number=int(time.time()) + 10000000,
        set=True,
    )
    partition = "primary"

    # Create a reservation with empty node_list
    reservation_info = V0046ReservationDescMsg(
        name=resv_name,
        users=users,
        duration=duration,
        start_time=start_time,
        partition=partition,
        node_list=[],
    )
    # Exception means restd crashed
    resp = slurm.slurm_v0046_post_reservations(
        V0046ReservationModReq(reservations=[reservation_info])
    )
    assert (
        not resp.warnings and not resp.errors
    ), "We should be able to get the server response from this message"


# Fields that legitimately differ between two independent dumps of the same
# config: runtime counters and the build/boot/update timestamps. The CLI and
# REST calls each sample a separate RPC, so these can disagree without a bug.
conf_volatile_fields = {
    "BOOT_TIME",
    "NEXT_JOB_ID",
    "next_job_id",
    "LastUpdate",
    "controllers",
}


def test_slurmrestd_slurm_conf(slurm):
    """GET /slurm/v0.0.46/conf returns a well-formed slurm.conf payload."""
    resp = slurm.slurm_v0046_get_conf()
    assert not resp.errors, f"unexpected errors: {resp.errors}"
    assert not resp.warnings, f"unexpected warnings: {resp.warnings}"
    assert resp.slurm_conf, "empty slurm_conf payload"
    assert resp.slurm_conf.cluster_name == atf.get_config_parameter(
        "ClusterName"
    ), "slurm_conf ClusterName does not match the running config"


def test_slurmrestd_slurm_conf_update_time_no_change(slurm):
    """A future update_time yields a no-change response with an empty body."""
    resp = slurm.slurm_v0046_get_conf(update_time="4102444800")
    assert not resp.errors, f"unexpected errors: {resp.errors}"
    assert resp.warnings, "expected a no-change warning"
    assert not resp.slurm_conf, "expected empty body on no-change"


def test_slurmrestd_slurm_conf_update_time_past(slurm):
    """A past update_time still returns the full slurm.conf payload."""
    resp = slurm.slurm_v0046_get_conf(update_time="1")
    assert not resp.errors, f"unexpected errors: {resp.errors}"
    assert resp.slurm_conf, "expected a full payload for a past update_time"


def test_slurmrestd_slurm_conf_rejects_non_get():
    """Only GET is registered for /slurm/v0.0.46/conf."""
    r = requests.post(
        f"{atf.properties['slurmrestd_url']}/slurm/v0.0.46/conf",
        headers=atf.properties["slurmrestd-headers"],
        timeout=30,
    )
    # A non-GET on a GET-only path is not served: slurmrestd's router returns
    # 404 (ESLURM_REST_UNKNOWN_URL) today. Accept 405 too so a future change to
    # the more correct status doesn't break this.
    assert r.status_code in (
        404,
        405,
    ), f"expected 404/405, got {r.status_code}: {r.text[:200]}"


def test_scontrol_show_config_json():
    """`scontrol show config --json=v0.0.46` emits a well-formed slurm_conf."""
    blob = json.loads(
        atf.run_command_output("scontrol show config --json=v0.0.46", fatal=True)
    )
    assert blob["errors"] == [], f"unexpected errors: {blob['errors']}"
    assert blob["slurm_conf"], "empty slurm_conf payload"


def test_scontrol_show_config_yaml():
    """`scontrol show config --yaml=v0.0.46` produces the same shape as --json."""
    blob = yaml.safe_load(
        atf.run_command_output("scontrol show config --yaml=v0.0.46", fatal=True)
    )
    assert blob["errors"] == [], f"unexpected errors: {blob['errors']}"
    assert blob["slurm_conf"], "empty slurm_conf payload"


def test_scontrol_show_config_json_list():
    """`scontrol show config --json=list` lists the data_parser plugins."""
    out = atf.run_command_output("scontrol show config --json=list", fatal=True)
    assert "v0.0.46" in out, f"v0.0.46 not listed in: {out}"


def test_slurm_conf_cli_matches_slurmrestd():
    """scontrol --json=v0.0.46 and /slurm/v0.0.46/conf yield equivalent payloads."""
    cli = json.loads(
        atf.run_command_output("scontrol show config --json=v0.0.46", fatal=True)
    )["slurm_conf"]
    rest = atf.request_slurmrestd("slurm/v0.0.46/conf").json()["slurm_conf"]
    assert cli.get("ClusterName"), "slurm_conf payload missing ClusterName"
    cli = {k: v for k, v in cli.items() if k not in conf_volatile_fields}
    rest = {k: v for k, v in rest.items() if k not in conf_volatile_fields}
    assert cli == rest, "scontrol and slurmrestd slurm_conf payloads differ"


def test_slurmrestd_slurmdbd_conf(slurmdb):
    """GET /slurmdb/v0.0.46/conf returns a well-formed slurmdbd.conf payload."""
    resp = slurmdb.slurmdb_v0046_get_conf()
    assert not resp.errors, f"unexpected errors: {resp.errors}"
    assert not resp.warnings, f"unexpected warnings: {resp.warnings}"
    assert resp.slurmdbd_conf, "empty slurmdbd_conf payload"
    assert resp.slurmdbd_conf.dbd_host, "slurmdbd_conf missing DbdHost"


def test_slurmrestd_slurmdbd_conf_rejects_non_get():
    """Only GET is registered for /slurmdb/v0.0.46/conf."""
    r = requests.post(
        f"{atf.properties['slurmrestd_url']}/slurmdb/v0.0.46/conf",
        headers=atf.properties["slurmrestd-headers"],
        timeout=30,
    )
    # See test_slurmrestd_slurm_conf_rejects_non_get: a non-GET on a
    # GET-only path is not served (404 today, 405 acceptable).
    assert r.status_code in (
        404,
        405,
    ), f"expected 404/405, got {r.status_code}: {r.text[:200]}"


def test_sacctmgr_show_config_json():
    """`sacctmgr show config --json=v0.0.46` emits a well-formed slurmdbd_conf."""
    blob = json.loads(
        atf.run_command_output("sacctmgr show config --json=v0.0.46", fatal=True)
    )
    assert blob["errors"] == [], f"unexpected errors: {blob['errors']}"
    assert blob["slurmdbd_conf"], "empty slurmdbd_conf payload"


def test_sacctmgr_show_config_yaml():
    """`sacctmgr show config --yaml=v0.0.46` produces the same shape as --json."""
    blob = yaml.safe_load(
        atf.run_command_output("sacctmgr show config --yaml=v0.0.46", fatal=True)
    )
    assert blob["errors"] == [], f"unexpected errors: {blob['errors']}"
    assert blob["slurmdbd_conf"], "empty slurmdbd_conf payload"


def test_sacctmgr_show_config_json_list():
    """`sacctmgr show config --json=list` lists the data_parser plugins."""
    out = atf.run_command_output("sacctmgr show config --json=list", fatal=True)
    assert "v0.0.46" in out, f"v0.0.46 not listed in: {out}"


def test_slurmdbd_conf_cli_matches_slurmrestd():
    """sacctmgr --json=v0.0.46 and /slurmdb/v0.0.46/conf yield equivalent payloads."""
    cli = json.loads(
        atf.run_command_output("sacctmgr show config --json=v0.0.46", fatal=True)
    )["slurmdbd_conf"]
    rest = atf.request_slurmrestd("slurmdb/v0.0.46/conf").json()["slurmdbd_conf"]
    assert cli.get("DbdHost"), "slurmdbd_conf payload missing DbdHost"
    cli = {k: v for k, v in cli.items() if k not in conf_volatile_fields}
    rest = {k: v for k, v in rest.items() if k not in conf_volatile_fields}
    assert cli == rest, "sacctmgr and slurmrestd slurmdbd_conf payloads differ"
