From 1881830ed4506c8c0e5d491a6c9afda3e8373be2 Mon Sep 17 00:00:00 2001 From: Ofer Ben-Yacov Date: Thu, 26 Jan 2017 10:29:25 +0200 Subject: [PATCH] Add delete filter from db command --- wan_qos/agent/tc_manager.py | 6 ++ wan_qos/common/api.py | 12 ++++ wan_qos/db/wan_qos_db.py | 125 ++++++++++++++++++---------------- wan_qos/services/plugin.py | 2 +- wan_qos/tests/unit/test_db.py | 56 +++++++++++++++ 5 files changed, 142 insertions(+), 59 deletions(-) diff --git a/wan_qos/agent/tc_manager.py b/wan_qos/agent/tc_manager.py index 8f118a3..2705a07 100644 --- a/wan_qos/agent/tc_manager.py +++ b/wan_qos/agent/tc_manager.py @@ -121,3 +121,9 @@ class TcAgentManager(manager.Manager): if wtc_class['direction'] == 'out' or wtc_class['direction'] == 'both': tc_dict['port_side'] = 'wan_port' self.agent.remove_traffic_class(tc_dict) + + def create_wtc_filter(self, context, wtc_filter): + pass + + def delete_wtc_filter(self, context, wtc_filter): + pass diff --git a/wan_qos/common/api.py b/wan_qos/common/api.py index 31b4fed..3d26145 100644 --- a/wan_qos/common/api.py +++ b/wan_qos/common/api.py @@ -63,3 +63,15 @@ class TcAgentApi(object): return cctxt.call(context, 'delete_wtc_class', wtc_class_tree=wtc_class_tree) + + def create_wtc_filter(self, context, wtc_filter): + cctxt = self.client.prepare() + return cctxt.call(context, + 'create_wtc_filter', + wtc_filter=wtc_filter) + + def delete_wtc_filter(self, context, wtc_filter): + cctxt = self.client.prepare() + return cctxt.call(context, + 'delete_wtc_filter', + wtc_filter=wtc_filter) \ No newline at end of file diff --git a/wan_qos/db/wan_qos_db.py b/wan_qos/db/wan_qos_db.py index c7c4834..32cec58 100644 --- a/wan_qos/db/wan_qos_db.py +++ b/wan_qos/db/wan_qos_db.py @@ -19,6 +19,8 @@ from oslo_utils import uuidutils from oslo_utils import timeutils from oslo_log import log as logging +import sqlalchemy as sa + from neutron import context as ctx from neutron.db.models import segment from neutron_lib import exceptions @@ -233,64 +235,6 @@ class WanTcDb(object): parent_class['child_list'].append(child_class) self._get_child_classes(context, child_class) - def _get_collection(self, context, model, dict_func, filters=None, - fields=None, sorts=None, limit=None, marker_obj=None, - page_reverse=False): - """Get collection object based on query for resources.""" - query = self._get_collection_query(context, model, filters=filters, - sorts=sorts, - limit=limit, - marker_obj=marker_obj, - page_reverse=page_reverse) - items = [dict_func(c, fields) for c in query] - if limit and page_reverse: - items.reverse() - return items - - def _get_collection_query(self, context, model, filters=None, - sorts=None, limit=None, marker_obj=None, - page_reverse=False): - """Get collection query for the models.""" - collection = self._model_query(context, model) - collection = self._apply_filters_to_query(collection, model, filters) - return collection - - def _get_marker_obj(self, context, resource, limit, marker): - """Get marker object for the resource.""" - if limit and marker: - return getattr(self, '_get_%s' % resource)(context, marker) - return None - - def _fields(self, resource, fields): - """Get fields for the resource for get query.""" - if fields: - return dict(((key, item) for key, item in resource.items() - if key in fields)) - return resource - - def _model_query(self, context, model): - """Query model based on filter.""" - query = context.session.query(model) - query_filter = None - if not context.is_admin and hasattr(model, 'tenant_id'): - if hasattr(model, 'shared'): - query_filter = ((model.tenant_id == context.tenant_id) | - (model.shared == sa.true())) - else: - query_filter = (model.tenant_id == context.tenant_id) - if query_filter is not None: - query = query.filter(query_filter) - return query - - def _apply_filters_to_query(self, query, model, filters): - """Apply filters to query for the models.""" - if filters: - for key, value in filters.items(): - column = getattr(model, key, None) - if column: - query = query.filter(column.in_(value)) - return query - def create_wan_tc_filter(self, context, wan_tc_filter): wtc_filter_db = models.WanTcFilter( @@ -334,3 +278,68 @@ class WanTcDb(object): sorts=sorts, limit=limit, marker_obj=marker_obj, page_reverse=page_reverse) + + def delete_wan_tc_filter(self, context, id): + filter_db = context.session.query(models.WanTcFilter).filter_by( + id=id + ).first() + if filter_db: + with context.session.begin(subtransactions=True): + context.session.delete(filter_db) + else: + LOG.error('Trying to delete none existing tc filter. id=%s' % id) + + def _get_collection(self, context, model, dict_func, filters=None, + fields=None, sorts=None, limit=None, marker_obj=None, + page_reverse=False): + """Get collection object based on query for resources.""" + if not self._has_attribute(model, filters): + return [] + query = self._get_collection_query(context, model, filters=filters, + sorts=sorts, + limit=limit, + marker_obj=marker_obj, + page_reverse=page_reverse) + items = [dict_func(c, fields) for c in query] + if limit and page_reverse: + items.reverse() + return items + + def _has_attribute(self, model, filters): + for key in filters.keys(): + if not hasattr(model, key): + return False + return True + + def _get_collection_query(self, context, model, filters=None, + sorts=None, limit=None, marker_obj=None, + page_reverse=False): + """Get collection query for the models.""" + collection = self._model_query(context, model) + collection = self._apply_filters_to_query(collection, model, filters) + return collection + + def _get_marker_obj(self, context, resource, limit, marker): + """Get marker object for the resource.""" + if limit and marker: + return getattr(self, '_get_%s' % resource)(context, marker) + return None + + def _model_query(self, context, model): + """Query model based on filter.""" + query = context.session.query(model) + query_filter = None + if not context.is_admin and hasattr(model, 'tenant_id'): + query_filter = (model.tenant_id == context.tenant_id) + if query_filter is not None: + query = query.filter(query_filter) + return query + + def _apply_filters_to_query(self, query, model, filters): + """Apply filters to query for the models.""" + if filters: + for key, value in filters.items(): + column = getattr(model, key, None) + if column: + query = query.filter(column.in_(value)) + return query diff --git a/wan_qos/services/plugin.py b/wan_qos/services/plugin.py index 15f2344..5c55504 100644 --- a/wan_qos/services/plugin.py +++ b/wan_qos/services/plugin.py @@ -122,7 +122,7 @@ class WanQosPlugin(wantcfilter.WanTcFilterPluginBase, marker, page_reverse) def delete_wan_tc_filter(self, context, id): - pass + self.db.delete_wan_tc_filter(context, id) def get_wan_tc_filters(self, context, filters=None, fields=None, sorts=None, limit=None, marker=None, diff --git a/wan_qos/tests/unit/test_db.py b/wan_qos/tests/unit/test_db.py index eb5992f..50b101d 100644 --- a/wan_qos/tests/unit/test_db.py +++ b/wan_qos/tests/unit/test_db.py @@ -32,6 +32,7 @@ class TestTcDb(testlib_api.SqlTestCase): '4mbit') class_by_id = self.db.get_class_by_id(self.context, class_db_1['id']) + # class_by_id = self.db.get_class_by_id(self.context, '111') print (class_by_id) def test_get_class_tree(self): @@ -113,6 +114,61 @@ class TestPlugin(testlib_api.SqlTestCase): print(tc_classes) + def test_get_all_classes_by_id(self): + + class_db_1 = self._add_class(None, 'both', '1mbit', '2mbit') + print ('class_1: %s ' % class_db_1) + + filters = {'id': [class_db_1['id']]} + # filters = {'id': ['11']} + # filters = {'name': ['111']} + + tc_classes = self.plugin.get_wan_tc_classs(ctx.get_admin_context(), + filters=filters) + + print(tc_classes) + + filters = {'name': ['111']} + + tc_classes = self.plugin.get_wan_tc_classs(ctx.get_admin_context(), + filters=filters) + + print(tc_classes) + + + + + + + + def test_add_filter(self): + + class_db = self._add_class(None, 'both', '1mbit', '2mbit') + filter = self._get_filter(class_db['id']) + filter_db = self.plugin.create_wan_tc_filter(ctx.get_admin_context(), + filter) + + print ('filter: %s' % filter_db) + + filters = { + 'id': [filter_db['id']] + # 'name': ['123'] + } + filter_by_id = self.plugin.get_wan_tc_filters(ctx.get_admin_context(), + filters=filters) + + print('filter by id: %s' % filter_by_id) + + def _get_filter(self, class_id): + + filter = {'wan_tc_filter': { + 'protocol': 'vxlan', + 'match': 'vni=123', + 'class_id': class_id + } + } + + return filter def _add_class(self, parent, direction, min, max): wtc_class = {