Get class tree

This commit is contained in:
Ofer Ben-Yacov 2017-01-24 11:57:42 +02:00
parent 16cacea629
commit 65ea68466f
3 changed files with 99 additions and 15 deletions

View File

@ -53,7 +53,7 @@ class WanTcSelector(model_base.BASEV2,
ondelete='CASCADE'),
nullable=False)
network = sa.Column(sa.String(36),
sa.ForeignKey('network.id',
sa.ForeignKey('networks.id',
ondelete='CASCADE'))
protocol = sa.Column(sa.String(15))
match = sa.Column(sa.String(15))

View File

@ -19,6 +19,7 @@ from oslo_utils import uuidutils
from oslo_utils import timeutils
from oslo_log import log as logging
from neutron import context as ctx
from neutron.db.models import segment
from neutron_lib import exceptions
@ -33,6 +34,20 @@ class WanTcDb(object):
def __init__(self):
self._lock = threading.Lock()
self._initialize_tables()
def _initialize_tables(self):
context = ctx.get_admin_context()
root_class = context.session.query(models.WanTcClass).filter_by(
id='root').first()
if not root_class:
with context.session.begin(subtransactions=True):
root_class = models.WanTcClass(
id='root',
class_ext_id=1,
direction='both'
)
context.session.add(root_class)
def agent_up_notification(self, context, host_info):
device = context.session.query(models.WanTcDevice).filter_by(
@ -80,9 +95,9 @@ class WanTcDb(object):
if not self._last_class_ext_id:
last_class_ext_id_db = context.session.query(
models.WanTcClass.class_ext_id).order_by(
models.WanTcClass.class_ext_id.desc())
models.WanTcClass.class_ext_id.desc()).first()
if last_class_ext_id_db:
self._last_class_ext_id, = last_class_ext_id_db.first()
self._last_class_ext_id, = last_class_ext_id_db
else:
self._last_class_ext_id = 10
self._last_class_ext_id += 1
@ -98,22 +113,22 @@ class WanTcDb(object):
class_ext_id=self.get_last_class_ext_id(context)
)
parent = wtc_class['parent']
parent_class_ext_id = 1
if parent:
if 'parent' in wtc_class:
parent = wtc_class['parent']
parent_class = self.get_class_by_id(context, parent)
if not parent_class:
raise exceptions.BadRequest(msg='invalid parent id')
wtc_class_db.parent = parent
parent_class_ext_id = parent_class['class_ext_id']
else:
wtc_class_db.parent = wtc_class_db.id
wtc_class_db.parent = 'root'
with context.session.begin(subtransactions=True):
if wtc_class['min']:
if 'min' in wtc_class:
wtc_class_db.min = wtc_class['min']
if wtc_class['max']:
if 'max' in wtc_class:
wtc_class_db.max = wtc_class['max']
context.session.add(wtc_class_db)
@ -135,7 +150,8 @@ class WanTcDb(object):
return self._class_to_dict(wtc_class)
def get_all_classes(self, context):
wtc_classes_db = context.session.query(models.WanTcClass).all()
wtc_classes_db = context.session.query(models.WanTcClass).filter(
models.WanTcClass.id != 'root').all()
wtc_classes = []
for wtc_class in wtc_classes_db:
wtc_classes.append(self._class_to_dict(wtc_class))
@ -148,14 +164,10 @@ class WanTcDb(object):
'direction': wtc_class.direction,
'min': wtc_class.min,
'max': wtc_class.max,
'class_ext_id': wtc_class.class_ext_id
'class_ext_id': wtc_class.class_ext_id,
'parent': wtc_class.parent
}
if wtc_class.parent == wtc_class.id:
class_dict['parent'] = ''
else:
class_dict['parent'] = wtc_class.parent
return class_dict
def _device_to_dict(self, device):
@ -186,3 +198,24 @@ class WanTcDb(object):
).first()
if device:
return self._device_to_dict(device)
def get_class_tree(self):
context = ctx.get_admin_context()
wtc_classes = self._get_root_classes(context)
return wtc_classes
def _get_root_classes(self, context):
root_class_db = context.session.query(models.WanTcClass).filter_by(
id='root').first()
root_class = self._class_to_dict(root_class_db)
self._get_child_classes(context, root_class)
return root_class
def _get_child_classes(self, context, parent_class):
child_classes_db = context.session.query(models.WanTcClass).filter_by(
parent=parent_class['id']).all()
parent_class['child_list'] = []
for child_class_db in child_classes_db:
child_class = self._class_to_dict(child_class_db)
parent_class['child_list'].append(child_class)
self._get_child_classes(context, child_class)

View File

@ -0,0 +1,51 @@
from neutron import context as ctx
from neutron.tests import base
from neutron.tests.unit import testlib_api
from oslo_config import cfg
from wan_qos.db import wan_qos_db
class TestTcDb(testlib_api.SqlTestCase):
def setUp(self):
super(TestTcDb, self).setUp()
self.db = wan_qos_db.WanTcDb()
self.context = ctx.get_admin_context()
def test_add_class(self):
wtc_class = {
'direction': 'both',
'min': '1mbit'
}
wtc_class_db = self.db.create_wan_tc_class(self.context, wtc_class)
assert wtc_class_db is not None
def test_get_class_tree(self):
class_db = self._add_class(None, 'both', '1mbit', '2mbit')
class_db = self._add_class(class_db['id'], 'both', '2mbit', '3mbit')
class_db = self._add_class(class_db['id'], 'both', '3mbit', '4mbit')
class_tree = self.db.get_class_tree()
assert class_tree is not None
print class_tree
def test_get_classes(self):
self.test_add_class()
all_classes = self.db.get_all_classes(self.context)
print ('all classes: %s' % all_classes)
def _add_class(self, parent, direction, min, max):
wtc_class = {
'direction': direction,
}
if min:
wtc_class['min'] = min
if parent:
wtc_class['parent'] = parent
if max:
wtc_class['max'] = max
return self.db.create_wan_tc_class(self.context, wtc_class)