# Process SNAT/DNAT rules and addresses for floating IPs
existing_floating_ips = ri.floating_ips
+ if ri.router['distributed']:
+ self.create_dvr_fip_interfaces(ri, ex_gw_port)
self._process_snat_dnat_for_fip(ri)
# Once NAT rules for floating IPs are safely in place
ri.iptables_manager.apply()
- def _get_external_device_interface_name(self, ri, ex_gw_port,
- floating_ips):
+ def create_dvr_fip_interfaces(self, ri, ex_gw_port):
+ floating_ips = self.get_floating_ips(ri)
+ if floating_ips:
+ is_first = self._fip_ns_subscribe(ri.router_id)
+ if is_first:
+ self._create_agent_gateway_port(ri, floating_ips[0]
+ ['floating_network_id'])
+
+ if self.agent_gateway_port:
+ if floating_ips and ri.dist_fip_count == 0:
+ self.create_rtr_2_fip_link(ri, floating_ips[0]
+ ['floating_network_id'])
+
+ def _get_external_device_interface_name(self, ri, ex_gw_port):
if ri.router['distributed']:
- # filter out only FIPs for this host/agent
- floating_ips = [i for i in floating_ips if i['host'] == self.host]
- if floating_ips:
- is_first = self._fip_ns_subscribe(ri.router_id)
- if is_first:
- self._create_agent_gateway_port(ri, floating_ips[0]
- ['floating_network_id'])
-
if self.agent_gateway_port:
- if floating_ips and ri.dist_fip_count == 0:
- self.create_rtr_2_fip_link(ri, floating_ips[0]
- ['floating_network_id'])
return self.get_rtr_int_device_name(ri.router_id)
- else:
- # there are no fips or agent port, no work to do
- return None
-
- return self.get_external_device_name(ex_gw_port['id'])
+ else:
+ return self.get_external_device_name(ex_gw_port['id'])
def _add_floating_ip(self, ri, fip, interface_name, device):
fip_ip = fip['floating_ip_address']
"""
fip_statuses = {}
- floating_ips = self.get_floating_ips(ri)
interface_name = self._get_external_device_interface_name(
- ri, ex_gw_port, floating_ips)
+ ri, ex_gw_port)
if interface_name is None:
return fip_statuses
existing_cidrs = set([addr['cidr'] for addr in device.addr.list()])
new_cidrs = set()
+ floating_ips = self.get_floating_ips(ri)
# Loop once to ensure that floating ips are configured.
for fip in floating_ips:
fip_ip = fip['floating_ip_address']
def _test_process_router(self, ri):
router = ri.router
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
+ agent.host = HOSTNAME
fake_fip_id = 'fake_fip_id'
+ agent.create_dvr_fip_interfaces = mock.Mock()
agent.process_router_floating_ip_addresses = mock.Mock()
agent.process_router_floating_ip_nat_rules = mock.Mock()
agent.process_router_floating_ip_addresses.return_value = {
{'id': fake_fip_id,
'floating_ip_address': '8.8.8.8',
'fixed_ip_address': '7.7.7.7',
- 'port_id': _uuid()}]}
+ 'port_id': _uuid(),
+ 'host': HOSTNAME}]}
agent.process_router(ri)
ex_gw_port = agent._get_ex_gw_port(ri)
agent.process_router_floating_ip_addresses.assert_called_with(
@mock.patch('neutron.agent.linux.ip_lib.IPDevice')
def _test_process_router_floating_ip_addresses_add(self, ri,
agent, IPDevice):
- floating_ips = ri.router.get(l3_constants.FLOATINGIP_KEY, [])
+ floating_ips = agent.get_floating_ips(ri)
fip_id = floating_ips[0]['id']
IPDevice.return_value = device = mock.Mock()
device.addr.list.return_value = []
ri.iptables_manager.ipv4['nat'] = mock.MagicMock()
+ ex_gw_port = {'id': _uuid()}
with mock.patch.object(lla.LinkLocalAllocator, '_write'):
+ agent.create_dvr_fip_interfaces(ri, ex_gw_port)
fip_statuses = agent.process_router_floating_ip_addresses(
- ri, {'id': _uuid()})
+ ri, ex_gw_port)
self.assertEqual({fip_id: l3_constants.FLOATINGIP_STATUS_ACTIVE},
fip_statuses)
device.addr.add.assert_called_once_with(4, '15.1.2.3/32', '15.1.2.3')
}
ri = mock.MagicMock()
- ri.router.get.return_value = [fip]
ri.router['distributed'].__nonzero__ = lambda self: False
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
+ agent.get_floating_ips = mock.Mock(return_value=[fip])
agent.process_router_floating_ip_nat_rules(ri)
{'id': _uuid(),
'floating_ip_address': '15.1.2.3',
'fixed_ip_address': '192.168.0.1',
- 'port_id': _uuid()}]}
+ 'floating_network_id': _uuid(),
+ 'port_id': _uuid(),
+ 'host': HOSTNAME}]}
router = prepare_router_data(enable_snat=True)
router[l3_constants.FLOATINGIP_KEY] = fake_floatingips['floatingips']
mock.sentinel.ex_gw_port)
agent.process_router_floating_ip_addresses.assert_called_with(
- mock.sentinel.ri, mock.sentinel.ex_gw_port)
+ mock.sentinel.ri,
+ mock.sentinel.ex_gw_port)