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")
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__ )
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()
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()