"""GSIFTP module based on the GFAL2_StorageBase class.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function # from DIRAC from DIRAC.Resources.Storage.GFAL2_StorageBase import GFAL2_StorageBase from DIRAC import gLogger from DIRAC.Core.Utilities.Pfn import pfnparse, pfnunparse class GFAL2_GSIFTPStorage(GFAL2_StorageBase): """ .. class:: GFAL2_GSIFTPStorage GSIFTP interface to StorageElement using gfal2 """ _INPUT_PROTOCOLS = ['file', 'gsiftp'] _OUTPUT_PROTOCOLS = ['gsiftp'] def __init__(self, storageName, parameters): """ c'tor """ # # init base class super(GFAL2_GSIFTPStorage, self).__init__(storageName, parameters) self.srmSpecificParse = False self.log = gLogger.getSubLogger("GFAL2_GSIFTPStorage") self.pluginName = 'GFAL2_GSIFTP' # We don't need extended attributes for metadata self._defaultExtendedAttributes = None def __addDoubleSlash(self, res): """ Utilities to add the double slash between the host(:port) and the path :param res: DIRAC return structure which contains an URL if S_OK :return: DIRAC structure with corrected URL """ if not res['OK']: return res url = res['Value'] res = pfnparse(url, srmSpecific=self.srmSpecificParse) if not res['OK']: return res urlDict = res['Value'] urlDict['Path'] = '/' + urlDict['Path'] return pfnunparse(urlDict, srmSpecific=self.srmSpecificParse) def getURLBase(self, withWSUrl=False): """ Overwrite to add the double slash """ return self.__addDoubleSlash(super(GFAL2_GSIFTPStorage, self).getURLBase(withWSUrl=withWSUrl)) def constructURLFromLFN(self, lfn, withWSUrl=False): """ Overwrite to add the double slash """ return self.__addDoubleSlash(super(GFAL2_GSIFTPStorage, self).constructURLFromLFN(lfn=lfn, withWSUrl=withWSUrl)) def getCurrentURL(self, fileName): """ Overwrite to add the double slash """ return self.__addDoubleSlash(super(GFAL2_GSIFTPStorage, self).getCurrentURL(fileName))