Esempio n. 1
0
def getLocationOrderedCatalogs( siteName = '' ):
  # First get a list of the active catalogs and their location
  res = getActiveCatalogs()
  if not res['OK']:
    gLogger.error( "Failed to get list of active catalogs", res['Message'] )
    return res
  catalogDict = res['Value']
  # Get the tier1 associated to the current location
  if not siteName:
    import DIRAC
    siteName = DIRAC.siteName()
  countryCode = siteName.split( '.' )[-1]
  res = getCountryMappingTier1( countryCode )
  if not res['OK']:
    gLogger.error( "Failed to resolve closest Tier1", res['Message'] )
    return res
  tier1 = res['Value']
  # Create a sorted list of the active readonly catalogs
  catalogList = []
  if catalogDict.has_key( tier1 ):
    catalogList.append( catalogDict[tier1] )
    catalogDict.pop( tier1 )
  for catalogURL in randomize( catalogDict.values() ):
    catalogList.append( catalogURL )
  return S_OK( catalogList )
Esempio n. 2
0
def getLocationOrderedCatalogs(siteName=''):
    # First get a list of the active catalogs and their location
    res = getActiveCatalogs()
    if not res['OK']:
        gLogger.error("Failed to get list of active catalogs", res['Message'])
        return res
    catalogDict = res['Value']
    # Get the tier1 associated to the current location
    if not siteName:
        import DIRAC
        siteName = DIRAC.siteName()
    countryCode = siteName.split('.')[-1]
    res = getCountryMappingTier1(countryCode)
    if not res['OK']:
        gLogger.error("Failed to resolve closest Tier1", res['Message'])
        return res
    tier1 = res['Value']
    # Create a sorted list of the active readonly catalogs
    catalogList = []
    if catalogDict.has_key(tier1):
        catalogList.append(catalogDict[tier1])
        catalogDict.pop(tier1)
    for catalogURL in randomize(catalogDict.values()):
        catalogList.append(catalogURL)
    return S_OK(catalogList)
Esempio n. 3
0
 def __init__(self, useCertificates = False):
   """ Constructor of the RequestClient class
   """
   self.localUrl = gConfig.getValue('/Systems/DataManagement/Development/Services/RequestDB/localURL')
   self.centralUrl = gConfig.getValue('/Systems/DataManagement/Development/Services/RequestDB/centralURL')
   voBoxUrls = gConfig.getValue('/Systems/DataManagement/Development/Services/RequestDB/voBoxURLs')
   self.voBoxUrls = randomize(voBoxUrls).remove(self.localUrl)
Esempio n. 4
0
  def __init__( self, useCertificates = False ):
    """c'tor

    :param self: self reference
    :param bool useCertificates: flag to enable/disable certificates
    """
    Client.__init__( self )
    ## setup logger
    self.log = gLogger.getSubLogger( "RequestManagement/RequestClient" )

    ## dict to store all RPC clients for easy reuse
    self.__requestRPCClientsDict = {}
    ## local if any defined
    local = PathFinder.getServiceURL( "RequestManagement/localURL" )
    if local:
      self.__requestRPCClientsDict.setdefault( "local" , [ self.__requestRPCClient( local ) ] )
    ## central if any defined
    central = PathFinder.getServiceURL( "RequestManagement/centralURL" )
    if central:
      self.__requestRPCClientsDict.setdefault( "central", [ self.__requestRPCClient( central ) ] )
    ## voboxes if any defined
    voBoxUrls = fromChar( PathFinder.getServiceURL( "RequestManagement/voBoxURLs" ) )
    if voBoxUrls:
      self.__requestRPCClientsDict.setdefault( "voboxes", [] )
      for voBoxURL in randomize( voBoxUrls ):
        self.__requestRPCClientsDict["voboxes"].append( self.__requestRPCClient( voBoxURL ) )

    self.setServer( 'RequestManagement/centralURL' )
Esempio n. 5
0
 def __applyReduction(self, lfns, maxFiles=None):
     """eventually remove the number of files to be considered"""
     if maxFiles is None:
         maxFiles = self.maxFiles
     if not maxFiles or len(lfns) <= maxFiles:
         return lfns
     return randomize(lfns)[:maxFiles]
