diff options
Diffstat (limited to 'qpid/extras/dispatch/src/py/router/node.py')
| -rw-r--r-- | qpid/extras/dispatch/src/py/router/node.py | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/qpid/extras/dispatch/src/py/router/node.py b/qpid/extras/dispatch/src/py/router/node.py new file mode 100644 index 0000000000..482a83dfe8 --- /dev/null +++ b/qpid/extras/dispatch/src/py/router/node.py @@ -0,0 +1,103 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +try: + from dispatch import * +except ImportError: + from stubs import * + + +class NodeTracker(object): + """ + This module is responsible for tracking the set of router nodes that are known to this + router. It tracks whether they are neighbor or remote and whether they are reachable. + """ + def __init__(self, container): + self.container = container + self.id = self.container.id + self.area = self.container.area + self.nodes = {} # id => RemoteNode + + + def tick(self, now): + pass + + + def new_neighbor(self, node_id): + if node_id not in self.nodes: + self.nodes[node_id] = RemoteNode(node_id) + self.nodes[node_id].set_neighbor() + self._notify(self.nodes[node_id]) + + + def lost_neighbor(self, node_id): + node = self.nodes[node_id] + node.clear_neighbor() + self._notify(node) + if node.to_delete(): + self.nodes.pop(node_id) + + + def new_node(self, node_id): + if node_id not in self.nodes: + self.nodes[node_id] = RemoteNode(node_id) + self.nodes[node_id].set_remote() + self._notify(self.nodes[node_id]) + + + def lost_node(self, node_id): + node = self.nodes[node_id] + node.clear_remote() + self._notify(node) + if node.to_delete(): + self.nodes.pop(node_id) + + + def _notify(self, node): + if node.to_delete(): + self.container.adapter.node_updated("R%s" % node.id, 0, 0) + else: + is_neighbor = 0 + if node.neighbor: + is_neighbor = 1 + self.container.adapter.node_updated("R%s" % node.id, 1, is_neighbor) + + +class RemoteNode(object): + + def __init__(self, node_id): + self.id = node_id + self.neighbor = None + self.remote = None + + def set_neighbor(self): + self.neighbor = True + + def set_remote(self): + self.remote = True + + def clear_neighbor(self): + self.neighbor = None + + def clear_remote(self): + self.remote = None + + def to_delete(self): + return self.neighbor or self.remote + |
