From 99f27032c24473f6d628333751653e4dbef980a7 Mon Sep 17 00:00:00 2001
From: Sinisa Veseli <sveseli@aps.anl.gov>
Date: Wed, 25 Nov 2015 20:27:50 +0000
Subject: [PATCH] changes to allow specifying file server (gridftp) url from
 the command line

---
 src/python/dm/common/objects/observedFile.py    |  4 +++-
 .../plugins/gridftpFileTransferPlugin.py        | 15 +++++++++++----
 src/python/dm/common/utility/ftpUtility.py      | 17 +++++++++++++++++
 .../service/impl/ftpFileSystemObserverAgent.py  |  6 ++++--
 4 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/src/python/dm/common/objects/observedFile.py b/src/python/dm/common/objects/observedFile.py
index a183351c..02de1c75 100755
--- a/src/python/dm/common/objects/observedFile.py
+++ b/src/python/dm/common/objects/observedFile.py
@@ -3,6 +3,7 @@
 import time
 import os
 from dmObject import DmObject
+import urlparse
 
 class ObservedFile(DmObject):
 
@@ -15,7 +16,8 @@ class ObservedFile(DmObject):
         if dataDirectory:
             self['dataDirectory'] = dataDirectory
             if filePath:
-                self['experimentFilePath'] = os.path.relpath(filePath, dataDirectory)
+                parseResult = urlparse.urlparse(dataDirectory)
+                self['experimentFilePath'] = os.path.relpath(filePath, parseResult.path)
         if experiment:
             self['experiment'] = experiment
 
diff --git a/src/python/dm/common/processing/plugins/gridftpFileTransferPlugin.py b/src/python/dm/common/processing/plugins/gridftpFileTransferPlugin.py
index 37ac10a7..594ebd66 100755
--- a/src/python/dm/common/processing/plugins/gridftpFileTransferPlugin.py
+++ b/src/python/dm/common/processing/plugins/gridftpFileTransferPlugin.py
@@ -2,23 +2,30 @@
 
 import os
 from fileTransferPlugin import FileTransferPlugin
+from dm.common.utility.ftpUtility import FtpUtility
 
 class GridftpFileTransferPlugin(FileTransferPlugin):
 
-    COMMAND = 'globus-url-copy -c -cd -r -vb -tcp-bs 512K -p 1 -sync -sync-level 1'
+    DEFAULT_COMMAND = 'globus-url-copy -c -cd -r -vb -tcp-bs 512K -p 1 -sync -sync-level 2'
+    DEFAULT_PORT = 2811
 
-    def __init__(self, src=None, dest=None, command=COMMAND):
+
+    def __init__(self, src=None, dest=None, command=DEFAULT_COMMAND):
         FileTransferPlugin.__init__(self, command, src, dest)
 
     def getSrcUrl(self, filePath, dataDirectory):
-        if self.src is None:
+        (scheme, host, port, dirPath) = FtpUtility.parseFtpUrl(dataDirectory, defaultPort=self.DEFAULT_PORT)
+        if scheme:
+            srcUrl = '%s://%s:%s/%s' % (scheme, host, port, filePath)
+        elif self.src is None:
             srcUrl = 'file://%s' % filePath
         else:
             srcUrl = '%s/%s' % (self.src,filePath)
         return srcUrl
     
     def getDestUrl(self, filePath, dataDirectory, storageHost, storageDirectory):
-        dirName = os.path.dirname(os.path.relpath(filePath, dataDirectory)).strip()
+        (scheme, host, port, dirPath) = FtpUtility.parseFtpUrl(dataDirectory, defaultPort=self.DEFAULT_PORT)
+        dirName = os.path.dirname(os.path.relpath(filePath, dirPath)).strip()
         fileName = os.path.basename(filePath)
         destUrl = 'sshftp://%s/%s/%s/%s' % (storageHost, storageDirectory, dirName, fileName)
         return destUrl
diff --git a/src/python/dm/common/utility/ftpUtility.py b/src/python/dm/common/utility/ftpUtility.py
index 16c48845..ab6f0314 100755
--- a/src/python/dm/common/utility/ftpUtility.py
+++ b/src/python/dm/common/utility/ftpUtility.py
@@ -3,6 +3,7 @@
 import copy
 from ftplib import FTP
 from dm.common.utility.loggingManager import LoggingManager
+import urlparse
 
 class FtpUtility:
 
@@ -13,6 +14,22 @@ class FtpUtility:
         self.password = password
         self.ftpClient = None
 
+    @classmethod
+    def parseFtpUrl(cls, url, defaultHost=None, defaultPort=None):
+        host = defaultHost
+        port = defaultPort
+        scheme = None
+        dirPath = url
+        if url.startswith('ftp://'):
+            parseResult = urlparse.urlparse(url)
+            scheme = parseResult.scheme
+            netlocTokens = parseResult.netloc.split(':')
+            host = netlocTokens[0]
+            if len(netlocTokens) > 1:
+                port = int(netlocTokens[1])
+            dirPath = parseResult.path
+        return (scheme, host, port, dirPath)
+
     @classmethod
     def getFtpClient(cls, host, port, username=None, password=None):
         ftp = FTP()
diff --git a/src/python/dm/daq_web_service/service/impl/ftpFileSystemObserverAgent.py b/src/python/dm/daq_web_service/service/impl/ftpFileSystemObserverAgent.py
index d7580914..b70cbd70 100755
--- a/src/python/dm/daq_web_service/service/impl/ftpFileSystemObserverAgent.py
+++ b/src/python/dm/daq_web_service/service/impl/ftpFileSystemObserverAgent.py
@@ -19,8 +19,10 @@ class FtpFileSystemObserverAgent(FileSystemObserverAgent):
         self.isDone = False
 
     def getFiles(self, dataDirectory):
-        ftpUtility = FtpUtility(self.host, self.port, self.username, self.password)
-        return ftpUtility.getFiles(dataDirectory, {})
+        (scheme, host, port, dirPath) = FtpUtility.parseFtpUrl(dataDirectory, defaultHost=self.host, defaultPort=self.port)
+        self.logger.debug('Retrieving files from FTP host: %s, port: %s, directory path: %s' % (host, port, dirPath))
+        ftpUtility = FtpUtility(host, port, self.username, self.password)
+        return ftpUtility.getFiles(dirPath, {})
 
     def updateFile(self, filePath, dataDirectory, experiment):
         if self.fileSystemObserver:
-- 
GitLab