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

import pytest

import atf

# Period Boundaries
# Mon Dec 31 23:00:00 2007
period_start_datetime = datetime.datetime(2007, 12, 31, 23, 0, 0)
period_start_epoch = int(period_start_datetime.timestamp())
period_start_string = period_start_datetime.strftime("%Y-%m-%dT%H:%M:%S")
# Thu Jan 31 23:59:59 2008
period_end_datetime = datetime.datetime(2008, 1, 31, 23, 59, 59)
period_end_epoch = int(period_end_datetime.timestamp())
period_end_string = period_end_datetime.strftime("%Y-%m-%dT%H:%M:%S")
# Midnight Fri Thu Jan 31 00:00:00 2008
midnight_datetime = datetime.datetime(2008, 1, 31, 0, 0, 0)
midnight_epoch = int(midnight_datetime.timestamp())

# Identities
uid = os.geteuid()
gid = os.getegid()

# Clusters
cluster1 = "cluster1"
cluster2 = "cluster2"

# Accounts
account1 = "account1"
account2 = "account2"
account3 = "account3"

# Workload Characterization Keys
wckey1 = "wckey1"

# Users
user1 = "user1"
user2 = "user2"

# Nodes
node0 = f"{cluster1}_node0"
node1 = f"{cluster1}_node1"
node_list = f"{cluster1}_node[0-1]"
node0_cpus = 2
node1_cpus = 2
cluster_cpus = node0_cpus + node1_cpus

# node0 down
node0_down_start_epoch = period_start_epoch + (45 * 60)
node0_down_end_epoch = period_start_epoch + (75 * 60)
node0_start_datetime = datetime.datetime.fromtimestamp(node0_down_start_epoch)
node0_start_string = node0_start_datetime.strftime("%Y-%m-%dT%H:%M:%S")
node0_end_datetime = datetime.datetime.fromtimestamp(node0_down_end_epoch)
node0_end_string = node0_end_datetime.strftime("%Y-%m-%dT%H:%M:%S")

# Job names
test_job1 = "job1"
test_job2 = "job2"
test_job3 = "job3"

# Job 0
# We want this to look like job1 but run right before hand
job0_start_epoch = period_start_epoch
job0_duration = 1200
job0_end_epoch = job0_start_epoch + job0_duration

# Job 1
job1_start_epoch = job0_end_epoch
job1_duration = 2700
job1_end_epoch = job1_start_epoch + job1_duration
job1_start_datetime = datetime.datetime.fromtimestamp(job1_start_epoch)
job1_start_string = job1_start_datetime.strftime("%Y-%m-%dT%H:%M:%S")
job1_end_datetime = datetime.datetime.fromtimestamp(job1_end_epoch)
job1_end_string = job1_end_datetime.strftime("%Y-%m-%dT%H:%M:%S")
job1_duration_datetime = datetime.datetime.fromtimestamp(midnight_epoch + job1_duration)
job1_duration_string = job1_duration_datetime.strftime("%H:%M:%S")
job1_nodes = node1
job1_cpus = node1_cpus
job1_alloc = (job0_duration + job1_duration) * job1_cpus
job1_acct = account1

# Job 2
# Make job eligible an hour into the allocation
job2_elig_epoch = period_start_epoch + 3600
# start the job 65 minutes later so we can check reserved time
job2_start_epoch = job2_elig_epoch + 3900
# Run for a day
job2_duration = 86400
job2_end_epoch = job2_start_epoch + job2_duration
job2_start_datetime = datetime.datetime.fromtimestamp(job2_start_epoch)
job2_start_string = job2_start_datetime.strftime("%Y-%m-%dT%H:%M:%S")
job2_end_datetime = datetime.datetime.fromtimestamp(job2_end_epoch)
job2_end_string = job2_end_datetime.strftime("%Y-%m-%dT%H:%M:%S")
job2_duration_datetime = datetime.datetime.fromtimestamp(midnight_epoch + job2_duration)
job2_duration_string = job2_duration_datetime.strftime("%-d-%H:%M:%S")
job2_nodes = f"{cluster1}_node[0-1]"
job2_cpus = node0_cpus + node1_cpus
job2_alloc = job2_duration * job2_cpus
job2_acct = account3

# Job 3
# Make job eligible an hour before the end of job2
job3_elig_epoch = job2_end_epoch - 3600
# Start the job at the end of job2
job3_start_epoch = job2_end_epoch
# Run for 65 minutes
job3_duration = 3900
job3_end_epoch = job3_start_epoch + job3_duration
job3_start_datetime = datetime.datetime.fromtimestamp(job3_start_epoch)
job3_start_string = job3_start_datetime.strftime("%Y-%m-%dT%H:%M:%S")
job3_end_datetime = datetime.datetime.fromtimestamp(job3_end_epoch)
job3_end_string = job3_end_datetime.strftime("%Y-%m-%dT%H:%M:%S")
job3_duration_datetime = datetime.datetime.fromtimestamp(midnight_epoch + job3_duration)
job3_duration_string = job3_duration_datetime.strftime("%H:%M:%S")
# Run on just node0
job3_nodes = node0
job3_cpus = node0_cpus
job3_alloc = job3_duration * job3_cpus
job3_acct = account2

# Cred Allocations
acct1_alloc = job1_alloc
acct3_alloc = job2_alloc
acct2_alloc = acct3_alloc + job3_alloc
total_alloc = job1_alloc + job2_alloc + job3_alloc
wckey1_alloc = job1_alloc + job2_alloc + job3_alloc
user1_wckey1_alloc = job1_alloc + job3_alloc
user2_wckey1_alloc = job2_alloc

