@ -76,13 +76,8 @@ class DvrLocalRouter(dvr_router_base.DvrRouterBase):
""" Add floating IP to FIP namespace. """
floating_ip = fip [ ' floating_ip_address ' ]
fixed_ip = fip [ ' fixed_ip_address ' ]
rule_pr = self . fip_ns . allocate_rule_priority ( floating_ip )
self . floating_ips_dict [ floating_ip ] = rule_pr
self . _add_floating_ip_rule ( floating_ip , fixed_ip )
fip_2_rtr_name = self . fip_ns . get_int_device_name ( self . router_id )
ip_rule = ip_lib . IPRule ( namespace = self . ns_name )
ip_rule . rule . add ( ip = fixed_ip ,
table = dvr_fip_ns . FIP_RT_TBL ,
priority = rule_pr )
#Add routing rule in fip namespace
fip_ns_name = self . fip_ns . get_name ( )
if self . rtr_fip_subnet is None :
@ -101,6 +96,24 @@ class DvrLocalRouter(dvr_router_base.DvrRouterBase):
# update internal structures
self . dist_fip_count = self . dist_fip_count + 1
def _add_floating_ip_rule ( self , floating_ip , fixed_ip ) :
rule_pr = self . fip_ns . allocate_rule_priority ( floating_ip )
self . floating_ips_dict [ floating_ip ] = rule_pr
ip_rule = ip_lib . IPRule ( namespace = self . ns_name )
ip_rule . rule . add ( ip = fixed_ip ,
table = dvr_fip_ns . FIP_RT_TBL ,
priority = rule_pr )
def _remove_floating_ip_rule ( self , floating_ip ) :
if floating_ip in self . floating_ips_dict :
rule_pr = self . floating_ips_dict [ floating_ip ]
ip_rule = ip_lib . IPRule ( namespace = self . ns_name )
ip_rule . rule . delete ( ip = floating_ip ,
table = dvr_fip_ns . FIP_RT_TBL ,
priority = rule_pr )
self . fip_ns . deallocate_rule_priority ( floating_ip )
#TODO(rajeev): Handle else case - exception/log?
def floating_ip_removed_dist ( self , fip_cidr ) :
""" Remove floating IP from FIP namespace. """
floating_ip = fip_cidr . split ( ' / ' ) [ 0 ]
@ -112,14 +125,7 @@ class DvrLocalRouter(dvr_router_base.DvrRouterBase):
rtr_2_fip , fip_2_rtr = self . rtr_fip_subnet . get_pair ( )
fip_ns_name = self . fip_ns . get_name ( )
if floating_ip in self . floating_ips_dict :
rule_pr = self . floating_ips_dict [ floating_ip ]
ip_rule = ip_lib . IPRule ( namespace = self . ns_name )
ip_rule . rule . delete ( ip = floating_ip ,
table = dvr_fip_ns . FIP_RT_TBL ,
priority = rule_pr )
self . fip_ns . deallocate_rule_priority ( floating_ip )
#TODO(rajeev): Handle else case - exception/log?
self . _remove_floating_ip_rule ( floating_ip )
device = ip_lib . IPDevice ( fip_2_rtr_name , namespace = fip_ns_name )
@ -136,6 +142,12 @@ class DvrLocalRouter(dvr_router_base.DvrRouterBase):
self . rtr_fip_subnet = None
ns_ip . del_veth ( fip_2_rtr_name )
def floating_ip_moved_dist ( self , fip ) :
""" Handle floating IP move between fixed IPs. """
floating_ip = fip [ ' floating_ip_address ' ]
self . _remove_floating_ip_rule ( floating_ip )
self . _add_floating_ip_rule ( floating_ip , fip [ ' fixed_ip_address ' ] )
def add_floating_ip ( self , fip , interface_name , device ) :
if not self . _add_fip_addr_to_device ( fip , device ) :
return l3_constants . FLOATINGIP_STATUS_ERROR
@ -149,6 +161,10 @@ class DvrLocalRouter(dvr_router_base.DvrRouterBase):
super ( DvrLocalRouter , self ) . remove_floating_ip ( device , ip_cidr )
self . floating_ip_removed_dist ( ip_cidr )
def move_floating_ip ( self , fip ) :
self . floating_ip_moved_dist ( fip )
return l3_constants . FLOATINGIP_STATUS_ACTIVE
def _get_internal_port ( self , subnet_id ) :
""" Return internal router port based on subnet_id. """
router_ports = self . router . get ( l3_constants . INTERFACE_KEY , [ ] )