Esempio n. 6
0
    def __init__(self, useCertificates=False):
        """c'tor

    :param self: self reference
    :param bool useCertificates: flag to enable/disable certificates
    """
        Client.__init__(self)
        ## setup logger
        self.log = gLogger.getSubLogger("RequestManagement/RequestClient")

        ## dict to store all RPC clients for easy reuse
        self.__requestRPCClientsDict = {}
        ## local if any defined
        local = PathFinder.getServiceURL("RequestManagement/localURL")
        if local:
            self.__requestRPCClientsDict.setdefault(
                "local", [self.__requestRPCClient(local)])
        ## central if any defined
        central = PathFinder.getServiceURL("RequestManagement/centralURL")
        if central:
            self.__requestRPCClientsDict.setdefault(
                "central", [self.__requestRPCClient(central)])
        ## voboxes if any defined
        voBoxUrls = fromChar(
            PathFinder.getServiceURL("RequestManagement/voBoxURLs"))
        if voBoxUrls:
            self.__requestRPCClientsDict.setdefault("voboxes", [])
            for voBoxURL in randomize(voBoxUrls):
                self.__requestRPCClientsDict["voboxes"].append(
                    self.__requestRPCClient(voBoxURL))

        self.setServer('RequestManagement/centralURL')
Esempio n. 7
0
 def __applyReduction(self, lfns, maxFiles=None):
   """ eventually remove the number of files to be considered
   """
   if maxFiles is None:
     maxFiles = self.maxFiles
   if not maxFiles or len(lfns) <= maxFiles:
     return lfns
   return randomize(lfns)[:maxFiles]
Esempio n. 8
0
  def _Broadcast( self ):
    """ This plug-in takes files found at the sourceSE and broadcasts to all (or a selection of) targetSEs.
    """
    if not self.params:
      return S_ERROR( "TransformationPlugin._Broadcast: The 'Broadcast' plugin requires additional parameters." )

    sourceseParam = self.params['SourceSE']
    targetseParam = self.params['TargetSE']
    sourceSEs = []
    targetSEs = []
    if sourceseParam.count( '[' ):#assume it's an array
      sourceSEs = eval( sourceseParam )
    else:
      sourceSEs = [sourceseParam]
    sourceSEs = eval( self.params['SourceSE'] )
    if targetseParam.count( '[' ):
      targetSEs = eval( targetseParam )
    elif type(targetseParam)==type([]):
      targetSEs = targetseParam
    else:
      targetSEs = [targetseParam]
    #sourceSEs = eval(self.params['SourceSE'])
    #targetSEs = eval(self.params['TargetSE'])
    destinations = int( self.params.get( 'Destinations', 0 ) )
    if destinations and ( destinations >= len(targetSEs) ):
      destinations = 0

    fileGroups = self._getFileGroups( self.data )
    targetSELfns = {}
    for replicaSE, lfns in fileGroups.items():
      ses = replicaSE.split( ',' )
      #sourceSites = self._getSitesForSEs(ses)
      atSource = False
      for se in ses:
        if se in sourceSEs:
          atSource = True
      if not atSource:
        continue

      for lfn in lfns:
        targets = []
        sources = self._getSitesForSEs( ses )
        for targetSE in randomize( targetSEs ):
          site = self._getSiteForSE( targetSE )['Value']
          if not site in sources:
            if ( destinations ) and ( len( targets ) >= destinations ):
              continue
            targets.append( targetSE )
            sources.append( site )
        strTargetSEs = str.join( ',', sortList( targets ) )
        if not targetSELfns.has_key( strTargetSEs ):
          targetSELfns[strTargetSEs] = []
        targetSELfns[strTargetSEs].append( lfn )
    tasks = []
    for ses, lfns in targetSELfns.items():
      tasks.append( ( ses, lfns ) )
    return S_OK( tasks )
