diff --git a/pysqa/base/abstract.py b/pysqa/base/abstract.py new file mode 100644 index 0000000..efd0c5c --- /dev/null +++ b/pysqa/base/abstract.py @@ -0,0 +1,80 @@ +from abc import ABC, abstractmethod +from typing import List, Optional, Union + +import pandas +from jinja2 import Template + + +class QueueAdapterAbstractClass(ABC): + @abstractmethod + def submit_job( + self, + queue: Optional[str] = None, + job_name: Optional[str] = None, + working_directory: Optional[str] = None, + cores: Optional[int] = None, + memory_max: Optional[int] = None, + run_time_max: Optional[int] = None, + dependency_list: Optional[List[str]] = None, + command: Optional[str] = None, + submission_template: Optional[Union[str, Template]] = None, + **kwargs, + ) -> Union[int, None]: + pass + + @abstractmethod + def enable_reservation(self, process_id: int): + pass + + @abstractmethod + def delete_job(self, process_id: int) -> Union[str, None]: + pass + + @abstractmethod + def get_queue_status(self, user: Optional[str] = None) -> pandas.DataFrame: + """ + Get the status of the queue. + + Args: + user (str): The user to filter the queue status for. + + Returns: + pandas.DataFrame: The queue status. + """ + pass + + @abstractmethod + def get_status_of_my_jobs(self) -> pandas.DataFrame: + """ + Get the status of the user's jobs. + + Returns: + pandas.DataFrame: The status of the user's jobs. + """ + pass + + @abstractmethod + def get_status_of_job(self, process_id: int) -> Union[str, None]: + """ + Get the status of a job. + + Args: + process_id (int): The process ID. + + Returns: + str: The status of the job.results_lst.append(df_selected.values[0]) + """ + pass + + @abstractmethod + def get_status_of_jobs(self, process_id_lst: List[int]) -> List[str]: + """ + Get the status of multiple jobs. + + Args: + process_id_lst (list[int]): List of process IDs. + + Returns: + list[str]: List of job statuses. + """ + pass diff --git a/pysqa/base/core.py b/pysqa/base/core.py index 410a7bf..496b293 100644 --- a/pysqa/base/core.py +++ b/pysqa/base/core.py @@ -7,6 +7,7 @@ import pandas from jinja2 import Template +from pysqa.base.abstract import QueueAdapterAbstractClass from pysqa.wrapper.abstract import SchedulerCommands queue_type_dict = { @@ -111,7 +112,7 @@ def get_queue_commands(queue_type: str) -> Union[SchedulerCommands, None]: ) -class QueueAdapterCore(object): +class QueueAdapterCore(QueueAdapterAbstractClass): """ The goal of the QueueAdapter class is to make submitting to a queue system as easy as starting another sub process locally. diff --git a/pysqa/queueadapter.py b/pysqa/queueadapter.py index 2e3ca76..e02ed12 100644 --- a/pysqa/queueadapter.py +++ b/pysqa/queueadapter.py @@ -2,13 +2,15 @@ from typing import List, Optional, Tuple, Union import pandas +from jinja2 import Template +from pysqa.base.abstract import QueueAdapterAbstractClass from pysqa.base.config import QueueAdapterWithConfig, read_config from pysqa.base.core import execute_command from pysqa.ext.modular import ModularQueueAdapter -class QueueAdapter(object): +class QueueAdapter(QueueAdapterAbstractClass): """ The goal of the QueueAdapter class is to make submitting to a queue system as easy as starting another sub process locally. @@ -164,6 +166,7 @@ def submit_job( run_time_max: Optional[int] = None, dependency_list: Optional[List[str]] = None, command: Optional[str] = None, + submission_template: Optional[Union[str, Template]] = None, **kwargs, ) -> int: """ @@ -194,6 +197,7 @@ def submit_job( run_time_max=run_time_max, dependency_list=dependency_list, command=command, + submission_template=submission_template, **kwargs, )