From b3f3483bad6b2b52196f4305c4944386b5801d9a Mon Sep 17 00:00:00 2001 From: Sinisa Veseli <sveseli@aps.anl.gov> Date: Mon, 13 Apr 2015 13:32:18 +0000 Subject: [PATCH] initial fil transfer plugin interface and rsync implementation --- src/python/dm/common/plugins/__init__.py | 0 .../common/plugins/fileProcessorInterface.py | 9 +++ .../dm/common/plugins/fileTransferPlugin.py | 76 +++++++++++++++++++ .../common/plugins/rsyncFileTransferPlugin.py | 18 +++++ 4 files changed, 103 insertions(+) create mode 100644 src/python/dm/common/plugins/__init__.py create mode 100755 src/python/dm/common/plugins/fileProcessorInterface.py create mode 100755 src/python/dm/common/plugins/fileTransferPlugin.py create mode 100755 src/python/dm/common/plugins/rsyncFileTransferPlugin.py diff --git a/src/python/dm/common/plugins/__init__.py b/src/python/dm/common/plugins/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/python/dm/common/plugins/fileProcessorInterface.py b/src/python/dm/common/plugins/fileProcessorInterface.py new file mode 100755 index 00000000..03546ebd --- /dev/null +++ b/src/python/dm/common/plugins/fileProcessorInterface.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python + +import abc +class FileProcessorInterface: + + @abc.abstractmethod + def processFile(self, srcPath): + return NotImplemented + diff --git a/src/python/dm/common/plugins/fileTransferPlugin.py b/src/python/dm/common/plugins/fileTransferPlugin.py new file mode 100755 index 00000000..969fd6d2 --- /dev/null +++ b/src/python/dm/common/plugins/fileTransferPlugin.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python + +from dm.common.utility.loggingManager import LoggingManager +from dm.common.utility.dmSubprocess import DmSubprocess +from dm.common.exceptions.invalidArgument import InvalidArgument +from dm.common.exceptions.invalidRequest import InvalidRequest +from fileProcessorInterface import FileProcessorInterface + +class FileTransferPlugin(FileProcessorInterface): + + def __init__(self, command, src=None, dest=None): + self.src = src + self.dest = dest + self.logger = LoggingManager.getInstance().getLogger(self.__class__.__name__) + if command is None or not len(command): + raise InvalidArgument('File transfer command must be non-empty string.') + self.command = command + self.subprocess = None + + def processFile(self, src): + self.start(src) + + def getFullCommand(self): + return '%s %s %s' % (self.command, self.src, self.dest) + + def setSrc(self, src): + self.src = src + + def setDest(self, dest): + self.dest = dest + + def start(self, src=None): + if src is not None: + self.src = src + if not self.src or not self.dest: + raise InvalidRequest('Both source and destination must be non-empty strings.') + self.subprocess = DmSubprocess.getSubprocess(self.getFullCommand()) + return self.subprocess.run() + + def wait(self): + if self.subprocess: + return self.subprocess.wait() + return None + + def poll(self): + if self.subprocess: + return self.subprocess.poll() + return None + + def getStdOut(self): + if self.subprocess: + return self.subprocess.getStdOut() + return None + + + def getStdErr(self): + if self.subprocess: + return self.subprocess.getStdErr() + return None + + def getExitStatus(self): + if self.subprocess: + return self.subprocess.getExitStatus() + return None + + def reset(self): + self.subprocess = None + +####################################################################### +# Testing. +if __name__ == '__main__': + ft = FileTransfer('rsync -arv', '/tmp/xyz', '/tmp/xyz2') + ft.start() + print 'StdOut: ', ft.getStdOut() + print 'StdErr: ', ft.getStdErr() + print 'Exit Status: ', ft.getExitStatus() diff --git a/src/python/dm/common/plugins/rsyncFileTransferPlugin.py b/src/python/dm/common/plugins/rsyncFileTransferPlugin.py new file mode 100755 index 00000000..16b10a76 --- /dev/null +++ b/src/python/dm/common/plugins/rsyncFileTransferPlugin.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python + +from fileTransferPlugin import FileTransferPlugin +class RsyncFileTransferPlugin(FileTransferPlugin): + + COMMAND = 'rsync -arvlP' + + def __init__(self, src=None, dest=None): + FileTransferPlugin.__init__(self, self.COMMAND, src, dest) + +####################################################################### +# Testing. +if __name__ == '__main__': + ft = RsyncFileTransferPlugin('/tmp/xyz', '/tmp/xyz2') + ft.start() + print 'StdOut: ', ft.getStdOut() + print 'StdErr: ', ft.getStdErr() + print 'Exit Status: ', ft.getExitStatus() -- GitLab