Add delete filter from db command

This commit is contained in:
Ofer Ben-Yacov 2017-01-26 10:29:25 +02:00
parent a1684c81dc
commit 1881830ed4
5 changed files with 142 additions and 59 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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,

View File

@ -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 = {