]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Add UnionModel support to filter query generator
authorKevin Benton <blak111@gmail.com>
Fri, 20 Nov 2015 05:16:42 +0000 (21:16 -0800)
committerKevin Benton <kevinbenton@buttewifi.com>
Tue, 24 Nov 2015 10:23:57 +0000 (10:23 +0000)
The _apply_filters_to_query method did not handle UnionModels
so objects leveraging it (i.e. RBAC policies) did not have
queries applied to them.

This patch corrects it by iterating through the component models
of the UnionModel and applying the filters to each component model.
It also adds an API test on RBAC that exercises the filtering.

Change-Id: I449acf359dd61189bbdacd200d7c41a4a88d3de8
Closes-Bug: #1517818

neutron/db/common_db_mixin.py
neutron/tests/api/admin/test_shared_network_extension.py

index cf319cd3797c8279620d0011f8d5622cb8dc1006..e2473a5d0cae80c05c59ce8062f47bf7a981856d 100644 (file)
@@ -184,6 +184,13 @@ class CommonDbMixin(object):
         return query.filter(model.id == id).one()
 
     def _apply_filters_to_query(self, query, model, filters, context=None):
+        if isinstance(model, UnionModel):
+            # NOTE(kevinbenton): a unionmodel is made up of multiple tables so
+            # we apply the filter to each table
+            for component_model in model.model_map.values():
+                query = self._apply_filters_to_query(query, component_model,
+                                                     filters, context)
+            return query
         if filters:
             for key, value in six.iteritems(filters):
                 column = getattr(model, key, None)
index 8a30c6a9bdcd2654791d6f2276dd0a1d04138177..ef3fe2845734e611e77aacc57b7a08152d7bdf48 100644 (file)
@@ -316,6 +316,25 @@ class RBACSharedNetworksTest(base.BaseAdminNetworkTest):
         self.assertEqual(
             p2, self.admin_client.show_rbac_policy(p2['id'])['rbac_policy'])
 
+    @test.attr(type='smoke')
+    @test.idempotent_id('e7bcb1ea-4877-4266-87bb-76f68b421f31')
+    def test_filter_policies(self):
+        net = self.create_network()
+        pol1 = self.client.create_rbac_policy(
+            object_type='network', object_id=net['id'],
+            action='access_as_shared',
+            target_tenant=self.client2.tenant_id)['rbac_policy']
+        pol2 = self.client.create_rbac_policy(
+            object_type='network', object_id=net['id'],
+            action='access_as_shared',
+            target_tenant=self.client.tenant_id)['rbac_policy']
+        res1 = self.client.list_rbac_policies(id=pol1['id'])['rbac_policies']
+        res2 = self.client.list_rbac_policies(id=pol2['id'])['rbac_policies']
+        self.assertEqual(1, len(res1))
+        self.assertEqual(1, len(res2))
+        self.assertEqual(pol1['id'], res1[0]['id'])
+        self.assertEqual(pol2['id'], res2[0]['id'])
+
     @test.attr(type='smoke')
     @test.idempotent_id('86c3529b-1231-40de-803c-afffffff6fff')
     def test_regular_client_blocked_from_sharing_anothers_network(self):