doc/.venv/Lib/site-packages/cerulean/factory.py

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))