From: Isaku Yamahata <[email protected]>

Signed-off-by: Isaku Yamahata <[email protected]>
Signed-off-by: YAMAMOTO Takashi <[email protected]>
---
 ryu/services/vrrp/event.py  | 11 +++++---
 ryu/services/vrrp/router.py | 65 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 72 insertions(+), 4 deletions(-)

diff --git a/ryu/services/vrrp/event.py b/ryu/services/vrrp/event.py
index 48e2ca5..33b9896 100644
--- a/ryu/services/vrrp/event.py
+++ b/ryu/services/vrrp/event.py
@@ -112,7 +112,7 @@ class VRRPConfig(object):
     def __init__(self, version=vrrp.VRRP_VERSION_V3, vrid=None,
                  priority=vrrp.VRRP_PRIORITY_BACKUP_DEFAULT, ip_addresses=None,
                  advertisement_interval=vrrp.VRRP_MAX_ADVER_INT_DEFAULT_IN_SEC,
-                 preempt_mode=True, accept_mode=False):
+                 preempt_mode=True, preempt_delay=0, accept_mode=False):
         # To allow version and priority default
         assert vrid is not None
         assert ip_addresses is not None
@@ -124,6 +124,7 @@ class VRRPConfig(object):
         self.ip_addresses = ip_addresses
         self.advertisement_interval = advertisement_interval
         self.preempt_mode = preempt_mode
+        self.preempt_delay = preempt_delay
         self.accept_mode = accept_mode
 
         self.is_ipv6 = vrrp.is_ipv6(ip_addresses[0])
@@ -139,13 +140,14 @@ class VRRPConfig(object):
                 self.ip_addresses == other.ip_addresses and
                 self.advertisement_interval == other.advertisement_interval and
                 self.preempt_mode == other.preempt_mode and
+                self.preempt_delay == other.preempt_delay and
                 self.accept_mode == other.accept_mode and
                 self.is_ipv6 == other.is_ipv6)
 
     def __hash__(self):
         hash((self.version, self.vrid, self.priority, self.ip_addresses,
-              self.advertisement_interval, self.preempt_mode, self.accept_mode,
-              self.is_ipv6))
+              self.advertisement_interval, self.preempt_mode,
+              self.preempt_delay, self.accept_mode, self.is_ipv6))
 
 
 class EventVRRPConfigRequest(event.EventRequestBase):
