本文整理汇总了Python中DIRAC.DataManagementSystem.Client.DataManager.DataManager.getReplicasForJobs方法的典型用法代码示例。如果您正苦于以下问题:Python DataManager.getReplicasForJobs方法的具体用法?Python DataManager.getReplicasForJobs怎么用?Python DataManager.getReplicasForJobs使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类DIRAC.DataManagementSystem.Client.DataManager.DataManager
的用法示例。
在下文中一共展示了DataManager.getReplicasForJobs方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: getFilesToStage
# 需要导入模块: from DIRAC.DataManagementSystem.Client.DataManager import DataManager [as 别名]
# 或者: from DIRAC.DataManagementSystem.Client.DataManager.DataManager import getReplicasForJobs [as 别名]
def getFilesToStage( lfnList, jobState = None, checkOnlyTapeSEs = None, jobLog = None ):
""" Utility that returns out of a list of LFNs those files that are offline,
and those for which at least one copy is online
"""
if not lfnList:
return S_OK( {'onlineLFNs':[], 'offlineLFNs': {}, 'failedLFNs':[], 'absentLFNs':{}} )
dm = DataManager()
if isinstance( lfnList, basestring ):
lfnList = [lfnList]
lfnListReplicas = dm.getReplicasForJobs( lfnList, getUrl = False )
if not lfnListReplicas['OK']:
return lfnListReplicas
offlineLFNsDict = {}
onlineLFNs = {}
offlineLFNs = {}
absentLFNs = {}
failedLFNs = set()
if lfnListReplicas['Value']['Failed']:
# Check if files are not existing
for lfn, reason in lfnListReplicas['Value']['Failed'].iteritems():
# FIXME: awful check until FC returns a proper error
if cmpError( reason, errno.ENOENT ) or 'No such file' in reason:
# The file doesn't exist, job must be Failed
# FIXME: it is not possible to return here an S_ERROR(), return the message only
absentLFNs[lfn] = S_ERROR( errno.ENOENT, 'File not in FC' )['Message']
if absentLFNs:
return S_OK({'onlineLFNs': list(onlineLFNs),
'offlineLFNs': offlineLFNsDict,
'failedLFNs': list(failedLFNs),
'absentLFNs': absentLFNs})
return S_ERROR( "Failures in getting replicas" )
lfnListReplicas = lfnListReplicas['Value']['Successful']
# If a file is reported here at a tape SE, it is not at a disk SE as we use disk in priority
# We shall check all file anyway in order to make sure they exist
seToLFNs = dict()
for lfn, ses in lfnListReplicas.iteritems():
for se in ses:
seToLFNs.setdefault( se, list() ).append( lfn )
if seToLFNs:
if jobState:
# Get user name and group from the job state
userName = jobState.getAttribute( 'Owner' )
if not userName[ 'OK' ]:
return userName
userName = userName['Value']
userGroup = jobState.getAttribute( 'OwnerGroup' )
if not userGroup[ 'OK' ]:
return userGroup
userGroup = userGroup['Value']
else:
userName = None
userGroup = None
# Check whether files are Online or Offline, or missing at SE
result = _checkFilesToStage( seToLFNs, onlineLFNs, offlineLFNs, absentLFNs, # pylint: disable=unexpected-keyword-arg
checkOnlyTapeSEs = checkOnlyTapeSEs, jobLog = jobLog,
proxyUserName = userName,
proxyUserGroup = userGroup,
executionLock = True )
if not result['OK']:
return result
failedLFNs = set( lfnList ) - set( onlineLFNs ) - set( offlineLFNs ) - set( absentLFNs )
# Get the online SEs
dmsHelper = DMSHelpers()
onlineSEs = set( se for ses in onlineLFNs.values() for se in ses )
onlineSites = set( dmsHelper.getLocalSiteForSE( se ).get( 'Value' ) for se in onlineSEs ) - {None}
for lfn in offlineLFNs:
ses = offlineLFNs[lfn]
if len( ses ) == 1:
# No choice, let's go
offlineLFNsDict.setdefault( ses[0], list() ).append( lfn )
continue
# Try and get an SE at a site already with online files
found = False
if onlineSites:
# If there is at least one online site, select one
for se in ses:
site = dmsHelper.getLocalSiteForSE( se )
if site['OK']:
if site['Value'] in onlineSites:
offlineLFNsDict.setdefault( se, list() ).append( lfn )
found = True
break
# No online site found in common, select randomly
if not found:
offlineLFNsDict.setdefault( random.choice( ses ), list() ).append( lfn )
return S_OK({'onlineLFNs': list(onlineLFNs),
'offlineLFNs': offlineLFNsDict,
'failedLFNs': list(failedLFNs),
'absentLFNs': absentLFNs,
'onlineSites': onlineSites})