diff --git a/src/config/vnc_openstack/vnc_openstack/neutron_plugin_db.py b/src/config/vnc_openstack/vnc_openstack/neutron_plugin_db.py index 7deabeae034..dbdd69d8c00 100644 --- a/src/config/vnc_openstack/vnc_openstack/neutron_plugin_db.py +++ b/src/config/vnc_openstack/vnc_openstack/neutron_plugin_db.py @@ -1581,31 +1581,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 diff --git a/src/config/vnc_openstack/vnc_openstack/tests/test_vnc_plugin_db.py b/src/config/vnc_openstack/vnc_openstack/tests/test_vnc_plugin_db.py index 796056dcf2d..b4bb784d0c3 100644 --- a/src/config/vnc_openstack/vnc_openstack/tests/test_vnc_plugin_db.py +++ b/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 @@ -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'])