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
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)
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)