From 1655dcbe21dde20a13047b2f726d5d01a727e3a0 Mon Sep 17 00:00:00 2001
From: Sinisa Veseli <sveseli@aps.anl.gov>
Date: Tue, 14 Apr 2015 13:21:03 +0000
Subject: [PATCH] changed file processing interface; added support for relative
 file paths (with respect to daq directory)

---
 .../common/plugins/fileProcessorInterface.py  |  2 +-
 .../dm/common/plugins/fileTransferPlugin.py   | 33 ++++++++++++++-----
 .../common/plugins/rsyncFileTransferPlugin.py |  2 +-
 3 files changed, 26 insertions(+), 11 deletions(-)

diff --git a/src/python/dm/common/plugins/fileProcessorInterface.py b/src/python/dm/common/plugins/fileProcessorInterface.py
index 03546ebd..f9aef1ce 100755
--- a/src/python/dm/common/plugins/fileProcessorInterface.py
+++ b/src/python/dm/common/plugins/fileProcessorInterface.py
@@ -4,6 +4,6 @@ import abc
 class FileProcessorInterface:
 
     @abc.abstractmethod
-    def processFile(self, srcPath):
+    def processFile(self, filePath, daqPath, experiment):
         return NotImplemented
         
diff --git a/src/python/dm/common/plugins/fileTransferPlugin.py b/src/python/dm/common/plugins/fileTransferPlugin.py
index 969fd6d2..1b369025 100755
--- a/src/python/dm/common/plugins/fileTransferPlugin.py
+++ b/src/python/dm/common/plugins/fileTransferPlugin.py
@@ -1,5 +1,6 @@
 #!/usr/bin/env python
 
+import os
 from dm.common.utility.loggingManager import LoggingManager
 from dm.common.utility.dmSubprocess import DmSubprocess
 from dm.common.exceptions.invalidArgument import InvalidArgument
@@ -17,11 +18,17 @@ class FileTransferPlugin(FileProcessorInterface):
         self.command = command
         self.subprocess = None
 
-    def processFile(self, src):
-        self.start(src)
+    def processFile(self, filePath, daqPath, experiment):
+        storageHost = experiment.get('storageHost')
+        storageDirectory = experiment.get('storageDirectory')
+        dest = '%s:%s' % (storageHost, storageDirectory)
+        # Use relative path with respect to daq directory as a source
+        os.chdir(daqPath)
+        src = os.path.relpath(filePath, daqPath)
+        self.start(src, dest)
 
-    def getFullCommand(self):
-        return '%s %s %s' % (self.command, self.src, self.dest)
+    def getFullCommand(self, src, dest):
+        return '%s %s %s' % (self.command, src, dest)
 
     def setSrc(self, src):
         self.src = src
@@ -29,12 +36,20 @@ class FileTransferPlugin(FileProcessorInterface):
     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:
+    def start(self, src=None, dest=None):
+        # Use preconfigured source if provided source is None
+        fileSrc = src
+        if src is None:
+            fileSrc = self.src
+        # Use provided destination only if preconfigured destination is None
+        # Plugins may have desired destination preconfigured for all files
+        fileDest = self.dest
+        if self.dest is None:
+            fileDest = dest
+
+        if not fileSrc or not fileDest:
             raise InvalidRequest('Both source and destination must be non-empty strings.')
-        self.subprocess = DmSubprocess.getSubprocess(self.getFullCommand())
+        self.subprocess = DmSubprocess.getSubprocess(self.getFullCommand(fileSrc, fileDest))
         return self.subprocess.run()
 
     def wait(self):
diff --git a/src/python/dm/common/plugins/rsyncFileTransferPlugin.py b/src/python/dm/common/plugins/rsyncFileTransferPlugin.py
index 16b10a76..3550d0cf 100755
--- a/src/python/dm/common/plugins/rsyncFileTransferPlugin.py
+++ b/src/python/dm/common/plugins/rsyncFileTransferPlugin.py
@@ -3,7 +3,7 @@
 from fileTransferPlugin import FileTransferPlugin
 class RsyncFileTransferPlugin(FileTransferPlugin):
 
-    COMMAND = 'rsync -arvlP'
+    COMMAND = 'rsync -arvlPR'
 
     def __init__(self, src=None, dest=None):
         FileTransferPlugin.__init__(self, self.COMMAND, src, dest)
-- 
GitLab