Merge "Use an inner join on aggregate_hosts in aggregate_get_by_host"
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
|
||||
@@ -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])
|
||||
|
||||
Reference in New Issue
Block a user