def rt_update(self, ip, port, **kwargs): costs = kwargs['costs'] addr_key = addr_to_key(ip, port) for node_addr_key in costs: # not in the node_dict yet, add to the node_dict if self.node_dict.get(node_addr_key) is None: self.node_dict[node_addr_key] = self.init_node() if self.node_dict[addr_key]['is_neighbor']: # already neighbor, so just update node costs node = self.node_dict[addr_key] node['costs'] = costs # restart watch_dog timer node['watch_dog'].reset() else: print 'welcome new neighbor at %s !\n' % addr_key del self.node_dict[addr_key] self.node_dict[addr_key] = self.node_generator( cost=self.node_dict[addr_key]['cost'], is_neighbor=True, direct_dist=kwargs['neighbor']['direct_dist'], costs=costs, addr_key=addr_key) # Bellman-Ford! self.calculate_costs()
def init_rt(self): route_dict = argv_parser(sys.argv) self.node_dict = defaultdict(lambda: self.init_node()) self.timeout = 3 * route_dict["timeout"] self.sock = init_socket(localhost, route_dict["port"]) self.me_key = addr_to_key(*self.sock.getsockname()) self.node_dict[self.me_key] = self.node_generator(cost=0.0, addr_key=self.me_key, is_neighbor=False, direct_dist=0.0) for neighbor_info in route_dict["neighbors"]: addr_key, cost = decode_node_info(neighbor_info) self.node_dict[addr_key] = self.node_generator(cost=cost, addr_key=addr_key, is_neighbor=True, direct_dist=cost) self.broadcast_costs() CountDownTimer(route_dict["timeout"], self.broadcast_costs).start()
def get_node(self, ip, port): try: addr_key = addr_to_key(ip, port) return self.node_dict[addr_key] except KeyError: raise NoNodeError