Пример #1
0
 def _items(self, request, do_authz=False, parent_id=None):
     """Retrieves and formats a list of elements of the requested entity."""
     # NOTE(salvatore-orlando): The following ensures that fields which
     # are needed for authZ policy validation are not stripped away by the
     # plugin before returning.
     original_fields, fields_to_add = self._do_field_list(
         api_common.list_args(request, 'fields'))
     filters = api_common.get_filters(
         request, self._attr_info,
         ['fields', 'sort_key', 'sort_dir',
          'limit', 'marker', 'page_reverse'],
         is_filter_validation_supported=self._filter_validation)
     kwargs = {'filters': filters,
               'fields': original_fields}
     sorting_helper = self._get_sorting_helper(request)
     pagination_helper = self._get_pagination_helper(request)
     sorting_helper.update_args(kwargs)
     sorting_helper.update_fields(original_fields, fields_to_add)
     pagination_helper.update_args(kwargs)
     pagination_helper.update_fields(original_fields, fields_to_add)
     if parent_id:
         kwargs[self._parent_id_name] = parent_id
     obj_getter = getattr(self._plugin, self._plugin_handlers[self.LIST])
     obj_list = obj_getter(request.context, **kwargs)
     obj_list = sorting_helper.sort(obj_list)
     obj_list = pagination_helper.paginate(obj_list)
     # Check authz
     if do_authz:
         # FIXME(salvatore-orlando): obj_getter might return references to
         # other resources. Must check authZ on them too.
         # Omit items from list that should not be visible
         tmp_list = []
         for obj in obj_list:
             self._set_parent_id_into_ext_resources_request(
                 request, obj, parent_id, is_get=True)
             if policy.check(
                     request.context, self._plugin_handlers[self.SHOW],
                     obj, plugin=self._plugin, pluralized=self._collection):
                 tmp_list.append(obj)
         obj_list = tmp_list
     # Use the first element in the list for discriminating which attributes
     # should be filtered out because of authZ policies
     # fields_to_add contains a list of attributes added for request policy
     # checks but that were not required by the user. They should be
     # therefore stripped
     fields_to_strip = fields_to_add or []
     if obj_list:
         fields_to_strip += self._exclude_attributes_by_policy(
             request.context, obj_list[0])
     collection = {self._collection:
                   [self._filter_attributes(obj,
                       fields_to_strip=fields_to_strip)
                    for obj in obj_list]}
     pagination_links = pagination_helper.get_links(obj_list)
     if pagination_links:
         collection[self._collection + "_links"] = pagination_links
     # Synchronize usage trackers, if needed
     resource_registry.resync_resource(
         request.context, self._resource, request.context.tenant_id)
     return collection
Пример #2
0
 def _items(self, request, do_authz=False, parent_id=None):
     """Retrieves and formats a list of elements of the requested entity."""
     # NOTE(salvatore-orlando): The following ensures that fields which
     # are needed for authZ policy validation are not stripped away by the
     # plugin before returning.
     original_fields, fields_to_add = self._do_field_list(
         api_common.list_args(request, 'fields'))
     filters = api_common.get_filters(request, self._attr_info, [
         'fields', 'sort_key', 'sort_dir', 'limit', 'marker', 'page_reverse'
     ])
     kwargs = {'filters': filters, 'fields': original_fields}
     sorting_helper = self._get_sorting_helper(request)
     pagination_helper = self._get_pagination_helper(request)
     sorting_helper.update_args(kwargs)
     sorting_helper.update_fields(original_fields, fields_to_add)
     pagination_helper.update_args(kwargs)
     pagination_helper.update_fields(original_fields, fields_to_add)
     if parent_id:
         kwargs[self._parent_id_name] = parent_id
     obj_getter = getattr(self._plugin, self._plugin_handlers[self.LIST])
     obj_list = obj_getter(request.context, **kwargs)
     obj_list = sorting_helper.sort(obj_list)
     obj_list = pagination_helper.paginate(obj_list)
     # Check authz
     if do_authz:
         # FIXME(salvatore-orlando): obj_getter might return references to
         # other resources. Must check authZ on them too.
         # Omit items from list that should not be visible
         obj_list = [
             obj for obj in obj_list
             if policy.check(request.context,
                             self._plugin_handlers[self.SHOW],
                             obj,
                             plugin=self._plugin,
                             pluralized=self._collection)
         ]
     # Use the first element in the list for discriminating which attributes
     # should be filtered out because of authZ policies
     # fields_to_add contains a list of attributes added for request policy
     # checks but that were not required by the user. They should be
     # therefore stripped
     fields_to_strip = fields_to_add or []
     if obj_list:
         fields_to_strip += self._exclude_attributes_by_policy(
             request.context, obj_list[0])
     collection = {
         self._collection: [
             self._filter_attributes(request.context,
                                     obj,
                                     fields_to_strip=fields_to_strip)
             for obj in obj_list
         ]
     }
     pagination_links = pagination_helper.get_links(obj_list)
     if pagination_links:
         collection[self._collection + "_links"] = pagination_links
     # Synchronize usage trackers, if needed
     resource_registry.resync_resource(request.context, self._resource,
                                       request.context.tenant_id)
     return collection
