Source code for laserfarm.pipeline_remote_data

import logging
import pathlib

from laserfarm.pipeline import Pipeline
from laserfarm.remote_utils import get_wdclient, purge_local, \
    pull_from_remote, push_to_remote
from laserfarm.utils import check_dir_exists


logger = logging.getLogger(__name__)


[docs] class PipelineRemoteData(Pipeline): """ Pipeline extension to deal with remote input/output """ _input_folder = pathlib.Path('.') _output_folder = pathlib.Path('.') _input_path = None _wdclient = None
[docs] def setup_local_fs(self, input_folder=None, output_folder=None, tmp_folder='.'): """ IO setup for the local file system. :param input_folder: path to input folder on local filesystem. :param output_folder: path to output folder on local filesystem. This folder is considered root for all output paths specified. :param tmp_folder: path of the temporary folder, used to set default input and output folders if not specified. """ tmp_path = pathlib.Path(tmp_folder) if input_folder is None: input_folder = tmp_path / '_'.join([self.label, 'input']) check_dir_exists(input_folder, should_exist=True, mkdir=True) self.input_folder = input_folder logger.info('Input dir set to {}'.format(self.input_folder)) if output_folder is None: output_folder = tmp_path / '_'.join([self.label, 'output']) check_dir_exists(output_folder, should_exist=True, mkdir=True) self.output_folder = output_folder logger.info( 'Output dir set to {}'.format(self.output_folder.as_posix()) ) if self.logger is not None: self.logger.start_log_to_file( directory=self.output_folder.as_posix() ) return self
[docs] def setup_webdav_client(self, webdav_options): self._wdclient = get_wdclient(webdav_options) return self
[docs] def pullremote(self, remote_origin): """ pull directory with input file(s) from remote to local fs :param remote_origin: path to directory on remote fs """ if self._wdclient is None: raise RuntimeError('WebDAV client not setup!') remote_path = pathlib.Path(remote_origin) local_path = self.input_path if self.input_path.absolute() != self.input_folder.absolute(): remote_path = remote_path / self.input_path.name if self.input_path.suffix: local_path = self.input_folder logger.info( 'Pulling from WebDAV {} ...'.format(remote_path.as_posix()) ) pull_from_remote(self._wdclient, local_path.as_posix(), remote_path.as_posix()) logger.info('... pulling completed.') return self
[docs] def pushremote(self, remote_destination): """ push directory with output from local fs to remote_dir :param remote_destination: path to remote target directory """ if self._wdclient is None: raise RuntimeError('WebDAV client not setup!') logger.info('Pushing to WebDAV {} ...'.format(remote_destination)) push_to_remote(self._wdclient, self.output_folder.as_posix(), remote_destination) logger.info('... pushing completed.') return self
[docs] def cleanlocalfs(self): """ remove pulled input and results (after push) """ logger.info('Removing input and output folders') purge_local(self.input_folder.as_posix()) purge_local(self.output_folder.as_posix()) return self
[docs] def run(self, pipeline=None): """ Run the (augmented) pipeline :param pipeline: (optional) Consider the input pipeline if provided """ _pipeline = pipeline if pipeline is not None else self.pipeline _pipeline = (('setup_local_fs', 'setup_webdav_client', 'pullremote') + _pipeline + ('pushremote', 'cleanlocalfs')) super(PipelineRemoteData, self).run(pipeline=_pipeline)
@property def input_folder(self): return self._input_folder @input_folder.setter def input_folder(self, input_folder): self._input_folder = pathlib.Path(input_folder) @property def output_folder(self): return self._output_folder @output_folder.setter def output_folder(self, output_folder): self._output_folder = pathlib.Path(output_folder) @property def input_path(self): path = self.input_folder if self._input_path is not None: path /= self._input_path return path @input_path.setter def input_path(self, path): self._input_path = pathlib.Path(path)