Esempio n. 9
0
  def _Broadcast( self ):
    """ This plug-in takes files found at the sourceSE and broadcasts to all (or a selection of) targetSEs. """
    if not self.params:
      return S_ERROR( "TransformationPlugin._Broadcast: The 'Broadcast' plugin requires additional parameters." )

    sourceseParam = self.params['SourceSE']
    targetseParam = self.params['TargetSE']
    sourceSEs = []
    targetSEs = []
    if sourceseParam.count( '[' ):#assume it's an array
      sourceSEs = eval( sourceseParam )
    else:
      sourceSEs = [sourceseParam]
    sourceSEs = eval( self.params['SourceSE'] )
    if targetseParam.count( '[' ):
      targetSEs = eval( targetseParam )
    elif type(targetseParam)==type([]):
      targetSEs = targetseParam
    else:
      targetSEs = [targetseParam]
    #sourceSEs = eval(self.params['SourceSE'])
    #targetSEs = eval(self.params['TargetSE'])
    destinations = int( self.params.get( 'Destinations', 0 ) )
    if destinations and ( destinations >= len(targetSEs) ):
      destinations = 0

    fileGroups = self._getFileGroups( self.data )
    targetSELfns = {}
    for replicaSE, lfns in fileGroups.items():
      ses = replicaSE.split( ',' )
      #sourceSites = self._getSitesForSEs(ses)
      atSource = False
      for se in ses:
        if se in sourceSEs:
          atSource = True
      if not atSource:
        continue

      for lfn in lfns:
        targets = []
        sources = self._getSitesForSEs( ses )
        for targetSE in randomize( targetSEs ):
          site = self._getSiteForSE( targetSE )['Value']
          if not site in sources:
            if ( destinations ) and ( len( targets ) >= destinations ):
              continue
            targets.append( targetSE )
            sources.append( site )
        strTargetSEs = str.join( ',', sortList( targets ) )
        if not targetSELfns.has_key( strTargetSEs ):
          targetSELfns[strTargetSEs] = []
        targetSELfns[strTargetSEs].append( lfn )
    tasks = []
    for ses, lfns in targetSELfns.items():
      tasks.append( ( ses, lfns ) )
    return S_OK( tasks )
Esempio n. 10
0
  def putRequest(self, request, useFailoverProxy=True, retryMainService=0):
    """Put request to RequestManager

      :param self: self reference
      :param ~Request.Request request: Request instance
      :param bool useFailoverProxy: if False, will not attempt to forward the request to ReqProxies
      :param int retryMainService: Amount of time we retry on the main ReqHandler in case of failures

      :return: S_OK/S_ERROR
    """
    errorsDict = {"OK": False}
    valid = self.requestValidator().validate(request)
    if not valid["OK"]:
      self.log.error("putRequest: request not valid", "%s" % valid["Message"])
      return valid
    # # dump to json
    requestJSON = request.toJSON()
    if not requestJSON["OK"]:
      return requestJSON
    requestJSON = requestJSON["Value"]

    retryMainService += 1

    while retryMainService:
      retryMainService -= 1
      setRequestMgr = self._getRPC().putRequest(requestJSON)
      if setRequestMgr["OK"]:
        return setRequestMgr
      errorsDict["RequestManager"] = setRequestMgr["Message"]
      # sleep a bit
      time.sleep(random.randint(1, 5))

    self.log.warn("putRequest: unable to set request '%s' at RequestManager" %
                  request.RequestName, setRequestMgr["Message"])
    proxies = self.requestProxies() if useFailoverProxy else {}
    for proxyURL in randomize(proxies.keys()):
      proxyClient = proxies[proxyURL]
      self.log.debug("putRequest: trying RequestProxy at %s" % proxyURL)
      setRequestProxy = proxyClient.putRequest(requestJSON)
      if setRequestProxy["OK"]:
        if setRequestProxy["Value"]["set"]:
          self.log.info("putRequest: request '%s' successfully set using RequestProxy %s" % (request.RequestName,
                                                                                             proxyURL))
        elif setRequestProxy["Value"]["saved"]:
          self.log.info("putRequest: request '%s' successfully forwarded to RequestProxy %s" % (request.RequestName,
                                                                                                proxyURL))
        return setRequestProxy
      else:
        self.log.warn("putRequest: unable to set request using RequestProxy %s: %s" % (proxyURL,
                                                                                       setRequestProxy["Message"]))
        errorsDict["RequestProxy(%s)" % proxyURL] = setRequestProxy["Message"]
    # # if we're here neither requestManager nor requestProxy were successful
    self.log.error("putRequest: unable to set request", "'%s'" % request.RequestName)
    errorsDict["Message"] = "ReqClient.putRequest: unable to set request '%s'" % request.RequestName
    return errorsDict
