actsim-cluster-agent/include/db_lib/task.hpp

294 lines
No EOL
7.9 KiB
C++

/*************************************************************************
*
* Copyright (c) 2023 Fabian Posch
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
**************************************************************************
*/
#ifndef __TASK_H__
#define __TASK_H__
#include <pqxx/pqxx>
#include <iostream>
#include <cstdint>
#include "db_types.hpp"
/**
* @brief Representation of the current status of a job.
*
*/
enum class JobStatusType {NOT_STARTED, IN_PROGRESS, FINISHED, HALTED, UNKNOWN};
// string mapping for job status type enum
static std::unordered_map<JobStatusType, std::string> job_status_type_st {
{JobStatusType::NOT_STARTED, "not_started"},
{JobStatusType::IN_PROGRESS, "in_progress"},
{JobStatusType::FINISHED, "finished"},
{JobStatusType::HALTED, "halted"},
{JobStatusType::UNKNOWN, "unknown"}
};
inline std::string to_string(JobStatusType const &value) {
return job_status_type_st[value];
};
inline std::ostream& operator<<(std::ostream& os, JobStatusType& value) {
os << to_string(value);
return os;
};
JobStatusType convert_to_job_status(std::string status_string);
/**
* @brief Defines if a simulation task should be executed a single time or
* dependent on a central coverage model. The latter task type can also be
* executed by more than just a single node to hasten progress.
*/
enum class TaskTypeType {UNKNOWN, SINGLE, MULTI_COV};
// string mapping for task type enum
static std::unordered_map<TaskTypeType, std::string> task_type_type_st {
{TaskTypeType::UNKNOWN, "unknown"},
{TaskTypeType::SINGLE, "single"},
{TaskTypeType::MULTI_COV, "multi_cov"}
};
inline std::string to_string(TaskTypeType const &value) {
return task_type_type_st[value];
};
inline std::ostream& operator<<(std::ostream& os, TaskTypeType& value) {
os << to_string(value);
return os;
};
TaskTypeType convert_to_task_type(std::string type_string);
// TODO check if this is complete
/**
* @brief If a task simulation was aborted or completed with an error,
* this type represents the types of error encountered.
*/
enum class TaskErrorType {UNKNOWN, NONE, SYNTAX, VALUE, CODE, METASTABLE, TIMING, DEADLOCK};
// string mapping for task error type enum
static std::unordered_map<TaskErrorType, std::string> task_error_type_st {
{TaskErrorType::UNKNOWN, "unknown"},
{TaskErrorType::NONE, "none"},
{TaskErrorType::SYNTAX, "syntax"},
{TaskErrorType::VALUE, "value"},
{TaskErrorType::CODE, "code"},
{TaskErrorType::METASTABLE, "metastable"},
{TaskErrorType::TIMING, "timing"},
{TaskErrorType::DEADLOCK, "deadlock"}
};
inline std::string to_string(TaskErrorType const &value) {
return task_error_type_st[value];
};
inline std::ostream& operator<<(std::ostream& os, TaskErrorType& value) {
os << to_string(value);
return os;
};
TaskErrorType convert_to_task_error(std::string error_string);
/**
* @brief Representation of teh current status of a task.
*
*/
enum class TaskStatusType {UNKNOWN, OPEN, IN_PROGRESS, DONE};
// string mapping for task status enum
static std::unordered_map<TaskStatusType, std::string> task_status_type_st {
{TaskStatusType::UNKNOWN, "unknown"},
{TaskStatusType::OPEN, "open"},
{TaskStatusType::IN_PROGRESS, "in_progress"},
{TaskStatusType::DONE, "done"}
};
inline std::string to_string(TaskStatusType const &value) {
return task_status_type_st[value];
};
inline std::ostream& operator<<(std::ostream& os, TaskStatusType& value) {
os << to_string(value);
return os;
};
TaskStatusType convert_to_task_status(std::string status_string);
/**
* @brief Task class represents one simulation task and its settings.
*/
class Task {
public:
Task( db::uuid_t task_uuid,
std::string job_id,
TaskStatusType status,
TaskTypeType type,
bool is_reference,
db::uuid_t reference_uuid,
float max_plf,
TaskErrorType error,
std::string sim_log
);
Task( db::uuid_t task_uuid,
std::string job_id,
TaskTypeType type,
bool is_reference,
db::uuid_t reference_uuid,
float max_plf
);
/**
* @brief Get the UUID of this task
*
* @return db::uuid_t Task UUID
*/
const db::uuid_t& uuid = task_uuid;
/**
* @brief Get the ID of the job this task belongs to
*
* @return const char* Job ID
*/
const std::string& job_id = job_id_;
/**
* @brief Get information whether this task is a one shot simulation or contributes
* to a central coverage model.
*
* @return TaskType
*/
const TaskTypeType& task_type = task_type_;
/**
* @brief Does this simulation task have a reference task to compare to?
*
* @return true It does
* @return false It does not
*/
const bool& is_reference_run = is_reference_;
/**
* @brief Get the reference object UUID
*
* @return The UUID of the reference simulation task
*/
const db::uuid_t& reference_uuid = reference_uuid_;
/**
* @brief Get the status of this task
*
* @return TaskStatusType The task status
*/
const TaskStatusType& status = status_;
/**
* @brief Set the status of the task
*
* @param new_status The new status this task should be set to
*/
void set_status(TaskStatusType new_status) { this->status_ = new_status; };
/**
* @brief Get the value of the maximum allowed pipeline load factor
*
* @return float
*/
const float& max_plf = max_plf_;
/**
* @brief Get the error with which this simulation task was completed
*
* @return TaskErrorType
*/
const TaskErrorType& error = error_;
/**
* @brief Set the error with which this task was completed
*
* @param error
*/
void set_error(TaskErrorType error) { this->error_ = error; };
/**
* @brief Get the simulation log of this task. Empty if not yet simulated.
*
* @return std::string The simulation log in JSON format
*/
const std::string& sim_log = sim_log_;
/**
* @brief Set the simulation log
*
* @param log
*/
void set_log(std::string log) { this->sim_log_ = log; };
/**
* @brief Get the simulation trace of this task. Empty if not yet simulated.
*
* @return std::string The simulation log in TODO format
*/
const std::string& trace = trace_;
/**
* @brief Set the simulation trace
*
* @param trace
*/
void set_trace(std::string trace) { this->trace_ = trace; };
/////////////////////////////////////
private:
// UUID of this task in the database
db::uuid_t task_uuid;
// ID of the job this task belongs to
std::string job_id_;
// Is this task a single shot or does it depend on central coverage metrics?
TaskTypeType task_type_;
// Does this task have a reference run which we should compare the trace to?
bool is_reference_;
TaskStatusType status_;
db::uuid_t reference_uuid_;
// maximum pipeline load factor
float max_plf_;
// error with which this task was completed
TaskErrorType error_;
// simulation output
std::string sim_log_;
std::string trace_;
};
#endif