@@ -225,12 +227,13 @@ class 
EventVRRPConfigChangeRequest(event.EventRequestBase):
     """
     def __init__(self, instance_name, priority=None,
                  advertisement_interval=None, preempt_mode=None,
-                 accept_mode=None):
+                 preempt_delay=None, accept_mode=None):
         super(EventVRRPConfigChangeRequest, self).__init__()
         self.instance_name = instance_name
         self.priority = priority
         self.advertisement_interval = advertisement_interval
         self.preempt_mode = preempt_mode
+        self.preempt_delay = preempt_delay
         self.accept_mode = accept_mode
 
 
diff --git a/ryu/services/vrrp/router.py b/ryu/services/vrrp/router.py
index b9f244f..bcbefa6 100644
--- a/ryu/services/vrrp/router.py
+++ b/ryu/services/vrrp/router.py
@@ -55,6 +55,9 @@ class Timer(object):
         hub.joinall([self._thread])
         self._thread = None
 
+    def is_running(self):
+        return self._thread is not None
+
     def _timer(self, interval):
         # Avoid cancellation during execution of self._callable()
         cancel = self._event.wait(interval)
@@ -116,6 +119,10 @@ class VRRPState(object):
         pass
 
     @abc.abstractmethod
+    def preempt_delay(self, ev):
+        pass
+
+    @abc.abstractmethod
     def vrrp_received(self, ev):
         pass
 
@@ -157,6 +164,9 @@ class VRRPRouter(app_manager.RyuApp):
     class _EventAdver(event.EventBase):
         pass
 
+    class _EventPreemptDelay(event.EventBase):
+        pass
+
     def __init__(self, *args, **kwargs):
         super(VRRPRouter, self).__init__(*args, **kwargs)
         self.name = kwargs['name']
@@ -170,6 +180,8 @@ class VRRPRouter(app_manager.RyuApp):
 
         self.master_down_timer = TimerEventSender(self, self._EventMasterDown)
         self.adver_timer = TimerEventSender(self, self._EventAdver)
+        self.preempt_delay_timer = TimerEventSender(self,
+                                                    self._EventPreemptDelay)
         self.register_observer(self._EventMasterDown, self.name)
         self.register_observer(self._EventAdver, self.name)
 
@@ -212,6 +224,10 @@ class VRRPRouter(app_manager.RyuApp):
     def adver_handler(self, ev):
         self.state_impl.adver(ev)
 
+    @handler.set_ev_handler(_EventPreemptDelay)
+    def preempt_delay_handler(self, ev):
+        self.state_impl.preempt_delay(ev)
+
     @handler.set_ev_handler(vrrp_event.EventVRRPReceived)
     def vrrp_received_handler(self, ev):
         self.state_impl.vrrp_received(ev)
@@ -230,6 +246,8 @@ class VRRPRouter(app_manager.RyuApp):
             config.advertisement_interval = ev.advertisement_interval
         if ev.preempt_mode is not None:
             config.preempt_mode = ev.preempt_mode
+        if ev.preempt_delay is not None:
+            config.preempt_delay = ev.preempt_delay
         if ev.accept_mode is not None:
             config.accept_mode = ev.accept_mode
 
@@ -252,6 +270,10 @@ class VRRPV2StateInitialize(VRRPState):
     def adver(self, ev):
         self.vrrp_router.logger.warn('%s adver', self.__class__.__name__)
 
+    def preempt_delay(self, ev):
+        self.vrrp_router.logger.warn('%s preempt_delay',
+                                     self.__class__.__name__)
+
     def vrrp_received(self, ev):
         self.vrrp_router.logger.warn('%s vrrp_received',
                                      self.__class__.__name__)
@@ -283,6 +305,10 @@ class VRRPV2StateMaster(VRRPState):
         self.vrrp_router.logger.debug('%s adver', self.__class__.__name__)
         self._adver()
 
+    def preempt_delay(self, ev):
+        self.vrrp_router.logger.warn('%s preempt_delay',
+                                     self.__class__.__name__)
+
     def vrrp_received(self, ev):
         vrrp_router = self.vrrp_router
         vrrp_router.logger.debug('%s vrrp_received', self.__class__.__name__)
@@ -339,6 +365,7 @@ class VRRPV2StateBackup(VRRPState):
         #       actual router sending GARP and VRRPRouter becoming
         #       master/backup
 
+        vrrp_router.preempt_delay_timer.cancel()
         vrrp_router.state_change(vrrp_event.VRRP_STATE_MASTER)
         vrrp_router.adver_timer.start(
             vrrp_router.config.advertisement_interval)
@@ -355,6 +382,11 @@ class VRRPV2StateBackup(VRRPState):
         vrrp_router.logger.debug('%s adver %s %s' % (
             self.__class__.__name__, ev.__class__.__name__, vrrp_router.state))
 
+    def preempt_delay(self, ev):
+        self.vrrp_router.logger.warn('%s preempt_delay',
+                                     self.__class__.__name__)
+        self._master_down()
+
     def vrrp_received(self, ev):
         vrrp_router = self.vrrp_router
         vrrp_router.logger.debug('%s vrrp_received', self.__class__.__name__)
@@ -366,6 +398,13 @@ class VRRPV2StateBackup(VRRPState):
             config = vrrp_router.config
             params = vrrp_router.params
             if (not config.preempt_mode or config.priority <= vrrp_.priority):
+                vrrp_router.preempt_delay_timer.cancel()
+                vrrp_router.master_down_timer.start(
+                    params.master_down_interval)
+            elif (config.preempt_mode and config.preempt_delay > 0 and
+                  config.priority > vrrp_.priority):
+                if not vrrp_router.preempt_delay_timer.is_running():
+                    vrrp_router.preempt_delay_timer.start(config.preempt_delay)
                 vrrp_router.master_down_timer.start(
                     params.master_down_interval)
 
@@ -375,6 +414,7 @@ class VRRPV2StateBackup(VRRPState):
                                  self.__class__.__name__)
 
         vrrp_router.master_down_timer.cancel()
+        vrrp_router.preempt_delay_timer.cancel()
         vrrp_router.state_change(vrrp_event.VRRP_STATE_INITIALIZE)
 
     def vrrp_config_change_request(self, ev):
@@ -384,6 +424,8 @@ class VRRPV2StateBackup(VRRPState):
         if ev.priority is not None and vrrp_router.config.address_owner:
             vrrp_router.master_down_timer.cancel()
             self._master_down()
+        if ev.preempt_mode is not None or ev.preempt_delay is not None:
+            vrrp_router.preempt_delay_timer.cancel()
 
 
 @VRRPRouter.register(vrrp.VRRP_VERSION_V2)
@@ -430,6 +472,10 @@ class VRRPV3StateInitialize(VRRPState):
     def adver(self, ev):
         self.vrrp_router.logger.debug('%s adver', self.__class__.__name__)
 
+    def preempt_delay(self, ev):
+        self.vrrp_router.logger.warn('%s preempt_delay',
+                                     self.__class__.__name__)
+
     def vrrp_received(self, ev):
         self.vrrp_router.logger.debug('%s vrrp_received',
                                       self.__class__.__name__)
@@ -461,6 +507,10 @@ class VRRPV3StateMaster(VRRPState):
         self.vrrp_router.logger.debug('%s adver', self.__class__.__name__)
         self._adver()
 
+    def preempt_delay(self, ev):
+        self.vrrp_router.logger.warn('%s preempt_delay',
+                                     self.__class__.__name__)
+
     def vrrp_received(self, ev):
         vrrp_router = self.vrrp_router
         vrrp_router.logger.debug('%s vrrp_received', self.__class__.__name__)
@@ -529,6 +579,7 @@ class VRRPV3StateBackup(VRRPState):
         #       actual router sending GARP and VRRPRouter becoming
         #       master/backup
 
+        vrrp_router.preempt_delay_timer.cancel()
         vrrp_router.state_change(vrrp_event.VRRP_STATE_MASTER)
         vrrp_router.adver_timer.start(
             vrrp_router.config.advertisement_interval)
@@ -545,6 +596,11 @@ class VRRPV3StateBackup(VRRPState):
         vrrp_router.logger.debug('adver %s %s %s' % (
             self.__class__.__name__, ev.__class__.__name__, vrrp_router.state))
 
+    def preempt_delay(self, ev):
+        self.vrrp_router.logger.warn('%s preempt_delay',
+                                     self.__class__.__name__)
+        self._master_down()
+
     def vrrp_received(self, ev):
         vrrp_router = self.vrrp_router
         vrrp_router.logger.debug('%s vrrp_received', self.__class__.__name__)
@@ -559,12 +615,19 @@ class VRRPV3StateBackup(VRRPState):
                 params.master_adver_interval = vrrp_.max_adver_int_in_sec
                 vrrp_router.master_down_timer.start(
                     params.master_down_interval)
+            elif (config.preempt_mode and config.preempt_delay > 0 and
+                  config.priority > vrrp_.priority):
+                if not vrrp_router.preempt_delay_timer.is_running():
+                    vrrp_router.preempt_delay_timer.start(config.preempt_delay)
+                vrrp_router.master_down_timer.start(
+                    params.master_down_interval)
 
     def vrrp_shutdown_request(self, ev):
         vrrp_router = self.vrrp_router
         vrrp_router.logger.debug('%s vrrp_shutdown_request',
                                  self.__class__.__name__)
 
+        vrrp_router.preempt_delay_timer.cancel()
         vrrp_router.master_down_timer.cancel()
         vrrp_router.state_change(vrrp_event.VRRP_STATE_INITIALIZE)
 
@@ -575,6 +638,8 @@ class VRRPV3StateBackup(VRRPState):
         if ev.priority is not None and vrrp_router.config.address_owner:
             vrrp_router.master_down_timer.cancel()
             self._master_down()
+        if ev.preempt_mode is not None or ev.preempt_delay is not None:
+            vrrp_router.preempt_delay_timer.cancel()
 
 
 @VRRPRouter.register(vrrp.VRRP_VERSION_V3)
-- 
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