Esempio n. 11
0
 def requestProxies( self, timeout = 120 ):
   """ get request proxies dict """
   if not self.__requestProxiesDict:
     self.__requestProxiesDict = {}
     proxiesURLs = fromChar( PathFinder.getServiceURL( "RequestManagement/RequestProxyURLs" ) )
     if not proxiesURLs:
       self.log.warn( "CS option RequestManagement/RequestProxyURLs is not set!" )
     for proxyURL in randomize( proxiesURLs ):
       self.log.debug( "creating RequestProxy for url = %s" % proxyURL )
       self.__requestProxiesDict[proxyURL] = RPCClient( proxyURL, timeout = timeout )
   return self.__requestProxiesDict
Esempio n. 12
0
 def __init__(self, useCertificates=False):
     """ Constructor of the RequestClient class
 """
     self.localUrl = gConfig.getValue(
         '/Systems/DataManagement/Development/Services/RequestDB/localURL')
     self.centralUrl = gConfig.getValue(
         '/Systems/DataManagement/Development/Services/RequestDB/centralURL'
     )
     voBoxUrls = gConfig.getValue(
         '/Systems/DataManagement/Development/Services/RequestDB/voBoxURLs')
     self.voBoxUrls = randomize(voBoxUrls).remove(self.localUrl)
Esempio n. 13
0
    def putRequest(self, request):
        """ put request to RequestManager

    :param self: self reference
    :param Request request: Request instance
    """
        errorsDict = {"OK": False}
        valid = self.requestValidator().validate(request)
        if not valid["OK"]:
            self.log.error("putRequest: request not valid",
                           "%s" % valid["Message"])
            return valid
        # # dump to json
        requestJSON = request.toJSON()
        if not requestJSON["OK"]:
            return requestJSON
        requestJSON = requestJSON["Value"]
        setRequestMgr = self.requestManager().putRequest(requestJSON)
        if setRequestMgr["OK"]:
            return setRequestMgr
        errorsDict["RequestManager"] = setRequestMgr["Message"]
        self.log.warn(
            "putRequest: unable to set request '%s' at RequestManager" %
            request.RequestName, setRequestMgr["Message"])
        proxies = self.requestProxies()
        for proxyURL in randomize(proxies.keys()):
            proxyClient = proxies[proxyURL]
            self.log.debug("putRequest: trying RequestProxy at %s" % proxyURL)
            setRequestProxy = proxyClient.putRequest(requestJSON)
            if setRequestProxy["OK"]:
                if setRequestProxy["Value"]["set"]:
                    self.log.info(
                        "putRequest: request '%s' successfully set using RequestProxy %s"
                        % (request.RequestName, proxyURL))
                elif setRequestProxy["Value"]["saved"]:
                    self.log.info(
                        "putRequest: request '%s' successfully forwarded to RequestProxy %s"
                        % (request.RequestName, proxyURL))
                return setRequestProxy
            else:
                self.log.warn(
                    "putRequest: unable to set request using RequestProxy %s: %s"
                    % (proxyURL, setRequestProxy["Message"]))
                errorsDict["RequestProxy(%s)" %
                           proxyURL] = setRequestProxy["Message"]
        # # if we're here neither requestManager nor requestProxy were successful
        self.log.error("putRequest: unable to set request",
                       "'%s'" % request.RequestName)
        errorsDict[
            "Message"] = "ReqClient.putRequest: unable to set request '%s'" % request.RequestName
        return errorsDict
Esempio n. 14
0
  def __init__( self, useCertificates = False ):
    """ Constructor of the RequestClient class
    """
    voBoxUrls = fromChar( PathFinder.getServiceURL( "RequestManagement/voBoxURLs" ) )
    self.voBoxUrls = []
    if voBoxUrls:
      self.voBoxUrls = randomize( voBoxUrls )

    local = PathFinder.getServiceURL( "RequestManagement/localURL" )
    self.local = False
    if local:
      self.local = local

    central = PathFinder.getServiceURL( "RequestManagement/centralURL" )
    self.central = False
    if central:
      self.central = central

    self.setServer( 'RequestManagement/centralURL' )
