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