From: Isaku Yamahata <[email protected]>

Cc: yuta-hamada <[email protected]>
Signed-off-by: Isaku Yamahata <[email protected]>
---
Changes v4 -> v5:
- manager.py: list_request_handler TypeError
  TypeError: __init__() takes exactly 5 arguments (4 given)
- appmanager.uninstantiate argument change
- add state to VRRPInstance

Changes v3 -> v4:
- eventlet

Changes v2 -> v3:
- comment
- typo
- drop register request handler

Changes v1 -> v2:
- dynamic configuration change
- trivial update for depending patch change
Signed-off-by: YAMAMOTO Takashi <[email protected]>
---
 ryu/services/vrrp/manager.py | 156 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 156 insertions(+)
 create mode 100644 ryu/services/vrrp/manager.py

diff --git a/ryu/services/vrrp/manager.py b/ryu/services/vrrp/manager.py
new file mode 100644
index 0000000..ce952d7
--- /dev/null
+++ b/ryu/services/vrrp/manager.py
@@ -0,0 +1,156 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 Isaku Yamahata <yamahata at private email ne jp>
+#
+# Licensed 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.
+
+"""
+VRRP manager that manages VRRP router instances
+VRRPManager creates/deletes VRRPRouter, VRRPInterfaceMonitor
+dynamically as requested.
+
+Usage example
+PYTHONPATH=. ./bin/ryu-manager --verbose \
+             ./ryu/services/vrrp/manager.py \
+             ./ryu/services/vrrp/dumper.py
+"""
+
+from ryu.base import app_manager
+from ryu.controller import handler
+from ryu.lib import hub
+from ryu.services.vrrp import event as vrrp_event
+from ryu.services.vrrp import monitor as vrrp_monitor
+from ryu.services.vrrp import router as vrrp_router
+
+
+class VRRPInstance(object):
+    def __init__(self, name, monitor_name, config, interface):
+        super(VRRPInstance, self).__init__()
+        self.name = name                        # vrrp_router.name
+        self.monitor_name = monitor_name        # interface_monitor.name
+        self.config = config
+        self.interface = interface
+        self.state = None
+
+    def state_changed(self, new_state):
+        self.state = new_state
+
+
+class VRRPManager(app_manager.RyuApp):
+    @staticmethod
+    def _instance_name(interface, vrid, is_ipv6):
+        ip_version = 'ipv6' if is_ipv6 else 'ipv4'
+        return 'VRRP-Router-%s-%d-%s' % (str(interface), vrid, ip_version)
+
+    def __init__(self, *args, **kwargs):
+        super(VRRPManager, self).__init__(*args, **kwargs)
+        self._args = args
+        self._kwargs = kwargs
+        self.name = vrrp_event.VRRP_MANAGER_NAME
+        self._instances = {}    # name -> VRRPInstance
+        self.shutdown = hub.Queue()
+
+    def start(self):
+        self.threads.append(hub.spawn(self._shutdown_loop))
+        super(VRRPManager, self).start()
+
+    @handler.set_ev_cls(vrrp_event.EventVRRPConfigRequest)
+    def config_request_handler(self, ev):
+        config = ev.config
+        interface = ev.interface
+        name = self._instance_name(interface, config.vrid, config.is_ipv6)
+        if name in self._instances:
+            rep = vrrp_event.EventVRRPConfigReply(None, interface, config)
+            self.reply_to_request(ev, rep)
+            return
+
+        monitor = vrrp_monitor.VRRPInterfaceMonitor.factory(
+            interface, config, name, *self._args, **self._kwargs)
+        router = vrrp_router.VRRPRouter.factory(
+            name, monitor.name, interface, config, *self._args, **self._kwargs)
+
+        # Event piping
+        #  vrrp_router -> vrrp_manager
+        #    EventVRRPStateChanged to vrrp_manager is handled by framework
+        #  vrrp_manager -> vrrp_rouer
+        self.register_observer(vrrp_event.EventVRRPShutdownRequest,
+                               router.name)
+        #  vrrp_router -> vrrp_monitor
+        router.register_observer(vrrp_event.EventVRRPStateChanged,
+                                 monitor.name)
+        router.register_observer(vrrp_event.EventVRRPTransmitRequest,
+                                 monitor.name)
+        #  vrrp_interface_monitor -> vrrp_router
+        monitor.register_observer(vrrp_event.EventVRRPReceived, router.name)
+
+        instance = VRRPInstance(name, monitor.name, config, interface)
+        self._instances[name] = instance
+        #self.logger.debug('report_bricks')
+        #app_manager.AppManager.get_instance().report_bricks()   # debug
+        monitor.start()
+        router.start()
+
+        rep = vrrp_event.EventVRRPConfigReply(instance.name, interface, config)
+        self.reply_to_request(ev, rep)
+
+    def _proxy_event(self, ev):
+        name = ev.instance_name
+        instance = self._instances.get(name, None)
+        if not instance:
+            self.logger.info('unknown vrrp router %s', name)
+            return
+        self.send_event(instance.name, ev)
+
+    @handler.set_ev_cls(vrrp_event.EventVRRPShutdownRequest)
+    def shutdown_request_handler(self, ev):
+        self._proxy_event(ev)
+
+    @handler.set_ev_cls(vrrp_event.EventVRRPConfigChangeRequest)
+    def config_change_request_handler(self, ev):
+        self._proxy_event(ev)
+
+    @handler.set_ev_cls(vrrp_event.EventVRRPStateChanged)
+    def state_change_handler(self, ev):
+        instance = self._instances.get(ev.instance_name, None)
+        assert instance is not None
+        instance.state_changed(ev.new_state)
+        if ev.old_state and ev.new_state == vrrp_event.VRRP_STATE_INITIALIZE:
+            self.shutdown.put(instance)
+
+    def _shutdown_loop(self):
+        app_mgr = app_manager.AppManager.get_instance()
+        while self.is_active or not self.shutdown.empty():
+            instance = self.shutdown.get()
+            app_mgr.uninstantiate(instance.name)
+            app_mgr.uninstantiate(instance.monitor_name)
+            del self._instances[instance.name]
+
+    @handler.set_ev_cls(vrrp_event.EventVRRPListRequest)
+    def list_request_handler(self, ev):
+        instance_name = ev.instance_name
+        if instance_name is None:
+            instance_list = [vrrp_event.VRRPInstance(
+                instance.name, instance.monitor_name,
+                instance.config, instance.interface, instance.state)
+                for instance in self._instances.values()]
+        else:
+            instance = self._instances.get(instance_name, None)
+            if instance is None:
+                instance_list = []
+            else:
+                instance_list = [vrrp_event.VRRPInstance(
+                    instance_name, instance.monitor_name,
+                    instance.config, instance.interface, instance.state)]
+
+        vrrp_list = vrrp_event.EventVRRPListReply(instance_list)
+        self.reply_to_request(ev, vrrp_list)
-- 
1.8.1.5


------------------------------------------------------------------------------
Get your SQL database under version control now!
Version control is standard for application code, but databases havent 
caught up. So what steps can you take to put your SQL databases under 
version control? Why should you start doing it? Read more to find out.
http://pubads.g.doubleclick.net/gampad/clk?id=49501711&iu=/4140/ostg.clktrk
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to