# Association dictionaries (populated up in create_entities fixture)
user_account_id = {}
user_wckey_id = {}

# Federation
federation1 = "federation1"


# Setup
@pytest.fixture(scope="module", autouse=True)
def setup():
    atf.require_accounting(modify=True)
    atf.require_config_parameter("TrackWCKey", "yes", source="slurmdbd")
    atf.require_slurm_running()


@pytest.fixture(scope="module")
def create_entities():
    """Populate accounting database with entities (clusters, accounts, users, ...)"""

    # Create accounting entities
    atf.run_command(
        f"sacctmgr -i add cluster {cluster1}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    atf.run_command(
        f"sacctmgr -i add cluster {cluster2}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    atf.run_command(
        f"sacctmgr -i add account {account1} cluster={cluster1},{cluster2}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    atf.run_command(
        f"sacctmgr -i add account {account2} cluster={cluster1},{cluster2}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    atf.run_command(
        f"sacctmgr -i add account {account3} cluster={cluster1},{cluster2} parent={account2}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    atf.run_command(
        f"sacctmgr -i add user user={user1} cluster={cluster1},{cluster2} account={account1},{account2},{account3} wckey={wckey1}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    atf.run_command(
        f"sacctmgr -i add user user={user2} cluster={cluster1},{cluster2} account={account1},{account2},{account3} wckey={wckey1}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )

    # Populate user_account_id dictionary with user-account association ids
    output = atf.run_command_output(
        f'sacctmgr -n -P list assoc users={user1},{user2} account={account1},{account2},{account3} cluster={cluster2} format="user,account,id"',
        fatal=True,
    )
    for line in output.splitlines():
        if match := re.search(r"^([^|]+)\|([^|]+)\|(\d+)$", line):
            user, account, id = match.group(1, 2, 3)
            if user not in user_account_id:
                user_account_id[user] = {}
            user_account_id[user][account] = id
    # Verify they were all populated with an id
    for user in user1, user2:
        if user not in user_account_id:
            pytest.fail(f"Account association for {user} was not created")
        for account in account1, account2, account3:
            if account not in user_account_id[user]:
                pytest.fail(f"Association for {user} and {account} was not created")

    # Populate user_wckey_id dictionary with user-wckey association ids
    output = atf.run_command_output(
        f'sacctmgr -n -P list wckeys users={user1},{user2} wckeys={wckey1} cluster={cluster1} format="user,wckey,id"',
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    for line in output.splitlines():
        if match := re.search(r"^([^|]+)\|([^|]+)\|(\d+)$", line):
            user, wckey, id = match.group(1, 2, 3)
            if user not in user_wckey_id:
                user_wckey_id[user] = {}
            user_wckey_id[user][wckey] = id
    # Verify they were all populated with an id
    for user in user1, user2:
        if user not in user_wckey_id:
            pytest.fail(f"WCKey association for {user} was not created")
        if wckey1 not in user_wckey_id[user]:
            pytest.fail(f"Association for {user} and {wckey1} was not created")


@pytest.fixture(scope="module")
def archive_load(create_entities):
    """Populate accounting database with cluster utilization data"""

    # Cluster utilization
    for cluster in cluster1, cluster2:
        sql_input_file = f"{cluster}.sql"
        sql_input_path = f"{str(atf.module_tmp_path / sql_input_file)}"
        with open(sql_input_path, "w") as f:
            # Add utilization data for a period prior to today's date
            # We are using 'Mon Dec 31 23:00:00 2007' = 1199167200 as the start
            f.write(
                f"insert into cluster_event_table (node_name, cluster, tres, period_start, period_end, reason, cluster_nodes) values ('', '{cluster}', '1={cluster_cpus}', {period_start_epoch}, {period_end_epoch}, 'Cluster processor count', '{node_list}')"
            )
            # Mark a node down for 30 minutes starting at 45 minutes after the start to make sure our rollups work so we should get 15 minutes on one hour and 15 on the other
            f.write(
                f", ('{node0}', '{cluster}', '1={node0_cpus}', {node0_down_start_epoch}, {node0_down_end_epoch}, 'down','')"
            )
            f.write(
                " on duplicate key update period_start=VALUES(period_start), period_end=VALUES(period_end);\n"
            )
            # Now we will put in a job running for an hour and 5 minutes
            f.write(
                "insert into job_table (jobid, associd, wckey, wckeyid, uid, gid, `partition`, blockid, cluster, account, eligible, submit, start, end, suspended, name, state, comp_code, priority, req_cpus, tres_alloc, nodelist, kill_requid, qos, deleted) values"
            )
            f.write(
                f" ('65536', '{user_account_id[user1][account1]}', '{wckey1}', '{user_wckey_id[user1][wckey1]}', '{uid}', '{gid}', 'debug', '', '{cluster}', '{job1_acct}', {job0_start_epoch}, {job0_start_epoch}, {job0_start_epoch}, {job0_end_epoch}, '0', '{test_job1}', '3', '0', '{job1_cpus}', {job1_cpus}, '1={job1_cpus}', '{job1_nodes}', '0', '0', '0')"
            )
            f.write(
                f", ('65537', '{user_account_id[user1][account1]}', '{wckey1}', '{user_wckey_id[user1][wckey1]}', '{uid}', '{gid}', 'debug', '', '{cluster}', '{job1_acct}', {job1_start_epoch}, {job1_start_epoch}, {job1_start_epoch}, {job1_end_epoch}, '0', '{test_job1}', '3', '0', '{job1_cpus}', {job1_cpus}, '1={job1_cpus}', '{job1_nodes}', '0', '0', '0')"
            )
            f.write(
                f", ('65538', '{user_account_id[user2][account3]}', '{wckey1}', '{user_wckey_id[user2][wckey1]}', '{uid}', '{gid}', 'debug', '', '{cluster}', '{job2_acct}', {job2_elig_epoch}, {job2_elig_epoch}, {job2_start_epoch}, {job2_end_epoch}, '0', '{test_job2}', '3', '0', '{job2_cpus}', {job2_cpus}, '1={job2_cpus}', '{job2_nodes}', '0', '0', '0')"
            )
            f.write(
                f", ('65539', '{user_account_id[user1][account2]}', '{wckey1}', '{user_wckey_id[user1][wckey1]}', '{uid}', '{gid}', 'debug', '', '{cluster}', '{job3_acct}', {job3_elig_epoch}, {job3_elig_epoch}, {job3_start_epoch}, {job3_end_epoch}, '0', '{test_job3}', '3', '0', {job3_cpus}, '{job3_cpus}', '1={job3_cpus}', '{job3_nodes}', '0', '0', '0')"
            )
            f.write(
                " on duplicate key update id=LAST_INSERT_ID(id), eligible=VALUES(eligible), submit=VALUES(submit), start=VALUES(start), end=VALUES(end), associd=VALUES(associd), tres_alloc=VALUES(tres_alloc), wckey=VALUES(wckey), wckeyid=VALUES(wckeyid);\n"
            )

        # Perform archive load
        atf.run_command(
            f"sacctmgr -i -n archive load {sql_input_path}",
            user=atf.properties["slurm-user"],
            fatal=True,
        )

        # Use sacct to see if the job loaded
        output = atf.run_command_output(
            f"sacct -P -M {cluster} --format=cluster,account,associd,wckey,wckeyid,start,end,elapsed --noheader --start={period_start_string} --end={period_end_string}",
            fatal=True,
        )
        # Verify values
        if not re.search(
            rf"{cluster}\|{account1}\|{user_account_id[user1][account1]}\|{wckey1}\|{user_wckey_id[user1][wckey1]}\|{job1_start_string}\|{job1_end_string}\|{job1_duration_string}",
            output,
        ):
            pytest.fail("The job accounting data was not loaded correctly for job1")
        if not re.search(
            rf"{cluster}\|{account3}\|{user_account_id[user2][account3]}\|{wckey1}\|{user_wckey_id[user2][wckey1]}\|{job2_start_string}\|{job2_end_string}\|{job2_duration_string}",
            output,
        ):
            pytest.fail("The job accounting data was not loaded correctly for job2")
        if not re.search(
            rf"{cluster}\|{account2}\|{user_account_id[user1][account2]}\|{wckey1}\|{user_wckey_id[user1][wckey1]}\|{job3_start_string}\|{job3_end_string}\|{job3_duration_string}",
            output,
        ):
            pytest.fail("The job accounting data was not loaded correctly for job3")

        # Use sacctmgr to see if the node event loaded
        output = atf.run_command_output(
            f"sacctmgr -P list events cluster={cluster} format=cluster,noden,start,end,cpu --noheader start={period_start_string} end={period_end_string}",
            fatal=True,
        )
        # Verify values
        if not re.search(
            rf"{cluster}\|\|{period_start_string}\|{period_end_string}\|{cluster_cpus}",
            output,
        ):
            pytest.fail(
                "The event accounting data was not loaded correctly for the cluster"
            )
        if not re.search(
            rf"{cluster}\|{node0}\|{node0_start_string}\|{node0_end_string}\|{node0_cpus}",
            output,
        ):
            pytest.fail("The event accounting data was not loaded correctly for node0")

        # Use sacctmgr to roll up the time period
        atf.run_command_output(
            f"sacctmgr -i roll {period_start_string} {period_end_string}",
            user=atf.properties["slurm-user"],
            fatal=True,
        )


@pytest.fixture(scope="class")
def configure_federation():
    """Configuration for federation tests"""

    # Create federation1
    atf.run_command(
        f"sacctmgr -i add federation {federation1}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    atf.run_command(
        f"sacctmgr -i mod federation {federation1} set clusters={cluster1},{cluster2}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )

    # Set the ClusterName to cluster1
    original_cluster_name = atf.get_config_parameter("ClusterName")
    atf.set_config_parameter("ClusterName", cluster1)

    yield

    # Undo the above
    atf.run_command(
        f"sacctmgr -i delete federation {federation1}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    atf.set_config_parameter("ClusterName", original_cluster_name)


@pytest.mark.usefixtures("create_entities", "archive_load", "configure_federation")
class TestFederation:
    """Test federated sreport functionality on second hour cluster1 usage"""

    # Set class variables

    cluster = f"FED:{federation1}"
    # Second hour start: Tue Jan 1 00:00:00 2008
    start_datetime = datetime.datetime(2008, 1, 1, 0, 0, 0)
    start_epoch = int(start_datetime.timestamp())
    start_string = start_datetime.strftime("%Y-%m-%dT%H:%M:%S")
    # Second hour end: Tue Jan 1 01:00:00 2008
    end_datetime = datetime.datetime(2008, 1, 1, 1, 0, 0)
    end_epoch = int(end_datetime.timestamp())
    end_string = end_datetime.strftime("%Y-%m-%dT%H:%M:%S")

    reported_duration = (end_epoch - start_epoch) * cluster_cpus * 2
    down_duration = (node0_down_end_epoch - start_epoch) * node0_cpus * 2
    allocated_duration = (job1_end_epoch - start_epoch) * job1_cpus * 2
    wckey_allocated_duration = allocated_duration
    reserved_duration = (end_epoch - job2_elig_epoch) * job2_cpus * 2
    # Use the same logic inside the plugin to figure out the correct idle and reserved durations
    idle_duration = reported_duration - (
        down_duration + allocated_duration + reserved_duration
    )
    if idle_duration < 0:
        reserved_duration = reserved_duration + idle_duration
        idle_duration = 0
        if reserved_duration < 0:
            reserved_duration = 0

    down_string = f"{down_duration}({float(down_duration*100)/reported_duration:.2f}%)"
    allocated_string = (
        f"{allocated_duration}({float(allocated_duration*100)/reported_duration:.2f}%)"
    )
    reserved_string = (
        f"{reserved_duration}({float(reserved_duration*100)/reported_duration:.2f}%)"
    )
    idle_string = f"{idle_duration}({float(idle_duration*100)/reported_duration:.2f}%)"
    reported_string = f"{reported_duration}({100:.2f}%)"

    def test_cluster_utilization(self):
        """Test utilization report for second hour"""

        command = f"sreport --federation cluster utilization start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,idle,down,alloc,res,reported"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{self.cluster}|{self.idle_string}|{self.down_string}|{self.allocated_string}|{self.reserved_string}|{self.reported_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_cluster_AccountUtilizationByUser(self):
        """Test cluster AccountUtilizationByUser report"""

        command = f"sreport --federation cluster AccountUtilizationByUser start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,account,login,used"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{self.cluster}|root||{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{self.cluster}|{account1}||{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{self.cluster}|{account1}|{user1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_cluster_UserUtilizationByWckey(self):
        """Test cluster UserUtilizationByWckey report"""

        command = f"sreport --federation cluster UserUtilizationByWckey start={self.start_string} end={self.end_string} -tsecper -P -n"
        output = atf.run_command_output(
            command, user=atf.properties["slurm-user"], fatal=True
        )
        pattern = rf"{self.cluster}|{user1}||{wckey1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_cluster_WckeyUtilizationByUser(self):
        """Test cluster WckeyUtilizationByUser report"""

        command = f"sreport --federation cluster WckeyUtilizationByUser start={self.start_string} end={self.end_string} -tsecper -P -n"
        output = atf.run_command_output(
            command, user=atf.properties["slurm-user"], fatal=True
        )
        pattern = rf"{self.cluster}|{wckey1}|||{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{self.cluster}|{wckey1}|{user1}||{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_user_top(self):
        """Test User Top report"""

        command = f"sreport --federation user top start={self.start_string} end={self.end_string} -tsecper -P -n"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{self.cluster}|{user1}||{account1}|{self.allocated_string}|{self.idle_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_job_size(self):
        """Test Job Size report"""

        command = f"sreport --federation job size AcctAsParent grouping=2,4 start={self.start_string} end={self.end_string} -tsecper -P -n"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{self.cluster}|{account1}|0|{self.allocated_duration}|0|{self.allocated_duration}|100.00%"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_job_sizesbywckey(self):
        """Test Job sizesbywckey report"""

        command = f"sreport --federation job sizesbywckey grouping=2,4 start={self.start_string} end={self.end_string} -tsecper -P -n"
        output = atf.run_command_output(
            command, user=atf.properties["slurm-user"], fatal=True
        )
        pattern = rf"{self.cluster}|{wckey1}|0|{self.wckey_allocated_duration}|0|{self.wckey_allocated_duration}|100.00%"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'


@pytest.mark.usefixtures("create_entities", "archive_load")
class TestFirstHour:
    """Test cluster usage for the first hour"""

    # Set class variables

    # First hour start: Mon Dec 31 23:00:00 2007
    start_datetime = datetime.datetime(2007, 12, 31, 23, 0, 0)
    start_epoch = int(start_datetime.timestamp())
    start_string = start_datetime.strftime("%Y-%m-%dT%H:%M:%S")
    # Second hour end: Tue Jan 1 00:00:00 2008
    end_datetime = datetime.datetime(2008, 1, 1, 0, 0, 0)
    end_epoch = int(end_datetime.timestamp())
    end_string = end_datetime.strftime("%Y-%m-%dT%H:%M:%S")

    reported_duration = (end_epoch - start_epoch) * cluster_cpus
    down_duration = (end_epoch - node0_down_start_epoch) * node0_cpus
    allocated_duration = (end_epoch - job0_start_epoch) * node1_cpus
    wckey_allocated_duration = allocated_duration
    reserved_duration = 0
    idle_duration = reported_duration - (
        down_duration + allocated_duration + reserved_duration
    )

    down_string = f"{down_duration}({float(down_duration*100)/reported_duration:.2f}%)"
    allocated_string = (
        f"{allocated_duration}({float(allocated_duration*100)/reported_duration:.2f}%)"
    )
    reserved_string = (
        f"{reserved_duration}({float(reserved_duration*100)/reported_duration:.2f}%)"
    )
    idle_string = f"{idle_duration}({float(idle_duration*100)/reported_duration:.2f}%)"
    reported_string = f"{reported_duration}({100:.2f}%)"

    def test_cluster_utilization(self):
        """Test cluster utilization report for first hour"""

        command = f"sreport -M{cluster2} cluster utilization cluster='{cluster1}' start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,idle,down,alloc,res,reported"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{cluster1}|{self.idle_string}|{self.down_string}|{self.allocated_string}|{self.reserved_string}|{self.reported_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{cluster2}|{self.idle_string}|{self.down_string}|{self.allocated_string}|{self.reserved_string}|{self.reported_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_cluster_UserUtilizationByAccount(self):
        """Test cluster UserUtilizationByAccount report"""

        command = f"sreport -M{cluster2} cluster UserUtilizationByAccount start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,login,account,used"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{cluster2}|{user1}|{account1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        command = f"sreport -M{cluster2} cluster UserUtilizationByAccount cluster='{cluster1}' start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,login,account,used"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{cluster1}|{user1}|{account1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{cluster2}|{user1}|{account1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_cluster_AccountUtilizationByUser(self):
        """Test cluster AccountUtilizationByUser report"""

        command = f"sreport -M{cluster2} cluster AccountUtilizationByUser start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,account,login,used"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{cluster2}|root||{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{cluster2}|{account1}||{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{cluster2}|{account1}|{user1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        command = f"sreport -M{cluster2} cluster AccountUtilizationByUser cluster='{cluster1}' start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,account,login,used"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{cluster1}|root||{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{cluster1}|{account1}||{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{cluster1}|{account1}|{user1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{cluster2}|root||{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{cluster2}|{account1}||{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{cluster2}|{account1}|{user1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_cluster_UserUtilizationByWckey(self):
        """Test cluster UserUtilizationByWckey report"""

        command = f"sreport -M{cluster2} cluster UserUtilizationByWckey start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,login,wckey,used"
        output = atf.run_command_output(
            command, user=atf.properties["slurm-user"], fatal=True
        )
        pattern = rf"{cluster2}|{user1}||{wckey1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        command = f"sreport -M{cluster2} cluster UserUtilizationByWckey cluster='{cluster1}' start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,login,wckey,used"
        output = atf.run_command_output(
            command, user=atf.properties["slurm-user"], fatal=True
        )
        pattern = rf"{cluster1}|{user1}||{wckey1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{cluster2}|{user1}||{wckey1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_cluster_WckeyUtilizationByUser(self):
        """Test cluster WckeyUtilizationByUser report"""

        command = f"sreport -M{cluster2} cluster WckeyUtilizationByUser start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,wckey,login,used"
        output = atf.run_command_output(
            command, user=atf.properties["slurm-user"], fatal=True
        )
        pattern = rf"{cluster2}|{wckey1}||{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{cluster2}|{wckey1}|{user1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        command = f"sreport -M{cluster2} cluster WckeyUtilizationByUser cluster='{cluster1}' start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,wckey,login,used"
        output = atf.run_command_output(
            command, user=atf.properties["slurm-user"], fatal=True
        )
        pattern = rf"{cluster1}|{wckey1}||{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{cluster1}|{wckey1}|{user1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{cluster2}|{wckey1}||{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{cluster2}|{wckey1}|{user1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_user_top(self):
        """Test User Top report"""

        command = f"sreport -M{cluster2} user top start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,account,login,used"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{cluster2}|{account1}|{user1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        command = f"sreport -M{cluster2} user top cluster='{cluster1}' start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,account,login,used"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{cluster1}|{account1}|{user1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{cluster2}|{account1}|{user1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_job_size(self):
        """Test Job Size report"""

        command = f"sreport -M{cluster2} job size AcctAsParent grouping=2,4 start={self.start_string} end={self.end_string} -tsecper -P -n"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{cluster2}|{account1}|0|{self.allocated_duration}|0"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        command = f"sreport --local job size AcctAsParent grouping=2,4 cluster='{cluster1}' start={self.start_string} end={self.end_string} -tsecper -P -n"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{cluster1}|{account1}|0|{self.allocated_duration}|0"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_job_sizesbywckey(self):
        """Test Job sizesbywckey report"""

        command = f"sreport -M{cluster2} job sizesbywckey grouping=2,4 start={self.start_string} end={self.end_string} -tsecper -P -n"
        output = atf.run_command_output(
            command, user=atf.properties["slurm-user"], fatal=True
        )
        pattern = rf"{cluster2}|{wckey1}|0|{self.wckey_allocated_duration}|0"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        command = f"sreport -M{cluster2} job sizesbywckey grouping=2,4 cluster='{cluster1}' start={self.start_string} end={self.end_string} -tsecper -P -n"
        output = atf.run_command_output(
            command, user=atf.properties["slurm-user"], fatal=True
        )
        pattern = rf"{cluster1}|{wckey1}|0|{self.wckey_allocated_duration}|0"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{cluster2}|{wckey1}|0|{self.wckey_allocated_duration}|0"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'


@pytest.mark.usefixtures("create_entities", "archive_load")
class TestSecondHour:
    """Test cluster usage for the second hour"""

    # Set class variables

    # Since there are 2 test clusters we will just use one
    cluster = cluster1

    # Second hour start: Tue Jan 1 00:00:00 2008
    start_datetime = datetime.datetime(2008, 1, 1, 0, 0, 0)
    start_epoch = int(start_datetime.timestamp())
    start_string = start_datetime.strftime("%Y-%m-%dT%H:%M:%S")
    # Second hour end: Tue Jan 1 01:00:00 2008
    end_datetime = datetime.datetime(2008, 1, 1, 1, 0, 0)
    end_epoch = int(end_datetime.timestamp())
    end_string = end_datetime.strftime("%Y-%m-%dT%H:%M:%S")

    reported_duration = (end_epoch - start_epoch) * cluster_cpus
    down_duration = (node0_down_end_epoch - start_epoch) * node0_cpus
    allocated_duration = (job1_end_epoch - start_epoch) * job1_cpus
    wckey_allocated_duration = allocated_duration
    reserved_duration = (end_epoch - job2_elig_epoch) * job2_cpus
    idle_duration = reported_duration - (
        down_duration + allocated_duration + reserved_duration
    )
    # Use the same logic inside the plugin to figure out the correct idle and reserved durations
    if idle_duration < 0:
        reserved_duration = reserved_duration + idle_duration
        idle_duration = 0
        if reserved_duration < 0:
            reserved_duration = 0

    down_string = f"{down_duration}({float(down_duration*100)/reported_duration:.2f}%)"
    allocated_string = (
        f"{allocated_duration}({float(allocated_duration*100)/reported_duration:.2f}%)"
    )
    reserved_string = (
        f"{reserved_duration}({float(reserved_duration*100)/reported_duration:.2f}%)"
    )
    idle_string = f"{idle_duration}({float(idle_duration*100)/reported_duration:.2f}%)"
    reported_string = f"{reported_duration}({100:.2f}%)"

    def test_cluster_utilization(self):
        """Test cluster utilization report for second hour"""

        command = f"sreport --local cluster utilization cluster='{self.cluster}' start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,idle,down,alloc,res,reported"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{self.cluster}|{self.idle_string}|{self.down_string}|{self.allocated_string}|{self.reserved_string}|{self.reported_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_cluster_AccountUtilizationByUser(self):
        """Test cluster AccountUtilizationByUser report"""

        command = f"sreport --local cluster AccountUtilizationByUser cluster='{self.cluster}' start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,account,login,used"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{self.cluster}|root||{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{self.cluster}|{account1}||{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{self.cluster}|{account1}|{user1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_cluster_UserUtilizationByWckey(self):
        """Test cluster UserUtilizationByWckey report"""

        command = f"sreport --local cluster UserUtilizationByWckey cluster='{self.cluster}' start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,login,wckey,used"
        output = atf.run_command_output(
            command, user=atf.properties["slurm-user"], fatal=True
        )
        pattern = rf"{self.cluster}|{user1}|{wckey1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_cluster_WckeyUtilizationByUser(self):
        """Test cluster WckeyUtilizationByUser report"""

        command = f"sreport --local cluster WckeyUtilizationByUser cluster='{self.cluster}' start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,wckey,login,used"
        output = atf.run_command_output(
            command, user=atf.properties["slurm-user"], fatal=True
        )
        pattern = rf"{self.cluster}|{wckey1}||{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{self.cluster}|{wckey1}|{user1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_user_top(self):
        """Test User Top report"""

        command = f"sreport --local user top cluster='{self.cluster}' start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,account,login,used"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{self.cluster}|{account1}|{user1}|{self.allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_job_size(self):
        """Test Job Size report"""

        command = f"sreport --local job size AcctAsParent grouping=2,4 cluster='{self.cluster}' start={self.start_string} end={self.end_string} -tsecper -P -n"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{self.cluster}|{account1}|0|{self.allocated_duration}|0"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_job_sizesbywckey(self):
        """Test Job sizesbywckey report"""

        command = f"sreport --local job sizesbywckey grouping=2,4 cluster='{self.cluster}' start={self.start_string} end={self.end_string} -tsecper -P -n"
        output = atf.run_command_output(
            command, user=atf.properties["slurm-user"], fatal=True
        )
        pattern = rf"{self.cluster}|{wckey1}|0|{self.wckey_allocated_duration}|0"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'


@pytest.mark.usefixtures("create_entities", "archive_load")
class TestFirstThreeDays:
    """Test cluster usage for the first 3 days"""

    # Set class variables

    # Since there are 2 test clusters we will just use one
    cluster = cluster1

    # First 3 Days Start: Mon Dec 31 23:00:00 2007
    start_datetime = datetime.datetime(2007, 12, 31, 23, 0, 0)
    start_epoch = int(start_datetime.timestamp())
    start_string = start_datetime.strftime("%Y-%m-%dT%H:%M:%S")
    # First 3 Days End: Tue Jan 3 00:00:00 2008
    end_datetime = datetime.datetime(2008, 1, 3, 0, 0, 0)
    end_epoch = int(end_datetime.timestamp())
    end_string = end_datetime.strftime("%Y-%m-%dT%H:%M:%S")

    reported_duration = (end_epoch - start_epoch) * cluster_cpus
    down_duration = (node0_down_end_epoch - node0_down_start_epoch) * node0_cpus
    allocated_duration = (
        ((job1_end_epoch - job0_start_epoch) * job1_cpus)
        + ((job2_end_epoch - job2_start_epoch) * job2_cpus)
        + ((job3_end_epoch - job3_start_epoch) * job3_cpus)
    )
    wckey_allocated_duration1 = job1_alloc + job3_alloc
    wckey_allocated_duration2 = job2_alloc
    reserved_duration = ((job2_start_epoch - job2_elig_epoch) * job2_cpus) + (
        (job3_start_epoch - job3_elig_epoch) * job3_cpus
    )
    # I didn't have time to do the correct math here so I am just putting in 9000 which should be the correct value of over commit
    overcommit_duration = 9000
    reserved_duration -= overcommit_duration
    idle_duration = reported_duration - (
        down_duration + allocated_duration + reserved_duration
    )
    # Use the same logic inside the plugin to figure out the correct idle and reserved durations
    if idle_duration < 0:
        reserved_duration = reserved_duration + idle_duration
        idle_duration = 0
        if reserved_duration < 0:
            reserved_duration = 0

    down_string = f"{down_duration}({float(down_duration*100)/reported_duration:.2f}%)"
    allocated_string = (
        f"{allocated_duration}({float(allocated_duration*100)/reported_duration:.2f}%)"
    )
    reserved_string = (
        f"{reserved_duration}({float(reserved_duration*100)/reported_duration:.2f}%)"
    )
    idle_string = f"{idle_duration}({float(idle_duration*100)/reported_duration:.2f}%)"
    overcommit_string = f"{overcommit_duration}({float(overcommit_duration*100)/reported_duration:.2f}%)"
    reported_string = f"{reported_duration}({100:.2f}%)"

    job1_allocated_string = (
        f"{job1_alloc}({float(job1_alloc*100)/reported_duration:.2f}%)"
    )
    job2_allocated_string = (
        f"{job2_alloc}({float(job2_alloc*100)/reported_duration:.2f}%)"
    )
    job3_allocated_string = (
        f"{job3_alloc}({float(job3_alloc*100)/reported_duration:.2f}%)"
    )
    total_allocated_string = (
        f"{total_alloc}({float(total_alloc*100)/reported_duration:.2f}%)"
    )
    account1_allocated_string = (
        f"{acct1_alloc}({float(acct1_alloc*100)/reported_duration:.2f}%)"
    )
    account2_allocated_string = (
        f"{acct2_alloc}({float(acct2_alloc*100)/reported_duration:.2f}%)"
    )
    account3_allocated_string = (
        f"{acct3_alloc}({float(acct3_alloc*100)/reported_duration:.2f}%)"
    )
    wckey1_allocated_string = (
        f"{wckey1_alloc}({float(wckey1_alloc*100)/reported_duration:.2f}%)"
    )
    user1_wckey1_allocated_string = (
        f"{user1_wckey1_alloc}({float(user1_wckey1_alloc*100)/reported_duration:.2f}%)"
    )
    user2_wckey1_allocated_string = (
        f"{user2_wckey1_alloc}({float(user2_wckey1_alloc*100)/reported_duration:.2f}%)"
    )

    def test_cluster_utilization(self):
        """Test cluster utilization report for first 3 days"""

        command = f"sreport --local cluster utilization cluster='{self.cluster}' start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,idle,down,alloc,res,over,reported"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{self.cluster}|{self.idle_string}|{self.down_string}|{self.allocated_string}|{self.reserved_string}|{self.overcommit_string}|{self.reported_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_cluster_UserUtilizationByAccount(self):
        """Test cluster UserUtilizationByAccount report"""

        command = f"sreport --local cluster UserUtilizationByAccount cluster='{self.cluster}' start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,login,account,used"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{self.cluster}|{user2}|{account3}|{self.job2_allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{self.cluster}|{user1}|{account1}|{self.job1_allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{self.cluster}|{user1}|{account2}|{self.job3_allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_cluster_AccountUtilizationByUser(self):
        """Test cluster AccountUtilizationByUser report"""

        command = f"sreport --local cluster AccountUtilizationByUser cluster='{self.cluster}' start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,account,login,used"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{self.cluster}|root||{self.total_allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{self.cluster}|{account1}||{self.account1_allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{self.cluster}|{account1}|{user1}|{self.job1_allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{self.cluster}|{account2}||{self.account2_allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{self.cluster}|{account2}|{user1}|{self.job3_allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{self.cluster}|{account3}||{self.account3_allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{self.cluster}|{account3}|{user2}|{self.job2_allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_cluster_UserUtilizationByWckey(self):
        """Test cluster UserUtilizationByWckey report"""

        command = f"sreport --local cluster UserUtilizationByWckey cluster='{self.cluster}' start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,login,wckey,used"
        output = atf.run_command_output(
            command, user=atf.properties["slurm-user"], fatal=True
        )
        pattern = (
            rf"{self.cluster}|{user2}|{wckey1}|{self.user2_wckey1_allocated_string}"
        )
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = (
            rf"{self.cluster}|{user1}|{wckey1}|{self.user1_wckey1_allocated_string}"
        )
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_cluster_WckeyUtilizationByUser(self):
        """Test cluster WckeyUtilizationByUser report"""

        command = f"sreport --local cluster WckeyUtilizationByUser cluster='{self.cluster}' start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,wckey,login,used"
        output = atf.run_command_output(
            command, user=atf.properties["slurm-user"], fatal=True
        )
        pattern = rf"{self.cluster}|{wckey1}||{self.wckey1_allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = (
            rf"{self.cluster}|{wckey1}|{user1}|{self.user1_wckey1_allocated_string}"
        )
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = (
            rf"{self.cluster}|{wckey1}|{user2}|{self.user2_wckey1_allocated_string}"
        )
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_user_top(self):
        """Test User Top report"""

        command = f"sreport --local user top cluster='{self.cluster}' start={self.start_string} end={self.end_string} -tsecper -P -n format=cluster,account,login,used"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{self.cluster}|{account3}|{user2}|{self.job2_allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{self.cluster}|{account1}|{user1}|{self.job1_allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{self.cluster}|{account2}|{user1}|{self.job3_allocated_string}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_job_size(self):
        """Test Job Size report"""

        command = f"sreport --local job size AcctAsParent grouping=2,4 cluster='{self.cluster}' start={self.start_string} end={self.end_string} -tsecper -P -n"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{self.cluster}|{account1}|0|{job1_alloc}|0"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        pattern = rf"{self.cluster}|{account2}|0|{job3_alloc}|{job2_alloc}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'
        command = f"sreport --local job size AcctAsParent grouping=2,4 cluster='{self.cluster}' account='{account2}' start={self.start_string} end={self.end_string} -tsecper -P -n"
        output = atf.run_command_output(command, fatal=True)
        pattern = rf"{self.cluster}|{account3}|0|0|{job2_alloc}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'

    def test_job_sizesbywckey(self):
        """Test Job sizesbywckey report"""

        command = f"sreport --local job sizesbywckey grouping=2,4 cluster='{self.cluster}' start={self.start_string} end={self.end_string} -tsecper -P -n"
        output = atf.run_command_output(
            command, user=atf.properties["slurm-user"], fatal=True
        )
        pattern = rf"{self.cluster}|{wckey1}|0|{self.wckey_allocated_duration1}|{self.wckey_allocated_duration2}"
        assert (
            re.search(pattern, output) is not None
        ), f'Command output for "{command}" did not match expected pattern "{pattern}"'


@pytest.mark.usefixtures("create_entities", "archive_load")
class TestSpecificJobs:
    """Test for jobs that ran on a node at a certain time"""

    # Set class variables

    # Since there are 2 test clusters we will just use one
    cluster = cluster1

    def test_job1(self):
        """Search for job1 on cluster1"""

        output = atf.run_command_output(
            f"sacct -p -M {self.cluster} --state=completed --start={job1_start_string} --end={job1_end_string} --format=jobname",
            fatal=True,
        )
        assert (
            len(re.findall(rf"{test_job1}", output)) == 2
        ), "Job 1 not found (twice) in sacct"

    def test_job2(self):
        """Search for job2 on cluster1"""

        output = atf.run_command_output(
            f"sacct -p -M {self.cluster} --state=completed --start={job2_start_string} --end={job2_end_string} --format=jobname",
            fatal=True,
        )
        assert (
            len(re.findall(rf"{test_job2}", output)) == 1
        ), "Job 2 not found (once) in sacct"

    def test_job3(self):
        """Search for job3 on cluster1"""

        output = atf.run_command_output(
            f"sacct -p -M {self.cluster} --state=completed --start={job3_start_string} --end={job3_end_string} --format=jobname",
            fatal=True,
        )
        assert (
            len(re.findall(rf"{test_job3}", output)) == 1
        ), "Job 3 not found (once) in sacct"


@pytest.mark.usefixtures("create_entities", "archive_load")
class TestOptions:
    """Get job usage reports with default options and with different switches"""

    # Set class variables

    # Start: Mon Dec 31 23:00:00 2007
    start_datetime = datetime.datetime(2007, 12, 31, 23, 0, 0)
    start_epoch = int(start_datetime.timestamp())
    start_string = start_datetime.strftime("%Y-%m-%dT%H:%M:%S")
    # End: Tue Dec 31 23:59:59 2008
    end_datetime = datetime.datetime(2008, 12, 31, 23, 59, 59)
    end_epoch = int(end_datetime.timestamp())
    end_string = end_datetime.strftime("%Y-%m-%dT%H:%M:%S")

    def test_job_sizesbyaccount_default(self):
        """Test job report for default (non-AcctAsParent)"""

        output = atf.run_command_output(
            f"sreport job sizesbyaccount printjobcount cluster='{cluster1}' start={self.start_string} end={self.end_string} -P -n",
            fatal=True,
        )
        assert re.search(rf"{cluster1}|root|4|0|0|0|0|100.00%", output) is not None

    def test_job_sizesbyaccount_flatview(self):
        """Test job report with flatview"""

        output = atf.run_command_output(
            f"sreport job sizesbyaccount printjobcount cluster='{cluster1}' start={self.start_string} end={self.end_string} -P -n flatview",
            fatal=True,
        )
        # test22-1clus1|test22-1acct1|2|0|0|0|0|50.00%
        # test22-1clus1|test22-1acct2|1|0|0|0|0|25.00%
        # test22-1clus1|test22-1acct3|1|0|0|0|0|25.00%
        assert (
            re.search(
                rf"{cluster1}|{account1}|2|0|0|0|0|50.00%\n{cluster1}|{account2}|1|0|0|0|0|25.00\n{cluster1}|{account3}|1|0|0|0|0|25.00",
                output,
            )
            is not None
        )

    def test_specific_account(self):
        """Test the job report for specific account"""

        # Should show just one account with all of its jobs
        output = atf.run_command_output(
            f"sreport job sizesbyaccount printjobcount cluster='{cluster1}' account={account1} start={self.start_string} end={self.end_string} -P -n",
            fatal=True,
        )
        assert (
            re.search(rf"{cluster1}|{account1}|2|0|0|0|0|100.00%", output) is not None
        )