Пример #3
0
 def test_resync_tracked_resource(self):
     with mock.patch('neutron.quota.resource.'
                     'TrackedResource.resync') as mock_resync:
         self.registry.set_tracked_resource('meh', test_quota.MehModel)
         self.registry.register_resource_by_name('meh')
         resource_registry.resync_resource(mock.ANY, 'meh', 'tenant_id')
         mock_resync.assert_called_once_with(mock.ANY, 'tenant_id')
 def test_resync_tracked_resource(self):
     with mock.patch('neutron.quota.resource.'
                     'TrackedResource.resync') as mock_resync:
         self.registry.set_tracked_resource('meh', test_quota.MehModel)
         self.registry.register_resource_by_name('meh')
         resource_registry.resync_resource(mock.ANY, 'meh', 'tenant_id')
         mock_resync.assert_called_once_with(mock.ANY, 'tenant_id')
 def test_resync_tracking_disabled(self):
     cfg.CONF.set_override("track_quota_usage", False, group="QUOTAS")
     # DietTestCase does not automatically cleans configuration overrides
     self.addCleanup(cfg.CONF.reset)
     with mock.patch("neutron.quota.resource." "TrackedResource.resync") as mock_resync:
         self.registry.set_tracked_resource("meh", test_quota.MehModel)
         self.registry.register_resource_by_name("meh")
         resource_registry.resync_resource(mock.ANY, "meh", "tenant_id")
         self.assertEqual(0, mock_resync.call_count)
Пример #6
0
 def test_resync_tracking_disabled(self):
     cfg.CONF.set_override('track_quota_usage', False, group='QUOTAS')
     # DietTestCase does not automatically cleans configuration overrides
     self.addCleanup(cfg.CONF.reset)
     with mock.patch('neutron.quota.resource.'
                     'TrackedResource.resync') as mock_resync:
         self.registry.set_tracked_resource('meh', test_quota.MehModel)
         self.registry.register_resource_by_name('meh')
         resource_registry.resync_resource(mock.ANY, 'meh', 'tenant_id')
         self.assertEqual(0, mock_resync.call_count)
 def test_resync_tracking_disabled(self):
     cfg.CONF.set_override('track_quota_usage', False,
                           group='QUOTAS')
     # DietTestCase does not automatically cleans configuration overrides
     self.addCleanup(cfg.CONF.reset)
     with mock.patch('neutron.quota.resource.'
                     'TrackedResource.resync') as mock_resync:
         self.registry.set_tracked_resource('meh', test_quota.MehModel)
         self.registry.register_resource_by_name('meh')
         resource_registry.resync_resource(mock.ANY, 'meh', 'tenant_id')
         self.assertEqual(0, mock_resync.call_count)
Пример #8
0
 def after(self, state):
     neutron_context = state.request.context.get('neutron_context')
     if not neutron_context:
         return
     collection = state.request.context.get('collection')
     resource = state.request.context.get('resource')
     if state.request.method == 'GET' and collection:
         # resync on list operations to preserve behavior of old API
         resource_registry.resync_resource(neutron_context, resource,
                                           neutron_context.tenant_id)
     # Commit reservation(s)
     reservations = state.request.context.get('reservations') or []
     if not reservations and state.request.method != 'DELETE':
         return
     with db_api.CONTEXT_WRITER.using(neutron_context):
         # Commit the reservation(s)
         for reservation in reservations:
             quota.QUOTAS.commit_reservation(neutron_context,
                                             reservation.reservation_id)
         resource_registry.set_resources_dirty(neutron_context)
Пример #9
0
 def after(self, state):
     neutron_context = state.request.context.get('neutron_context')
     if not neutron_context:
         return
     collection = state.request.context.get('collection')
     resource = state.request.context.get('resource')
     if state.request.method == 'GET' and collection:
         # resync on list operations to preserve behavior of old API
         resource_registry.resync_resource(
             neutron_context, resource, neutron_context.tenant_id)
     # Commit reservation(s)
     reservations = state.request.context.get('reservations') or []
     if not reservations and state.request.method != 'DELETE':
         return
     with db_api.CONTEXT_WRITER.using(neutron_context):
         # Commit the reservation(s)
         for reservation in reservations:
             quota.QUOTAS.commit_reservation(
                 neutron_context, reservation.reservation_id)
         resource_registry.set_resources_dirty(neutron_context)
Пример #10
0
 def test_resync_non_tracked_resource(self):
     with mock.patch('neutron.quota.resource.'
                     'TrackedResource.resync') as mock_resync:
         self.registry.register_resource_by_name('meh')
         resource_registry.resync_resource(mock.ANY, 'meh', 'tenant_id')
         self.assertEqual(0, mock_resync.call_count)
 def test_resync_non_tracked_resource(self):
     with mock.patch("neutron.quota.resource." "TrackedResource.resync") as mock_resync:
         self.registry.register_resource_by_name("meh")
         resource_registry.resync_resource(mock.ANY, "meh", "tenant_id")
         self.assertEqual(0, mock_resync.call_count)
 def test_resync_tracked_resource(self):
     with mock.patch("neutron.quota.resource." "TrackedResource.resync") as mock_resync:
         self.registry.set_tracked_resource("meh", test_quota.MehModel)
         self.registry.register_resource_by_name("meh")
         resource_registry.resync_resource(mock.ANY, "meh", "tenant_id")
         mock_resync.assert_called_once_with(mock.ANY, "tenant_id")
 def test_resync_non_tracked_resource(self):
     with mock.patch('neutron.quota.resource.'
                     'TrackedResource.resync') as mock_resync:
         self.registry.register_resource_by_name('meh')
         resource_registry.resync_resource(mock.ANY, 'meh', 'tenant_id')
         self.assertEqual(0, mock_resync.call_count)