Beispiel #1
0
    def test(self):
        """ test case """
        graph = FTSGraph("ftsGraph", self.ftsHistoryViews)

        self.assertEqual(type(graph), FTSGraph, "c'tor failed")

        site = graph.findSiteForSE("CERN-FOO")
        self.assertEqual(site["OK"], False,
                         "findSiteForSE call failed for unknown SE")

        sourceSite = graph.findSiteForSE("CERN-USER")
        self.assertEqual(sourceSite["OK"], True,
                         "findSiteForSE call failed for target SE")

        targetSite = graph.findSiteForSE("RAL-USER")
        self.assertEqual(targetSite["OK"], True,
                         "findSiteForSE call failed for source SE")

        route = graph.findRoute("RAL-USER", "CERN-USER")
        self.assertEqual(route["OK"], True,
                         "findRoute failed for known source and target SEs")

        route = graph.findRoute("RAL-FOO", "CERN-BAR")
        self.assertEqual(route["OK"], False,
                         "findRoute failed for unknown source and target SEs")
Beispiel #2
0
  def __init__( self, csPath = None, ftsSites = None, ftsHistoryViews = None ):
    """c'tor

    :param self: self reference
    :param str csPath: CS path
    :param list ftsSites: list of FTSSites
    :param list ftsHistoryViews: list of FTSHistoryViews
    """
    # ## config path
    self.csPath = csPath
    # # fts sites
    ftsSites = ftsSites if ftsSites else []
    # # history views
    ftsHistoryViews = ftsHistoryViews if ftsHistoryViews else []
    # # own sub logger
    self.log = gLogger.getSubLogger( "FTSStrategy", child = True )
    self.log.setLevel( gConfig.getValue( self.csPath + "/LogLevel", "DEBUG" ) )
    for ftsSite in ftsSites:
      self.log.info( "FTSSite: %-16s FTSServer=%s" % ( ftsSite.Name, ftsSite.FTSServer ) )

    # # CS options
    self.log.info( "Supported strategies = %s" % ", ".join( self.supportedStrategies ) )
    self.activeStrategies = gConfig.getValue( "%s/%s" % ( self.csPath, "ActiveStrategies" ), ["MinimiseTotalWait"] )
    self.log.info( "ActiveStrategies = %s" % ", ".join( self.activeStrategies ) )
    self.numberOfStrategies = len( self.activeStrategies )
    self.log.info( "Number of active strategies = %s" % self.numberOfStrategies )
    self.sigma = gConfig.getValue( "%s/%s" % ( self.csPath, "HopSigma" ), 5 )
    self.log.info( "HopSigma = %s" % self.sigma )
    self.schedulingType = gConfig.getValue( "%s/%s" % ( self.csPath, "SchedulingType" ), "Files" )
    self.log.info( "SchedulingType = %s" % self.schedulingType )
    self.acceptableFailureRate = gConfig.getValue( "%s/%s" % ( self.csPath, "AcceptableFailureRate" ), 75 )
    self.log.info( "AcceptableFailureRate = %s" % self.acceptableFailureRate )
    self.acceptableFailedFiles = gConfig.getValue( "%s/%s" % ( self.csPath, "AcceptableFailedFiles" ), 5 )
    self.log.info( "AcceptableFailedFiles = %s" % self.acceptableFailedFiles )
    # # chosen strategy
    self.chosenStrategy = 0
    # dispatcher
    self.strategyDispatcher = { "MinimiseTotalWait" : self.minimiseTotalWait,
                                "DynamicThroughput" : self.dynamicThroughput,
                                "Simple" : self.simple,
                                "Swarm" : self.swarm }

    self.ftsGraph = FTSGraph( "FTSGraph",
                              ftsHistoryViews,
                              self.acceptableFailureRate,
                              self.acceptableFailedFiles,
                              self.schedulingType )

    # for node in self.ftsGraph.nodes():
    #  self.log.debug( node )
    # for edge in self.ftsGraph.edges():
    #  self.log.debug( edge )

    # # if we land here everything is OK
    self.log.info( "%s has been constructed" % self.__class__.__name__ )
Beispiel #3
0
    def resetGraph(cls, ftsHistoryViews):
        """ reset graph

    :param list ftsHistoryViews: list of FTSHistoryViews
    """
        ftsGraph = None
        try:
            cls.graphLock().acquire()
            ftsGraph = FTSGraph("FTSGraph", ftsHistoryViews,
                                cls.acceptableFailureRate,
                                cls.acceptableFailedFiles, cls.schedulingType)
            if ftsGraph:
                cls.ftsGraph = ftsGraph
        finally:
            cls.graphLock().release()
        return S_OK()
Beispiel #4
0
    def resetFTSGraph(self):
        """ create fts graph """
        log = gLogger.getSubLogger("ftsGraph")

        ftsHistory = self.ftsClient().getFTSHistory()
        if not ftsHistory["OK"]:
            log.error("unable to get FTS history: %s" % ftsHistory["Message"])
            return ftsHistory
        ftsHistory = ftsHistory["Value"]

        try:
            self.updateLock().acquire()
            self.__ftsGraph = FTSGraph("FTSGraph", ftsHistory)
        finally:
            self.updateLock().release()

        log.debug("FTSSites: %s" % len(self.__ftsGraph.nodes()))
        for i, site in enumerate(self.__ftsGraph.nodes()):
            log.debug(" [%02d] FTSSite: %-25s FTSServer: %s" %
                      (i, site.name, site.FTSServer))
        log.debug("FTSRoutes: %s" % len(self.__ftsGraph.edges()))
        for i, route in enumerate(self.__ftsGraph.edges()):
            log.debug(
                " [%02d] FTSRoute: %-25s Active FTSJobs (Max) = %s (%s)" %
                (i, route.routeName, route.ActiveJobs,
                 route.toNode.MaxActiveJobs))
        # # save graph stamp
        self.__ftsGraphValidStamp = datetime.datetime.now(
        ) + datetime.timedelta(seconds=self.FTSGRAPH_REFRESH)

        # # refresh SE R/W access
        try:
            self.updateLock().acquire()
            self.__ftsGraph.updateRWAccess()
        finally:
            self.updateLock().release()
        # # save rw access stamp
        self.__rwAccessValidStamp = datetime.datetime.now(
        ) + datetime.timedelta(seconds=self.RW_REFRESH)

        return S_OK()