Esempio n. 15
0
  def putRequest( self, request ):
    """ put request to RequestManager

    :param self: self reference
    :param Request request: Request instance
    """
    errorsDict = { "OK" : False }
    valid = self.requestValidator().validate( request )
    if not valid["OK"]:
      self.log.error( "putRequest: request not valid: %s" % valid["Message"] )
      return valid
    # # dump to json
    requestJSON = request.toJSON()
    if not requestJSON["OK"]:
      return requestJSON
    requestJSON = requestJSON["Value"]
    setRequestMgr = self.requestManager().putRequest( requestJSON )
    if setRequestMgr["OK"]:
      return setRequestMgr
    errorsDict["RequestManager"] = setRequestMgr["Message"]
    self.log.warn( "putRequest: unable to set request '%s' at RequestManager" % request.RequestName )
    proxies = self.requestProxies()
    for proxyURL in randomize( proxies.keys() ):
      proxyClient = proxies[proxyURL]
      self.log.debug( "putRequest: trying RequestProxy at %s" % proxyURL )
      setRequestProxy = proxyClient.putRequest( requestJSON )
      if setRequestProxy["OK"]:
        if setRequestProxy["Value"]["set"]:
          self.log.info( "putRequest: request '%s' successfully set using RequestProxy %s" % ( request.RequestName,
                                                                                               proxyURL ) )
        elif setRequestProxy["Value"]["saved"]:
          self.log.info( "putRequest: request '%s' successfully forwarded to RequestProxy %s" % ( request.RequestName,
                                                                                                  proxyURL ) )
        return setRequestProxy
      else:
        self.log.warn( "putRequest: unable to set request using RequestProxy %s: %s" % ( proxyURL,
                                                                                         setRequestProxy["Message"] ) )
        errorsDict["RequestProxy(%s)" % proxyURL] = setRequestProxy["Message"]
    # # if we're here neither requestManager nor requestProxy were successful
    self.log.error( "putRequest: unable to set request '%s'" % request.RequestName )
    errorsDict["Message"] = "ReqClient.putRequest: unable to set request '%s'" % request.RequestName
    return errorsDict
Esempio n. 16
0
    def __init__(self, useCertificates=False):
        """ Constructor of the RequestClient class
    """
        voBoxUrls = fromChar(
            PathFinder.getServiceURL("RequestManagement/voBoxURLs"))
        self.voBoxUrls = []
        if voBoxUrls:
            self.voBoxUrls = randomize(voBoxUrls)

        local = PathFinder.getServiceURL("RequestManagement/localURL")
        self.local = False
        if local:
            self.local = local

        central = PathFinder.getServiceURL("RequestManagement/centralURL")
        self.central = False
        if central:
            self.central = central

        self.setServer('RequestManagement/centralURL')
Esempio n. 17
0
 def __applyReduction( self, lfns ):
   """ eventually remove the number of files to be considered
   """
   if len( lfns ) <= self.maxFiles:
     return lfns
   return randomize( lfns )[:self.maxFiles]
Esempio n. 18
0
    def _Broadcast(self):
        """ This plug-in takes files found at the sourceSE and broadcasts to all (or a selection of) targetSEs.
    """
        if not self.params:
            return S_ERROR(
                "TransformationPlugin._Broadcast: The 'Broadcast' plugin requires additional parameters."
            )

        sourceseParam = self.params['SourceSE']
        targetseParam = self.params['TargetSE']
        sourceSEs = []
        targetSEs = []
        if sourceseParam.count('['):  #assume it's an array
            sourceSEs = eval(sourceseParam)
        else:
            sourceSEs = [sourceseParam]
        sourceSEs = eval(self.params['SourceSE'])
        if targetseParam.count('['):
            targetSEs = eval(targetseParam)
        elif type(targetseParam) == type([]):
            targetSEs = targetseParam
        else:
            targetSEs = [targetseParam]
        #sourceSEs = eval(self.params['SourceSE'])
        #targetSEs = eval(self.params['TargetSE'])
        destinations = int(self.params.get('Destinations', 0))
        if destinations and (destinations >= len(targetSEs)):
            destinations = 0

        status = self.params['Status']
        groupSize = self.params['GroupSize']  #Number of files per tasks

        fileGroups = self._getFileGroups(self.data)  #groups by SE
        targetSELfns = {}
        for replicaSE, lfns in fileGroups.items():
            ses = replicaSE.split(',')
            #sourceSites = self._getSitesForSEs(ses)
            atSource = False
            for se in ses:
                if se in sourceSEs:
                    atSource = True
            if not atSource:
                continue

            for lfn in lfns:
                targets = []
                sources = self._getSitesForSEs(ses)
                for targetSE in randomize(targetSEs):
                    site = self._getSiteForSE(targetSE)['Value']
                    if not site in sources:
                        if (destinations) and (len(targets) >= destinations):
                            continue
                        sources.append(site)
                    targets.append(
                        targetSE
                    )  #after all, if someone wants to copy to the source, it's his choice
                strTargetSEs = str.join(',', sortList(targets))
                if not targetSELfns.has_key(strTargetSEs):
                    targetSELfns[strTargetSEs] = []
                targetSELfns[strTargetSEs].append(lfn)
        tasks = []
        for ses, lfns in targetSELfns.items():
            tasksLfns = breakListIntoChunks(lfns, groupSize)
            for taskLfns in tasksLfns:
                if (status == 'Flush') or (len(taskLfns) >= int(groupSize)):
                    #do not allow groups smaller than the groupSize, except if transformation is in flush state
                    tasks.append((ses, taskLfns))
        return S_OK(tasks)
Esempio n. 19
0
  def _Broadcast( self ):
    """ This plug-in takes files found at the sourceSE and broadcasts to all (or a selection of) targetSEs.
    """
    if not self.params:
      return S_ERROR( "TransformationPlugin._Broadcast: The 'Broadcast' plugin requires additional parameters." )

    sourceseParam = self.params['SourceSE']
    targetseParam = self.params['TargetSE']
    sourceSEs = []
    targetSEs = []
    if sourceseParam.count( '[' ):#assume it's an array
      sourceSEs = eval( sourceseParam )
    else:
      sourceSEs = [sourceseParam]
    sourceSEs = eval( self.params['SourceSE'] )
    if targetseParam.count( '[' ):
      targetSEs = eval( targetseParam )
    elif type(targetseParam)==type([]):
      targetSEs = targetseParam
    else:
      targetSEs = [targetseParam]
    #sourceSEs = eval(self.params['SourceSE'])
    #targetSEs = eval(self.params['TargetSE'])
    destinations = int( self.params.get( 'Destinations', 0 ) )
    if destinations and ( destinations >= len(targetSEs) ):
      destinations = 0

    status = self.params['Status']
    groupSize = self.params['GroupSize']#Number of files per tasks

    fileGroups = self._getFileGroups( self.data )#groups by SE
    targetSELfns = {}
    for replicaSE, lfns in fileGroups.items():
      ses = replicaSE.split( ',' )
      #sourceSites = self._getSitesForSEs(ses)
      atSource = False
      for se in ses:
        if se in sourceSEs:
          atSource = True
      if not atSource:
        continue

      for lfn in lfns:
        targets = []
        sources = self._getSitesForSEs( ses )
        for targetSE in randomize( targetSEs ):
          site = self._getSiteForSE( targetSE )['Value']
          if not site in sources:
            if ( destinations ) and ( len( targets ) >= destinations ):
              continue
            sources.append( site )
          targets.append( targetSE )#after all, if someone wants to copy to the source, it's his choice
        strTargetSEs = str.join( ',', sortList( targets ) )
        if not targetSELfns.has_key( strTargetSEs ):
          targetSELfns[strTargetSEs] = []
        targetSELfns[strTargetSEs].append( lfn )
    tasks = []
    for ses, lfns in targetSELfns.items():
      tasksLfns = breakListIntoChunks(lfns, groupSize)
      for taskLfns in tasksLfns:
        if ( status == 'Flush' ) or ( len( taskLfns ) >= int( groupSize ) ):
          #do not allow groups smaller than the groupSize, except if transformation is in flush state
          tasks.append( ( ses, taskLfns ) )
    return S_OK( tasks )
Esempio n. 20
0
 def __applyReduction(self, lfns):
     """ eventually remove the number of files to be considered
 """
     if len(lfns) <= self.maxFiles:
         return lfns
     return randomize(lfns)[:self.maxFiles]