mirror of http://git.sairate.top/sairate/doc.git
132 lines
4.8 KiB
Python
132 lines
4.8 KiB
Python
from typing import cast, Optional
|
|
|
|
from cerulean.credential import Credential
|
|
from cerulean.direct_gnu_scheduler import DirectGnuScheduler
|
|
from cerulean.file_system import FileSystem
|
|
from cerulean.local_file_system import LocalFileSystem
|
|
from cerulean.local_terminal import LocalTerminal
|
|
from cerulean.scheduler import Scheduler
|
|
from cerulean.sftp_file_system import SftpFileSystem
|
|
from cerulean.slurm_scheduler import SlurmScheduler
|
|
from cerulean.ssh_terminal import SshTerminal
|
|
from cerulean.terminal import Terminal
|
|
from cerulean.torque_scheduler import TorqueScheduler
|
|
from cerulean.webdav_file_system import WebdavFileSystem
|
|
|
|
|
|
def make_file_system(protocol: str, location: Optional[str] = None,
|
|
credential: Optional[Credential] = None
|
|
) -> FileSystem:
|
|
"""Make a file system object.
|
|
|
|
This is a factory function for FileSystem objects. It will \
|
|
instantiate a FileSystem implementation according to the parameters \
|
|
you give it.
|
|
|
|
FileSystems may hold resources, so you should either use this \
|
|
function with a ``with`` statement, or call :meth:`close` on the \
|
|
returned object when you are done with it.
|
|
|
|
Args:
|
|
protocol: The protocol to use to connect to the file system. \
|
|
Can be `local`, `sftp` or `webdav`. For `local`, \
|
|
location and credential can be omitted. For `webdav`, \
|
|
credential can be omitted.
|
|
location: The location in the form `hostname`, \
|
|
`hostname:port` or `http(s)://hostname:port/base_path` \
|
|
to connect to.
|
|
credential: The :class:`Credential` to use to connect with.
|
|
|
|
Returns:
|
|
An instance of a FileSystem representing the described file \
|
|
system.
|
|
|
|
"""
|
|
if protocol == 'local':
|
|
return LocalFileSystem()
|
|
elif protocol == 'sftp':
|
|
term = cast(SshTerminal, make_terminal('ssh', location, credential))
|
|
return SftpFileSystem(term, True)
|
|
elif protocol == 'webdav':
|
|
if location is None:
|
|
raise ValueError('WebDAV requires a location to connect to')
|
|
return WebdavFileSystem(location, credential)
|
|
else:
|
|
raise ValueError('Unknown protocol, use local, sftp or webdav')
|
|
|
|
|
|
def make_terminal(protocol: str, location: Optional[str] = None,
|
|
credential: Optional[Credential] = None
|
|
) -> Terminal:
|
|
"""Make a terminal object.
|
|
|
|
This is a factory function for Terminal objects. It will \
|
|
instantiate a Terminal implementation according to the parameters \
|
|
you give it.
|
|
|
|
Terminals may hold resources, so you should either use this \
|
|
function with a ``with`` statement, or call :meth:`close` on the \
|
|
returned object when you are done with it.
|
|
|
|
Args:
|
|
protocol: The protocol to use to connect to the file system. \
|
|
Can be `local` or `sftp`. For `local`, location and \
|
|
credential can be omitted.
|
|
location: The location in the form `hostname` or \
|
|
`hostname:port` to connect to.
|
|
credential: The :class:`Credential` to use to connect with.
|
|
|
|
Returns:
|
|
An instance of a FileSystem representing the described file \
|
|
system.
|
|
|
|
"""
|
|
if protocol == 'local':
|
|
return LocalTerminal()
|
|
elif protocol == 'ssh':
|
|
if location is None:
|
|
raise ValueError(
|
|
'The ssh protocol requires a location to connect to')
|
|
if credential is None:
|
|
raise ValueError(
|
|
'The ssh protocol requires a credential to connect with')
|
|
|
|
if ':' in location:
|
|
host = location.split(':')[0]
|
|
port = int(location.split(':')[1])
|
|
else:
|
|
host = location
|
|
port = 22
|
|
return SshTerminal(host, port, credential)
|
|
else:
|
|
raise ValueError('Unknown protocol, use either local or ssh')
|
|
|
|
|
|
def make_scheduler(name: str, terminal: Terminal, prefix: str = ''
|
|
) -> Scheduler:
|
|
"""Make a scheduler object.
|
|
|
|
This is a factory function for Scheduler objects. It will \
|
|
instantiate a Scheduler implementation according to the parameters \
|
|
you give it, which talks to the supplied Terminal.
|
|
|
|
Args:
|
|
name: The name of the scheduler. One of ``directgnu``,
|
|
``slurm``, or ``torque``.
|
|
terminal: The terminal this Scheduler will communicate on.
|
|
prefix: A string to prefix any shell commands with.
|
|
|
|
Returns:
|
|
The Scheduler.
|
|
|
|
"""
|
|
if name == 'directgnu':
|
|
return DirectGnuScheduler(terminal, prefix)
|
|
elif name == 'slurm':
|
|
return SlurmScheduler(terminal, prefix)
|
|
elif name == 'torque':
|
|
return TorqueScheduler(terminal, prefix)
|
|
else:
|
|
raise ValueError('Unknown scheduler type {} specified, expected one of'
|
|
' directgnu, slurm, or torque.'.format(name))
|