Skip to content
Snippets Groups Projects
Commit 691ee9fc authored by sveseli's avatar sveseli
Browse files

merged fixes from 0.8

parents d98298f4 eaa5ad5c
No related branches found
No related tags found
No related merge requests found
...@@ -18,8 +18,8 @@ from dm.common.utility import loggingManager ...@@ -18,8 +18,8 @@ from dm.common.utility import loggingManager
class DmObject(UserDict.UserDict): class DmObject(UserDict.UserDict):
""" Base dm object class. """ """ Base dm object class. """
ALL_KEYS = '__all__' ALL_KEYS = 'ALL'
DEFAULT_KEYS = '__default__' DEFAULT_KEYS = 'DEFAULT'
DICT_DISPLAY_FORMAT = 'dict' DICT_DISPLAY_FORMAT = 'dict'
TEXT_DISPLAY_FORMAT = 'text' TEXT_DISPLAY_FORMAT = 'text'
......
...@@ -4,6 +4,7 @@ import os ...@@ -4,6 +4,7 @@ import os
from fileTransferPlugin import FileTransferPlugin from fileTransferPlugin import FileTransferPlugin
from dm.common.utility.fileUtility import FileUtility from dm.common.utility.fileUtility import FileUtility
from dm.common.utility.ftpUtility import FtpUtility from dm.common.utility.ftpUtility import FtpUtility
from dm.common.utility.sftpUtility import SftpUtility
from dm.common.exceptions.fileProcessingError import FileProcessingError from dm.common.exceptions.fileProcessingError import FileProcessingError
from dm.common.utility.dmSubprocess import DmSubprocess from dm.common.utility.dmSubprocess import DmSubprocess
from dm.ds_web_service.api.dsRestApiFactory import DsRestApiFactory from dm.ds_web_service.api.dsRestApiFactory import DsRestApiFactory
...@@ -43,30 +44,30 @@ class GridftpFileTransferPlugin(FileTransferPlugin): ...@@ -43,30 +44,30 @@ class GridftpFileTransferPlugin(FileTransferPlugin):
storageDirectory = uploadInfo['storageDirectory'] storageDirectory = uploadInfo['storageDirectory']
dataDirectory = uploadInfo['dataDirectory'] dataDirectory = uploadInfo['dataDirectory']
self.logger.debug('Upload info: %s', uploadInfo) self.logger.debug('Upload info: %s', uploadInfo)
#(scheme, host, port, dirPath) = FtpUtility.parseFtpUrl(storageUrl, defaultPort=self.DEFAULT_PORT) # Original data directory may contain host/port
ftpUtility = FtpUtility(storageHost, self.DEFAULT_PORT) (scheme, host, port, replacementDirPath) = FtpUtility.parseFtpUrl(dataDirectory)
storageFilePathsDict = ftpUtility.getFiles(storageDirectory, {}) ftpUtility = SftpUtility(storageHost)
storageFilePathsDict = ftpUtility.getFiles(storageDirectory, {}, replacementDirPath)
pluginFilePathsDict = {} pluginFilePathsDict = {}
filePaths = filePathsDict.keys() filePaths = filePathsDict.keys()
for filePath in filePaths: for filePath in filePaths:
filePathDict = filePathsDict.get(filePath) filePathDict = filePathsDict.get(filePath)
experimentFilePath = os.path.relpath(filePath, dataDirectory) storageFilePathDict = storageFilePathsDict.get(filePath)
storageFilePath = os.path.join(storageDirectory, experimentFilePath)
storageFilePathDict = storageFilePathsDict.get(storageFilePath)
if not storageFilePathDict: if not storageFilePathDict:
# remote directory does not have the file # remote directory does not have the file
pluginFilePathsDict[filePath] = filePathDict pluginFilePathsDict[filePath] = filePathDict
else: else:
fSize = filePathDict.get('Size') fSize = filePathDict.get('fileSize')
sfSize = storageFilePathDict.get('Size') sfSize = storageFilePathDict.get('fileSize')
# check size # check size
if not fSize or not sfSize or fSize != sfSize: if not fSize or not sfSize or fSize != sfSize:
pluginFilePathsDict[filePath] = filePathDict pluginFilePathsDict[filePath] = filePathDict
else: else:
# sizes are the same, check modify time # sizes are the same, check modify time
mTime = filePathDict.get('Modify') mTime = filePathDict.get('fileModificationTime')
sfTime = storageFilePathDict.get('Modify') smTime = storageFilePathDict.get('fileModificationTime')
if not mTime or not sfTime or mTime > sfTime: if not mTime or not smTime or mTime > smTime:
pluginFilePathsDict[filePath] = filePathDict pluginFilePathsDict[filePath] = filePathDict
self.logger.debug('Number of original files: %s, number of plugin files: %s', len(filePathsDict), len(pluginFilePathsDict)) self.logger.debug('Number of original files: %s, number of plugin files: %s', len(filePathsDict), len(pluginFilePathsDict))
......
...@@ -10,12 +10,13 @@ import urlparse ...@@ -10,12 +10,13 @@ import urlparse
class FtpUtility: class FtpUtility:
def __init__(self, host, port, username=None, password=None): def __init__(self, host, port, username=None, password=None, serverUsesUtcTime=True):
self.host = host self.host = host
self.port = port self.port = port
self.username = username self.username = username
self.password = password self.password = password
self.ftpClient = None self.ftpClient = None
self.serverUsesUtcTime = serverUsesUtcTime
self.mlsdFileStatDict = {} self.mlsdFileStatDict = {}
@classmethod @classmethod
...@@ -47,9 +48,11 @@ class FtpUtility: ...@@ -47,9 +48,11 @@ class FtpUtility:
return logger return logger
def __parseKeyValue(cls, keyValue, outputDict={}): def __parseKeyValue(cls, origKeyValue, outputDict={}, newKey=None):
key,value = keyValue.split('=') key,value = origKeyValue.split('=')
value = value.strip() value = value.strip()
if newKey is not None:
key = newKey
outputDict[key] = value outputDict[key] = value
return outputDict return outputDict
...@@ -59,7 +62,7 @@ class FtpUtility: ...@@ -59,7 +62,7 @@ class FtpUtility:
parseDict = {} parseDict = {}
self.__parseKeyValue(parts[0], parseDict) self.__parseKeyValue(parts[0], parseDict)
self.__parseKeyValue(parts[1], parseDict) self.__parseKeyValue(parts[1], parseDict)
self.__parseKeyValue(parts[2], parseDict) self.__parseKeyValue(parts[2], parseDict, 'fileSize')
name = parts[-1].strip() name = parts[-1].strip()
parseDict['Name'] = name parseDict['Name'] = name
type = parseDict.get('Type', '') type = parseDict.get('Type', '')
...@@ -74,23 +77,39 @@ class FtpUtility: ...@@ -74,23 +77,39 @@ class FtpUtility:
parseDict = {} parseDict = {}
self.__parseKeyValue(parts[0], parseDict) self.__parseKeyValue(parts[0], parseDict)
self.__parseKeyValue(parts[1], parseDict) self.__parseKeyValue(parts[1], parseDict)
self.__parseKeyValue(parts[2], parseDict) self.__parseKeyValue(parts[2], parseDict, 'fileSize')
name = parts[-1].strip() name = parts[-1].strip()
self.mlsdFileStatDict[name] = parseDict self.mlsdFileStatDict[name] = parseDict
def getFiles(self, dirPath, fileDict={}): def __processFileStatDict(self, fileStatDict):
modifyTime = fileStatDict.get('Modify')
modifyTime = time.mktime(time.strptime(modifyTime, '%Y%m%d%H%M%S'))
if self.serverUsesUtcTime:
modifyTime = TimeUtility.utcToLocalTime(modifyTime)
fileStatDict['fileModificationTime'] = modifyTime
fileStatDict['fileModificationTimeStamp'] = TimeUtility.formatLocalTimeStamp(modifyTime)
fileStatDict['fileSize'] = int(fileStatDict.get('fileSize'))
del fileStatDict['Modify']
del fileStatDict['Type']
def getFiles(self, dirPath, fileDict={}, replacementDirPath=None):
if not self.ftpClient: if not self.ftpClient:
self.ftpClient = self.getFtpClient(self.host, self.port, self.username, self.password) self.ftpClient = self.getFtpClient(self.host, self.port, self.username, self.password)
# Need these to be class members for the callback function # Need these to be class members for the callback function
self.mlsdFileDict = {} self.mlsdFileDict = {}
self.mlsdDirList = [] self.mlsdDirList = []
self.ftpClient.retrlines('MLSD %s' % dirPath, self.__parseMlsdOutput) self.ftpClient.retrlines('MLSD %s' % dirPath, self.__parseMlsdOutput)
if not replacementDirPath:
replacementDirPath = dirPath
for (fileName,fileInfo) in self.mlsdFileDict.items(): for (fileName,fileInfo) in self.mlsdFileDict.items():
filePath = '%s/%s' % (dirPath, fileName) self.__processFileStatDict(fileInfo)
del fileInfo['Name']
filePath = '%s/%s' % (replacementDirPath, fileName)
fileDict[filePath] = fileInfo fileDict[filePath] = fileInfo
for d in copy.copy(self.mlsdDirList): for d in copy.copy(self.mlsdDirList):
dirPath2 = '%s/%s' % (dirPath,d) dirPath2 = '%s/%s' % (dirPath,d)
self.getFiles(dirPath2,fileDict) replacementDirPath2 = '%s/%s' % (replacementDirPath,d)
self.getFiles(dirPath2,fileDict, replacementDirPath2)
return fileDict return fileDict
def getMd5Sum(self, filePath, fileInfo={}): def getMd5Sum(self, filePath, fileInfo={}):
...@@ -108,11 +127,8 @@ class FtpUtility: ...@@ -108,11 +127,8 @@ class FtpUtility:
self.ftpClient.retrlines('MLSD %s' % filePath, self.__parseMlsdFileStat) self.ftpClient.retrlines('MLSD %s' % filePath, self.__parseMlsdFileStat)
fileStatDict = self.mlsdFileStatDict.get(fileName) fileStatDict = self.mlsdFileStatDict.get(fileName)
if fileStatDict: if fileStatDict:
fileInfo['fileSize'] = fileStatDict.get('Size') self.__processFileStatDict(fileStatDict)
modifyTime = fileStatDict.get('Modify') fileInfo.update(fileStatDict)
modifyTime = time.mktime(time.strptime(modifyTime, '%Y%m%d%H%M%S'))
fileInfo['fileModificationTime'] = modifyTime
fileInfo['fileModificationTimeStamp'] = TimeUtility.formatLocalTimeStamp(modifyTime)
del self.mlsdFileStatDict[fileName] del self.mlsdFileStatDict[fileName]
return fileInfo return fileInfo
...@@ -123,5 +139,7 @@ if __name__ == '__main__': ...@@ -123,5 +139,7 @@ if __name__ == '__main__':
ftpUtility = FtpUtility('s8dserv', 2811) ftpUtility = FtpUtility('s8dserv', 2811)
files = ftpUtility.getFiles('/export/8-id-i/test') files = ftpUtility.getFiles('/export/8-id-i/test')
print files print files
files = ftpUtility.getFiles('/export/8-id-i/test', replacementDirPath='/data/testing/8-id-i')
print files
print ftpUtility.getMd5Sum('/export/8-id-i/test/testfile01') print ftpUtility.getMd5Sum('/export/8-id-i/test/testfile01')
print ftpUtility.statFile('/export/8-id-i/test/testfile01') print ftpUtility.statFile('/export/8-id-i/test/testfile01')
...@@ -45,6 +45,10 @@ class TimeUtility: ...@@ -45,6 +45,10 @@ class TimeUtility:
def utcToLocalTime(cls, utc): def utcToLocalTime(cls, utc):
if cls.UTC_MINUS_LOCAL_TIME is None: if cls.UTC_MINUS_LOCAL_TIME is None:
cls.UTC_MINUS_LOCAL_TIME = (datetime.datetime.utcnow()-datetime.datetime.now()).total_seconds() cls.UTC_MINUS_LOCAL_TIME = (datetime.datetime.utcnow()-datetime.datetime.now()).total_seconds()
if cls.UTC_MINUS_LOCAL_TIME > 0:
cls.UTC_MINUS_LOCAL_TIME = int(cls.UTC_MINUS_LOCAL_TIME+0.5)
else:
cls.UTC_MINUS_LOCAL_TIME = int(cls.UTC_MINUS_LOCAL_TIME-0.5)
localTime = utc - cls.UTC_MINUS_LOCAL_TIME localTime = utc - cls.UTC_MINUS_LOCAL_TIME
return localTime return localTime
......
...@@ -38,9 +38,9 @@ class FtpFileSystemObserverAgent(FileSystemObserverAgent): ...@@ -38,9 +38,9 @@ class FtpFileSystemObserverAgent(FileSystemObserverAgent):
else: else:
# old file, check timestamp # old file, check timestamp
oldFileInfo = oldFileDict.get(filePath) oldFileInfo = oldFileDict.get(filePath)
oldModifyTime = oldFileInfo.get('Modify', '') oldModifyTime = oldFileInfo.get('fileModificationTime', '')
fileInfo = fileDict.get(filePath) fileInfo = fileDict.get(filePath)
modifyTime = fileInfo.get('Modify') modifyTime = fileInfo.get('fileModificationTime')
if modifyTime != oldModifyTime: if modifyTime != oldModifyTime:
# file has been modified, need to process it # file has been modified, need to process it
self.logger.debug('Modified file path detected: %s' % filePath) self.logger.debug('Modified file path detected: %s' % filePath)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment