Skip to content

Commit

Permalink
Floating IP show must reference router ID if exist
Browse files Browse the repository at this point in the history
When a floating IP is associated to a port which its network is link to
a router, that floating IP should reference the router ID.
The schema change and logical router does not have anymore VMI ref for
interface. Only for the gateway.

Change-Id: Ic7d084fd745bbca37165b77f276019152a70740d
Closes-Bug: #1401827
  • Loading branch information
Édouard Thuleau committed Dec 12, 2014
1 parent 16a5828 commit 4dfbb65
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 19 deletions.
29 changes: 10 additions & 19 deletions src/config/vnc_openstack/vnc_openstack/neutron_plugin_db.py
Expand Up @@ -1588,31 +1588,22 @@ def _floatingip_vnc_to_neutron(self, fip_obj):
tenant_id = fip_obj.get_project_refs()[0]['uuid'].replace('-', '')

port_id = None
fixed_ip = None
router_id = None
port_refs = fip_obj.get_virtual_machine_interface_refs()
if port_refs:
port_id = port_refs[0]['uuid']
internal_net_id = None
port_obj = self._virtual_machine_interface_read(port_id=port_id)
port_net_id = port_obj.get_virtual_network_refs()[0]['uuid']
# find router_id from port
router_list = self._router_list_project(
fip_obj.get_project_refs()[0]['uuid'], detail=True)
router_list = self._router_list_project(tenant_id, detail=True)
for router_obj in router_list or []:
for net in router_obj.get_virtual_network_refs() or []:
if net['uuid'] != floating_net_id:
continue
for vmi in (router_obj.get_virtual_machine_interface_refs()
or []):
vmi_obj = self._vnc_lib.virtual_machine_interface_read(
id=vmi['uuid'])
if internal_net_id is None:
port_obj = self._virtual_machine_interface_read(port_id=port_id)
internal_net_id = port_obj.get_virtual_network_refs()[0]['uuid']
if (vmi_obj.get_virtual_network_refs()[0]['uuid'] ==
internal_net_id):
router_id = router_obj.uuid
break
if router_id:
for vmi in (router_obj.get_virtual_machine_interface_refs()
or []):
vmi_obj = self._virtual_machine_interface_read(
port_id=vmi['uuid'])
if (vmi_obj.get_virtual_network_refs()[0]['uuid'] ==
port_net_id):
router_id = router_obj.uuid
break
if router_id:
break
Expand Down
42 changes: 42 additions & 0 deletions src/config/vnc_openstack/vnc_openstack/tests/test_vnc_plugin_db.py
@@ -1,4 +1,5 @@
import unittest
import uuid
from flexmock import flexmock

from vnc_openstack import neutron_plugin_db as db
Expand Down Expand Up @@ -71,3 +72,44 @@ def test_resource_count_optimized(self):
self._test_for("network_policys")
self._test_for("network_ipams")
self._test_for("route_tables")

def test_floating_show_router_id(self):
dbi = MockDbInterface()
vmi_obj = None

def fake_virtual_machine_read(id, fq_name=None, fields=None,
parent_id=None):
if id == 'fip_port_uuid1':
net_uuid = 'match_vn_uuid'
elif id == 'fip_port_uuid2':
net_uuid = 'miss_vn_uuid'
elif id == 'router_port_uuid':
net_uuid = 'match_vn_uuid'
return flexmock(uuid=id,
get_virtual_network_refs=\
lambda: [{'uuid': net_uuid}])

dbi._vnc_lib = flexmock(
fq_name_to_id=lambda res, name: 'fip_pool_uuid',
virtual_machine_interface_read=fake_virtual_machine_read,
logical_routers_list=lambda parent_id, detail: [
flexmock(uuid='router_uuid',
get_virtual_machine_interface_refs=\
lambda: [{'uuid': 'router_port_uuid'}])])

fip_obj = flexmock(
uuid = 'fip_uuid',
get_fq_name=lambda: ['domain', 'project', 'fip'],
get_project_refs=lambda: [{'uuid': str(uuid.uuid4())}],
get_floating_ip_address=lambda: 'fip_ip',
get_floating_ip_fixed_ip_address= lambda: 'fip_port_ip')

fip_obj.get_virtual_machine_interface_refs = \
lambda: [{'uuid': 'fip_port_uuid1'}]
fip_neutron = dbi._floatingip_vnc_to_neutron(fip_obj)
self.assertEqual(fip_neutron['router_id'], 'router_uuid')

fip_obj.get_virtual_machine_interface_refs = \
lambda: [{'uuid': 'fip_port_uuid2'}]
fip_neutron = dbi._floatingip_vnc_to_neutron(fip_obj)
self.assertIsNone(fip_neutron['router_id'])

0 comments on commit 4dfbb65

Please sign in to comment.