Merge "Use an inner join on aggregate_hosts in aggregate_get_by_host"

This commit is contained in:
Jenkins
2013-06-13 05:39:25 +00:00
committed by Gerrit Code Review
2 changed files with 15 additions and 3 deletions
+10 -3
View File
@@ -4605,12 +4605,19 @@ def aggregate_get(context, aggregate_id):
@require_admin_context
def aggregate_get_by_host(context, host, key=None):
query = _aggregate_get_query(context, models.Aggregate,
models.AggregateHost.host, host)
"""Return rows that match host (mandatory) and metadata key (optional).
:param host matches host, and is required.
:param key Matches metadata key, if not None.
"""
query = model_query(context, models.Aggregate)
query = query.options(joinedload('_hosts', innerjoin=True))
query = query.options(joinedload('_metadata'))
query = query.filter(models.AggregateHost.host == host)
if key:
query = query.join("_metadata").filter(
models.AggregateMetadata.key == key)
models.AggregateMetadata.key == key)
return query.all()
+5
View File
@@ -1240,17 +1240,22 @@ class AggregateDBApiTestCase(test.TestCase):
def test_aggregate_get_by_host(self):
ctxt = context.get_admin_context()
values = {'name': 'fake_aggregate2'}
values2 = {'name': 'fake_aggregate4'}
a1 = _create_aggregate_with_hosts(context=ctxt)
a2 = _create_aggregate_with_hosts(context=ctxt, values=values)
# a3 has no hosts and should not be in the results.
a3 = _create_aggregate(context=ctxt, values=values2)
r1 = db.aggregate_get_by_host(ctxt, 'foo.openstack.org')
self.assertEqual([a1['id'], a2['id']], [x['id'] for x in r1])
def test_aggregate_get_by_host_with_key(self):
ctxt = context.get_admin_context()
values = {'name': 'fake_aggregate2'}
values2 = {'name': 'fake_aggregate4'}
a1 = _create_aggregate_with_hosts(context=ctxt,
metadata={'goodkey': 'good'})
a2 = _create_aggregate_with_hosts(context=ctxt, values=values)
a3 = _create_aggregate(context=ctxt, values=values2)
# filter result by key
r1 = db.aggregate_get_by_host(ctxt, 'foo.openstack.org', key='goodkey')
self.assertEqual([a1['id']], [x['id'] for x in r1])