Forked from
DM / dm-docs
261 commits behind, 603 commits ahead of the upstream repository.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
fileRestApi.py 3.71 KiB
#!/usr/bin/env python
import os
import urllib
import json
import getpass
from dm.common.utility.encoder import Encoder
from dm.common.exceptions.dmException import DmException
from dm.common.exceptions.invalidRequest import InvalidRequest
from dm.common.objects.fileMetadata import FileMetadata
from dm.common.objects.experiment import Experiment
from dm.common.utility.rsyncFileTransfer import RsyncFileTransfer
from dsRestApi import DsRestApi
class FileRestApi(DsRestApi):
def __init__(self, username=None, password=None, host=None, port=None, protocol=None):
DsRestApi.__init__(self, username, password, host, port, protocol)
@DsRestApi.execute
def processFile(self, experimentFilePath, experimentName, fileInfo={}):
url = '%s/files/processFile' % (self.getContextRoot())
if not experimentFilePath:
raise InvalidRequest('Experiment file path must be provided.')
if not experimentName:
raise InvalidRequest('Experiment name must be provided.')
fileInfo['experimentFilePath'] = experimentFilePath
fileInfo['experimentName'] = experimentName
url += '?fileInfo=%s' % (Encoder.encode(json.dumps(fileInfo)))
responseDict = self.sendSessionRequest(url=url, method='POST')
return FileMetadata(responseDict)
@DsRestApi.execute
def statFile(self, experimentFilePath, experimentName, fileInfo={}):
url = '%s/files/statFile' % (self.getContextRoot())
if not experimentFilePath:
raise InvalidRequest('Experiment file path must be provided.')
if not experimentName:
raise InvalidRequest('Experiment name must be provided.')
fileInfo['experimentFilePath'] = experimentFilePath
fileInfo['experimentName'] = experimentName
url += '?fileInfo=%s' % (Encoder.encode(json.dumps(fileInfo)))
responseDict = self.sendSessionRequest(url=url, method='POST')
return FileMetadata(responseDict)
@DsRestApi.execute
def download(self, experimentName, experimentFilePath='', destDirectory='.'):
username = getpass.getuser()
# Initialize download
url = '%s/downloadAuthorizations/%s/%s' % (self.getContextRoot(), username, experimentName)
if not experimentName:
raise InvalidRequest('Experiment name must be provided.')
self.logger.info('Authorizing download for user %s (experiment: %s)' % (username, experimentName))
responseDict = self.sendSessionRequest(url=url, method='POST')
experiment = Experiment(responseDict)
# Download
try:
storageDirectory = experiment.get('storageDirectory')
storageHost = experiment.get('storageHost')
src = '%s@%s:%s' % (username, storageHost, storageDirectory)
if experimentFilePath:
src = '%s/%s' % (src, experimentFilePath)
dest = destDirectory
rsyncPath = '/tmp/rsync.%s.%s' % (username, experimentName)
flags = '-arvlP --rsync-path="%s"' % rsyncPath
fileTransfer = RsyncFileTransfer(src=src, dest=dest, flags=flags)
self.logger.info('Executing file download on behalf of %s (experiment: %s)' % (username, experimentName))
fileTransfer.execute()
finally:
# Finalize download
self.logger.info('Deleting download authorization for user %s (experiment: %s)' % (username, experimentName))
self.sendSessionRequest(url=url, method='DELETE')
#######################################################################
# Testing.
if __name__ == '__main__':
api = FileRestApi('sveseli', 'sveseli', 'zagreb.svdev.net', 22236, 'http')
print api.processFile('file1', '/ESAF/exp1', 'exp1')