Skip to content

Commit

Permalink
Merge "In neutron translation, if 'id' specified in filters, read onl…
Browse files Browse the repository at this point in the history
…y those resources from contrail backend." into R3.1
  • Loading branch information
Zuul authored and opencontrail-ci-admin committed Aug 10, 2016
2 parents b52e8cb + 3451c82 commit c165886
Show file tree
Hide file tree
Showing 2 changed files with 149 additions and 14 deletions.
51 changes: 37 additions & 14 deletions src/config/vnc_openstack/vnc_openstack/neutron_plugin_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -586,8 +586,9 @@ def _logical_router_delete(self, rtr_id):
self._raise_contrail_exception('RouterInUse', router_id=rtr_id)
#end _logical_router_delete

def _floatingip_list(self, back_ref_id=None):
return self._vnc_lib.floating_ips_list(back_ref_id=back_ref_id,
def _floatingip_list(self, obj_uuids=None, back_ref_id=None):
return self._vnc_lib.floating_ips_list(obj_uuids=obj_uuids,
back_ref_id=back_ref_id,
detail=True)
#end _floatingip_list

Expand Down Expand Up @@ -3431,28 +3432,46 @@ def floatingip_list(self, context, filters=None):

proj_ids = None
port_ids = None
fip_ids = None
backref_ids = None
if filters:
if 'id' in filters:
fip_ids = filters['id']
if 'tenant_id' in filters:
proj_ids = self._validate_project_ids(context,
filters['tenant_id'])
elif 'port_id' in filters:
port_ids = filters['port_id']
backref_ids = self._validate_project_ids(context,
filters['tenant_id'])
proj_ids = backref_ids
if 'port_id' in filters:
backref_ids = backref_ids or [] + filters['port_id']
port_ids = backref_ids
else: # no filters
if not context['is_admin']:
proj_ids = [str(uuid.UUID(context['tenant']))]
backref_ids = [str(uuid.UUID(context['tenant']))]

if port_ids:
fip_objs = self._floatingip_list(back_ref_id=port_ids)
elif proj_ids:
fip_objs = self._floatingip_list(back_ref_id=proj_ids)
else:
fip_objs = self._floatingip_list()
fip_objs = self._floatingip_list(obj_uuids=fip_ids,
back_ref_id=backref_ids)

for fip_obj in fip_objs:
if 'floating_ip_address' in filters:
if (fip_obj.get_floating_ip_address() not in
filters['floating_ip_address']):
continue
# if filters has both id and tenant_id, api-server would
# have returned ORed value, neutron expects ANDed
if not self._filters_is_present(filters, 'id', fip_obj.uuid):
continue
if filters and 'tenant_id' in filters:
if not fip_obj.get_project_refs():
continue
if fip_obj.get_project_refs()[0]['uuid'] not in proj_ids:
continue
if filters and 'port_id' in filters:
if not fip_obj.get_virtual_machine_interface_refs():
continue
if fip_obj.get_virtual_machine_interface_refs(
)[0]['uuid'] not in port_ids:
continue

try:
ret_list.append(self._floatingip_vnc_to_neutron(fip_obj))
except NoIdError:
Expand Down Expand Up @@ -3941,7 +3960,11 @@ def security_group_list(self, context, filters=None):
self._ensure_default_security_group_exists(context['tenant_id'])

all_sgs = [] # all sgs in all projects
if context and not context['is_admin']:
if filters and 'id' in filters:
all_sgs.append(
self._vnc_lib.security_groups_list(obj_uuids=filters['id'],
detail=True))
elif context and not context['is_admin']:
project_sgs = self._security_group_list_project(str(uuid.UUID(context['tenant'])), filters)
all_sgs.append(project_sgs)
else: # admin context
Expand Down
112 changes: 112 additions & 0 deletions src/config/vnc_openstack/vnc_openstack/tests/test_basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -526,3 +526,115 @@ def test_no_extra_fields_on_network(self):
self.assertNotIn('contrail:fq_name', net_dict)
# end test_extra_fields_on_network
# end class TestExtraFieldsAbsenceByKnob


class TestListWithFilters(test_case.NeutronBackendTestCase):
def test_filters_with_id(self):
neutron_api_obj = FakeExtensionManager.get_extension_objects(
'vnc_cfg_api.neutronApi')[0]
neutron_api_obj._npi._connect_to_db()
neutron_db_obj = neutron_api_obj._npi._cfgdb

# sg setup
proj_obj = self._vnc_lib.project_read(
fq_name=['default-domain', 'default-project'])
sg_obj = vnc_api.SecurityGroup('sg-%s' %(self.id()), proj_obj)
self._vnc_lib.security_group_create(sg_obj)

# fip setup
vn_obj = vnc_api.VirtualNetwork('vn1-%s' %(self.id()), proj_obj)
vn_obj.add_network_ipam(vnc_api.NetworkIpam(),
vnc_api.VnSubnetsType(
[vnc_api.IpamSubnetType(vnc_api.SubnetType('1.1.1.0', 28))]))
self._vnc_lib.virtual_network_create(vn_obj)
fip_pool_obj = vnc_api.FloatingIpPool('fip-pool-%s' %(self.id()),
vn_obj)
self._vnc_lib.floating_ip_pool_create(fip_pool_obj)
fip1_obj = vnc_api.FloatingIp('fip1-%s' %(self.id()), fip_pool_obj)
fip1_obj.add_project(proj_obj)
self._vnc_lib.floating_ip_create(fip1_obj)

proj2_obj = vnc_api.Project('proj2-%s' %(self.id()), vnc_api.Domain())
self._vnc_lib.project_create(proj2_obj)
fip2_obj = vnc_api.FloatingIp('fip2-%s' %(self.id()), fip_pool_obj)
fip2_obj.add_project(proj2_obj)
self._vnc_lib.floating_ip_create(fip2_obj)

vmi_obj = vnc_api.VirtualMachineInterface(
'vmi-%s' %(self.id()), proj_obj)
vmi_obj.add_virtual_network(vn_obj)
self._vnc_lib.virtual_machine_interface_create(vmi_obj)
fip3_obj = vnc_api.FloatingIp('fip3-%s' %(self.id()), fip_pool_obj)
fip3_obj.add_virtual_machine_interface(vmi_obj)
fip3_obj.add_project(proj_obj)
self._vnc_lib.floating_ip_create(fip3_obj)

def spy_list(orig_method, *args, **kwargs):
self.assertIn(sg_obj.uuid, kwargs['obj_uuids'])
return orig_method(*args, **kwargs)
with test_common.patch(
neutron_db_obj._vnc_lib, 'security_groups_list', spy_list):
context = {'operation': 'READALL',
'user_id': '',
'tenant_id': proj_obj.uuid,
'roles': '',
'is_admin': 'False'}
data = {'filters': {'id':[sg_obj.uuid]}}
body = {'context': context, 'data': data}
resp = self._api_svr_app.post_json(
'/neutron/security_group', body)

sg_neutron_list = json.loads(resp.text)
self.assertEqual(len(sg_neutron_list), 1)
self.assertEqual(sg_neutron_list[0]['id'], sg_obj.uuid)

def spy_list(orig_method, *args, **kwargs):
self.assertIn(fip1_obj.uuid, kwargs['obj_uuids'])
return orig_method(*args, **kwargs)
with test_common.patch(
neutron_db_obj._vnc_lib, 'floating_ips_list', spy_list):
context = {'operation': 'READALL',
'user_id': '',
'tenant_id': '',
'roles': '',
'is_admin': 'False'}
# ask for one explicit id
data = {'filters': {'id':[fip1_obj.uuid]}}
body = {'context': context, 'data': data}
resp = self._api_svr_app.post_json(
'/neutron/floatingip', body)
fip_neutron_list = json.loads(resp.text)
self.assertEqual(len(fip_neutron_list), 1)
self.assertEqual(fip_neutron_list[0]['id'], fip1_obj.uuid)

# ask for list of ids AND in a project, should return 1
data = {'filters': {'id':[fip1_obj.uuid, fip2_obj.uuid],
'tenant_id': [proj2_obj.uuid.replace('-', '')]}}
body = {'context': context, 'data': data}
resp = self._api_svr_app.post_json(
'/neutron/floatingip', body)
fip_neutron_list = json.loads(resp.text)
self.assertEqual(len(fip_neutron_list), 1)
self.assertEqual(fip_neutron_list[0]['id'], fip2_obj.uuid)

# ask for list of ids AND on a VMI, should return 1
data = {'filters': {'id':[fip1_obj.uuid, fip2_obj.uuid,
fip3_obj.uuid],
'tenant_id': [proj2_obj.uuid.replace('-', '')]}}
body = {'context': context, 'data': data}
resp = self._api_svr_app.post_json(
'/neutron/floatingip', body)
fip_neutron_list = json.loads(resp.text)
self.assertEqual(len(fip_neutron_list), 1)
self.assertEqual(fip_neutron_list[0]['id'], fip2_obj.uuid)

self._vnc_lib.security_group_delete(id=sg_obj.uuid)
self._vnc_lib.floating_ip_delete(id=fip1_obj.uuid)
self._vnc_lib.floating_ip_delete(id=fip2_obj.uuid)
self._vnc_lib.floating_ip_delete(id=fip3_obj.uuid)
self._vnc_lib.floating_ip_pool_delete(id=fip_pool_obj.uuid)
self._vnc_lib.virtual_machine_interface_delete(id=vmi_obj.uuid)
self._vnc_lib.virtual_network_delete(id=vn_obj.uuid)
self._vnc_lib.project_delete(id=proj2_obj.uuid)
# end test_filters_with_id
# end class TestListWithFilters

0 comments on commit c165886

Please sign in to comment.