Skip to content

Commit

Permalink
[VNC OpenStack] Filter port list with network back-ref
Browse files Browse the repository at this point in the history
On port list, when the filter network IDs is provided we can filter VMIs
with back reference to that network IDs.

Closes_bug: #1646137

Change-Id: I5c479e6f4b3e512d1b24a6b415f4fa0633d5d2ba
(cherry picked from commit fe20656)
  • Loading branch information
Édouard Thuleau committed Feb 9, 2017
1 parent 362b35e commit 085f457
Showing 1 changed file with 20 additions and 12 deletions.
32 changes: 20 additions & 12 deletions src/config/vnc_openstack/vnc_openstack/neutron_plugin_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -3892,25 +3892,36 @@ def port_list(self, context=None, filters=None):

port_objs = []
if filters.get('device_id'):
back_ref_ids = filters.get('device_id')
if filters.get('network_id'):
back_ref_ids += filters.get('network_id')
# Get all VM port
port_objs_filtered_by_device_id =\
self._virtual_machine_interface_list(
obj_uuids=filters.get('id'),
back_ref_id=filters.get('device_id'))
back_ref_id=back_ref_ids)

port_objs_filtered_by_device_id = []
founded_device_ids = set()
for vmi_obj in self._virtual_machine_interface_list(
obj_uuids=filters.get('id'),
back_ref_id=back_ref_ids):
for device_ref in vmi_obj.get_virtual_machine_refs() or [] +\
vmi_obj.get_logical_router_back_refs() or []:
if device_ref['uuid'] in filters.get('device_id'):
port_objs_filtered_by_device_id.append(vmi_obj)
founded_device_ids.add(device_ref['uuid'])

# If some device ids not yet found look to router interfaces
found_device_ids = set(
vm_ref['uuid']
for vmi_obj in port_objs_filtered_by_device_id
for vm_ref in vmi_obj.get_virtual_machine_refs() or [])
not_found_device_ids = set(filters.get('device_id')) -\
found_device_ids
founded_device_ids
if not_found_device_ids:
# Port has a back_ref to logical router, so need to read in
# logical routers based on device ids
router_objs = self._logical_router_list(
obj_uuids=list(not_found_device_ids),
parent_id=project_ids,
back_ref_id=filters.get('network_id'),
fields=['virtual_machine_interface_back_refs'])
router_port_ids = [
vmi_ref['uuid']
Expand All @@ -3921,8 +3932,7 @@ def port_list(self, context=None, filters=None):
# Read all logical router ports and add it to the list
if router_port_ids:
port_objs.extend(self._virtual_machine_interface_list(
obj_uuids=router_port_ids,
parent_id=project_ids))
obj_uuids=router_port_ids, parent_id=project_ids))

# Filter it with project ids if there are.
if project_ids:
Expand All @@ -3933,7 +3943,8 @@ def port_list(self, context=None, filters=None):
else:
port_objs = self._virtual_machine_interface_list(
obj_uuids=filters.get('id'),
parent_id=project_ids)
parent_id=project_ids,
back_ref_id=filters.get('network_id'))

neutron_ports = self._port_list(port_objs)

Expand All @@ -3949,9 +3960,6 @@ def port_list(self, context=None, filters=None):
not self._port_fixed_ips_is_present(filters['fixed_ips'],
neutron_port['fixed_ips'])):
continue
if not self._filters_is_present(filters,'network_id',
neutron_port['network_id']):
continue

ret_list.append(neutron_port)
return ret_list
Expand Down

0 comments on commit 085f457

Please sign in to comment.