Added goal+strategy ObjectField for AuditTemplate

In this changeset, I added the "goal" and the "strategy "ObjectField
which can either be loaded by setting the new "eager" parameter as True
or not loaded (as before) by setting it to False.
The advantage of introducing this eager parameter is that this way,
we can reduce to a minimum the overhead of DB queries whenever the
related goal is not actually needed.

Change-Id: I97418163f68aea2f1cda80be94e4035f0b3700ae
Partially-Implements: blueprint watcher-versioned-objects
This commit is contained in:
Vincent Françoise
2016-10-03 12:01:51 +02:00
parent f54aca70cc
commit 54cf10b41c
9 changed files with 234 additions and 147 deletions

View File

@@ -225,6 +225,11 @@ class TestDbAuditTemplateFilters(base.DbTestCase):
class DbAuditTemplateTestCase(base.DbTestCase):
def _create_test_goal(self, **kwargs):
goal = utils.get_test_goal(**kwargs)
self.dbapi.create_goal(goal)
return goal
def _create_test_audit_template(self, **kwargs):
audit_template = utils.get_test_audit_template(**kwargs)
self.dbapi.create_audit_template(audit_template)
@@ -268,18 +273,19 @@ class DbAuditTemplateTestCase(base.DbTestCase):
strategy.as_dict(), eager_audit_template.strategy.as_dict())
def test_get_audit_template_list_with_filters(self):
goal = self._create_test_goal(name='DUMMY')
audit_template1 = self._create_test_audit_template(
id=1,
uuid=w_utils.generate_uuid(),
name='My Audit Template 1',
description='Description of my audit template 1',
goal='DUMMY')
goal_id=goal['id'])
audit_template2 = self._create_test_audit_template(
id=2,
uuid=w_utils.generate_uuid(),
name='My Audit Template 2',
description='Description of my audit template 2',
goal='DUMMY')
goal_id=goal['id'])
res = self.dbapi.get_audit_template_list(
self.context, filters={'name': 'My Audit Template 1'})

View File

@@ -265,7 +265,7 @@ class TestPurgeCommand(base.DbTestCase):
with freezegun.freeze_time(self.fake_today):
# orphan audit template
audit_template4 = obj_utils.create_test_audit_template(
self.context, goal_id=404, # Does not exist
self.context, goal_id=self.goal2.id, # Does not exist
name=self.generate_unique_name(prefix="Audit Template 4 "),
strategy_id=None, id=self._generate_id(),
uuid=utils.generate_uuid())
@@ -362,7 +362,7 @@ class TestPurgeCommand(base.DbTestCase):
with freezegun.freeze_time(self.fake_today):
# orphan audit template
audit_template4 = obj_utils.create_test_audit_template(
self.context, goal_id=404, # Does not exist
self.context, goal_id=self.goal2.id, # Does not exist
name=self.generate_unique_name(prefix="Audit Template 4 "),
strategy_id=None, id=self._generate_id(),
uuid=utils.generate_uuid())

View File

@@ -21,7 +21,7 @@ from watcher import objects
def get_test_audit_template(**kwargs):
return {
audit_template_data = {
'id': kwargs.get('id', 1),
'uuid': kwargs.get('uuid', 'e74c40e0-d825-11e2-a28f-0800200c9a66'),
'goal_id': kwargs.get('goal_id', 1),
@@ -34,6 +34,15 @@ def get_test_audit_template(**kwargs):
'deleted_at': kwargs.get('deleted_at'),
}
# ObjectField doesn't allow None nor dict, so if we want to simulate a
# non-eager object loading, the field should not be referenced at all.
if kwargs.get('goal'):
audit_template_data['goal'] = kwargs.get('goal')
if kwargs.get('strategy'):
audit_template_data['strategy'] = kwargs.get('strategy')
return audit_template_data
def create_test_audit_template(**kwargs):
"""Create test audit template entry in DB and return AuditTemplate DB object.