def requestNetworkTopology(topology,serverState=None):
        """
        Asks each neigbouring node for their network topology

        inputs:
            topology:Nodes The list of the topology generated so far
            serverState:ServerState
                if provided worker states are fetched.
                since this method is called by getNetworkTopology() which in turn
                is called from places where we do not pass (and don't want) the serverState
                we provide this option. Also it is not needed as the calling server always
                knows the most up to date state of its own workers.

        """
        conf = ServerConf()
        thisNode = Node.getSelfNode(conf)
        thisNode.setNodes(conf.getNodes())
        topology.addNode(thisNode)
        if serverState:
            thisNode.workerStates = WorkerStateHandler.getConnectedWorkers(serverState.getWorkerStates())

        for node in thisNode.getNodes().nodes.itervalues():
            if topology.exists(node.getId()) == False:
                #connect to correct node
                if node.isConnected():
                    try:
                        clnt = DirectServerMessage(node,conf=conf)
                        #send along the current topology
                        rawresp = clnt.networkTopology(topology)
                        processedResponse = ProcessedResponse(rawresp)
                        topology = processedResponse.getData()
                    except ServerConnectionError as e:
                        #we cannot connect to the node,
                        # and its marked as unreachable
                        #we must still add it to the topology
                        log.error("node %s unreachable when asking for network "
                                  "topology: error was %s"%(node.getId(),e.__str__()))
                        topology.addNode(node)

                #todo notify in topology that this node is not connected?
        return topology
Exemplo n.º 2
0
    def run(self, serverState, request, response):
        ret_dict = {}

        # handle project status
        user = self.getUser(request)
        explicit_project = self.getProject(request,
                                           serverState,
                                           only_explicit=True)
        if explicit_project is not None:
            projects = [explicit_project.getName()]
        else:
            if user.isSuperuser():
                projects = lst = serverState.getProjectList().list()
            else:
                projects = UserHandler().getProjectListForUser(user)
        ret_prj_dict = {}

        for prj_str in projects:
            ret_prj_dict[prj_str] = dict()
            queue = {'queue': [], 'running': []}
            state_count = {}
            err_list = []
            warn_list = []
            prj_obj = serverState.getProjectList().get(prj_str)
            # we iterate over the childred rather than calling _traverseInstance
            # here to avoid the project itself being counted as an instance
            for child in prj_obj.getSubValueIterList():
                self._traverseInstance(prj_obj.getSubValue([child]),
                                       state_count, queue, err_list, warn_list)
            ret_prj_dict[prj_str]['states'] = state_count
            ret_prj_dict[prj_str]['queue'] = queue
            ret_prj_dict[prj_str]['errors'] = err_list
            ret_prj_dict[prj_str]['warnings'] = warn_list
            if prj_str == request.session.get('default_project_name', None):
                ret_prj_dict[prj_str]['default'] = True
        ret_dict['projects'] = ret_prj_dict
        if explicit_project is not None:
            # client only want info for this project, return with that.
            response.add("", ret_dict)
            return

        # handle network
        topology = ServerToServerMessage.getNetworkTopology()

        if not topology:
            log.error("Cannot get network topology.")
            return

        numWorkers = 0
        numServers = 0

        numLocalWorkers = len(
            WorkerStateHandler.getConnectedWorkers(serverState.workerStates))

        numNotConnectedLocalServers = 0
        numLocalServers = 0
        for id, node in ServerConf().getNodes().nodes.iteritems():
            if node.isConnected():
                numLocalServers += 1
            else:
                numNotConnectedLocalServers += 1

        for name, node in topology.nodes.iteritems():
            numWorkers += len(node.workerStates)
            numServers += 1

        numWorkers += numLocalWorkers
        ret_dict['network'] = {
            'workers': numWorkers,
            'servers': numServers,
            'local_workers': numLocalWorkers,
            'local_servers': numLocalServers,
            'not_connected_local_servers': numNotConnectedLocalServers
        }

        response.add("", ret_dict)
Exemplo n.º 3
0
    def run(self, serverState, request, response):
        ret_dict = {}

        # handle project status
        user = self.getUser(request)
        explicit_project=self.getProject(request, serverState, only_explicit=True)
        if explicit_project is not None:
            projects = [explicit_project.getName()]
        else:
            if user.isSuperuser():
                projects = lst=serverState.getProjectList().list()
            else:
                projects = UserHandler().getProjectListForUser(user)
        ret_prj_dict = {}

        for prj_str in projects:
            ret_prj_dict[prj_str] = dict()
            queue = {'queue' : [], 'running': []}
            state_count = {}
            err_list=[]
            warn_list=[]
            prj_obj = serverState.getProjectList().get(prj_str)
            # we iterate over the childred rather than calling _traverseInstance
            # here to avoid the project itself being counted as an instance
            for child in prj_obj.getSubValueIterList():
                self._traverseInstance(prj_obj.getSubValue([child]), 
                                       state_count, queue, err_list, 
                                       warn_list)
            ret_prj_dict[prj_str]['states'] = state_count
            ret_prj_dict[prj_str]['queue']  = queue
            ret_prj_dict[prj_str]['errors'] = err_list
            ret_prj_dict[prj_str]['warnings'] = warn_list
            if prj_str == request.session.get('default_project_name', None):
                ret_prj_dict[prj_str]['default']=True
        ret_dict['projects'] = ret_prj_dict
        if explicit_project is not None:
            # client only want info for this project, return with that.
            response.add("", ret_dict)
            return

        # handle network
        topology = ServerToServerMessage.getNetworkTopology()

        if not topology:
            log.error("Cannot get network topology.")
            return

        numWorkers = 0
        numServers = 0

        numLocalWorkers =len(WorkerStateHandler.getConnectedWorkers(serverState.workerStates))

        numNotConnectedLocalServers = 0
        numLocalServers = 0
        for id,node in ServerConf().getNodes().nodes.iteritems():
            if node.isConnected():
                numLocalServers +=1
            else:
                numNotConnectedLocalServers+=1

        for name, node in topology.nodes.iteritems():
            numWorkers += len(node.workerStates)
            numServers += 1

        numWorkers +=numLocalWorkers
        ret_dict['network'] = {
            'workers': numWorkers,
            'servers': numServers,
            'local_workers': numLocalWorkers,
            'local_servers': numLocalServers,
            'not_connected_local_servers':numNotConnectedLocalServers
        }

        response.add("", ret_dict)