Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions pysqa/cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,16 @@
import json
import getopt
from pysqa.queueadapter import QueueAdapter
from pysqa.utils.execute import execute_command


def command_line(argv):
def command_line(argv, execute_command=execute_command):
"""
Parse the command line arguments.

Args:
argv: Command line arguments
execute_command: function to comunicate with shell process

"""
directory = "~/.queues"
Expand Down Expand Up @@ -94,7 +96,7 @@ def command_line(argv):
print("cmd.py help ... coming soon.")
sys.exit()
if mode_submit or mode_delete or mode_reservation or mode_status:
qa = QueueAdapter(directory=directory)
qa = QueueAdapter(directory=directory, execute_command=execute_command)
if mode_submit:
print(
qa.submit_job(
Expand Down
7 changes: 5 additions & 2 deletions pysqa/ext/modular.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@

import pandas
from pysqa.utils.basic import BasisQueueAdapter
from pysqa.utils.execute import execute_command


class ModularQueueAdapter(BasisQueueAdapter):
def __init__(self, config, directory="~/.queues"):
super(ModularQueueAdapter, self).__init__(config=config, directory=directory)
def __init__(self, config, directory="~/.queues", execute_command=execute_command):
super(ModularQueueAdapter, self).__init__(
config=config, directory=directory, execute_command=execute_command
)
self._queue_to_cluster_dict = {
k: v["cluster"] for k, v in self._config["queues"].items()
}
Expand Down
7 changes: 5 additions & 2 deletions pysqa/ext/remote.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,14 @@
import warnings
from tqdm import tqdm
from pysqa.utils.basic import BasisQueueAdapter
from pysqa.utils.execute import execute_command


class RemoteQueueAdapter(BasisQueueAdapter):
def __init__(self, config, directory="~/.queues"):
super(RemoteQueueAdapter, self).__init__(config=config, directory=directory)
def __init__(self, config, directory="~/.queues", execute_command=execute_command):
super(RemoteQueueAdapter, self).__init__(
config=config, directory=directory, execute_command=execute_command
)
self._ssh_host = config["ssh_host"]
self._ssh_username = config["ssh_username"]
self._ssh_known_hosts = os.path.abspath(
Expand Down
22 changes: 16 additions & 6 deletions pysqa/queueadapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from pysqa.ext.modular import ModularQueueAdapter
from pysqa.ext.remote import RemoteQueueAdapter
from pysqa.utils.config import read_config
from pysqa.utils.execute import execute_command

__author__ = "Jan Janssen"
__copyright__ = "Copyright 2019, Jan Janssen"
Expand Down Expand Up @@ -44,14 +45,16 @@ class QueueAdapter(object):
Queues available for auto completion QueueAdapter().queues.<queue name> returns the queue name.
"""

def __init__(self, directory="~/.queues"):
def __init__(self, directory="~/.queues", execute_command=execute_command):
queue_yaml = os.path.join(directory, "queue.yaml")
clusters_yaml = os.path.join(directory, "clusters.yaml")
self._adapter = None
if os.path.exists(queue_yaml):
self._queue_dict = {
"default": set_queue_adapter(
config=read_config(file_name=queue_yaml), directory=directory
config=read_config(file_name=queue_yaml),
directory=directory,
execute_command=execute_command,
)
}
primary_queue = "default"
Expand All @@ -61,6 +64,7 @@ def __init__(self, directory="~/.queues"):
k: set_queue_adapter(
config=read_config(file_name=os.path.join(directory, v)),
directory=directory,
execute_command=execute_command,
)
for k, v in config["cluster"].items()
}
Expand Down Expand Up @@ -296,7 +300,7 @@ def check_queue_parameters(
)


def set_queue_adapter(config, directory):
def set_queue_adapter(config, directory, execute_command=execute_command):
"""
Initialize the queue adapter

Expand All @@ -305,10 +309,16 @@ def set_queue_adapter(config, directory):
directory (str): directory which contains the queue configurations
"""
if config["queue_type"] in ["SGE", "TORQUE", "SLURM", "LSF", "MOAB"]:
return BasisQueueAdapter(config=config, directory=directory)
return BasisQueueAdapter(
config=config, directory=directory, execute_command=execute_command
)
elif config["queue_type"] in ["GENT"]:
return ModularQueueAdapter(config=config, directory=directory)
return ModularQueueAdapter(
config=config, directory=directory, execute_command=execute_command
)
elif config["queue_type"] in ["REMOTE"]:
return RemoteQueueAdapter(config=config, directory=directory)
return RemoteQueueAdapter(
config=config, directory=directory, execute_command=execute_command
)
else:
raise ValueError
57 changes: 57 additions & 0 deletions tests/test_cmd.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import os
import unittest
from pysqa.cmd import command_line


class TestCMD(unittest.TestCase):
def test_help(self):
with self.assertRaises(SystemExit):
command_line(["--help"])

def test_wrong_option(self):
with self.assertRaises(SystemExit):
command_line(["--error"])

def test_submit(self):
def execute_command(
commands,
working_directory=None,
split_output=True,
shell=False,
error_filename="pysqa.err",
):
return "1\n"

test_dir = os.path.abspath(os.path.dirname(__file__))
with self.assertRaises(SystemExit):
command_line(
[
"--config_directory", os.path.join(test_dir, "config", "slurm"),
"--submit",
"--queue", "slurm",
"--job_name", "test",
"--working_directory", ".",
"--cores", "2",
"--memory", "1GB",
"--run_time", "10",
"--command", "echo hello"
],
execute_command=execute_command
)
with open("run_queue.sh") as f:
output = f.readlines()
content = [
'#!/bin/bash\n',
'#SBATCH --output=time.out\n',
'#SBATCH --job-name=test\n',
'#SBATCH --chdir=.\n',
'#SBATCH --get-user-env=L\n',
'#SBATCH --partition=slurm\n',
'#SBATCH --time=4320\n',
'#SBATCH --mem=1GBG\n',
'#SBATCH --cpus-per-task=10\n',
'\n',
'echo hello'
]
self.assertEqual(output, content)
os.remove("run_queue.sh")